From 4e28f54d02332e99576f30b86f77a17a8ad730e2 Mon Sep 17 00:00:00 2001 From: Makram Date: Mon, 10 Feb 2025 12:09:04 +0200 Subject: [PATCH 01/83] [CCIP-5175] core/capabilities/ccip/ccipevm: fix msg hashing (#16285) * core/capabilities/ccip/ccipevm: fix msg hashing * fix test, small cleanup * add more test vectors * fix execute codec * rm unused --- .../capabilities/ccip/ccipevm/executecodec.go | 17 +- .../ccip/ccipevm/executecodec_test.go | 30 +++ core/capabilities/ccip/ccipevm/msghasher.go | 93 +++++-- .../ccip/ccipevm/msghasher_test.go | 249 +++++++++++++++--- .../ccip/ccipevm/msgs_test_vector.json | 1 + .../ccip/changeset/cs_chain_contracts.go | 3 +- 6 files changed, 342 insertions(+), 51 deletions(-) create mode 100644 core/capabilities/ccip/ccipevm/msgs_test_vector.json diff --git a/core/capabilities/ccip/ccipevm/executecodec.go b/core/capabilities/ccip/ccipevm/executecodec.go index 6e32e422b07..6c3ba8a586a 100644 --- a/core/capabilities/ccip/ccipevm/executecodec.go +++ b/core/capabilities/ccip/ccipevm/executecodec.go @@ -63,8 +63,17 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec return nil, fmt.Errorf("decode dest gas amount: %w", err) } + // from https://github.com/smartcontractkit/chainlink/blob/e036012d5b562f5c30c5a87898239ba59aeb2f7b/contracts/src/v0.8/ccip/pools/TokenPool.sol#L84 + // remote pool addresses are abi-encoded addresses if the remote chain is EVM. + // its unclear as of writing how we will handle non-EVM chains and their addresses. + // e.g, will we encode them as bytes or bytes32? + sourcePoolAddressABIEncodedAsAddress, err := abiEncodeAddress(common.BytesToAddress(tokenAmount.SourcePoolAddress)) + if err != nil { + return nil, fmt.Errorf("abi encode source pool address: %w", err) + } + tokenAmounts = append(tokenAmounts, offramp.InternalAny2EVMTokenTransfer{ - SourcePoolAddress: tokenAmount.SourcePoolAddress, + SourcePoolAddress: sourcePoolAddressABIEncodedAsAddress, DestTokenAddress: common.BytesToAddress(tokenAmount.DestTokenAddress), ExtraData: tokenAmount.ExtraData, Amount: tokenAmount.Amount.Int, @@ -144,7 +153,11 @@ func (e *ExecutePluginCodecV1) Decode(ctx context.Context, encodedReport []byte) return cciptypes.ExecutePluginReport{}, fmt.Errorf("abi encode dest gas amount: %w", err) } tokenAmounts = append(tokenAmounts, cciptypes.RampTokenAmount{ - SourcePoolAddress: tokenAmount.SourcePoolAddress, + // from https://github.com/smartcontractkit/chainlink/blob/e036012d5b562f5c30c5a87898239ba59aeb2f7b/contracts/src/v0.8/ccip/pools/TokenPool.sol#L84 + // remote pool addresses are abi-encoded addresses if the remote chain is EVM. + // its unclear as of writing how we will handle non-EVM chains and their addresses. + // e.g, will we encode them as bytes or bytes32? + SourcePoolAddress: common.BytesToAddress(tokenAmount.SourcePoolAddress).Bytes(), // TODO: should this be abi-encoded? DestTokenAddress: tokenAmount.DestTokenAddress.Bytes(), ExtraData: tokenAmount.ExtraData, diff --git a/core/capabilities/ccip/ccipevm/executecodec_test.go b/core/capabilities/ccip/ccipevm/executecodec_test.go index d3ef9fae5f1..0c7c6504fe1 100644 --- a/core/capabilities/ccip/ccipevm/executecodec_test.go +++ b/core/capabilities/ccip/ccipevm/executecodec_test.go @@ -1,9 +1,11 @@ package ccipevm import ( + "encoding/base64" "math/rand" "testing" + "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" @@ -12,10 +14,12 @@ import ( "github.com/stretchr/testify/require" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/message_hasher" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/report_codec" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) @@ -176,3 +180,29 @@ func TestExecutePluginCodecV1(t *testing.T) { }) } } + +func Test_DecodeReport(t *testing.T) { + offRampABI, err := offramp.OffRampMetaData.GetAbi() + require.NoError(t, err) + + reportBase64 := "9Y4D/AAKbBOGy6NAcrBVaUmVfONiiic4CO6GbHwProoOgQEuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATQECAwyzhPUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAx7Gv0ioZNqUJw0gfsLHFIQQr3lR0XlsvWXBIfQJNfOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0BAgMMs4T1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJ+ShEYchSsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAAAAAAAAAAAANczLkN32zc8KqgZj7Tm8KueHiruAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAZAUE4xFSzvn6m/FNtkX62lAsPigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAIn5uKZ/XwqWg+aAsi9+uE03oJuIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB6EgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3gtrOnZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTDIjV28BIw1+6agsDfXqqEiuKGowAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + reportBytes, err := base64.StdEncoding.DecodeString(reportBase64) + require.NoError(t, err) + + executeInputs, err := offRampABI.Methods["execute"].Inputs.Unpack(reportBytes[4:]) + require.NoError(t, err) + require.Len(t, executeInputs, 2) + + // first param is report ctx, which is bytes32[2], so cast to that using + // abi.ConvertType + reportCtx := *abi.ConvertType(executeInputs[0], new([2][32]byte)).(*[2][32]byte) + t.Logf("reportCtx[0]: %x, reportCtx[1]: %x", reportCtx[0], reportCtx[1]) + + rawReport := *abi.ConvertType(executeInputs[1], new([]byte)).(*[]byte) + + codec := NewExecutePluginCodecV1() + decoded, err := codec.Decode(tests.Context(t), rawReport) + require.NoError(t, err) + + t.Logf("decoded: %+v", decoded) +} diff --git a/core/capabilities/ccip/ccipevm/msghasher.go b/core/capabilities/ccip/ccipevm/msghasher.go index 3c9cea1147e..7d880d4197f 100644 --- a/core/capabilities/ccip/ccipevm/msghasher.go +++ b/core/capabilities/ccip/ccipevm/msghasher.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/smartcontractkit/chainlink-ccip/pkg/logutil" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -18,7 +19,7 @@ import ( var ( // bytes32 internal constant LEAF_DOMAIN_SEPARATOR = 0x0000000000000000000000000000000000000000000000000000000000000000; - leafDomainSeparator = [32]byte{} + LEAF_DOMAIN_SEPARATOR = [32]byte{} // bytes32 internal constant ANY_2_EVM_MESSAGE_HASH = keccak256("Any2EVMMessageHashV1"); ANY_2_EVM_MESSAGE_HASH = utils.Keccak256Fixed([]byte("Any2EVMMessageHashV1")) @@ -73,8 +74,15 @@ func NewMessageHasherV1(lggr logger.Logger) *MessageHasherV1 { ) ); */ -func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (cciptypes.Bytes32, error) { - h.lggr.Debugw("hashing message", "msg", msg) +func (h *MessageHasherV1) Hash(ctx context.Context, msg cciptypes.Message) (cciptypes.Bytes32, error) { + lggr := logutil.WithContextValues(ctx, h.lggr) + lggr = logger.With( + lggr, + "msgID", msg.Header.MessageID.String(), + "ANY_2_EVM_MESSAGE_HASH", hexutil.Encode(ANY_2_EVM_MESSAGE_HASH[:]), + "onrampAddress", msg.Header.OnRamp, + ) + lggr.Debugw("hashing message", "msg", msg) var rampTokenAmounts []message_hasher.InternalAny2EVMTokenTransfer for _, rta := range msg.TokenAmounts { @@ -83,21 +91,47 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty return [32]byte{}, fmt.Errorf("decode dest gas amount: %w", err) } + lggr.Debugw("decoded dest gas amount", + "destGasAmount", destGasAmount) + + // from https://github.com/smartcontractkit/chainlink/blob/e036012d5b562f5c30c5a87898239ba59aeb2f7b/contracts/src/v0.8/ccip/pools/TokenPool.sol#L84 + // remote pool addresses are abi-encoded addresses if the remote chain is EVM. + // its unclear as of writing how we will handle non-EVM chains and their addresses. + // e.g, will we encode them as bytes or bytes32? + sourcePoolAddressABIEncodedAsAddress, err := abiEncodeAddress(common.BytesToAddress(rta.SourcePoolAddress)) + if err != nil { + return [32]byte{}, fmt.Errorf("abi encode source pool address: %w", err) + } + + lggr.Debugw("abi encoded source pool address as solidity address", + "sourcePoolAddressABIEncodedAsAddress", hexutil.Encode(sourcePoolAddressABIEncodedAsAddress)) + + destTokenAddress, err := abiDecodeAddress(rta.DestTokenAddress) + if err != nil { + return [32]byte{}, fmt.Errorf("decode dest token address: %w", err) + } + + lggr.Debugw("abi decoded dest token address", + "destTokenAddress", destTokenAddress) + rampTokenAmounts = append(rampTokenAmounts, message_hasher.InternalAny2EVMTokenTransfer{ - SourcePoolAddress: rta.SourcePoolAddress, - DestTokenAddress: common.BytesToAddress(rta.DestTokenAddress), + SourcePoolAddress: sourcePoolAddressABIEncodedAsAddress, + DestTokenAddress: destTokenAddress, + DestGasAmount: destGasAmount, ExtraData: rta.ExtraData, Amount: rta.Amount.Int, - DestGasAmount: destGasAmount, }) } - encodedRampTokenAmounts, err := h.abiEncode("encodeAny2EVMTokenAmountsHashPreimage", rampTokenAmounts) + encodedRampTokenAmounts, err := h.abiEncode( + "encodeAny2EVMTokenAmountsHashPreimage", + rampTokenAmounts, + ) if err != nil { return [32]byte{}, fmt.Errorf("abi encode token amounts: %w", err) } - h.lggr.Debugw("abi encoded ramp token amounts", + lggr.Debugw("token amounts preimage", "encodedRampTokenAmounts", hexutil.Encode(encodedRampTokenAmounts)) metaDataHashInput, err := h.abiEncode( @@ -113,8 +147,8 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty return [32]byte{}, fmt.Errorf("abi encode metadata hash input: %w", err) } - h.lggr.Debugw("abi encoded metadata hash input", - "metaDataHashInput", cciptypes.Bytes32(utils.Keccak256Fixed(metaDataHashInput)).String()) + lggr.Debugw("metadata hash preimage", + "metaDataHashInput", hexutil.Encode(metaDataHashInput)) // Need to decode the extra args to get the gas limit. // TODO: we assume that extra args is always abi-encoded for now, but we need @@ -125,6 +159,8 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty return [32]byte{}, fmt.Errorf("decode extra args: %w", err) } + lggr.Debugw("decoded msg gas limit", "gasLimit", gasLimit) + fixedSizeFieldsEncoded, err := h.abiEncode( "encodeFixedSizeFieldsHashPreimage", msg.Header.MessageID, @@ -137,9 +173,12 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty return [32]byte{}, fmt.Errorf("abi encode fixed size values: %w", err) } - packedValues, err := h.abiEncode( + lggr.Debugw("fixed size fields has preimage", + "fixedSizeFieldsEncoded", hexutil.Encode(fixedSizeFieldsEncoded)) + + hashPreimage, err := h.abiEncode( "encodeFinalHashPreimage", - leafDomainSeparator, + LEAF_DOMAIN_SEPARATOR, utils.Keccak256Fixed(metaDataHashInput), // metaDataHash utils.Keccak256Fixed(fixedSizeFieldsEncoded), utils.Keccak256Fixed(common.LeftPadBytes(msg.Sender, 32)), // todo: this is not chain-agnostic @@ -150,14 +189,14 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty return [32]byte{}, fmt.Errorf("abi encode packed values: %w", err) } - res := utils.Keccak256Fixed(packedValues) + msgHash := utils.Keccak256Fixed(hashPreimage) - h.lggr.Debugw("abi encoded msg hash", - "abiEncodedMsg", hexutil.Encode(packedValues), - "result", hexutil.Encode(res[:]), + lggr.Debugw("final hash preimage and message hash result", + "hashPreimage", hexutil.Encode(hashPreimage), + "msgHash", hexutil.Encode(msgHash[:]), ) - return res, nil + return msgHash, nil } func (h *MessageHasherV1) abiEncode(method string, values ...interface{}) ([]byte, error) { @@ -183,5 +222,25 @@ func abiEncodeUint32(data uint32) ([]byte, error) { return utils.ABIEncode(`[{ "type": "uint32" }]`, data) } +// abiEncodeAddress encodes the given address as a solidity address. +// TODO: this is potentially incorrect for nonEVM sources. +// we need to revisit. +// e.g on Solana, we would be abi.encode()ing bytes or bytes32. +// encoding 20 bytes as a solidity bytes is not the same as encoding a 20 byte address +// or a bytes32. +func abiEncodeAddress(data common.Address) ([]byte, error) { + return utils.ABIEncode(`[{ "type": "address" }]`, data) +} + +func abiDecodeAddress(data []byte) (common.Address, error) { + raw, err := utils.ABIDecode(`[{ "type": "address" }]`, data) + if err != nil { + return common.Address{}, fmt.Errorf("abi decode address: %w", err) + } + + val := *abi.ConvertType(raw[0], new(common.Address)).(*common.Address) + return val, nil +} + // Interface compliance check var _ cciptypes.MessageHasher = (*MessageHasherV1)(nil) diff --git a/core/capabilities/ccip/ccipevm/msghasher_test.go b/core/capabilities/ccip/ccipevm/msghasher_test.go index a434f7f6b76..f3c0f0a4b78 100644 --- a/core/capabilities/ccip/ccipevm/msghasher_test.go +++ b/core/capabilities/ccip/ccipevm/msghasher_test.go @@ -3,7 +3,9 @@ package ccipevm import ( "context" cryptorand "crypto/rand" + "encoding/json" "fmt" + "io/ioutil" "math/big" "math/rand" "strings" @@ -12,10 +14,13 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/utils" @@ -199,37 +204,219 @@ func testSetup(t *testing.T) *testSetupData { } func TestMessagerHasher_againstRmnSharedVector(t *testing.T) { - const ( - messageID = "c6f553ab71282f01324bbdbcc82e22a7e66efbcd108881ecc4cdbd728aed9b1e" - onRampAddress = "0000000000000000000000007a2088a1bfc9d81c55368ae168c2c02570cb814f" - dataField = "68656c6c6f" - receiverAddress = "677df0cb865368207999f2862ece576dc56d8df6" - extraArgs = "181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000" - senderAddress = "f39fd6e51aad88f6f4ce6ab8827279cfffb92266" - feeToken = "9fe46736679d2d9a65f0992f2272de9f3c7fa6e0" - sourceChainSelector = 3379446385462418246 - destChainSelector = 12922642891491394802 - expectedMsgHash = "0x1c61fef7a3dd153943419c1101031316ed7b7a3d75913c34cbe8628033f5924f" - ) - - h := NewMessageHasherV1(logger.Test(t)) - msgH, err := h.Hash(context.Background(), cciptypes.Message{ - Header: cciptypes.RampMessageHeader{ - MessageID: cciptypes.Bytes32(common.Hex2Bytes(messageID)), - SourceChainSelector: sourceChainSelector, - DestChainSelector: destChainSelector, - SequenceNumber: 1, - Nonce: 1, - MsgHash: cciptypes.Bytes32{}, - OnRamp: common.HexToAddress(onRampAddress).Bytes(), - }, - Sender: common.HexToAddress(senderAddress).Bytes(), - Data: common.Hex2Bytes(dataField), - Receiver: common.Hex2Bytes(receiverAddress), - ExtraArgs: common.Hex2Bytes(extraArgs), - FeeToken: common.HexToAddress(feeToken).Bytes(), - TokenAmounts: []cciptypes.RampTokenAmount{}, + transactor := testutils.MustNewSimTransactor(t) + backend := backends.NewSimulatedBackend(types.GenesisAlloc{ + transactor.From: {Balance: assets.Ether(1000).ToInt()}, + }, 30e6) + + msghasherAddr, _, _, err := message_hasher.DeployMessageHasher(transactor, backend) + require.NoError(t, err) + backend.Commit() + + msghasher, err := message_hasher.NewMessageHasher(msghasherAddr, backend) + require.NoError(t, err) + + t.Run("vec1", func(t *testing.T) { + const ( + messageID = "c6f553ab71282f01324bbdbcc82e22a7e66efbcd108881ecc4cdbd728aed9b1e" + onRampAddress = "0000000000000000000000007a2088a1bfc9d81c55368ae168c2c02570cb814f" + dataField = "68656c6c6f" + receiverAddress = "677df0cb865368207999f2862ece576dc56d8df6" + extraArgs = "181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000" + senderAddress = "f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + feeToken = "9fe46736679d2d9a65f0992f2272de9f3c7fa6e0" + sourceChainSelector = 3379446385462418246 + destChainSelector = 12922642891491394802 + expectedMsgHash = "0x1c61fef7a3dd153943419c1101031316ed7b7a3d75913c34cbe8628033f5924f" + ) + + var ( + msg = cciptypes.Message{ + Header: cciptypes.RampMessageHeader{ + MessageID: cciptypes.Bytes32(common.Hex2Bytes(messageID)), + SourceChainSelector: sourceChainSelector, + DestChainSelector: destChainSelector, + SequenceNumber: 1, + Nonce: 1, + MsgHash: cciptypes.Bytes32{}, + OnRamp: common.HexToAddress(onRampAddress).Bytes(), + }, + Sender: common.HexToAddress(senderAddress).Bytes(), + Data: common.Hex2Bytes(dataField), + Receiver: common.Hex2Bytes(receiverAddress), + ExtraArgs: common.Hex2Bytes(extraArgs), + FeeToken: common.HexToAddress(feeToken).Bytes(), + TokenAmounts: []cciptypes.RampTokenAmount{}, + } + any2EVMMessage = ccipMsgToAny2EVMMessage(t, msg) + ) + + onchainHash, err := msghasher.Hash(&bind.CallOpts{ + Context: tests.Context(t), + }, any2EVMMessage, common.LeftPadBytes(msg.Header.OnRamp, 32)) + require.NoError(t, err) + + h := NewMessageHasherV1(logger.Test(t)) + msgH, err := h.Hash(tests.Context(t), msg) + require.NoError(t, err) + require.Equal(t, expectedMsgHash, msgH.String()) + require.Equal(t, onchainHash, [32]byte(msgH), "my hash and onchain hash should match") + }) + + t.Run("vec2", func(t *testing.T) { + // source chain tx: https://sepolia.etherscan.io/tx/0x3b64b5cb2c972a3f5064801187f17360c2025fbcc51e11b67b25c7949daeec24#eventlog + var ( + // header fields + messageID = mustBytes32FromString(t, "0xcdad95e113e35cf691295c1f42455d41062ba9a1b96a6280c1a5a678ef801721") + destChainSelector = cciptypes.ChainSelector(3478487238524512106) // arb sepolia + sourceChainSelector = cciptypes.ChainSelector(16015286601757825753) // sepolia + sequenceNumber = cciptypes.SeqNum(386) + nonce = uint64(1) + // message fields + // sender is parsed unpadded since its emitted unpadded from EVM. + senderAddress = cciptypes.UnknownAddress(hexutil.MustDecode("0x269895AC2a2eC6e1Df37F68AcfbBDa53e62b71B1")) + // onRampAddress is parsed padded because its set as a padded address in the offRamp + onRampAddress = hexutil.MustDecode("0x00000000000000000000000089559ce6904d4c4B0f6aaB9065Ad02B1ed531Be4") + dataField = "0x" + // receiver address is parsed padded because its emitted as padded from EVM. + receiverAddress = cciptypes.UnknownAddress(hexutil.MustDecode("0x000000000000000000000000269895ac2a2ec6e1df37f68acfbbda53e62b71b1")) + // extraArgs always abi-encoded + extraArgs = hexutil.MustDecode("0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000") + // feeToken is parsed unpadded since its emitted unpadded from EVM. + // however, it isn't used in the hash. its just set for completion. + feeToken = common.HexToAddress("0x097D90c9d3E0B50Ca60e1ae45F6A81010f9FB534") + feeTokenAmount = big.NewInt(114310554250104) + feeValueJuels = big.NewInt(16499514422603741) + tokenAmounts = []cciptypes.RampTokenAmount{ + { + // parsed unpadded since its emitted unpadded from EVM. + SourcePoolAddress: cciptypes.UnknownAddress(hexutil.MustDecode("0xBBE734cAB186C0988CFBAfdFdbe442979a0c8697")), + // parsed padded because its emitted padded from EVM. + DestTokenAddress: cciptypes.UnknownAddress(hexutil.MustDecode("0x000000000000000000000000b8d6a6a41d5dd732aec3c438e91523b7613b963b")), + // extra data always abi-encoded + ExtraData: cciptypes.Bytes(hexutil.MustDecode("0x0000000000000000000000000000000000000000000000000000000000000012")), + Amount: cciptypes.NewBigInt(big.NewInt(100000000000000000)), + // dest exec data always abi-encoded + DestExecData: cciptypes.Bytes(hexutil.MustDecode("0x000000000000000000000000000000000000000000000000000000000001e848")), + DestExecDataDecoded: map[string]any{}, + }, + } + + msg = cciptypes.Message{ + Header: cciptypes.RampMessageHeader{ + MessageID: messageID, + SourceChainSelector: sourceChainSelector, + DestChainSelector: destChainSelector, + SequenceNumber: sequenceNumber, + Nonce: nonce, + MsgHash: cciptypes.Bytes32{}, + OnRamp: onRampAddress, + }, + Sender: senderAddress, + Data: hexutil.MustDecode(dataField), + Receiver: receiverAddress, + ExtraArgs: extraArgs, + FeeToken: feeToken.Bytes(), + FeeTokenAmount: cciptypes.NewBigInt(feeTokenAmount), + FeeValueJuels: cciptypes.NewBigInt(feeValueJuels), + TokenAmounts: tokenAmounts, + } + + any2EVMMessage = ccipMsgToAny2EVMMessage(t, msg) + ) + + const ( + rmnMsgHash = "0xb6ea678f918293745bfb8db05d79dcf08986c7da3e302ac5f6782618a6f11967" + ) + + h := NewMessageHasherV1(logger.Test(t)) + msgH, err := h.Hash(tests.Context(t), msg) + require.NoError(t, err) + + msgHashOnchain, err := msghasher.Hash(&bind.CallOpts{ + Context: tests.Context(t), + }, any2EVMMessage, onRampAddress) + require.NoError(t, err) + + t.Logf("rmn hash: %s, onchain hash: %s, my hash: %s", rmnMsgHash, hexutil.Encode(msgHashOnchain[:]), msgH.String()) + require.Equal(t, msgHashOnchain, [32]byte(msgH), "my hash and onchain hash should match") + require.Equal(t, rmnMsgHash, msgH.String(), "rmn hash and my hash should match") + }) + + t.Run("other vectors", func(t *testing.T) { + // These test vectors are from real ccip transactions on sepolia. + // onramp address: 0x89559ce6904d4c4b0f6aab9065ad02b1ed531be4 + // sequence numbers 386 to 419. + var msgs []cciptypes.Message + data, err := ioutil.ReadFile("msgs_test_vector.json") + require.NoError(t, err) + + err = json.Unmarshal(data, &msgs) + require.NoError(t, err) + + msgHasher := NewMessageHasherV1(logger.Test(t)) + + for _, msg := range msgs { + any2EVMMessage := ccipMsgToAny2EVMMessage(t, msg) + + onchainHash, err := msghasher.Hash(&bind.CallOpts{ + Context: tests.Context(t), + }, any2EVMMessage, common.LeftPadBytes(msg.Header.OnRamp, 32)) + require.NoError(t, err) + + myHash, err := msgHasher.Hash(tests.Context(t), msg) + require.NoError(t, err) + + t.Logf("onchain hash: %s, my hash: %s", hexutil.Encode(onchainHash[:]), myHash.String()) + require.Equal(t, [32]byte(myHash), onchainHash, "my hash and onchain hash should match") + } }) +} + +func ccipMsgToAny2EVMMessage(t *testing.T, msg cciptypes.Message) message_hasher.InternalAny2EVMRampMessage { + var tokenAmounts []message_hasher.InternalAny2EVMTokenTransfer + for _, rta := range msg.TokenAmounts { + destGasAmount, err := abiDecodeUint32(rta.DestExecData) + require.NoError(t, err) + + tokenAmounts = append(tokenAmounts, message_hasher.InternalAny2EVMTokenTransfer{ + SourcePoolAddress: common.LeftPadBytes(rta.SourcePoolAddress, 32), + DestTokenAddress: common.BytesToAddress(rta.DestTokenAddress), + ExtraData: rta.ExtraData[:], + Amount: rta.Amount.Int, + DestGasAmount: destGasAmount, + }) + } + + gasLimit, err := decodeExtraArgsV1V2(msg.ExtraArgs) + require.NoError(t, err) + + return message_hasher.InternalAny2EVMRampMessage{ + Header: message_hasher.InternalRampMessageHeader{ + MessageId: msg.Header.MessageID, + SourceChainSelector: uint64(msg.Header.SourceChainSelector), + DestChainSelector: uint64(msg.Header.DestChainSelector), + SequenceNumber: uint64(msg.Header.SequenceNumber), + Nonce: msg.Header.Nonce, + }, + Sender: common.LeftPadBytes(msg.Sender, 32), + Data: msg.Data, + Receiver: common.BytesToAddress(msg.Receiver), + GasLimit: gasLimit, + TokenAmounts: tokenAmounts, + } +} + +func mustBytes32FromString(t *testing.T, str string) cciptypes.Bytes32 { + t.Helper() + b, err := cciptypes.NewBytes32FromString(str) + require.NoError(t, err) + return b +} + +func mustEncodeAddress(t *testing.T, addr common.Address) []byte { + t.Helper() + enc, err := abiEncodeAddress(addr) require.NoError(t, err) - require.Equal(t, expectedMsgHash, msgH.String()) + return enc } diff --git a/core/capabilities/ccip/ccipevm/msgs_test_vector.json b/core/capabilities/ccip/ccipevm/msgs_test_vector.json new file mode 100644 index 00000000000..6fbb1c24979 --- /dev/null +++ b/core/capabilities/ccip/ccipevm/msgs_test_vector.json @@ -0,0 +1 @@ +[{"header":{"messageId":"0xcdad95e113e35cf691295c1f42455d41062ba9a1b96a6280c1a5a678ef801721","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"386","nonce":1,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x269895ac2a2ec6e1df37f68acfbbda53e62b71b1","data":"0x","receiver":"0x000000000000000000000000269895ac2a2ec6e1df37f68acfbbda53e62b71b1","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"114310554250104","feeValueJuels":"16499514422603741","tokenAmounts":[{"sourcePoolAddress":"0xbbe734cab186c0988cfbafdfdbe442979a0c8697","destTokenAddress":"0x000000000000000000000000b8d6a6a41d5dd732aec3c438e91523b7613b963b","extraData":"0x0000000000000000000000000000000000000000000000000000000000000012","amount":"100000000000000000","destExecData":"0x000000000000000000000000000000000000000000000000000000000001e848"}]},{"header":{"messageId":"0x4ce099555339149423d09874925129534dd54bd877b6eb2b671fee6e67b8053c","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"387","nonce":97,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94639947351035","feeValueJuels":"13760066113400839","tokenAmounts":null},{"header":{"messageId":"0x887794bc95ae55e76c744df633b75f663dd7f8d49da842de41f204cce46efff5","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"388","nonce":98,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94298711785335","feeValueJuels":"13600487945170649","tokenAmounts":null},{"header":{"messageId":"0x9c7e83cc409a6a0b2f31da507e8ba36c0e3631cb55c6e34b60d59052759494e7","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"389","nonce":99,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"93813506595188","feeValueJuels":"13497594131836892","tokenAmounts":null},{"header":{"messageId":"0x9c2cfc0509035ebaa6b8b6c60bba4a753e4f580a16696387964c67a4c7753a9e","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"390","nonce":8,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94711864075391","feeValueJuels":"13626846998435333","tokenAmounts":null},{"header":{"messageId":"0xee6cb5f5d467982da1a4630974c630cdd2404e36b18574770a152d27c0dfed50","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"391","nonce":9,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94711864075391","feeValueJuels":"13626846998435333","tokenAmounts":null},{"header":{"messageId":"0xebad6673e9c7280a42943f4c1948ff1ca71cd6ba3a6250fabbd2383539ec23c7","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"392","nonce":10,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94711864075391","feeValueJuels":"13626846998435333","tokenAmounts":null},{"header":{"messageId":"0x6a8f62af5c8b923b914a38472c15fa62bef1a70ed2564474c356c091d50e9242","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"393","nonce":11,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94711864075391","feeValueJuels":"13626846998435333","tokenAmounts":null},{"header":{"messageId":"0xaae85290cff7d773d610eae73222b4b033fdf0e07162ecd592854a5cf767138e","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"394","nonce":12,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94340281421006","feeValueJuels":"13586086320372742","tokenAmounts":null},{"header":{"messageId":"0x97dbb81ef593809817e0de64398e3aa4f6ca02310be1ceadcc6093731a8bbd3b","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"395","nonce":13,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94340281421006","feeValueJuels":"13586086320372742","tokenAmounts":null},{"header":{"messageId":"0x86b9d4be39b2a2be56eaaff7ae33bb019d9c8d844d18765468d2ff9375a3f1b7","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"396","nonce":14,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94340281421006","feeValueJuels":"13586086320372742","tokenAmounts":null},{"header":{"messageId":"0xf6870bf61da90315cd42d9f723cb646625feff1c09f1e4f245634ccd89107da6","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"397","nonce":15,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94340281421006","feeValueJuels":"13586086320372742","tokenAmounts":null},{"header":{"messageId":"0xe79bc33294a712d9e1623b1374c6c487ed665a40d7f5b4fbb5d2854e68642c24","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"398","nonce":16,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94340281421006","feeValueJuels":"13586086320372742","tokenAmounts":null},{"header":{"messageId":"0xd16d3ebffe73a54a4f78bc6004bc9a6fc362dd7de17b40bda4ea53ac5cf3fee2","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"399","nonce":17,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94340281421006","feeValueJuels":"13586086320372742","tokenAmounts":null},{"header":{"messageId":"0xbd8336eb28d72666d48374f83f566fe4627600ee36bf490a6416ed159aa8f208","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"400","nonce":100,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"93938771998124","feeValueJuels":"13495235215418671","tokenAmounts":null},{"header":{"messageId":"0xf2f556e76a88b00bbb688c0646fef815066e5a7d229826e2b2c64a2381a18e30","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"401","nonce":78,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0xea387241d834d04cc408f4c2fe7ef2c477e4b3e7","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94245520021172","feeValueJuels":"13561893850200048","tokenAmounts":null},{"header":{"messageId":"0xb73e6b475c217be931931187ae30e229b690825bf5f52717f6ebf41274411f16","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"402","nonce":79,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0xea387241d834d04cc408f4c2fe7ef2c477e4b3e7","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94245520021172","feeValueJuels":"13561893850200048","tokenAmounts":null},{"header":{"messageId":"0x1777806bfd753d1d6c448691921c08cfe6e6de550b9a689bd02b32cba313c5c1","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"403","nonce":80,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0xea387241d834d04cc408f4c2fe7ef2c477e4b3e7","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94152145905503","feeValueJuels":"13561463504149080","tokenAmounts":null},{"header":{"messageId":"0x65c366b6dc0ce47afe639e8625f05de3c69be98cde620237e21dac710c527599","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"404","nonce":101,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94152145905503","feeValueJuels":"13561463504149080","tokenAmounts":null},{"header":{"messageId":"0x97e191707bdcf1193fd12800d73f177d6b8edd5c8cc5d019856c27931ac9f26e","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"405","nonce":18,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94152145905503","feeValueJuels":"13561463504149080","tokenAmounts":null},{"header":{"messageId":"0xa167183830024028adb01ad86d2d743891a114c07f7c7f6ac7628824b0aa8bcb","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"406","nonce":19,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94152145905503","feeValueJuels":"13561463504149080","tokenAmounts":null},{"header":{"messageId":"0x3edab0cdbfdc729861b117408dc3874bebacb29e20373d586b746055af10be03","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"407","nonce":20,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94152145905503","feeValueJuels":"13561463504149080","tokenAmounts":null},{"header":{"messageId":"0xb9d618eefa7a0500ff4474972f6dc47b21d05db1314f76a4ca6bee8a5e54ef52","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"408","nonce":21,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94218172781329","feeValueJuels":"13570973866958081","tokenAmounts":null},{"header":{"messageId":"0xff1e0b39324e6fa0b59dc18a1783a6fd9c7021e13eed6ca786e7d13a5b77a7ce","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"409","nonce":102,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94218172781329","feeValueJuels":"13570973866958081","tokenAmounts":null},{"header":{"messageId":"0xc864eb5939e326554b903b5c20d9fdf856253f8526523c6c2eb0b49e9592b621","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"410","nonce":22,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94218172781329","feeValueJuels":"13570973866958081","tokenAmounts":null},{"header":{"messageId":"0xc09e0a0f7354c6488cf825c551d3ef41c6c41080ef5653611ddbbd3b0e597424","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"411","nonce":23,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x9b5538b82bc1cb385d76981925107920a83793ca","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94218172781329","feeValueJuels":"13570973866958081","tokenAmounts":null},{"header":{"messageId":"0x9cb22f9e88abc6a8d454787e894e51d328de07e26f469fe8b8527bc8714b4608","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"412","nonce":103,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94594106459361","feeValueJuels":"13653938438067957","tokenAmounts":null},{"header":{"messageId":"0x6fcac4a4f8ee75f8893391886b4ac924c84abb44540e40c4ae23f6656a539872","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"413","nonce":104,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94191013643358","feeValueJuels":"13623574604039063","tokenAmounts":null},{"header":{"messageId":"0x1edf61738375e021f4671ff6138168a2f0209eea77c863caaff366afa408ba37","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"414","nonce":105,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94626849495871","feeValueJuels":"13680869273609157","tokenAmounts":null},{"header":{"messageId":"0x0c281f4989da9017239adc697f50cceefa3077d03fa44793b323d66d998b8b57","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"415","nonce":47,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0xf5008eaf49ea2b8b905f23b45e7206e191b0959e","data":"0x68656c6c6f20656f61","receiver":"0x000000000000000000000000000000000000000000000000000000000000dead","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"93982403446670","feeValueJuels":"13513718462909709","tokenAmounts":null},{"header":{"messageId":"0xb9f7788cca2919014391d330aeb145d49fe814ee6c1e06a33921aefa1493f3e4","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"416","nonce":48,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0xf5008eaf49ea2b8b905f23b45e7206e191b0959e","data":"0x68656c6c6f2046656551756f746572","receiver":"0x000000000000000000000000d1b3f472e2c99cc67a03fe2f2124c4f07e32bcf0","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"93998164909829","feeValueJuels":"13515984801797447","tokenAmounts":null},{"header":{"messageId":"0x373434dab8edc6cea8427d31e8e140193bb0f474526c11cdba18cccddebda5a5","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"417","nonce":49,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0xf5008eaf49ea2b8b905f23b45e7206e191b0959e","data":"0x68656c6c6f20434349505265636569766572","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94006045641408","feeValueJuels":"13517117971241244","tokenAmounts":null},{"header":{"messageId":"0xebd9b410539e171fd1113f31a00812e734186b0c80ae0ba6378b5f4230117eb5","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"418","nonce":50,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0xf5008eaf49ea2b8b905f23b45e7206e191b0959e","data":"0x68656c6c6f204343495052656365697665722077697468206c6f77206578656320676173","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf1000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"61217112632115","feeValueJuels":"8802401246229755","tokenAmounts":null},{"header":{"messageId":"0xf27489bad2efe43f86239a873ac95375e93646fb8970841a320ca897246408e0","sourceChainSelector":"16015286601757825753","destChainSelector":"3478487238524512106","seqNum":"419","nonce":106,"msgHash":"0x0000000000000000000000000000000000000000000000000000000000000000","onRamp":"0x00000000000000000000000089559ce6904d4c4b0f6aab9065ad02b1ed531be4"},"sender":"0x79de45bbbbbbd1bd179352aa5e7836a32285e8bd","data":"0x68656c6c6f","receiver":"0x000000000000000000000000407558574852b8dba7853e186e23feabbcc83a64","extraArgs":"0x181dcf100000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000000","feeToken":"0x097d90c9d3e0b50ca60e1ae45f6a81010f9fb534","feeTokenAmount":"94458311766654","feeValueJuels":"13481242549583544","tokenAmounts":null}] \ No newline at end of file diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go index 1dfef25ccc7..90d0ce47c55 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/cs_chain_contracts.go @@ -1077,7 +1077,8 @@ func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSo SourceChainSelector: source, Router: router, IsEnabled: update.IsEnabled, - OnRamp: common.LeftPadBytes(onRamp.Address().Bytes(), 32), + // TODO: how would this work when the onRamp is nonEVM? + OnRamp: common.LeftPadBytes(onRamp.Address().Bytes(), 32), }) } tx, err := offRamp.ApplySourceChainConfigUpdates(txOpts, args) From 83ccf038841caaaf97f404d71c585bdd3232cc22 Mon Sep 17 00:00:00 2001 From: Alec Gard Date: Mon, 10 Feb 2025 14:10:30 +0000 Subject: [PATCH 02/83] [DF-21039] Data Feeds CRE contracts (#16253) * Data Feeds CRE contracts. Add DataFeedsCache and BundleAggregatorProxy contracts. https://smartcontract-it.atlassian.net/browse/DF-21039 Co-authored-by: Karen Stepanyan Co-authored-by: Gregory Cawthorne Co-authored-by: Felix Fan * [Bot] Update changeset file with jira issues * pr fixes * add 0.8.26 compiler to hardhat config * fix solhint issues in test files * update gas snapshots * named returns, struct packing, evm_version, downgrade interface versions * remove space * gas snapshots * change interface version --------- Co-authored-by: Karen Stepanyan Co-authored-by: Gregory Cawthorne Co-authored-by: Felix Fan Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> --- .github/CODEOWNERS | 3 + .github/workflows/solidity-foundry.yml | 6 +- contracts/.changeset/fair-zoos-repeat.md | 10 + contracts/.prettierignore | 1 + contracts/.solhintignore | 1 + contracts/.solhintignore-test | 1 + contracts/GNUmakefile | 11 +- contracts/foundry.toml | 7 + .../gas-snapshots/data-feeds.gas-snapshot | 96 + contracts/hardhat.config.ts | 7 + contracts/scripts/native_solc_compile_all | 2 +- .../native_solc_compile_all_data-feeds | 33 + .../snapshots/DataFeedsCacheGasTest.json | 30 + .../v0.8/data-feeds/BundleAggregatorProxy.sol | 86 + .../src/v0.8/data-feeds/DataFeedsCache.sol | 755 ++++ .../interfaces/IBundleAggregator.sol | 7 + .../interfaces/IBundleAggregatorProxy.sol | 15 + .../interfaces/IBundleBaseAggregator.sol | 10 + .../interfaces/ICommonAggregator.sol | 8 + .../data-feeds/interfaces/IDataFeedsCache.sol | 33 + .../interfaces/IDecimalAggregator.sol | 33 + .../data-feeds/interfaces/ITokenRecover.sol | 15 + .../src/v0.8/data-feeds/test/BaseTest.t.sol | 29 + .../test/BundleAggregatorProxy.t.sol | 75 + .../v0.8/data-feeds/test/DataFeedsCache.t.sol | 1683 ++++++++ .../data-feeds/test/DataFeedsCacheGas.t.sol | 236 ++ .../data-feeds/test/DataFeedsSetupGas.t.sol | 209 + .../DataFeedsLegacyAggregatorProxy.sol | 318 ++ .../aggregator_proxy/aggregator_proxy.go | 1367 +++++++ .../bundle_aggregator_proxy.go | 1054 +++++ .../data_feeds_cache/data_feeds_cache.go | 3410 +++++++++++++++++ ...rapper-dependency-versions-do-not-edit.txt | 3 + core/gethwrappers/data-feeds/go_generate.go | 8 + 33 files changed, 9559 insertions(+), 3 deletions(-) create mode 100644 contracts/.changeset/fair-zoos-repeat.md create mode 100644 contracts/gas-snapshots/data-feeds.gas-snapshot create mode 100755 contracts/scripts/native_solc_compile_all_data-feeds create mode 100644 contracts/snapshots/DataFeedsCacheGasTest.json create mode 100644 contracts/src/v0.8/data-feeds/BundleAggregatorProxy.sol create mode 100644 contracts/src/v0.8/data-feeds/DataFeedsCache.sol create mode 100644 contracts/src/v0.8/data-feeds/interfaces/IBundleAggregator.sol create mode 100644 contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol create mode 100644 contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol create mode 100644 contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol create mode 100644 contracts/src/v0.8/data-feeds/interfaces/IDataFeedsCache.sol create mode 100644 contracts/src/v0.8/data-feeds/interfaces/IDecimalAggregator.sol create mode 100644 contracts/src/v0.8/data-feeds/interfaces/ITokenRecover.sol create mode 100644 contracts/src/v0.8/data-feeds/test/BaseTest.t.sol create mode 100644 contracts/src/v0.8/data-feeds/test/BundleAggregatorProxy.t.sol create mode 100644 contracts/src/v0.8/data-feeds/test/DataFeedsCache.t.sol create mode 100644 contracts/src/v0.8/data-feeds/test/DataFeedsCacheGas.t.sol create mode 100644 contracts/src/v0.8/data-feeds/test/DataFeedsSetupGas.t.sol create mode 100644 contracts/src/v0.8/data-feeds/test/helpers/DataFeedsLegacyAggregatorProxy.sol create mode 100644 core/gethwrappers/data-feeds/generated/aggregator_proxy/aggregator_proxy.go create mode 100644 core/gethwrappers/data-feeds/generated/bundle_aggregator_proxy/bundle_aggregator_proxy.go create mode 100644 core/gethwrappers/data-feeds/generated/data_feeds_cache/data_feeds_cache.go create mode 100644 core/gethwrappers/data-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt create mode 100644 core/gethwrappers/data-feeds/go_generate.go diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 845ccc259ca..ef1bafc41ee 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -88,6 +88,7 @@ core/scripts/gateway @smartcontractkit/dev-services /contracts/**/*l2ep* @smartcontractkit/bix-ship /contracts/**/*llo-feeds* @smartcontractkit/data-streams-engineers /contracts/**/*operatorforwarder* @smartcontractkit/data-feeds-engineers +/contracts/**/*data-feeds* @smartcontractkit/data-feeds-engineers /contracts/**/*vrf* @smartcontractkit/dev-services /contracts/**/*keystone* @smartcontractkit/keystone @@ -98,6 +99,7 @@ core/scripts/gateway @smartcontractkit/dev-services /contracts/src/v0.8/llo-feeds @smartcontractkit/data-streams-engineers # TODO: mocks folder, folder should be removed and files moved to the correct folders /contracts/src/v0.8/operatorforwarder @smartcontractkit/data-feeds-engineers +/contracts/src/v0.8/data-feeds @smartcontractkit/data-feeds-engineers /contracts/src/v0.8/shared @smartcontractkit/core-solidity /contracts/src/v0.8/vrf @smartcontractkit/dev-services /contracts/src/v0.8/keystone @smartcontractkit/keystone @@ -109,6 +111,7 @@ core/scripts/gateway @smartcontractkit/dev-services /core/gethwrappers/liquiditymanager @smartcontractkit/ccip-onchain /core/gethwrappers/llo-feeds @smartcontractkit/data-streams-engineers /core/gethwrappers/operatorforwarder @smartcontractkit/data-feeds-engineers +/core/gethwrappers/data-feeds @smartcontractkit/data-feeds-engineers /core/gethwrappers/shared @smartcontractkit/core-solidity /core/gethwrappers/workflow @smartcontractkit/dev-services diff --git a/.github/workflows/solidity-foundry.yml b/.github/workflows/solidity-foundry.yml index c91a1abd086..a3e9730e7ac 100644 --- a/.github/workflows/solidity-foundry.yml +++ b/.github/workflows/solidity-foundry.yml @@ -38,7 +38,9 @@ jobs: { "name": "operatorforwarder", "setup": { "run-coverage": true, "min-coverage": 55.7, "run-gas-snapshot": true, "run-forge-fmt": false }}, { "name": "shared", "setup": { "run-coverage": true, "extra-coverage-params": "--no-match-path='*CallWithExactGas*' --ir-minimum", "min-coverage": 32.6, "run-gas-snapshot": true, "run-forge-fmt": false }}, { "name": "vrf", "setup": { "run-coverage": false, "min-coverage": 98.5, "run-gas-snapshot": false, "run-forge-fmt": false }}, - { "name": "workflow", "setup": { "run-coverage": true, "extra-coverage-params": "--ir-minimum", "min-coverage": 96.0, "run-gas-snapshot": true, "run-forge-fmt": true }} + { "name": "workflow", "setup": { "run-coverage": true, "extra-coverage-params": "--ir-minimum", "min-coverage": 96.0, "run-gas-snapshot": true, "run-forge-fmt": true }}, + { "name": "data-feeds", "setup": { "run-coverage": true, "min-coverage": 98.5, "run-gas-snapshot": true, "extra-coverage-params": "--no-match-coverage='WIP*'", "run-forge-fmt": false }} + ] EOF @@ -110,6 +112,8 @@ jobs: - 'contracts/src/v0.8/vendor/**/*.sol' workflow: - 'contracts/src/v0.8/workflow/**/*.sol' + data-feeds: + - 'contracts/src/v0.8/data-feeds/**/*.sol' - name: Detect non-test changes uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 diff --git a/contracts/.changeset/fair-zoos-repeat.md b/contracts/.changeset/fair-zoos-repeat.md new file mode 100644 index 00000000000..3763e3e6629 --- /dev/null +++ b/contracts/.changeset/fair-zoos-repeat.md @@ -0,0 +1,10 @@ +--- +'@chainlink/contracts': minor +--- + +#added Add Data Feeds CRE contracts + + +PR issue: DF-21039 + +Solidity Review issue: DF-21067 \ No newline at end of file diff --git a/contracts/.prettierignore b/contracts/.prettierignore index 483a8cb89db..65ef2b226ce 100644 --- a/contracts/.prettierignore +++ b/contracts/.prettierignore @@ -23,6 +23,7 @@ typechain **/vendor src/v0.8/ccip/** src/v0.8/workflow/** +src/v0.8/data-feeds/** # Ignore TS definition and map files **/**.d.ts diff --git a/contracts/.solhintignore b/contracts/.solhintignore index 7ae5b10d150..f6613c95dea 100644 --- a/contracts/.solhintignore +++ b/contracts/.solhintignore @@ -28,6 +28,7 @@ # Ignore tests / test helpers (for now) ./src/v0.8/automation/mocks ./src/v0.8/automation/testhelpers +./src/v0.8/data-feeds/test/helpers # Ignore Functions v1.0.0 code that was frozen after audit ./src/v0.8/functions/v1_0_0 diff --git a/contracts/.solhintignore-test b/contracts/.solhintignore-test index 137ba9998c7..e6151fe67cb 100644 --- a/contracts/.solhintignore-test +++ b/contracts/.solhintignore-test @@ -11,6 +11,7 @@ ./src/v0.8/liquiditymanager/ ./src/v0.8/keystone/ ./src/v0.8/llo-feeds/ +./src/v0.8/data-feeds/test/helpers/DataFeedsLegacyAggregatorProxy.sol # Ignore Functions v1.0.0 code that was frozen after audit diff --git a/contracts/GNUmakefile b/contracts/GNUmakefile index 0844b6eb5bc..835a712c2d8 100644 --- a/contracts/GNUmakefile +++ b/contracts/GNUmakefile @@ -1,6 +1,6 @@ # ALL_FOUNDRY_PRODUCTS contains a list of all products that have a foundry # profile defined and use the Foundry snapshots. -ALL_FOUNDRY_PRODUCTS = ccip functions keystone l2ep liquiditymanager llo-feeds operatorforwarder shared workflow +ALL_FOUNDRY_PRODUCTS = ccip functions keystone l2ep liquiditymanager llo-feeds operatorforwarder shared workflow data-feeds # To make a snapshot for a specific product, either set the `FOUNDRY_PROFILE` env var # or call the target with `FOUNDRY_PROFILE=product` @@ -65,6 +65,15 @@ ccip-lcov: ../tools/ci/ccip_lcov_prune ./lcov.info ./lcov.info.pruned genhtml -o report lcov.info.pruned --branch-coverage +data-feeds-precommit: export FOUNDRY_PROFILE=data-feeds +.PHONY: data-feeds-precommit +data-feeds-precommit: + forge test + make snapshot + forge fmt + make wrappers + pnpm solhint + # To generate gethwrappers for a specific product, either set the `FOUNDRY_PROFILE` # env var or call the target with `FOUNDRY_PROFILE=product` # This uses FOUNDRY_PROFILE, even though it does support non-foundry products. This diff --git a/contracts/foundry.toml b/contracts/foundry.toml index 6c7c41a2d5b..578ac7e8e19 100644 --- a/contracts/foundry.toml +++ b/contracts/foundry.toml @@ -104,6 +104,13 @@ test = 'src/v0.8/workflow/test' via_ir = true # reconsider using the --via-ir flag if compilation takes too long evm_version = 'paris' +[profile.data-feeds] +optimizer_runs = 10_000 +src = 'src/v0.8/data-feeds' +test = 'src/v0.8/data-feeds/test' +solc_version = '0.8.26' +evm_version = 'paris' + [profile.shared] optimizer_runs = 1_000_000 src = 'src/v0.8/shared' diff --git a/contracts/gas-snapshots/data-feeds.gas-snapshot b/contracts/gas-snapshots/data-feeds.gas-snapshot new file mode 100644 index 00000000000..b310f9be9f0 --- /dev/null +++ b/contracts/gas-snapshots/data-feeds.gas-snapshot @@ -0,0 +1,96 @@ +BundleAggregatorProxyTest:test_aggregator() (gas: 12620) +BundleAggregatorProxyTest:test_bundleDecimals() (gas: 19152) +BundleAggregatorProxyTest:test_confirmAggregatorRevertNotProposed() (gas: 13155) +BundleAggregatorProxyTest:test_confirmAggregatorSuccess() (gas: 32440) +BundleAggregatorProxyTest:test_description() (gas: 20305) +BundleAggregatorProxyTest:test_latestBundle() (gas: 19795) +BundleAggregatorProxyTest:test_latestBundleTimestamp() (gas: 18092) +BundleAggregatorProxyTest:test_proposeAggregator() (gas: 41280) +BundleAggregatorProxyTest:test_version() (gas: 13639) +DataFeedsCacheGasTest:test_bundleDecimals_proxy_gas() (gas: 22286) +DataFeedsCacheGasTest:test_decimals_proxy_gas() (gas: 16912) +DataFeedsCacheGasTest:test_description_proxy_gas() (gas: 20706) +DataFeedsCacheGasTest:test_getAnswer_proxy_gas() (gas: 19151) +DataFeedsCacheGasTest:test_getRoundData_proxy_gas() (gas: 19973) +DataFeedsCacheGasTest:test_getTimestamp_proxy_gas() (gas: 19156) +DataFeedsCacheGasTest:test_latestAnswer_proxy_gas() (gas: 18507) +DataFeedsCacheGasTest:test_latestBundleTimestamp_proxy_gas() (gas: 18484) +DataFeedsCacheGasTest:test_latestBundle_proxy_gas() (gas: 20135) +DataFeedsCacheGasTest:test_latestRoundData_proxy_gas() (gas: 21906) +DataFeedsCacheGasTest:test_latestRound_proxy_gas() (gas: 18628) +DataFeedsCacheGasTest:test_latestTimestamp_proxy_gas() (gas: 18627) +DataFeedsCacheGasTest:test_removeDataIdMappingsForProxies1feed_gas() (gas: 17873) +DataFeedsCacheGasTest:test_removeDataIdMappingsForProxies5feeds_gas() (gas: 43203) +DataFeedsCacheGasTest:test_updateDataIdMappingsForProxies1feed_gas() (gas: 45277) +DataFeedsCacheGasTest:test_updateDataIdMappingsForProxies5feeds_gas() (gas: 97781) +DataFeedsCacheGasTest:test_write_onReport_prices_1_gas() (gas: 74765) +DataFeedsCacheGasTest:test_write_onReport_prices_5_gas() (gas: 336286) +DataFeedsCacheGasTest:test_write_removeFeedConfigs_1_gas() (gas: 52598) +DataFeedsCacheGasTest:test_write_removeFeedConfigs_5_gas() (gas: 232944) +DataFeedsCacheGasTest:test_write_setBundleFeedConfigs_1_gas() (gas: 284044) +DataFeedsCacheGasTest:test_write_setBundleFeedConfigs_5_gas() (gas: 1295817) +DataFeedsCacheGasTest:test_write_setBundleFeedConfigs_with_delete_1_gas() (gas: 91336) +DataFeedsCacheGasTest:test_write_setBundleFeedConfigs_with_delete_5_gas() (gas: 373668) +DataFeedsCacheGasTest:test_write_setDecimalFeedConfigs_1_gas() (gas: 219180) +DataFeedsCacheGasTest:test_write_setDecimalFeedConfigs_5_gas() (gas: 980459) +DataFeedsCacheGasTest:test_write_setDecimalFeedConfigs_with_delete_1_gas() (gas: 74514) +DataFeedsCacheGasTest:test_write_setDecimalFeedConfigs_with_delete_5_gas() (gas: 297007) +DataFeedsCacheTest:testFuzzy_getDataType(bytes16,uint256) (runs: 256, μ: 9492, ~: 9492) +DataFeedsCacheTest:testFuzzy_getDataTypeRevertOutOfBound(bytes16,uint256) (runs: 256, μ: 9275, ~: 9275) +DataFeedsCacheTest:testFuzzy_recoverTokensERC20Success(uint256) (runs: 256, μ: 77137, ~: 77137) +DataFeedsCacheTest:testFuzzy_recoverTokensNativeSuccess(uint256) (runs: 256, μ: 49076, ~: 49076) +DataFeedsCacheTest:test_bundleDecimals() (gas: 282615) +DataFeedsCacheTest:test_decimals() (gas: 221728) +DataFeedsCacheTest:test_description() (gas: 224377) +DataFeedsCacheTest:test_getDataIdForProxy() (gas: 15208) +DataFeedsCacheTest:test_getDataType() (gas: 8885) +DataFeedsCacheTest:test_getFeedMetadata() (gas: 268430) +DataFeedsCacheTest:test_getFeedMetadataRevertFeedNotConfigured() (gas: 13396) +DataFeedsCacheTest:test_getLatestAnswer1() (gas: 307921) +DataFeedsCacheTest:test_getLatestAnswer2() (gas: 578544) +DataFeedsCacheTest:test_getLatestBundle1() (gas: 410719) +DataFeedsCacheTest:test_getLatestBundle2() (gas: 781477) +DataFeedsCacheTest:test_getLatestByFeedId() (gas: 318015) +DataFeedsCacheTest:test_getWorkflowMetaData() (gas: 10161) +DataFeedsCacheTest:test_isFeedAdmin() (gas: 14294) +DataFeedsCacheTest:test_latestAnswer1() (gas: 314086) +DataFeedsCacheTest:test_latestAnswer2() (gas: 589248) +DataFeedsCacheTest:test_latestBundle1() (gas: 420293) +DataFeedsCacheTest:test_latestBundle2() (gas: 798323) +DataFeedsCacheTest:test_onReportInvalidPermission() (gas: 675297) +DataFeedsCacheTest:test_onReportRevertInvalidWorkflowName() (gas: 252356) +DataFeedsCacheTest:test_onReportRevertInvalidWorkflowOwner() (gas: 252408) +DataFeedsCacheTest:test_onReportStaleBundleReport() (gas: 815355) +DataFeedsCacheTest:test_onReportStaleDecimalReport() (gas: 635704) +DataFeedsCacheTest:test_onReportSuccess_BundleReportLength1() (gas: 402715) +DataFeedsCacheTest:test_onReportSuccess_BundleReportLength2() (gas: 765928) +DataFeedsCacheTest:test_onReportSuccess_DecimalReportLength1() (gas: 310107) +DataFeedsCacheTest:test_onReportSuccess_DecimalReportLength2() (gas: 579872) +DataFeedsCacheTest:test_onReportSuccess_EmptyBundleReport() (gas: 251217) +DataFeedsCacheTest:test_onReportSuccess_EmptyDecimalReport() (gas: 241310) +DataFeedsCacheTest:test_onReportSuccess_EmptyReport() (gas: 221809) +DataFeedsCacheTest:test_recoverTokensERC20RevertNoBalance() (gas: 19972) +DataFeedsCacheTest:test_recoverTokensNativeRevertNoBalance() (gas: 11489) +DataFeedsCacheTest:test_recoverTokensRevertUnauthorized() (gas: 13353) +DataFeedsCacheTest:test_removeDataIdMappingsForProxiesSuccess() (gas: 22198) +DataFeedsCacheTest:test_removeDataIdMappingsForProxiesSuccess_and_call_decimals() (gas: 24859) +DataFeedsCacheTest:test_removeFeedAdminSuccess() (gas: 26969) +DataFeedsCacheTest:test_removeFeedsRevertInvalidSender() (gas: 12166) +DataFeedsCacheTest:test_removeFeedsRevertNotConfiguredFeed() (gas: 20111) +DataFeedsCacheTest:test_removeFeedsSuccess() (gas: 193878) +DataFeedsCacheTest:test_setBundleFeedConfigsRevertInvalidConfigsLengthDecimals() (gas: 32424) +DataFeedsCacheTest:test_setBundleFeedConfigs_setAgainWithClear() (gas: 961706) +DataFeedsCacheTest:test_setDecimalFeedConfigs_setAgainWithClear() (gas: 744404) +DataFeedsCacheTest:test_setFeedAdminRevertZeroAddress() (gas: 11343) +DataFeedsCacheTest:test_setFeedConfigsRevertEmptyConfig() (gas: 55665) +DataFeedsCacheTest:test_setFeedConfigsRevertInvalidConfigsLengthDescriptions() (gas: 48308) +DataFeedsCacheTest:test_setFeedConfigsRevertInvalidWorkflowMetadata() (gas: 94046) +DataFeedsCacheTest:test_setFeedConfigsRevertUnauthorizedFeedAdmin() (gas: 43091) +DataFeedsCacheTest:test_setFeedConfigsRevertZeroDataId() (gas: 43243) +DataFeedsCacheTest:test_setFeedConfigsSuccess() (gas: 220732) +DataFeedsCacheTest:test_supportsInterface() (gas: 8637) +DataFeedsCacheTest:test_updateDataIdMappingsForProxiesRevertInvalidLengths() (gas: 12232) +DataFeedsCacheTest:test_updateDataIdMappingsForProxiesRevertUnauthorizedOwner() (gas: 13207) +DataFeedsCacheTest:test_updateDataIdMappingsForProxiesSuccess() (gas: 21337) +DataFeedsCacheTest:test_updateDataIdMappingsForProxies_and_RevertOnWrongCaller() (gas: 25810) +DataFeedsCacheTest:test_updateDataIdMappingsForProxies_and_call_decimals() (gas: 55054) \ No newline at end of file diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 5df1fc2bd76..dcebb04f06b 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -78,6 +78,13 @@ let config = { evmVersion: 'paris', }, }, + { + version: '0.8.26', + settings: { + ...COMPILER_SETTINGS, + evmVersion: 'paris', + }, + }, ], overrides: { 'src/v0.8/vrf/VRFCoordinatorV2.sol': { diff --git a/contracts/scripts/native_solc_compile_all b/contracts/scripts/native_solc_compile_all index a66456bb6d5..33b7c6e11b2 100755 --- a/contracts/scripts/native_solc_compile_all +++ b/contracts/scripts/native_solc_compile_all @@ -12,7 +12,7 @@ python3 -m pip install --require-hashes -r $SCRIPTPATH/requirements.txt # 6 and 7 are legacy contracts, for each other product we have a native_solc_compile_all_$product script # These scripts can be run individually, or all together with this script. # To add new CL products, simply write a native_solc_compile_all_$product script and add it to the list below. -for product in automation events_mock feeds functions keystone llo-feeds operatorforwarder shared vrf ccip liquiditymanager workflow +for product in automation events_mock feeds functions keystone llo-feeds operatorforwarder shared vrf ccip liquiditymanager workflow data-feeds do $SCRIPTPATH/native_solc_compile_all_$product done diff --git a/contracts/scripts/native_solc_compile_all_data-feeds b/contracts/scripts/native_solc_compile_all_data-feeds new file mode 100755 index 00000000000..669422010df --- /dev/null +++ b/contracts/scripts/native_solc_compile_all_data-feeds @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -e + +echo " ┌────────────────────────────────────────────────────┐" +echo " │ Compiling Data Feeds contracts... │" +echo " └────────────────────────────────────────────────────┘" + + +PROJECT="data-feeds" + +CONTRACTS_DIR="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; cd ../ && pwd -P )" +echo "Contracts directory: $CONTRACTS_DIR" + +export FOUNDRY_PROFILE="$PROJECT" + +compileContract() { + local contract + contract=$(basename "$1") + echo "Compiling" "$contract" + + local command + command="forge build $CONTRACTS_DIR/src/v0.8/$PROJECT/"$1.sol" \ + --root $CONTRACTS_DIR \ + --extra-output-files bin abi \ + -o $CONTRACTS_DIR/solc/$PROJECT/$contract" + + $command +} + + +compileContract BundleAggregatorProxy +compileContract DataFeedsCache diff --git a/contracts/snapshots/DataFeedsCacheGasTest.json b/contracts/snapshots/DataFeedsCacheGasTest.json new file mode 100644 index 00000000000..05abdd8b357 --- /dev/null +++ b/contracts/snapshots/DataFeedsCacheGasTest.json @@ -0,0 +1,30 @@ +{ + "test_bundleDecimals_proxy_gas": "18742", + "test_decimals_proxy_gas": "13389", + "test_description_proxy_gas": "17161", + "test_getAnswer_proxy_gas": "15650", + "test_getRoundData_proxy_gas": "16427", + "test_getTimestamp_proxy_gas": "15653", + "test_latestAnswer_proxy_gas": "15005", + "test_latestBundleTimestamp_proxy_gas": "14942", + "test_latestBundle_proxy_gas": "16631", + "test_latestRoundData_proxy_gas": "18360", + "test_latestRound_proxy_gas": "15105", + "test_latestTimestamp_proxy_gas": "15081", + "test_removeDataIdMappingsForProxies1feed_gas": "19152", + "test_removeDataIdMappingsForProxies5feeds_gas": "55726", + "test_updateDataIdMappingsForProxies1feed_gas": "41733", + "test_updateDataIdMappingsForProxies5feeds_gas": "94263", + "test_write_onReport_prices_1_gas": "71259", + "test_write_onReport_prices_5_gas": "332760", + "test_write_removeFeedConfigs_1_gas": "67494", + "test_write_removeFeedConfigs_5_gas": "292926", + "test_write_setBundleFeedConfigs_1_gas": "280503", + "test_write_setBundleFeedConfigs_5_gas": "1292298", + "test_write_setBundleFeedConfigs_with_delete_1_gas": "115794", + "test_write_setBundleFeedConfigs_with_delete_5_gas": "468786", + "test_write_setDecimalFeedConfigs_1_gas": "215660", + "test_write_setDecimalFeedConfigs_5_gas": "976917", + "test_write_setDecimalFeedConfigs_with_delete_1_gas": "94866", + "test_write_setDecimalFeedConfigs_with_delete_5_gas": "372982" +} diff --git a/contracts/src/v0.8/data-feeds/BundleAggregatorProxy.sol b/contracts/src/v0.8/data-feeds/BundleAggregatorProxy.sol new file mode 100644 index 00000000000..434fd57af6c --- /dev/null +++ b/contracts/src/v0.8/data-feeds/BundleAggregatorProxy.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol"; +import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol"; +import {IBundleAggregator} from "./interfaces/IBundleAggregator.sol"; +import {IBundleAggregatorProxy} from "./interfaces/IBundleAggregatorProxy.sol"; + +/// @title A trusted proxy for updating where current answers are read from +/// @notice This contract provides a consistent address for the +/// CurrentAnswerInterface but delegates where it reads from to the owner, who is +/// trusted to update it. +contract BundleAggregatorProxy is IBundleAggregatorProxy, ITypeAndVersion, ConfirmedOwner { + string public constant override typeAndVersion = "BundleAggregatorProxy 1.0.0"; + + IBundleAggregator private s_currentAggregator; + IBundleAggregator private s_proposedAggregator; + + event AggregatorProposed(address indexed current, address indexed proposed); + event AggregatorConfirmed(address indexed previous, address indexed latest); + + error AggregatorNotProposed(address aggregator); + + constructor(address aggregatorAddress, address owner) ConfirmedOwner(owner) { + s_currentAggregator = IBundleAggregator(aggregatorAddress); + } + + function latestBundle() external view returns (bytes memory bundle) { + return s_currentAggregator.latestBundle(); + } + + function latestBundleTimestamp() external view returns (uint256 timestamp) { + return s_currentAggregator.latestBundleTimestamp(); + } + + /// @notice returns the current aggregator address. + function aggregator() external view returns (address) { + return address(s_currentAggregator); + } + + /// @notice represents the number of decimals the aggregator responses represent. + function bundleDecimals() external view override returns (uint8[] memory decimals) { + return s_currentAggregator.bundleDecimals(); + } + + /// @notice the version number representing the type of aggregator the proxy + /// points to. + function version() external view override returns (uint256 aggregatorVersion) { + return s_currentAggregator.version(); + } + + /// @notice returns the description of the aggregator the proxy points to. + function description() external view returns (string memory aggregatorDescription) { + return s_currentAggregator.description(); + } + + /// @notice returns the current proposed aggregator + function proposedAggregator() external view returns (address proposedAggregatorAddress) { + return address(s_proposedAggregator); + } + + /// @notice Allows the owner to propose a new address for the aggregator + /// @param aggregatorAddress The new address for the aggregator contract + function proposeAggregator( + address aggregatorAddress + ) external onlyOwner { + s_proposedAggregator = IBundleAggregator(aggregatorAddress); + emit AggregatorProposed(address(s_currentAggregator), aggregatorAddress); + } + + /// @notice Allows the owner to confirm and change the address + /// to the proposed aggregator + /// @dev Reverts if the given address doesn't match what was previously proposed + /// @param aggregatorAddress The new address for the aggregator contract + function confirmAggregator( + address aggregatorAddress + ) external onlyOwner { + if (aggregatorAddress != address(s_proposedAggregator)) { + revert AggregatorNotProposed(aggregatorAddress); + } + address previousAggregator = address(s_currentAggregator); + delete s_proposedAggregator; + s_currentAggregator = IBundleAggregator(aggregatorAddress); + emit AggregatorConfirmed(previousAggregator, aggregatorAddress); + } +} diff --git a/contracts/src/v0.8/data-feeds/DataFeedsCache.sol b/contracts/src/v0.8/data-feeds/DataFeedsCache.sol new file mode 100644 index 00000000000..1d4603358f6 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/DataFeedsCache.sol @@ -0,0 +1,755 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {IReceiver} from "../keystone/interfaces/IReceiver.sol"; +import {OwnerIsCreator} from "../shared/access/OwnerIsCreator.sol"; +import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol"; +import {IDataFeedsCache} from "./interfaces/IDataFeedsCache.sol"; +import {ITokenRecover} from "./interfaces/ITokenRecover.sol"; + +import {IERC165} from "../vendor/openzeppelin-solidity/v5.0.2/contracts/interfaces/IERC165.sol"; +import {IERC20} from "../vendor/openzeppelin-solidity/v5.0.2/contracts/token/ERC20/IERC20.sol"; +import {SafeERC20} from "../vendor/openzeppelin-solidity/v5.0.2/contracts/token/ERC20/utils/SafeERC20.sol"; + +contract DataFeedsCache is IDataFeedsCache, IReceiver, ITokenRecover, ITypeAndVersion, OwnerIsCreator { + using SafeERC20 for IERC20; + + string public constant override typeAndVersion = "DataFeedsCache 1.0.0"; + + // solhint-disable-next-line + uint256 public constant override version = 7; + + /// Cache State + + struct WorkflowMetadata { + address allowedSender; // Address of the sender allowed to send new reports + address allowedWorkflowOwner; // ─╮ Address of the workflow owner + bytes10 allowedWorkflowName; // ──╯ Name of the workflow + } + + struct FeedConfig { + uint8[] bundleDecimals; // Only appliciable to Bundle reports - Decimal reports have decimals encoded into the DataId. + string description; // Description of the feed (e.g. "LINK / USD") + WorkflowMetadata[] workflowMetadata; // Metadata for the feed + } + + struct ReceivedBundleReport { + bytes32 dataId; // Data ID of the feed from the received report + uint32 timestamp; // Timestamp of the feed from the received report + bytes bundle; // Report data in raw bytes + } + + struct ReceivedDecimalReport { + bytes32 dataId; // Data ID of the feed from the received report + uint32 timestamp; // ─╮ Timestamp of the feed from the received report + uint224 answer; // ───╯ Report data in uint224 + } + + struct StoredBundleReport { + bytes bundle; // The latest bundle report stored for a feed + uint32 timestamp; // The timestamp of the latest bundle report + } + + struct StoredDecimalReport { + uint224 answer; // ───╮ The latest decimal report stored for a feed + uint32 timestamp; // ─╯ The timestamp of the latest decimal report + } + + /// The message sender determines which feed is being requested, as each proxy has a single associated feed + mapping(address aggProxy => bytes16 dataId) private s_aggregatorProxyToDataId; + + /// The latest decimal reports for each decimal feed. This will always equal s_decimalReports[s_dataIdToRoundId[dataId]][dataId] + mapping(bytes16 dataId => StoredDecimalReport) private s_latestDecimalReports; + + /// Decimal reports for each feed, per round + mapping(uint256 roundId => mapping(bytes16 dataId => StoredDecimalReport)) private s_decimalReports; + + /// The latest bundle reports for each bundle feed + mapping(bytes16 dataId => StoredBundleReport) private s_latestBundleReports; + + /// The latest round id for each feed + mapping(bytes16 dataId => uint256 roundId) private s_dataIdToRoundId; + + /// Addresses that are permitted to configure all feeds + mapping(address feedAdmin => bool isFeedAdmin) private s_feedAdmins; + + mapping(bytes16 dataId => FeedConfig) private s_feedConfigs; + + /// Whether a given Sender and Workflow have permission to write feed updates. + /// reportHash is the keccak256 hash of the abi.encoded(dataId, sender, workflowOwner and workflowName) + mapping(bytes32 reportHash => bool) private s_writePermissions; + + event BundleReportUpdated(bytes16 indexed dataId, uint256 indexed timestamp, bytes bundle); + event DecimalReportUpdated( + bytes16 indexed dataId, uint256 indexed roundId, uint256 indexed timestamp, uint224 answer + ); + event DecimalFeedConfigSet( + bytes16 indexed dataId, uint8 decimals, string description, WorkflowMetadata[] workflowMetadata + ); + event BundleFeedConfigSet( + bytes16 indexed dataId, uint8[] decimals, string description, WorkflowMetadata[] workflowMetadata + ); + event FeedConfigRemoved(bytes16 indexed dataId); + event TokenRecovered(address indexed token, address indexed to, uint256 amount); + + event FeedAdminSet(address indexed feedAdmin, bool indexed isAdmin); + + event ProxyDataIdRemoved(address indexed proxy, bytes16 indexed dataId); + event ProxyDataIdUpdated(address indexed proxy, bytes16 indexed dataId); + + event InvalidUpdatePermission(bytes16 indexed dataId, address sender, address workflowOwner, bytes10 workflowName); + event StaleDecimalReport(bytes16 indexed dataId, uint256 reportTimestamp, uint256 latestTimestamp); + event StaleBundleReport(bytes16 indexed dataId, uint256 reportTimestamp, uint256 latestTimestamp); + + error ArrayLengthMismatch(); + error EmptyConfig(); + error ErrorSendingNative(address to, uint256 amount, bytes data); + error FeedNotConfigured(bytes16 dataId); + error InsufficientBalance(uint256 balance, uint256 requiredBalance); + error InvalidAddress(address addr); + error InvalidDataId(); + error InvalidWorkflowName(bytes10 workflowName); + error UnauthorizedCaller(address caller); + error NoMappingForSender(address proxy); + + modifier onlyFeedAdmin() { + if (!s_feedAdmins[msg.sender]) revert UnauthorizedCaller(msg.sender); + _; + } + + /// @inheritdoc IERC165 + function supportsInterface( + bytes4 interfaceId + ) public pure returns (bool) { + return ( + interfaceId == type(IDataFeedsCache).interfaceId || interfaceId == type(IERC165).interfaceId + || interfaceId == type(IReceiver).interfaceId || interfaceId == type(ITokenRecover).interfaceId + || interfaceId == type(ITypeAndVersion).interfaceId + ); + } + + /// @notice Get the workflow metadata of a feed + /// @param dataId data ID of the feed + /// @param startIndex The cursor to start fetching the metadata from + /// @param maxCount The number of metadata to fetch + /// @return workflowMetadata The metadata of the feed + function getFeedMetadata( + bytes16 dataId, + uint256 startIndex, + uint256 maxCount + ) external view returns (WorkflowMetadata[] memory workflowMetadata) { + FeedConfig storage feedConfig = s_feedConfigs[dataId]; + + uint256 workflowMetadataLength = feedConfig.workflowMetadata.length; + + if (workflowMetadataLength == 0) { + revert FeedNotConfigured(dataId); + } + + if (startIndex >= workflowMetadataLength) return new WorkflowMetadata[](0); + uint256 endIndex = startIndex + maxCount; + endIndex = endIndex > workflowMetadataLength || maxCount == 0 ? workflowMetadataLength : endIndex; + + workflowMetadata = new WorkflowMetadata[](endIndex - startIndex); + for (uint256 idx; idx < workflowMetadata.length; idx++) { + workflowMetadata[idx] = feedConfig.workflowMetadata[idx + startIndex]; + } + + return workflowMetadata; + } + + /// @notice Checks to see if this data ID, msg.sender, workflow owner, and workflow name are permissioned + /// @param dataId The data ID for the feed + /// @param workflowMetadata workflow metadata + function checkFeedPermission( + bytes16 dataId, + WorkflowMetadata memory workflowMetadata + ) external view returns (bool hasPermission) { + bytes32 permission = _createReportHash( + dataId, + workflowMetadata.allowedSender, + workflowMetadata.allowedWorkflowOwner, + workflowMetadata.allowedWorkflowName + ); + return s_writePermissions[permission]; + } + + // ================================================================ + // │ Contract Config Interface │ + // ================================================================ + + /// @notice Initializes the config for a decimal feed + /// @param dataIds The data IDs of the feeds to configure + /// @param descriptions The descriptions of the feeds + /// @param workflowMetadata List of workflow metadata (owners, senders, and names) for every feed + function setDecimalFeedConfigs( + bytes16[] calldata dataIds, + string[] calldata descriptions, + WorkflowMetadata[] calldata workflowMetadata + ) external onlyFeedAdmin { + if (workflowMetadata.length == 0 || dataIds.length == 0) { + revert EmptyConfig(); + } + + if (dataIds.length != descriptions.length) { + revert ArrayLengthMismatch(); + } + + for (uint256 i; i < dataIds.length; ++i) { + bytes16 dataId = dataIds[i]; + if (dataId == bytes16(0)) revert InvalidDataId(); + FeedConfig storage feedConfig = s_feedConfigs[dataId]; + + if (feedConfig.workflowMetadata.length > 0) { + // Feed is already configured, remove the previous config + for (uint256 j; j < feedConfig.workflowMetadata.length; ++j) { + WorkflowMetadata memory feedCurrentWorkflowMetadata = feedConfig.workflowMetadata[j]; + bytes32 reportHash = _createReportHash( + dataId, + feedCurrentWorkflowMetadata.allowedSender, + feedCurrentWorkflowMetadata.allowedWorkflowOwner, + feedCurrentWorkflowMetadata.allowedWorkflowName + ); + delete s_writePermissions[reportHash]; + } + + delete s_feedConfigs[dataId]; + + emit FeedConfigRemoved(dataId); + } + + for (uint256 j; j < workflowMetadata.length; ++j) { + WorkflowMetadata memory feedWorkflowMetadata = workflowMetadata[j]; + // Do those checks only once for the first data id + if (i == 0) { + if (feedWorkflowMetadata.allowedSender == address(0)) { + revert InvalidAddress(feedWorkflowMetadata.allowedSender); + } + if (feedWorkflowMetadata.allowedWorkflowOwner == address(0)) { + revert InvalidAddress(feedWorkflowMetadata.allowedWorkflowOwner); + } + if (feedWorkflowMetadata.allowedWorkflowName == bytes10(0)) { + revert InvalidWorkflowName(feedWorkflowMetadata.allowedWorkflowName); + } + } + + bytes32 reportHash = _createReportHash( + dataId, + feedWorkflowMetadata.allowedSender, + feedWorkflowMetadata.allowedWorkflowOwner, + feedWorkflowMetadata.allowedWorkflowName + ); + s_writePermissions[reportHash] = true; + feedConfig.workflowMetadata.push(feedWorkflowMetadata); + } + + feedConfig.description = descriptions[i]; + + emit DecimalFeedConfigSet({ + dataId: dataId, + decimals: _getDecimals(dataId), + description: descriptions[i], + workflowMetadata: workflowMetadata + }); + } + } + + /// @notice Initializes the config for a bundle feed + /// @param dataIds The data IDs of the feeds to configure + /// @param descriptions The descriptions of the feeds + /// @param decimalsMatrix The number of decimals for each data point in the bundle for the feed + /// @param workflowMetadata List of workflow metadata (owners, senders, and names) for every feed + function setBundleFeedConfigs( + bytes16[] calldata dataIds, + string[] calldata descriptions, + uint8[][] calldata decimalsMatrix, + WorkflowMetadata[] calldata workflowMetadata + ) external onlyFeedAdmin { + if (workflowMetadata.length == 0 || dataIds.length == 0) { + revert EmptyConfig(); + } + + if (dataIds.length != descriptions.length || dataIds.length != decimalsMatrix.length) { + revert ArrayLengthMismatch(); + } + + for (uint256 i; i < dataIds.length; ++i) { + bytes16 dataId = dataIds[i]; + if (dataId == bytes16(0)) revert InvalidDataId(); + FeedConfig storage feedConfig = s_feedConfigs[dataId]; + + if (feedConfig.workflowMetadata.length > 0) { + // Feed is already configured, remove the previous config + for (uint256 j; j < feedConfig.workflowMetadata.length; ++j) { + WorkflowMetadata memory feedCurrentWorkflowMetadata = feedConfig.workflowMetadata[j]; + bytes32 reportHash = _createReportHash( + dataId, + feedCurrentWorkflowMetadata.allowedSender, + feedCurrentWorkflowMetadata.allowedWorkflowOwner, + feedCurrentWorkflowMetadata.allowedWorkflowName + ); + delete s_writePermissions[reportHash]; + } + + delete s_feedConfigs[dataId]; + + emit FeedConfigRemoved(dataId); + } + + for (uint256 j; j < workflowMetadata.length; ++j) { + WorkflowMetadata memory feedWorkflowMetadata = workflowMetadata[j]; + // Do those checks only once for the first data id + if (i == 0) { + if (feedWorkflowMetadata.allowedSender == address(0)) { + revert InvalidAddress(feedWorkflowMetadata.allowedSender); + } + if (feedWorkflowMetadata.allowedWorkflowOwner == address(0)) { + revert InvalidAddress(feedWorkflowMetadata.allowedWorkflowOwner); + } + if (feedWorkflowMetadata.allowedWorkflowName == bytes10(0)) { + revert InvalidWorkflowName(feedWorkflowMetadata.allowedWorkflowName); + } + } + + bytes32 reportHash = _createReportHash( + dataId, + feedWorkflowMetadata.allowedSender, + feedWorkflowMetadata.allowedWorkflowOwner, + feedWorkflowMetadata.allowedWorkflowName + ); + s_writePermissions[reportHash] = true; + feedConfig.workflowMetadata.push(feedWorkflowMetadata); + } + + feedConfig.bundleDecimals = decimalsMatrix[i]; + feedConfig.description = descriptions[i]; + + emit BundleFeedConfigSet({ + dataId: dataId, + decimals: decimalsMatrix[i], + description: descriptions[i], + workflowMetadata: workflowMetadata + }); + } + } + + /// @notice Removes feeds and all associated data, for a set of feeds + /// @param dataIds And array of data IDs to delete the data and configs of + function removeFeedConfigs( + bytes16[] calldata dataIds + ) external onlyFeedAdmin { + for (uint256 i; i < dataIds.length; ++i) { + bytes16 dataId = dataIds[i]; + if (s_feedConfigs[dataId].workflowMetadata.length == 0) revert FeedNotConfigured(dataId); + + for (uint256 j; j < s_feedConfigs[dataId].workflowMetadata.length; ++j) { + WorkflowMetadata memory feedWorkflowMetadata = s_feedConfigs[dataId].workflowMetadata[j]; + bytes32 reportHash = _createReportHash( + dataId, + feedWorkflowMetadata.allowedSender, + feedWorkflowMetadata.allowedWorkflowOwner, + feedWorkflowMetadata.allowedWorkflowName + ); + delete s_writePermissions[reportHash]; + } + + delete s_feedConfigs[dataId]; + + emit FeedConfigRemoved(dataId); + } + } + + /// @notice Sets a feed admin for all feeds, only callable by the Owner + /// @param feedAdmin The feed admin + function setFeedAdmin(address feedAdmin, bool isAdmin) external onlyOwner { + if (feedAdmin == address(0)) revert InvalidAddress(feedAdmin); + + s_feedAdmins[feedAdmin] = isAdmin; + emit FeedAdminSet(feedAdmin, isAdmin); + } + + /// @notice Returns a bool is an address has feed admin permission for all feeds + /// @param feedAdmin The feed admin + /// @return isFeedAdmin bool if the address is the feed admin for all feeds + function isFeedAdmin( + address feedAdmin + ) external view returns (bool) { + return s_feedAdmins[feedAdmin]; + } + + /// @inheritdoc IDataFeedsCache + function updateDataIdMappingsForProxies( + address[] calldata proxies, + bytes16[] calldata dataIds + ) external onlyFeedAdmin { + uint256 numberOfProxies = proxies.length; + if (numberOfProxies != dataIds.length) revert ArrayLengthMismatch(); + + for (uint256 i; i < numberOfProxies; i++) { + s_aggregatorProxyToDataId[proxies[i]] = dataIds[i]; + + emit ProxyDataIdUpdated(proxies[i], dataIds[i]); + } + } + + /// @inheritdoc IDataFeedsCache + function getDataIdForProxy( + address proxy + ) external view returns (bytes16 dataId) { + return s_aggregatorProxyToDataId[proxy]; + } + + /// @inheritdoc IDataFeedsCache + function removeDataIdMappingsForProxies( + address[] calldata proxies + ) external onlyFeedAdmin { + uint256 numberOfProxies = proxies.length; + + for (uint256 i; i < numberOfProxies; i++) { + address proxy = proxies[i]; + bytes16 dataId = s_aggregatorProxyToDataId[proxy]; + delete s_aggregatorProxyToDataId[proxy]; + emit ProxyDataIdRemoved(proxy, dataId); + } + } + + // ================================================================ + // │ Token Transfer Interface │ + // ================================================================ + + /// @inheritdoc ITokenRecover + function recoverTokens(IERC20 token, address to, uint256 amount) external onlyOwner { + if (address(token) == address(0)) { + if (amount > address(this).balance) { + revert InsufficientBalance(address(this).balance, amount); + } + (bool success, bytes memory data) = to.call{value: amount}(""); + if (!success) revert ErrorSendingNative(to, amount, data); + } else { + if (amount > token.balanceOf(address(this))) { + revert InsufficientBalance(token.balanceOf(address(this)), amount); + } + token.safeTransfer(to, amount); + } + emit TokenRecovered(address(token), to, amount); + } + + // ================================================================ + // │ Cache Update Interface │ + // ================================================================ + + /// @inheritdoc IReceiver + function onReport(bytes calldata metadata, bytes calldata report) external { + (address workflowOwner, bytes10 workflowName) = _getWorkflowMetaData(metadata); + + // The first 32 bytes is the offset to the array + // The second 32 bytes is the length of the array + uint256 numReports = uint256(bytes32(report[32:64])); + + // Decimal reports contain 96 bytes per report + // The total length should equal to the sum of: + // 32 bytes for the offset + // 32 bytes for the number of reports + // the number of reports times 96 + if (report.length == numReports * 96 + 64) { + ReceivedDecimalReport[] memory decodedDecimalReports = abi.decode(report, (ReceivedDecimalReport[])); + for (uint256 i; i < numReports; ++i) { + ReceivedDecimalReport memory decodedDecimalReport = decodedDecimalReports[i]; + // single dataId can have multiple permissions, to be updated by multiple Workflows + bytes16 dataId = bytes16(decodedDecimalReport.dataId); + bytes32 permission = _createReportHash(dataId, msg.sender, workflowOwner, workflowName); + if (!s_writePermissions[permission]) { + emit InvalidUpdatePermission(dataId, msg.sender, workflowOwner, workflowName); + continue; + } + + if (decodedDecimalReport.timestamp <= s_latestDecimalReports[dataId].timestamp) { + emit StaleDecimalReport(dataId, decodedDecimalReport.timestamp, s_latestDecimalReports[dataId].timestamp); + continue; + } + + StoredDecimalReport memory decimalReport = + StoredDecimalReport({answer: decodedDecimalReport.answer, timestamp: decodedDecimalReport.timestamp}); + + uint256 roundId = ++s_dataIdToRoundId[dataId]; + + s_latestDecimalReports[dataId] = decimalReport; + s_decimalReports[roundId][dataId] = decimalReport; + + emit DecimalReportUpdated(dataId, roundId, decimalReport.timestamp, decimalReport.answer); + + // Needed for DF1 backward compatibility + emit NewRound(roundId, address(0), decodedDecimalReport.timestamp); + emit AnswerUpdated(int256(uint256(decodedDecimalReport.answer)), roundId, block.timestamp); + } + } + // Bundle reports contain more bytes for the offsets + // The total length should equal to the sum of: + // 32 bytes for the offset + // 32 bytes for the number of reports + // the number of reports times 224 + else { + //For byte reports decode using ReceivedFeedReportBundle struct + ReceivedBundleReport[] memory decodedBundleReports = abi.decode(report, (ReceivedBundleReport[])); + for (uint256 i; i < decodedBundleReports.length; ++i) { + ReceivedBundleReport memory decodedBundleReport = decodedBundleReports[i]; + bytes16 dataId = bytes16(decodedBundleReport.dataId); + // same dataId can have multiple permissions + bytes32 permission = _createReportHash(dataId, msg.sender, workflowOwner, workflowName); + if (!s_writePermissions[permission]) { + emit InvalidUpdatePermission(dataId, msg.sender, workflowOwner, workflowName); + continue; + } + + if (decodedBundleReport.timestamp <= s_latestBundleReports[dataId].timestamp) { + emit StaleBundleReport(dataId, decodedBundleReport.timestamp, s_latestBundleReports[dataId].timestamp); + continue; + } + + StoredBundleReport memory bundleReport = + StoredBundleReport({bundle: decodedBundleReport.bundle, timestamp: decodedBundleReport.timestamp}); + + s_latestBundleReports[dataId] = bundleReport; + + emit BundleReportUpdated(dataId, bundleReport.timestamp, bundleReport.bundle); + } + } + } + // ================================================================ + // │ Helper Methods │ + // ================================================================ + + /// @notice Gets the Decimals of the feed from the data Id + /// @param dataId The data ID for the feed + /// @return feedDecimals The number of decimals the feed has + function _getDecimals( + bytes16 dataId + ) internal pure returns (uint8 feedDecimals) { + // Get the report type from data id. Report type has index of 7 + bytes1 reportType = _getDataType(dataId, 7); + + // For decimal reports convert to uint8, then shift + if (reportType >= hex"20" && reportType <= hex"60") { + return uint8(reportType) - 32; + } + + // If not decimal type, return 0 + return 0; + } + + /// @notice Extracts the workflow name and the workflow owner from the metadata parameter of onReport + /// @param metadata The metadata in bytes format + /// @return workflowOwner The owner of the workflow + /// @return workflowName The name of the workflow + function _getWorkflowMetaData( + bytes memory metadata + ) internal pure returns (address, bytes10) { + address workflowOwner; + bytes10 workflowName; + // (first 32 bytes contain length of the byte array) + // workflow_cid // offset 32, size 32 + // workflow_name // offset 64, size 10 + // workflow_owner // offset 74, size 20 + // report_name // offset 94, size 2 + assembly { + // no shifting needed for bytes10 type + workflowName := mload(add(metadata, 64)) + // shift right by 12 bytes to get the actual value + workflowOwner := shr(mul(12, 8), mload(add(metadata, 74))) + } + return (workflowOwner, workflowName); + } + + /// @notice Extracts a byte from the data ID, to check data types + /// @param dataId The data ID for the feed + /// @param index The index of the byte to extract from the data Id + /// @return dataType result The keccak256 hash of the abi.encoded inputs + function _getDataType(bytes16 dataId, uint256 index) internal pure returns (bytes1 dataType) { + // Convert bytes16 to bytes + return abi.encodePacked(dataId)[index]; + } + + /// @notice Creates a report hash used to permission write access + /// @param dataId The data ID for the feed + /// @param sender The msg.sender of the transaction calling into onReport + /// @param workflowOwner The owner of the workflow + /// @param workflowName The name of the workflow + /// @return reportHash The keccak256 hash of the abi.encoded inputs + function _createReportHash( + bytes16 dataId, + address sender, + address workflowOwner, + bytes10 workflowName + ) internal pure returns (bytes32) { + return keccak256(abi.encode(dataId, sender, workflowOwner, workflowName)); + } + + // ================================================================ + // │ Data Access Interface │ + // ================================================================ + + /// Bundle Feed Interface + + function latestBundle() external view returns (bytes memory bundle) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return (s_latestBundleReports[dataId].bundle); + } + + function bundleDecimals() external view returns (uint8[] memory bundleFeedDecimals) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return s_feedConfigs[dataId].bundleDecimals; + } + + function latestBundleTimestamp() external view returns (uint256 timestamp) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return s_latestBundleReports[dataId].timestamp; + } + + /// AggregatorInterface + + function latestAnswer() external view returns (int256 answer) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return int256(uint256(s_latestDecimalReports[dataId].answer)); + } + + function latestTimestamp() external view returns (uint256 timestamp) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return s_latestDecimalReports[dataId].timestamp; + } + + function latestRound() external view returns (uint256 round) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return s_dataIdToRoundId[dataId]; + } + + function getAnswer( + uint256 roundId + ) external view returns (int256 answer) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return int256(uint256(s_decimalReports[roundId][dataId].answer)); + } + + function getTimestamp( + uint256 roundId + ) external view returns (uint256 timestamp) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return s_decimalReports[roundId][dataId].timestamp; + } + + /// AggregatorV3Interface + + function decimals() external view returns (uint8 feedDecimals) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + return _getDecimals(dataId); + } + + function description() external view returns (string memory feedDescription) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + return s_feedConfigs[dataId].description; + } + + function getRoundData( + uint80 roundId + ) external view returns (uint80 id, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + uint256 timestamp = s_decimalReports[uint256(roundId)][dataId].timestamp; + + return (roundId, int256(uint256(s_decimalReports[uint256(roundId)][dataId].answer)), timestamp, timestamp, roundId); + } + + function latestRoundData() + external + view + returns (uint80 id, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + bytes16 dataId = s_aggregatorProxyToDataId[msg.sender]; + if (dataId == bytes16(0)) revert NoMappingForSender(msg.sender); + + uint80 roundId = uint80(s_dataIdToRoundId[dataId]); + uint256 timestamp = s_latestDecimalReports[dataId].timestamp; + + return (roundId, int256(uint256(s_latestDecimalReports[dataId].answer)), timestamp, timestamp, roundId); + } + + /// Direct access + function getLatestBundle( + bytes16 dataId + ) external view returns (bytes memory bundle) { + if (dataId == bytes16(0)) revert InvalidDataId(); + return (s_latestBundleReports[dataId].bundle); + } + + function getBundleDecimals( + bytes16 dataId + ) external view returns (uint8[] memory bundleFeedDecimals) { + if (dataId == bytes16(0)) revert InvalidDataId(); + return s_feedConfigs[dataId].bundleDecimals; + } + + function getLatestBundleTimestamp( + bytes16 dataId + ) external view returns (uint256 timestamp) { + if (dataId == bytes16(0)) revert InvalidDataId(); + return s_latestBundleReports[dataId].timestamp; + } + + function getLatestAnswer( + bytes16 dataId + ) external view returns (int256 answer) { + if (dataId == bytes16(0)) revert InvalidDataId(); + return int256(uint256(s_latestDecimalReports[dataId].answer)); + } + + function getLatestTimestamp( + bytes16 dataId + ) external view returns (uint256 timestamp) { + if (dataId == bytes16(0)) revert InvalidDataId(); + return s_latestDecimalReports[dataId].timestamp; + } + + function getLatestRoundData( + bytes16 dataId + ) external view returns (uint80 id, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) { + if (dataId == bytes16(0)) revert InvalidDataId(); + + uint80 roundId = uint80(s_dataIdToRoundId[dataId]); + uint256 timestamp = s_latestDecimalReports[dataId].timestamp; + + return (roundId, int256(uint256(s_latestDecimalReports[dataId].answer)), timestamp, timestamp, roundId); + } + + function getDecimals( + bytes16 dataId + ) external pure returns (uint8 feedDecimals) { + if (dataId == bytes16(0)) revert InvalidDataId(); + return _getDecimals(dataId); + } + + function getDescription( + bytes16 dataId + ) external view returns (string memory feedDescription) { + if (dataId == bytes16(0)) revert InvalidDataId(); + return s_feedConfigs[dataId].description; + } +} diff --git a/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregator.sol b/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregator.sol new file mode 100644 index 00000000000..1f6a4af496e --- /dev/null +++ b/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregator.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +import {IBundleBaseAggregator} from "./IBundleBaseAggregator.sol"; +import {ICommonAggregator} from "./ICommonAggregator.sol"; + +interface IBundleAggregator is IBundleBaseAggregator, ICommonAggregator {} diff --git a/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol b/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol new file mode 100644 index 00000000000..9caacae9a58 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/interfaces/IBundleAggregatorProxy.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +import {IBundleBaseAggregator} from "./IBundleBaseAggregator.sol"; +import {ICommonAggregator} from "./ICommonAggregator.sol"; + +interface IBundleAggregatorProxy is IBundleBaseAggregator, ICommonAggregator { + function proposedAggregator() external view returns (address); + + function confirmAggregator( + address aggregatorAddress + ) external; + + function aggregator() external view returns (address); +} diff --git a/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol b/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol new file mode 100644 index 00000000000..cb1f12e8a2b --- /dev/null +++ b/contracts/src/v0.8/data-feeds/interfaces/IBundleBaseAggregator.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +interface IBundleBaseAggregator { + function latestBundle() external view returns (bytes memory bundle); + + function bundleDecimals() external view returns (uint8[] memory); + + function latestBundleTimestamp() external view returns (uint256); +} diff --git a/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol b/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol new file mode 100644 index 00000000000..558650efc24 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/interfaces/ICommonAggregator.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +interface ICommonAggregator { + function description() external view returns (string memory); + + function version() external view returns (uint256); +} diff --git a/contracts/src/v0.8/data-feeds/interfaces/IDataFeedsCache.sol b/contracts/src/v0.8/data-feeds/interfaces/IDataFeedsCache.sol new file mode 100644 index 00000000000..66a0a615eb9 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/interfaces/IDataFeedsCache.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +import {IBundleBaseAggregator} from "./IBundleBaseAggregator.sol"; +import {ICommonAggregator} from "./ICommonAggregator.sol"; +import {IDecimalAggregator} from "./IDecimalAggregator.sol"; + +/// @notice IDataFeedsCache +/// Responsible for storing data associated with a given data ID and additional request data. +interface IDataFeedsCache is IDecimalAggregator, IBundleBaseAggregator, ICommonAggregator { + /// @notice Remove feed configs. + /// @param dataIds List of data IDs + function removeFeedConfigs( + bytes16[] calldata dataIds + ) external; + + /// @notice Update mappings for AggregatorProxy -> Data ID + /// @param proxies AggregatorProxy addresses + /// @param dataIds Data IDs + function updateDataIdMappingsForProxies(address[] calldata proxies, bytes16[] calldata dataIds) external; + + /// @notice Remove mappings for AggregatorProxy -> Data IDs + /// @param proxies AggregatorProxy addresses to remove + function removeDataIdMappingsForProxies( + address[] calldata proxies + ) external; + + /// @notice Get the Data ID mapping for a AggregatorProxy + /// @param proxy AggregatorProxy addresses which will be reading feed data + function getDataIdForProxy( + address proxy + ) external view returns (bytes16 dataId); +} diff --git a/contracts/src/v0.8/data-feeds/interfaces/IDecimalAggregator.sol b/contracts/src/v0.8/data-feeds/interfaces/IDecimalAggregator.sol new file mode 100644 index 00000000000..85003e94af7 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/interfaces/IDecimalAggregator.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.4; + +interface IDecimalAggregator { + function latestAnswer() external view returns (int256); + + function latestRound() external view returns (uint256); + + function latestTimestamp() external view returns (uint256); + + function getAnswer( + uint256 roundId + ) external view returns (int256); + + function getTimestamp( + uint256 roundId + ) external view returns (uint256); + + function decimals() external view returns (uint8); + + function getRoundData( + uint80 _roundId + ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); + + function latestRoundData() + external + view + returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); + + event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt); + + event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt); +} diff --git a/contracts/src/v0.8/data-feeds/interfaces/ITokenRecover.sol b/contracts/src/v0.8/data-feeds/interfaces/ITokenRecover.sol new file mode 100644 index 00000000000..587d0a85d42 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/interfaces/ITokenRecover.sol @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + +import {IERC20} from "./../../vendor/openzeppelin-solidity/v5.0.2/contracts/interfaces/IERC20.sol"; + +/// @notice ITokenRecover +/// Implements the recoverTokens method, enabling the recovery of ERC-20 or native tokens accidentally sent to a +/// contract outside of normal operations. +interface ITokenRecover { + /// @notice Transfer any ERC-20 or native tokens accidentally sent to this contract. + /// @param token Token to transfer + /// @param to Address to send payment to + /// @param amount Amount of token to transfer + function recoverTokens(IERC20 token, address to, uint256 amount) external; +} diff --git a/contracts/src/v0.8/data-feeds/test/BaseTest.t.sol b/contracts/src/v0.8/data-feeds/test/BaseTest.t.sol new file mode 100644 index 00000000000..c92986b272f --- /dev/null +++ b/contracts/src/v0.8/data-feeds/test/BaseTest.t.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {Test} from "forge-std/Test.sol"; + +contract BaseTest is Test { + bool private s_baseTestInitialized; + address internal constant OWNER = 0x72da681452Ab957d1020c25fFaCA47B43980b7C3; + address internal constant STRANGER = 0x02e7d5DD1F4dDbC9f512FfA01d30aa190Ae3edBb; + + // Fri May 26 2023 13:49:53 GMT+0000 + uint256 internal constant BLOCK_TIME = 1685108993; + + function setUp() public virtual { + // BaseTest.setUp is often called multiple times from tests' setUp due to inheritance. + if (s_baseTestInitialized) return; + s_baseTestInitialized = true; + + vm.label(OWNER, "Owner"); + vm.label(STRANGER, "Stranger"); + + // Set the sender to OWNER permanently + vm.startPrank(OWNER); + deal(OWNER, 1e20); + + // Set the block time to a constant known value + vm.warp(BLOCK_TIME); + } +} diff --git a/contracts/src/v0.8/data-feeds/test/BundleAggregatorProxy.t.sol b/contracts/src/v0.8/data-feeds/test/BundleAggregatorProxy.t.sol new file mode 100644 index 00000000000..464f83d5440 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/test/BundleAggregatorProxy.t.sol @@ -0,0 +1,75 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {BundleAggregatorProxy} from "../BundleAggregatorProxy.sol"; +import {DataFeedsCache} from "../DataFeedsCache.sol"; +import {BaseTest} from "./BaseTest.t.sol"; + +contract BundleAggregatorProxyTest is BaseTest { + BundleAggregatorProxy internal s_proxy; + DataFeedsCache internal s_aggregator; + + function setUp() public override { + super.setUp(); + s_aggregator = new DataFeedsCache(); + s_proxy = new BundleAggregatorProxy(address(s_aggregator), OWNER); + + bytes16[] memory datIds = new bytes16[](1); + datIds[0] = bytes16("1"); + + address[] memory proxies = new address[](1); + proxies[0] = address(s_proxy); + + s_aggregator.setFeedAdmin(OWNER, true); + s_aggregator.updateDataIdMappingsForProxies(proxies, datIds); + } + + function test_aggregator() public { + assertEq(s_proxy.aggregator(), address(s_aggregator)); + } + + function test_version() public { + assertEq(s_proxy.version(), 7); + } + + function test_description() public { + assertEq(s_proxy.description(), ""); + } + + function test_latestBundle() public { + bytes memory bundle = s_proxy.latestBundle(); + assertEq(bundle.length, 0); + } + + function test_latestBundleTimestamp() public { + assertEq(s_proxy.latestBundleTimestamp(), 0); + } + + function test_bundleDecimals() public { + uint8[] memory decimals = s_proxy.bundleDecimals(); + assertEq(decimals.length, 0); + } + + function test_proposeAggregator() public { + address newAggregator = address(123); + vm.expectEmit(); + emit BundleAggregatorProxy.AggregatorProposed({current: address(s_aggregator), proposed: newAggregator}); + s_proxy.proposeAggregator(newAggregator); + + assertEq(s_proxy.proposedAggregator(), newAggregator); + } + + function test_confirmAggregatorRevertNotProposed() public { + address newAggregator = address(123); + vm.expectRevert(abi.encodeWithSelector(BundleAggregatorProxy.AggregatorNotProposed.selector, newAggregator)); + s_proxy.confirmAggregator(newAggregator); + } + + function test_confirmAggregatorSuccess() public { + address newAggregator = address(123); + s_proxy.proposeAggregator(newAggregator); + vm.expectEmit(); + emit BundleAggregatorProxy.AggregatorConfirmed({previous: address(s_aggregator), latest: newAggregator}); + s_proxy.confirmAggregator(newAggregator); + } +} diff --git a/contracts/src/v0.8/data-feeds/test/DataFeedsCache.t.sol b/contracts/src/v0.8/data-feeds/test/DataFeedsCache.t.sol new file mode 100644 index 00000000000..701bbb3896a --- /dev/null +++ b/contracts/src/v0.8/data-feeds/test/DataFeedsCache.t.sol @@ -0,0 +1,1683 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {ERC20Mock} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/mocks/ERC20Mock.sol"; +import {IERC20Metadata as IERC20} from + "../../vendor/openzeppelin-solidity/v5.0.2/contracts/token/ERC20/extensions/IERC20Metadata.sol"; +import {BundleAggregatorProxy} from "../BundleAggregatorProxy.sol"; + +import {DataFeedsCache} from "../DataFeedsCache.sol"; +import {IDataFeedsCache} from "../interfaces/IDataFeedsCache.sol"; +import {BaseTest} from "./BaseTest.t.sol"; + +// solhint-disable-next-line max-states-count +contract DataFeedsCacheTest is BaseTest { + BundleAggregatorProxy internal s_dataFeedsAggregatorProxy; + DataFeedsCacheHarness internal s_dataFeedsCache; + + address internal constant ILLEGAL_CALLER = address(11111); // address used as incorrect caller in tests + address internal constant REPORT_SENDER = address(12222); // mocks keystone forwarder address + + ERC20Mock internal s_link = new ERC20Mock("LINK", "LINK", OWNER, 0); + + bytes32 internal constant WORKFLOWID = hex"6d795f6964000000000000000000000000000000000000000000000000000000"; + bytes10 internal constant WORKFLOWNAME = bytes10("abc"); + address internal constant WORKFLOWOWNER = address(10004); + bytes2 internal constant REPORTID = hex"0001"; + string[] internal s_descriptions = ["description"]; + + uint8[][] internal s_decimals1By1 = new uint8[][](1); + uint8[][] internal s_decimals2By1 = new uint8[][](2); + uint8[][] internal s_decimals2By2 = new uint8[][](2); + + bytes internal constant METADATA = abi.encodePacked(WORKFLOWID, WORKFLOWNAME, WORKFLOWOWNER, REPORTID); + + address[] internal s_allowedSendersList = [REPORT_SENDER, REPORT_SENDER]; + address[] internal s_allowedWorkflowOwnersList = [address(10004), address(10005)]; + bytes10[] internal s_allowedWorkflowNamesList = [bytes10("abc"), bytes10("xyz")]; + + address[] internal s_singleProxyList = new address[](1); + address[] internal s_proxyList = new address[](5); + address[] internal s_newSingleProxyList = new address[](1); + address[] internal s_newProxyList = new address[](5); + + bytes16[] internal s_singleValueId = new bytes16[](1); + bytes16[] internal s_batchValueIds = new bytes16[](5); + + DataFeedsCache.WorkflowMetadata internal s_workflowMetadata1 = DataFeedsCache.WorkflowMetadata({ + allowedSender: s_allowedSendersList[0], + allowedWorkflowOwner: s_allowedWorkflowOwnersList[0], + allowedWorkflowName: s_allowedWorkflowNamesList[0] + }); + + DataFeedsCache.WorkflowMetadata internal s_workflowMetadata2 = DataFeedsCache.WorkflowMetadata({ + allowedSender: s_allowedSendersList[1], + allowedWorkflowOwner: s_allowedWorkflowOwnersList[1], + allowedWorkflowName: s_allowedWorkflowNamesList[1] + }); + + DataFeedsCache.WorkflowMetadata[] internal s_workflowMetadata; + + bytes internal s_emptyDecimalReport; + bytes internal s_decimalReportlength1; + bytes internal s_decimalReportlength2; + bytes internal s_emptyBundleReport; + bytes internal s_bundleReportlength1; + bytes internal s_bundleReportlength2; + bytes internal s_staleReport; + bytes internal s_staleBundleReport; + bytes32 internal constant DATAID1 = hex"010e12d1e0000032000000000000000000000000000000000000000000000000"; + bytes32 internal constant DATAID2 = hex"01b476d70d000232000000000000000000000000000000000000000000000000"; + bytes32 internal constant DATAID3 = hex"0169bd6041000103000000000000000000000000000000000000000000000000"; + bytes32 internal constant DATAID4 = hex"010e12d1e0000028000000000000000000000000000000000000000000000000"; + bytes32 internal constant DATAID5 = hex"010e12d1e0000032000000000000000000000000000000000000000000000000"; + bytes16 internal constant DATA_ID_0 = bytes16(keccak256("12345")); + bytes16 internal constant DATA_ID_1 = bytes16(keccak256("23456")); + bytes16 internal constant DATA_ID_2 = bytes16(keccak256("34567")); + bytes16 internal constant DATA_ID_3 = bytes16(keccak256("45678")); + bytes16 internal constant DATA_ID_4 = bytes16(keccak256("56789")); + bytes16 internal constant DATA_ID_5 = bytes16(keccak256("67890")); + uint256 internal constant PRICE1 = 123456; + uint256 internal constant PRICE2 = 456789; + uint256 internal constant PRICE3 = 789456; + uint256 internal constant PRICE4 = 890123; + uint256 internal constant PRICE5 = 654321; + uint256 internal constant PRICE6 = 987654; + uint32 internal constant TIMESTAMP1 = 100; + uint32 internal constant TIMESTAMP2 = 200; + + function setUp() public override { + super.setUp(); + s_dataFeedsCache = new DataFeedsCacheHarness(); + s_dataFeedsCache.setFeedAdmin(OWNER, true); + s_dataFeedsAggregatorProxy = new BundleAggregatorProxy(address(s_dataFeedsCache), OWNER); + + // reports should be encoded as calldata, which has offset and length + s_emptyDecimalReport = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // Offset + hex"0000000000000000000000000000000000000000000000000000000000000000" // Length + ); + + // reports should be encoded as calldata, which has offset and length + s_decimalReportlength1 = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // Offset + hex"0000000000000000000000000000000000000000000000000000000000000001", // Length + DATAID1, + abi.encode(TIMESTAMP1), + abi.encode(PRICE1) + ); + + // reports should be encoded as calldata, which has offset and length + s_decimalReportlength2 = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // Offset + hex"0000000000000000000000000000000000000000000000000000000000000002", // Length + DATAID1, + abi.encode(TIMESTAMP1), + abi.encode(PRICE3), + DATAID2, + abi.encode(TIMESTAMP2), + abi.encode(PRICE4) + ); + + s_staleReport = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // Offset + hex"0000000000000000000000000000000000000000000000000000000000000002", // Length + DATAID1, + abi.encode(TIMESTAMP1 - 50), // report 1 for DATAID1 is stale in this report + abi.encode(PRICE1), + DATAID2, + abi.encode(TIMESTAMP2 + 50), + abi.encode(PRICE2) + ); + + s_emptyBundleReport = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // offset + hex"0000000000000000000000000000000000000000000000000000000000000000", // length + hex"0000000000000000000000000000000000000000000000000000000000000000" // offset of ReportOne + ); + + s_bundleReportlength1 = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // offset + hex"0000000000000000000000000000000000000000000000000000000000000001", // length + hex"0000000000000000000000000000000000000000000000000000000000000020", // offset of ReportOne + DATAID1, // ReportOne FeedID + abi.encode(TIMESTAMP1), + hex"0000000000000000000000000000000000000000000000000000000000000060", // offset of ReportOne Bundle + hex"0000000000000000000000000000000000000000000000000000000000000040", // length of ReportOne Bundle + abi.encode(PRICE1), + abi.encode(PRICE2) + ); + + s_bundleReportlength2 = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // offset + hex"0000000000000000000000000000000000000000000000000000000000000002", // length + hex"0000000000000000000000000000000000000000000000000000000000000040", // offset of ReportOne + hex"0000000000000000000000000000000000000000000000000000000000000100", // offset of ReportTwo + DATAID1, // ReportOne FeedID + abi.encode(TIMESTAMP1), + hex"0000000000000000000000000000000000000000000000000000000000000060", // offset of ReportOne Bundle + hex"0000000000000000000000000000000000000000000000000000000000000040", // length of ReportOne Bundle + abi.encode(PRICE3), + abi.encode(PRICE4), + DATAID2, // ReportTwo FeedID + abi.encode(TIMESTAMP2), + hex"0000000000000000000000000000000000000000000000000000000000000060", // offset of ReportTwo Bundle + hex"0000000000000000000000000000000000000000000000000000000000000040", // length of ReportTwo Bundle + abi.encode(PRICE5), + abi.encode(PRICE6) + ); + + s_staleBundleReport = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // offset + hex"0000000000000000000000000000000000000000000000000000000000000002", // length + hex"0000000000000000000000000000000000000000000000000000000000000040", // offset of ReportOne + hex"0000000000000000000000000000000000000000000000000000000000000100", // offset of ReportTwo + DATAID1, // ReportOne FeedID + abi.encode(TIMESTAMP1 - 50), // report is stale + hex"0000000000000000000000000000000000000000000000000000000000000060", // offset of ReportOne Bundle + hex"0000000000000000000000000000000000000000000000000000000000000040", // length of ReportOne Bundle + abi.encode(PRICE1), + abi.encode(PRICE2), + DATAID2, // ReportTwo FeedID + abi.encode(TIMESTAMP2 + 50), + hex"0000000000000000000000000000000000000000000000000000000000000060", // offset of ReportTwo Bundle + hex"0000000000000000000000000000000000000000000000000000000000000040", // length of ReportTwo Bundle + abi.encode(PRICE3), + abi.encode(PRICE4) + ); + + s_workflowMetadata.push(s_workflowMetadata1); + s_workflowMetadata.push(s_workflowMetadata2); + + s_singleProxyList[0] = address(10002); + + s_proxyList[0] = address(s_dataFeedsAggregatorProxy); + s_proxyList[1] = address(10002); + s_proxyList[2] = address(10004); + s_proxyList[3] = address(10005); + s_proxyList[4] = address(10006); + + s_newSingleProxyList[0] = address(10007); + + s_newProxyList[0] = address(10002); + s_newProxyList[1] = address(10003); + s_newProxyList[2] = address(10004); + s_newProxyList[3] = address(10005); + s_newProxyList[4] = address(10006); + + s_singleValueId = new bytes16[](1); + s_singleValueId[0] = bytes16(DATAID1); + + s_batchValueIds = new bytes16[](5); + s_batchValueIds[0] = bytes16(DATAID1); + s_batchValueIds[1] = bytes16(DATAID2); + s_batchValueIds[2] = bytes16(DATAID3); + s_batchValueIds[3] = bytes16(DATAID4); + s_batchValueIds[4] = bytes16(DATAID5); + + s_decimals1By1[0] = new uint8[](1); + s_decimals1By1[0][0] = 18; + + s_decimals2By1[0] = new uint8[](1); + s_decimals2By1[0][0] = 18; + s_decimals2By1[1] = new uint8[](1); + s_decimals2By1[1][0] = 8; + + s_decimals2By2[0] = new uint8[](2); + s_decimals2By2[0][0] = 6; + s_decimals2By2[0][1] = 12; + s_decimals2By2[1] = new uint8[](2); + s_decimals2By2[1][0] = 18; + s_decimals2By2[1][0] = 8; + + vm.startPrank(OWNER); + s_dataFeedsCache.setFeedAdmin(OWNER, true); + + s_dataFeedsCache.updateDataIdMappingsForProxies(s_proxyList, s_batchValueIds); + } + + function test_updateDataIdMappingsForProxiesRevertInvalidLengths() public { + address[] memory s_proxyList = new address[](1); + s_proxyList[0] = address(10002); + + bytes16[] memory dataIdList = new bytes16[](2); + dataIdList[0] = bytes16(keccak256("12345")); + dataIdList[1] = bytes16(keccak256("67890")); + + vm.expectRevert(DataFeedsCache.ArrayLengthMismatch.selector); + + s_dataFeedsCache.updateDataIdMappingsForProxies(s_proxyList, dataIdList); + } + + function test_updateDataIdMappingsForProxiesRevertUnauthorizedOwner() public { + address[] memory s_proxyList = new address[](1); + s_proxyList[0] = address(10002); + + bytes16[] memory dataIdList = new bytes16[](1); + dataIdList[0] = bytes16(keccak256("12345")); + + vm.stopPrank(); + vm.startPrank(ILLEGAL_CALLER); + vm.expectRevert( + abi.encodeWithSelector( + DataFeedsCache.UnauthorizedCaller.selector, address(0x0000000000000000000000000000000000002B67) + ) + ); + s_dataFeedsCache.updateDataIdMappingsForProxies(s_proxyList, dataIdList); + } + + function test_updateDataIdMappingsForProxiesSuccess() public { + address[] memory s_proxyList = new address[](1); + s_proxyList[0] = address(10002); + + bytes16[] memory dataIdList = new bytes16[](1); + dataIdList[0] = bytes16(keccak256("12345")); + + vm.expectEmit(); + emit DataFeedsCache.ProxyDataIdUpdated(s_proxyList[0], dataIdList[0]); + + s_dataFeedsCache.updateDataIdMappingsForProxies(s_proxyList, dataIdList); + } + + function test_updateDataIdMappingsForProxies_and_call_decimals() public { + uint8 decimals = 8; + + vm.startPrank(s_proxyList[3]); + uint8 decimalsAns = s_dataFeedsCache.decimals(); + + assertEq(decimalsAns, decimals); + + decimals = 18; + + vm.startPrank(s_proxyList[4]); + decimalsAns = s_dataFeedsCache.decimals(); + + assertEq(decimalsAns, decimals); + + address[] memory s_newProxyList = new address[](2); + s_newProxyList[0] = s_proxyList[3]; + s_newProxyList[1] = s_proxyList[4]; + + bytes16[] memory newDataIdList = new bytes16[](2); + newDataIdList[0] = s_batchValueIds[4]; + newDataIdList[1] = s_batchValueIds[3]; + + vm.startPrank(OWNER); + + vm.expectEmit(); + emit DataFeedsCache.ProxyDataIdUpdated(s_newProxyList[0], newDataIdList[0]); + emit DataFeedsCache.ProxyDataIdUpdated(s_newProxyList[1], newDataIdList[1]); + + s_dataFeedsCache.updateDataIdMappingsForProxies(s_newProxyList, newDataIdList); + + decimals = 18; + + vm.startPrank(s_proxyList[3]); + decimalsAns = s_dataFeedsCache.decimals(); + + assertEq(decimalsAns, decimals); + + decimals = 8; + + vm.startPrank(s_proxyList[4]); + decimalsAns = s_dataFeedsCache.decimals(); + + assertEq(decimalsAns, decimals); + } + + function test_updateDataIdMappingsForProxies_and_RevertOnWrongCaller() public { + address[] memory s_proxyList = new address[](1); + s_proxyList[0] = address(10002); + + bytes16[] memory dataIdList = new bytes16[](1); + dataIdList[0] = bytes16(keccak256("12345")); + + vm.expectEmit(); + emit DataFeedsCache.ProxyDataIdUpdated(s_proxyList[0], dataIdList[0]); + + s_dataFeedsCache.updateDataIdMappingsForProxies(s_proxyList, dataIdList); + + uint8[] memory decimalsArr = new uint8[](1); + decimalsArr[0] = 8; + + vm.startPrank(ILLEGAL_CALLER); + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.NoMappingForSender.selector, ILLEGAL_CALLER)); + + s_dataFeedsCache.decimals(); + } + + function test_removeDataIdMappingsForProxiesSuccess() public { + address[] memory s_proxyList = new address[](1); + s_proxyList[0] = address(10002); + + bytes16[] memory dataIdList = new bytes16[](1); + dataIdList[0] = bytes16(keccak256("12345")); + + vm.expectEmit(); + emit DataFeedsCache.ProxyDataIdUpdated(s_proxyList[0], dataIdList[0]); + + s_dataFeedsCache.updateDataIdMappingsForProxies(s_proxyList, dataIdList); + + vm.expectEmit(); + emit DataFeedsCache.ProxyDataIdRemoved(s_proxyList[0], dataIdList[0]); + + s_dataFeedsCache.removeDataIdMappingsForProxies(s_proxyList); + } + + function test_removeDataIdMappingsForProxiesSuccess_and_call_decimals() public { + address[] memory s_proxyList = new address[](1); + s_proxyList[0] = address(10002); + + bytes16[] memory dataIdList = new bytes16[](1); + dataIdList[0] = bytes16(keccak256("12345")); + + vm.expectEmit(); + emit DataFeedsCache.ProxyDataIdUpdated(s_proxyList[0], dataIdList[0]); + + s_dataFeedsCache.updateDataIdMappingsForProxies(s_proxyList, dataIdList); + + vm.expectEmit(); + emit DataFeedsCache.ProxyDataIdRemoved(s_proxyList[0], dataIdList[0]); + + s_dataFeedsCache.removeDataIdMappingsForProxies(s_proxyList); + + uint8[] memory decimalsArr = new uint8[](1); + decimalsArr[0] = 8; + + vm.startPrank(s_proxyList[0]); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.NoMappingForSender.selector, s_proxyList[0])); + + s_dataFeedsCache.decimals(); + } + + function test_supportsInterface() public view { + assertEq(s_dataFeedsCache.supportsInterface(type(IDataFeedsCache).interfaceId), true); + } + + function test_setFeedConfigsRevertEmptyConfig() public { + // empty data ids + bytes16[] memory dataIds = new bytes16[](0); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.EmptyConfig.selector)); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.EmptyConfig.selector)); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, s_descriptions, s_decimals1By1, s_workflowMetadata); + + // empty workflows + dataIds = new bytes16[](1); + dataIds[0] = bytes16(0); + DataFeedsCache.WorkflowMetadata[] memory _workflowMetadata; + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.EmptyConfig.selector)); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, _workflowMetadata); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.EmptyConfig.selector)); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, s_descriptions, s_decimals1By1, _workflowMetadata); + } + + function test_setFeedConfigsRevertZeroDataId() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(0); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidDataId.selector)); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidDataId.selector)); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, s_descriptions, s_decimals1By1, s_workflowMetadata); + } + + function test_setFeedConfigsRevertInvalidConfigsLengthDescriptions() public { + // description has length of 1 + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16("1"); + dataIds[1] = bytes16("2"); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.ArrayLengthMismatch.selector)); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.ArrayLengthMismatch.selector)); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, s_descriptions, s_decimals2By1, s_workflowMetadata); + } + + function test_setBundleFeedConfigsRevertInvalidConfigsLengthDecimals() public { + // decimals has length of 1 + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16("1"); + dataIds[1] = bytes16("2"); + + string[] memory _descriptions = new string[](2); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.ArrayLengthMismatch.selector)); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals1By1, s_workflowMetadata); + } + + function test_setFeedConfigsRevertUnauthorizedFeedAdmin() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16("1"); + vm.startPrank(address(123)); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.UnauthorizedCaller.selector, address(123))); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.UnauthorizedCaller.selector, address(123))); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, s_descriptions, s_decimals1By1, s_workflowMetadata); + } + + function test_setFeedConfigsRevertInvalidWorkflowMetadata() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16("1"); + + // 0 address sender + DataFeedsCache.WorkflowMetadata memory wfWithInvalidSender = DataFeedsCache.WorkflowMetadata({ + allowedSender: address(0), + allowedWorkflowOwner: s_allowedWorkflowOwnersList[0], + allowedWorkflowName: s_allowedWorkflowNamesList[0] + }); + + DataFeedsCache.WorkflowMetadata[] memory _workflowMetadata = new DataFeedsCache.WorkflowMetadata[](1); + _workflowMetadata[0] = wfWithInvalidSender; + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidAddress.selector, address(0))); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, _workflowMetadata); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidAddress.selector, address(0))); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, s_descriptions, s_decimals1By1, _workflowMetadata); + + // 0 address owner + DataFeedsCache.WorkflowMetadata memory wfWithInvalidOwner = DataFeedsCache.WorkflowMetadata({ + allowedSender: s_allowedSendersList[0], + allowedWorkflowOwner: address(0), + allowedWorkflowName: s_allowedWorkflowNamesList[0] + }); + _workflowMetadata[0] = wfWithInvalidOwner; + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidAddress.selector, address(0))); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, _workflowMetadata); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidAddress.selector, address(0))); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, s_descriptions, s_decimals1By1, _workflowMetadata); + + // 0 address name + DataFeedsCache.WorkflowMetadata memory wfWithInvalidName = DataFeedsCache.WorkflowMetadata({ + allowedSender: s_allowedSendersList[0], + allowedWorkflowOwner: s_allowedWorkflowOwnersList[0], + allowedWorkflowName: bytes10(0) + }); + _workflowMetadata[0] = wfWithInvalidName; + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidWorkflowName.selector, address(0))); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, _workflowMetadata); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidWorkflowName.selector, address(0))); + s_dataFeedsCache.setBundleFeedConfigs(dataIds, s_descriptions, s_decimals1By1, _workflowMetadata); + } + + function test_setFeedConfigsSuccess() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16("1"); + + vm.expectEmit(); + emit DataFeedsCache.DecimalFeedConfigSet({ + dataId: dataIds[0], + decimals: 0, + description: s_descriptions[0], + workflowMetadata: s_workflowMetadata + }); + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + } + + function test_setDecimalFeedConfigs_setAgainWithClear() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16("1"); + dataIds[1] = bytes16("2"); + + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + DataFeedsCache.WorkflowMetadata[] memory _workflowMetadataNew = new DataFeedsCache.WorkflowMetadata[](3); + _workflowMetadataNew[0] = s_workflowMetadata[1]; + _workflowMetadataNew[1] = s_workflowMetadata[0]; + _workflowMetadataNew[2] = s_workflowMetadata[1]; + + vm.expectEmit(); + emit DataFeedsCache.DecimalFeedConfigSet({ + dataId: dataIds[0], + decimals: 0, + description: _descriptions[0], + workflowMetadata: s_workflowMetadata + }); + vm.expectEmit(); + emit DataFeedsCache.DecimalFeedConfigSet({ + dataId: dataIds[1], + decimals: 0, + description: _descriptions[1], + workflowMetadata: s_workflowMetadata + }); + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + DataFeedsCache.WorkflowMetadata[] memory _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 0); + + assertEq(_workflowMetadata.length, 2); + assertEq(_workflowMetadata[0].allowedWorkflowName, s_workflowMetadata[0].allowedWorkflowName); + assertEq(_workflowMetadata[0].allowedWorkflowOwner, s_workflowMetadata[0].allowedWorkflowOwner); + assertEq(_workflowMetadata[0].allowedSender, s_workflowMetadata[0].allowedSender); + + assertEq(_workflowMetadata[1].allowedWorkflowName, s_workflowMetadata[1].allowedWorkflowName); + assertEq(_workflowMetadata[1].allowedWorkflowOwner, s_workflowMetadata[1].allowedWorkflowOwner); + assertEq(_workflowMetadata[1].allowedSender, s_workflowMetadata[1].allowedSender); + + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[1], 0, 0); + + assertEq(_workflowMetadata.length, 2); + assertEq(_workflowMetadata[0].allowedWorkflowName, s_workflowMetadata[0].allowedWorkflowName); + assertEq(_workflowMetadata[0].allowedWorkflowOwner, s_workflowMetadata[0].allowedWorkflowOwner); + assertEq(_workflowMetadata[0].allowedSender, s_workflowMetadata[0].allowedSender); + + assertEq(_workflowMetadata[1].allowedWorkflowName, s_workflowMetadata[1].allowedWorkflowName); + assertEq(_workflowMetadata[1].allowedWorkflowOwner, s_workflowMetadata[1].allowedWorkflowOwner); + assertEq(_workflowMetadata[1].allowedSender, s_workflowMetadata[1].allowedSender); + + vm.expectEmit(); + emit DataFeedsCache.FeedConfigRemoved({dataId: dataIds[0]}); + vm.expectEmit(); + emit DataFeedsCache.DecimalFeedConfigSet({ + dataId: dataIds[0], + decimals: 0, + description: _descriptions[0], + workflowMetadata: _workflowMetadataNew + }); + vm.expectEmit(); + emit DataFeedsCache.FeedConfigRemoved({dataId: dataIds[1]}); + vm.expectEmit(); + emit DataFeedsCache.DecimalFeedConfigSet({ + dataId: dataIds[1], + decimals: 0, + description: _descriptions[1], + workflowMetadata: _workflowMetadataNew + }); + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, _workflowMetadataNew); + + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 0); + + assertEq(_workflowMetadata.length, 3); + assertEq(_workflowMetadataNew[0].allowedWorkflowName, _workflowMetadata[0].allowedWorkflowName); + assertEq(_workflowMetadataNew[0].allowedWorkflowOwner, _workflowMetadata[0].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[0].allowedSender, _workflowMetadata[0].allowedSender); + + assertEq(_workflowMetadataNew[1].allowedWorkflowName, _workflowMetadata[1].allowedWorkflowName); + assertEq(_workflowMetadataNew[1].allowedWorkflowOwner, _workflowMetadata[1].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[1].allowedSender, _workflowMetadata[1].allowedSender); + + assertEq(_workflowMetadataNew[2].allowedWorkflowName, _workflowMetadata[2].allowedWorkflowName); + assertEq(_workflowMetadataNew[2].allowedWorkflowOwner, _workflowMetadata[2].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[2].allowedSender, _workflowMetadata[2].allowedSender); + + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[1], 0, 0); + + assertEq(_workflowMetadata.length, 3); + assertEq(_workflowMetadataNew[0].allowedWorkflowName, _workflowMetadata[0].allowedWorkflowName); + assertEq(_workflowMetadataNew[0].allowedWorkflowOwner, _workflowMetadata[0].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[0].allowedSender, _workflowMetadata[0].allowedSender); + + assertEq(_workflowMetadataNew[1].allowedWorkflowName, _workflowMetadata[1].allowedWorkflowName); + assertEq(_workflowMetadataNew[1].allowedWorkflowOwner, _workflowMetadata[1].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[1].allowedSender, _workflowMetadata[1].allowedSender); + + assertEq(_workflowMetadataNew[2].allowedWorkflowName, _workflowMetadata[2].allowedWorkflowName); + assertEq(_workflowMetadataNew[2].allowedWorkflowOwner, _workflowMetadata[2].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[2].allowedSender, _workflowMetadata[2].allowedSender); + } + + function test_setBundleFeedConfigs_setAgainWithClear() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16("1"); + dataIds[1] = bytes16("2"); + + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + DataFeedsCache.WorkflowMetadata[] memory _workflowMetadataNew = new DataFeedsCache.WorkflowMetadata[](3); + _workflowMetadataNew[0] = s_workflowMetadata[1]; + _workflowMetadataNew[1] = s_workflowMetadata[0]; + _workflowMetadataNew[2] = s_workflowMetadata[1]; + + vm.expectEmit(); + emit DataFeedsCache.BundleFeedConfigSet({ + dataId: dataIds[0], + decimals: s_decimals2By1[0], + description: _descriptions[0], + workflowMetadata: s_workflowMetadata + }); + vm.expectEmit(); + emit DataFeedsCache.BundleFeedConfigSet({ + dataId: dataIds[1], + decimals: s_decimals2By1[1], + description: _descriptions[1], + workflowMetadata: s_workflowMetadata + }); + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals2By1, s_workflowMetadata); + + DataFeedsCache.WorkflowMetadata[] memory _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 0); + + assertEq(_workflowMetadata.length, 2); + assertEq(_workflowMetadata[0].allowedWorkflowName, s_workflowMetadata[0].allowedWorkflowName); + assertEq(_workflowMetadata[0].allowedWorkflowOwner, s_workflowMetadata[0].allowedWorkflowOwner); + assertEq(_workflowMetadata[0].allowedSender, s_workflowMetadata[0].allowedSender); + + assertEq(_workflowMetadata[1].allowedWorkflowName, s_workflowMetadata[1].allowedWorkflowName); + assertEq(_workflowMetadata[1].allowedWorkflowOwner, s_workflowMetadata[1].allowedWorkflowOwner); + assertEq(_workflowMetadata[1].allowedSender, s_workflowMetadata[1].allowedSender); + + uint8[] memory decimalsArr = s_dataFeedsCache.getBundleDecimals(dataIds[0]); + + assertEq(decimalsArr.length, s_decimals2By1[0].length); + assertEq(decimalsArr[0], s_decimals2By1[0][0]); + + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[1], 0, 0); + + assertEq(_workflowMetadata.length, 2); + assertEq(_workflowMetadata[0].allowedWorkflowName, s_workflowMetadata[0].allowedWorkflowName); + assertEq(_workflowMetadata[0].allowedWorkflowOwner, s_workflowMetadata[0].allowedWorkflowOwner); + assertEq(_workflowMetadata[0].allowedSender, s_workflowMetadata[0].allowedSender); + + assertEq(_workflowMetadata[1].allowedWorkflowName, s_workflowMetadata[1].allowedWorkflowName); + assertEq(_workflowMetadata[1].allowedWorkflowOwner, s_workflowMetadata[1].allowedWorkflowOwner); + assertEq(_workflowMetadata[1].allowedSender, s_workflowMetadata[1].allowedSender); + + decimalsArr = s_dataFeedsCache.getBundleDecimals(dataIds[1]); + + assertEq(decimalsArr.length, s_decimals2By1[1].length); + assertEq(decimalsArr[0], s_decimals2By1[1][0]); + + vm.expectEmit(); + emit DataFeedsCache.FeedConfigRemoved({dataId: dataIds[0]}); + vm.expectEmit(); + emit DataFeedsCache.BundleFeedConfigSet({ + dataId: dataIds[0], + decimals: s_decimals2By2[0], + description: _descriptions[0], + workflowMetadata: _workflowMetadataNew + }); + vm.expectEmit(); + emit DataFeedsCache.FeedConfigRemoved({dataId: dataIds[1]}); + vm.expectEmit(); + emit DataFeedsCache.BundleFeedConfigSet({ + dataId: dataIds[1], + decimals: s_decimals2By2[1], + description: _descriptions[1], + workflowMetadata: _workflowMetadataNew + }); + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals2By2, _workflowMetadataNew); + + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 0); + + assertEq(_workflowMetadata.length, 3); + assertEq(_workflowMetadataNew[0].allowedWorkflowName, _workflowMetadata[0].allowedWorkflowName); + assertEq(_workflowMetadataNew[0].allowedWorkflowOwner, _workflowMetadata[0].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[0].allowedSender, _workflowMetadata[0].allowedSender); + + assertEq(_workflowMetadataNew[1].allowedWorkflowName, _workflowMetadata[1].allowedWorkflowName); + assertEq(_workflowMetadataNew[1].allowedWorkflowOwner, _workflowMetadata[1].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[1].allowedSender, _workflowMetadata[1].allowedSender); + + assertEq(_workflowMetadataNew[2].allowedWorkflowName, _workflowMetadata[2].allowedWorkflowName); + assertEq(_workflowMetadataNew[2].allowedWorkflowOwner, _workflowMetadata[2].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[2].allowedSender, _workflowMetadata[2].allowedSender); + + decimalsArr = s_dataFeedsCache.getBundleDecimals(dataIds[0]); + + assertEq(decimalsArr.length, s_decimals2By2[0].length); + assertEq(decimalsArr[0], s_decimals2By2[0][0]); + assertEq(decimalsArr[1], s_decimals2By2[0][1]); + + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[1], 0, 0); + + assertEq(_workflowMetadata.length, 3); + assertEq(_workflowMetadataNew[0].allowedWorkflowName, _workflowMetadata[0].allowedWorkflowName); + assertEq(_workflowMetadataNew[0].allowedWorkflowOwner, _workflowMetadata[0].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[0].allowedSender, _workflowMetadata[0].allowedSender); + + assertEq(_workflowMetadataNew[1].allowedWorkflowName, _workflowMetadata[1].allowedWorkflowName); + assertEq(_workflowMetadataNew[1].allowedWorkflowOwner, _workflowMetadata[1].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[1].allowedSender, _workflowMetadata[1].allowedSender); + + assertEq(_workflowMetadataNew[2].allowedWorkflowName, _workflowMetadata[2].allowedWorkflowName); + assertEq(_workflowMetadataNew[2].allowedWorkflowOwner, _workflowMetadata[2].allowedWorkflowOwner); + assertEq(_workflowMetadataNew[2].allowedSender, _workflowMetadata[2].allowedSender); + + decimalsArr = s_dataFeedsCache.getBundleDecimals(dataIds[1]); + + assertEq(decimalsArr.length, s_decimals2By2[1].length); + assertEq(decimalsArr[0], s_decimals2By2[1][0]); + assertEq(decimalsArr[1], s_decimals2By2[1][1]); + } + + function test_description() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(address(s_dataFeedsAggregatorProxy)); + string memory description = s_dataFeedsCache.description(); + + assertEq(s_descriptions[0], description); + } + + function test_decimals() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(address(s_dataFeedsAggregatorProxy)); + uint8 decimals = s_dataFeedsCache.decimals(); + assertEq(18, decimals); + } + + function test_bundleDecimals() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + uint8[][] memory _decimals = new uint8[][](1); + _decimals[0] = new uint8[](2); + _decimals[0][0] = 18; + _decimals[0][1] = 8; + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, _decimals, s_workflowMetadata); + + vm.startPrank(address(s_dataFeedsAggregatorProxy)); + uint8[] memory decimals = s_dataFeedsCache.bundleDecimals(); + assertEq(decimals.length, 2); + assertEq(decimals[0], 18); + assertEq(decimals[1], 8); + } + + function test_getFeedMetadataRevertFeedNotConfigured() public { + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.FeedNotConfigured.selector, bytes16(0))); + s_dataFeedsCache.getFeedMetadata(bytes16(0), 0, 1); + } + + function test_getFeedMetadata() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16("1"); + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + + // limit less than the number of elements + // first slice + DataFeedsCache.WorkflowMetadata[] memory _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 1); + + assertEq(_workflowMetadata.length, 1); + assertEq(_workflowMetadata[0].allowedWorkflowName, s_allowedWorkflowNamesList[0]); + assertEq(_workflowMetadata[0].allowedWorkflowOwner, s_allowedWorkflowOwnersList[0]); + assertEq(_workflowMetadata[0].allowedSender, s_allowedSendersList[0]); + + // second slice + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 1, 1); + + assertEq(_workflowMetadata.length, 1); + assertEq(_workflowMetadata[0].allowedWorkflowName, s_allowedWorkflowNamesList[1]); + assertEq(_workflowMetadata[0].allowedWorkflowOwner, s_allowedWorkflowOwnersList[1]); + assertEq(_workflowMetadata[0].allowedSender, s_allowedSendersList[1]); + + // returns the full array if the maxCount is equal to the number of elements + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, s_workflowMetadata.length); + assertEq(_workflowMetadata.length, 2); + + // returns the full array if the number of elements is less than the maxCount + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 100); + + assertEq(_workflowMetadata.length, 2); + assertEq(_workflowMetadata[0].allowedWorkflowName, s_allowedWorkflowNamesList[0]); + assertEq(_workflowMetadata[0].allowedWorkflowOwner, s_allowedWorkflowOwnersList[0]); + assertEq(_workflowMetadata[0].allowedSender, s_allowedSendersList[0]); + + assertEq(_workflowMetadata[1].allowedWorkflowName, s_allowedWorkflowNamesList[1]); + assertEq(_workflowMetadata[1].allowedWorkflowOwner, s_allowedWorkflowOwnersList[1]); + assertEq(_workflowMetadata[1].allowedSender, s_allowedSendersList[1]); + + // returns the full array if maxCount is 0 + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 0); + assertEq(_workflowMetadata.length, 2); + + // returns empty array if the cursor is out of bounds + _workflowMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 2, 1); + assertEq(_workflowMetadata.length, 0); + } + + function test_getWorkflowMetaData() public view { + (address _workflowOwner, bytes10 _workflowName) = s_dataFeedsCache.getWorkflowMetaData(METADATA); + + assertEq(_workflowName, WORKFLOWNAME); + assertEq(_workflowOwner, WORKFLOWOWNER); + } + + function test_getDataType() public view { + bytes1 dataType = s_dataFeedsCache.getDataType(bytes16(DATAID1), 7); + assertEq(dataType, hex"32"); + } + + function testFuzzy_getDataType(bytes16 id, uint256 index) public view { + vm.assume(index < 16); + bytes1 expected = bytes1(uint8(id[index])); + bytes1 result = s_dataFeedsCache.getDataType(id, index); + assertEq(result, expected); + } + + function testFuzzy_getDataTypeRevertOutOfBound(bytes16 id, uint256 index) public { + vm.assume(index >= 16); + vm.expectRevert(); + s_dataFeedsCache.getDataType(id, index); + } + + function testFuzz_createReportHash( + bytes16 dataId, + address sender, + address fuzzedWorkflowOwner, + bytes10 fuzzedWorkflowName + ) public view { + bytes32 reportHash = s_dataFeedsCache.createReportHash(dataId, sender, fuzzedWorkflowOwner, fuzzedWorkflowName); + bytes32 expectedReportHash = keccak256(abi.encode(dataId, sender, fuzzedWorkflowOwner, fuzzedWorkflowName)); + assertEq(reportHash, expectedReportHash); + } + + function test_setFeedAdminRevertZeroAddress() public { + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InvalidAddress.selector, address(0))); + + s_dataFeedsCache.setFeedAdmin(address(0), true); + } + + function testFuzz_setFeedAdminSuccess( + address feedAdmin + ) public { + vm.assume(feedAdmin != address(0)); + vm.assume(feedAdmin != OWNER); + vm.expectEmit(); + emit DataFeedsCache.FeedAdminSet(feedAdmin, true); + + s_dataFeedsCache.setFeedAdmin(feedAdmin, true); + } + + function test_isFeedAdmin() public view { + assertEq(s_dataFeedsCache.isFeedAdmin(OWNER), true); + assertEq(s_dataFeedsCache.isFeedAdmin(address(10002)), false); + } + + function test_removeFeedAdminSuccess() public { + s_dataFeedsCache.setFeedAdmin(address(10003), true); + vm.expectEmit(); + emit DataFeedsCache.FeedAdminSet(address(10003), false); + s_dataFeedsCache.setFeedAdmin(address(10003), false); + } + + function testFuzz_checkFeedPermissionFalse( + bytes16 dataId, + address sender, + address fuzzedWorkflowOwner, + bytes10 fuzzedWorkflowName + ) public view { + DataFeedsCache.WorkflowMetadata memory wfm = DataFeedsCache.WorkflowMetadata({ + allowedSender: sender, + allowedWorkflowOwner: fuzzedWorkflowOwner, + allowedWorkflowName: fuzzedWorkflowName + }); + bool hasPermission = s_dataFeedsCache.checkFeedPermission(dataId, wfm); + assertEq(hasPermission, false); + } + + function testFuzz_checkFeedPermissionTrue( + bytes16 dataId, + address sender, + address fuzzedWorkflowOwner, + bytes10 fuzzedWorkflowName + ) public { + vm.assume(dataId != bytes16(0)); + vm.assume(sender != address(0)); + vm.assume(fuzzedWorkflowOwner != address(0)); + vm.assume(fuzzedWorkflowName != bytes10(0)); + + DataFeedsCache.WorkflowMetadata memory _workflowMetadata1 = DataFeedsCache.WorkflowMetadata({ + allowedSender: sender, + allowedWorkflowOwner: fuzzedWorkflowOwner, + allowedWorkflowName: fuzzedWorkflowName + }); + + DataFeedsCache.WorkflowMetadata[] memory _workflowMetadata = new DataFeedsCache.WorkflowMetadata[](1); + _workflowMetadata[0] = _workflowMetadata1; + + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = dataId; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, _workflowMetadata); + + bool hasPermission = s_dataFeedsCache.checkFeedPermission(dataId, _workflowMetadata[0]); + assertEq(hasPermission, true); + } + + function test_onReportInvalidPermission() public { + // Invalid sender + vm.startPrank(ILLEGAL_CALLER); + + vm.expectEmit(); + emit DataFeedsCache.InvalidUpdatePermission({ + dataId: bytes16(DATAID1), + sender: ILLEGAL_CALLER, + workflowOwner: WORKFLOWOWNER, + workflowName: WORKFLOWNAME + }); + + vm.expectEmit(); + emit DataFeedsCache.InvalidUpdatePermission({ + dataId: bytes16(DATAID2), + sender: ILLEGAL_CALLER, + workflowOwner: WORKFLOWOWNER, + workflowName: WORKFLOWNAME + }); + + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength2); + + // Data id not configured + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16("1"); // onReport will send report for DATAID1 and DATAID2. + + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + vm.stopPrank(); + vm.startPrank(OWNER); + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.expectEmit(); + emit DataFeedsCache.DecimalReportUpdated({ + dataId: bytes16(DATAID1), + roundId: 1, + timestamp: TIMESTAMP1, + answer: uint224(PRICE3) + }); + + vm.expectEmit(); + emit DataFeedsCache.InvalidUpdatePermission({ + dataId: bytes16(DATAID2), + sender: REPORT_SENDER, + workflowOwner: WORKFLOWOWNER, + workflowName: WORKFLOWNAME + }); + + vm.stopPrank(); + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength2); + + vm.expectEmit(); + emit DataFeedsCache.BundleReportUpdated({ + dataId: bytes16(DATAID1), + timestamp: TIMESTAMP1, + bundle: abi.encodePacked(abi.encode(PRICE3), abi.encode(PRICE4)) + }); + + // missing data id for bundle report + vm.expectEmit(); + emit DataFeedsCache.InvalidUpdatePermission({ + dataId: bytes16(DATAID2), + sender: REPORT_SENDER, + workflowOwner: WORKFLOWOWNER, + workflowName: WORKFLOWNAME + }); + + s_dataFeedsCache.onReport(METADATA, s_bundleReportlength2); + } + + function test_onReportStaleDecimalReport() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16(DATAID2); + + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength2); + + vm.expectEmit(); + emit DataFeedsCache.StaleDecimalReport({ + dataId: bytes16(DATAID1), + reportTimestamp: TIMESTAMP1 - 50, + latestTimestamp: TIMESTAMP1 + }); + + vm.expectEmit(); + emit DataFeedsCache.DecimalReportUpdated({ + dataId: bytes16(DATAID2), + roundId: 2, + timestamp: TIMESTAMP2 + 50, + answer: uint224(PRICE2) + }); + + s_dataFeedsCache.onReport(METADATA, s_staleReport); + } + + function test_onReportStaleBundleReport() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16(DATAID2); + + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals2By1, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_bundleReportlength2); + + vm.expectEmit(); + emit DataFeedsCache.StaleBundleReport({ + dataId: bytes16(DATAID1), + reportTimestamp: TIMESTAMP1 - 50, + latestTimestamp: TIMESTAMP1 + }); + + vm.expectEmit(); + emit DataFeedsCache.BundleReportUpdated({ + dataId: bytes16(DATAID2), + timestamp: TIMESTAMP2 + 50, + bundle: abi.encodePacked(abi.encode(PRICE3), abi.encode(PRICE4)) + }); + + s_dataFeedsCache.onReport(METADATA, s_staleBundleReport); + } + + function test_onReportRevertInvalidWorkflowName() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + + // workflowName in report is 'abc' + bytes10 invalidWorkflowName = bytes10("xyz"); + bytes memory thisMetadata = abi.encodePacked(WORKFLOWID, invalidWorkflowName, WORKFLOWOWNER, REPORTID); + + vm.startPrank(REPORT_SENDER); + + vm.expectEmit(); + emit DataFeedsCache.InvalidUpdatePermission({ + dataId: bytes16(DATAID1), + sender: REPORT_SENDER, + workflowOwner: WORKFLOWOWNER, + workflowName: invalidWorkflowName + }); + + vm.expectEmit(); + emit DataFeedsCache.InvalidUpdatePermission({ + dataId: bytes16(DATAID2), + sender: REPORT_SENDER, + workflowOwner: WORKFLOWOWNER, + workflowName: invalidWorkflowName + }); + + s_dataFeedsCache.onReport(thisMetadata, s_decimalReportlength2); + } + + function test_onReportRevertInvalidWorkflowOwner() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + + // workFlowOwner in report is address(10004); + address invalidWorkflowOwner = address(10005); + bytes memory thisMetadata = abi.encodePacked(WORKFLOWID, WORKFLOWNAME, invalidWorkflowOwner, REPORTID); + + vm.startPrank(REPORT_SENDER); + + vm.expectEmit(); + emit DataFeedsCache.InvalidUpdatePermission({ + dataId: bytes16(DATAID1), + sender: REPORT_SENDER, + workflowOwner: invalidWorkflowOwner, + workflowName: WORKFLOWNAME + }); + + vm.expectEmit(); + emit DataFeedsCache.InvalidUpdatePermission({ + dataId: bytes16(DATAID2), + sender: REPORT_SENDER, + workflowOwner: invalidWorkflowOwner, + workflowName: WORKFLOWNAME + }); + + s_dataFeedsCache.onReport(thisMetadata, s_decimalReportlength2); + } + + function test_onReportSuccess_EmptyReport() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + + vm.expectRevert(); + s_dataFeedsCache.onReport(METADATA, ""); + + assertEq(s_dataFeedsCache.getLatestAnswer(dataIds[0]), int256(0)); + } + + function test_onReportSuccess_EmptyDecimalReport() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + + s_dataFeedsCache.onReport(METADATA, s_emptyDecimalReport); + + assertEq(s_dataFeedsCache.getLatestAnswer(bytes16(DATAID1)), int256(0)); + assertEq(s_dataFeedsCache.getLatestAnswer(bytes16(DATAID2)), int256(0)); + assertEq(s_dataFeedsCache.getLatestAnswer(bytes16(DATAID3)), int256(0)); + assertEq(s_dataFeedsCache.getLatestAnswer(bytes16(DATAID4)), int256(0)); + assertEq(s_dataFeedsCache.getLatestAnswer(bytes16(DATAID5)), int256(0)); + } + + function test_onReportSuccess_DecimalReportLength1() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + + vm.expectEmit(); + emit DataFeedsCache.DecimalReportUpdated({ + dataId: bytes16(DATAID1), + roundId: 1, + timestamp: TIMESTAMP1, + answer: uint224(PRICE1) + }); + + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength1); + + assertEq(s_dataFeedsCache.getLatestAnswer(dataIds[0]), int256(PRICE1)); + } + + function test_onReportSuccess_DecimalReportLength2() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16(DATAID2); + + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + + vm.expectEmit(); + emit DataFeedsCache.DecimalReportUpdated({ + dataId: bytes16(DATAID1), + roundId: 1, + timestamp: TIMESTAMP1, + answer: uint224(PRICE3) + }); + + vm.expectEmit(); + emit DataFeedsCache.DecimalReportUpdated({ + dataId: bytes16(DATAID2), + roundId: 1, + timestamp: TIMESTAMP2, + answer: uint224(PRICE4) + }); + + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength2); + } + + function test_onReportSuccess_EmptyBundleReport() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + + s_dataFeedsCache.onReport(METADATA, s_emptyBundleReport); + + assertEq(s_dataFeedsCache.getLatestBundle(bytes16(DATAID1)), ""); + assertEq(s_dataFeedsCache.getLatestBundle(bytes16(DATAID2)), ""); + assertEq(s_dataFeedsCache.getLatestBundle(bytes16(DATAID3)), ""); + assertEq(s_dataFeedsCache.getLatestBundle(bytes16(DATAID4)), ""); + assertEq(s_dataFeedsCache.getLatestBundle(bytes16(DATAID5)), ""); + } + + function test_onReportSuccess_BundleReportLength1() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals1By1, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + + bytes memory expectedBundle = + hex"000000000000000000000000000000000000000000000000000000000001e240000000000000000000000000000000000000000000000000000000000006f855"; + + vm.expectEmit(); + emit DataFeedsCache.BundleReportUpdated({dataId: bytes16(DATAID1), timestamp: TIMESTAMP1, bundle: expectedBundle}); + + s_dataFeedsCache.onReport(METADATA, s_bundleReportlength1); + } + + function test_onReportSuccess_BundleReportLength2() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16(DATAID2); + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals2By1, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + + bytes memory expectedBundle1 = + hex"00000000000000000000000000000000000000000000000000000000000c0bd000000000000000000000000000000000000000000000000000000000000d950b"; + + bytes memory expectedBundle2 = + hex"000000000000000000000000000000000000000000000000000000000009fbf100000000000000000000000000000000000000000000000000000000000f1206"; + + vm.expectEmit(); + emit DataFeedsCache.BundleReportUpdated({dataId: bytes16(DATAID1), timestamp: TIMESTAMP1, bundle: expectedBundle1}); + + vm.expectEmit(); + emit DataFeedsCache.BundleReportUpdated({dataId: bytes16(DATAID2), timestamp: TIMESTAMP2, bundle: expectedBundle2}); + + s_dataFeedsCache.onReport(METADATA, s_bundleReportlength2); + } + + function test_latestAnswer1() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength1); + + vm.startPrank(s_proxyList[0]); + int256 value = s_dataFeedsCache.latestAnswer(); + assertEq(value, int256(PRICE1)); + } + + function test_latestAnswer2() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16(DATAID2); + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength2); + + vm.startPrank(s_proxyList[0]); + int256 value = s_dataFeedsCache.latestAnswer(); + assertEq(value, int256(PRICE3)); + + vm.startPrank(s_proxyList[1]); + value = s_dataFeedsCache.latestAnswer(); + assertEq(value, int256(PRICE4)); + } + + function test_getLatestAnswer1() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength1); + vm.stopPrank(); + + int256 value = s_dataFeedsCache.getLatestAnswer(dataIds[0]); + assertEq(value, int256(PRICE1)); + } + + function test_getLatestAnswer2() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16(DATAID2); + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength2); + vm.stopPrank(); + + int256 value = s_dataFeedsCache.getLatestAnswer(dataIds[0]); + assertEq(value, int256(PRICE3)); + + value = s_dataFeedsCache.getLatestAnswer(dataIds[1]); + assertEq(value, int256(PRICE4)); + } + + function test_latestBundle1() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals1By1, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_bundleReportlength1); + + vm.startPrank(s_proxyList[0]); + uint256 roundId = s_dataFeedsCache.latestRound(); + assertEq(roundId, 0); + + bytes memory bundle = s_dataFeedsCache.latestBundle(); + uint256 timestamp = s_dataFeedsCache.latestBundleTimestamp(); + uint8[] memory decimals = s_dataFeedsCache.bundleDecimals(); + assertEq(bundle, abi.encode(PRICE1, PRICE2)); + (uint256 firstBundleP1, uint256 firstBundleP2) = abi.decode(bundle, (uint256, uint256)); + assertEq(firstBundleP1, PRICE1); + assertEq(firstBundleP2, PRICE2); + assertEq(timestamp, TIMESTAMP1); + assertEq(decimals.length, s_decimals1By1[0].length); + assertEq(decimals[0], s_decimals1By1[0][0]); + } + + function test_latestBundle2() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16(DATAID2); + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals2By1, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_bundleReportlength2); + + vm.startPrank(s_proxyList[0]); + uint256 roundId = s_dataFeedsCache.latestRound(); + + bytes memory bundle = s_dataFeedsCache.latestBundle(); + uint256 timestamp = s_dataFeedsCache.latestBundleTimestamp(); + uint8[] memory decimals = s_dataFeedsCache.bundleDecimals(); + assertEq(bundle, abi.encode(PRICE3, PRICE4)); + (uint256 firstBundleP1, uint256 firstBundleP2) = abi.decode(bundle, (uint256, uint256)); + assertEq(firstBundleP1, PRICE3); + assertEq(firstBundleP2, PRICE4); + assertEq(timestamp, TIMESTAMP1); + assertEq(decimals.length, s_decimals2By1[0].length); + assertEq(decimals[0], s_decimals2By1[0][0]); + + vm.startPrank(s_proxyList[1]); + roundId = s_dataFeedsCache.latestRound(); + + bundle = s_dataFeedsCache.latestBundle(); + timestamp = s_dataFeedsCache.latestBundleTimestamp(); + decimals = s_dataFeedsCache.bundleDecimals(); + assertEq(bundle, abi.encode(PRICE5, PRICE6)); + (uint256 secondBundleP1, uint256 secondBundleP2) = abi.decode(bundle, (uint256, uint256)); + assertEq(secondBundleP1, PRICE5); + assertEq(secondBundleP2, PRICE6); + assertEq(timestamp, TIMESTAMP2); + assertEq(decimals.length, s_decimals2By1[1].length); + assertEq(decimals[0], s_decimals2By1[1][0]); + } + + function test_getLatestBundle1() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals1By1, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_bundleReportlength1); + vm.stopPrank(); + + bytes memory bundle = s_dataFeedsCache.getLatestBundle(dataIds[0]); + uint256 timestamp = s_dataFeedsCache.getLatestBundleTimestamp(dataIds[0]); + uint8[] memory decimals = s_dataFeedsCache.getBundleDecimals(dataIds[0]); + assertEq(bundle, abi.encode(PRICE1, PRICE2)); + (uint256 firstBundleP1, uint256 firstBundleP2) = abi.decode(bundle, (uint256, uint256)); + assertEq(firstBundleP1, PRICE1); + assertEq(firstBundleP2, PRICE2); + assertEq(timestamp, TIMESTAMP1); + assertEq(decimals.length, s_decimals1By1[0].length); + assertEq(decimals[0], s_decimals1By1[0][0]); + } + + function test_getLatestBundle2() public { + bytes16[] memory dataIds = new bytes16[](2); + dataIds[0] = bytes16(DATAID1); + dataIds[1] = bytes16(DATAID2); + string[] memory _descriptions = new string[](2); + _descriptions[0] = s_descriptions[0]; + _descriptions[1] = s_descriptions[0]; + + s_dataFeedsCache.setBundleFeedConfigs(dataIds, _descriptions, s_decimals2By1, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_bundleReportlength2); + vm.stopPrank(); + + bytes memory bundle = s_dataFeedsCache.getLatestBundle(dataIds[0]); + uint256 timestamp = s_dataFeedsCache.getLatestBundleTimestamp(dataIds[0]); + uint8[] memory decimals = s_dataFeedsCache.getBundleDecimals(dataIds[0]); + assertEq(bundle, abi.encode(PRICE3, PRICE4)); + (uint256 firstBundleP1, uint256 firstBundleP2) = abi.decode(bundle, (uint256, uint256)); + assertEq(firstBundleP1, PRICE3); + assertEq(firstBundleP2, PRICE4); + assertEq(timestamp, TIMESTAMP1); + assertEq(decimals.length, s_decimals2By1[0].length); + assertEq(decimals[0], s_decimals2By1[0][0]); + + bundle = s_dataFeedsCache.getLatestBundle(dataIds[1]); + timestamp = s_dataFeedsCache.getLatestBundleTimestamp(dataIds[1]); + decimals = s_dataFeedsCache.getBundleDecimals(dataIds[1]); + assertEq(bundle, abi.encode(PRICE5, PRICE6)); + (uint256 secondBundleP1, uint256 secondBundleP2) = abi.decode(bundle, (uint256, uint256)); + assertEq(secondBundleP1, PRICE5); + assertEq(secondBundleP2, PRICE6); + assertEq(timestamp, TIMESTAMP2); + assertEq(decimals.length, s_decimals2By1[1].length); + assertEq(decimals[0], s_decimals2By1[1][0]); + } + + function test_removeFeedsRevertInvalidSender() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + vm.startPrank(address(1002)); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.UnauthorizedCaller.selector, address(1002))); + s_dataFeedsCache.removeFeedConfigs(dataIds); + } + + function test_removeFeedsRevertNotConfiguredFeed() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + + s_dataFeedsCache.setFeedAdmin(OWNER, true); + + vm.stopPrank(); + vm.startPrank(OWNER); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.FeedNotConfigured.selector, dataIds[0])); + s_dataFeedsCache.removeFeedConfigs(dataIds); + } + + function test_removeFeedsSuccess() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + + DataFeedsCache.WorkflowMetadata[] memory wfMetadata; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, s_descriptions, s_workflowMetadata); + + wfMetadata = s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 2); + assertEq(wfMetadata.length, 2); + bool hasPermission = s_dataFeedsCache.checkFeedPermission(dataIds[0], wfMetadata[0]); + assertEq(hasPermission, true); + + s_dataFeedsCache.setFeedAdmin(OWNER, true); + + vm.stopPrank(); + vm.startPrank(OWNER); + + vm.expectEmit(); + emit DataFeedsCache.FeedConfigRemoved(dataIds[0]); + s_dataFeedsCache.removeFeedConfigs(dataIds); + + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.FeedNotConfigured.selector, dataIds[0])); + s_dataFeedsCache.getFeedMetadata(dataIds[0], 0, 2); + hasPermission = s_dataFeedsCache.checkFeedPermission(dataIds[0], wfMetadata[0]); + assertEq(hasPermission, false); + } + + function test_getDataIdForProxy() public view { + bytes16 dataId = s_dataFeedsCache.getDataIdForProxy(s_proxyList[0]); + assertEq(dataId, bytes16(DATAID1)); + } + + function test_recoverTokensRevertUnauthorized() public { + vm.startPrank(ILLEGAL_CALLER); + + vm.expectRevert("Only callable by owner"); + s_dataFeedsCache.recoverTokens(IERC20(address(s_link)), address(10008), 1 ether); + } + + function test_recoverTokensERC20RevertNoBalance() public { + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InsufficientBalance.selector, 0, 1)); + s_dataFeedsCache.recoverTokens(IERC20(address(s_link)), address(10007), 1); + } + + function testFuzzy_recoverTokensERC20Success( + uint256 amount + ) public { + vm.assume(amount > 0); + s_link.mint(address(s_dataFeedsCache), amount); + + vm.expectEmit(); + emit DataFeedsCache.TokenRecovered(address(s_link), address(10008), amount); + s_dataFeedsCache.recoverTokens(IERC20(address(s_link)), address(10008), amount); + assertEq(s_link.balanceOf(address(10008)), amount); + assertEq(s_link.balanceOf(address(s_dataFeedsCache)), 0); + } + + function test_recoverTokensNativeRevertNoBalance() public { + vm.expectRevert(abi.encodeWithSelector(DataFeedsCache.InsufficientBalance.selector, 0, 1 ether)); + s_dataFeedsCache.recoverTokens(IERC20(address(0)), address(10007), 1 ether); + } + + function testFuzzy_recoverTokensNativeSuccess( + uint256 amount + ) public { + vm.assume(amount > 0); + vm.deal(address(s_dataFeedsCache), amount); + assertEq(address(s_dataFeedsCache).balance, amount); + + vm.expectEmit(); + emit DataFeedsCache.TokenRecovered(address(0), address(10007), amount); + s_dataFeedsCache.recoverTokens(IERC20(address(0)), address(10007), amount); + assertEq(address(s_dataFeedsCache).balance, 0); + assertEq(address(10007).balance, amount); + } + + function test_getLatestByFeedId() public { + bytes16[] memory dataIds = new bytes16[](1); + dataIds[0] = bytes16(DATAID1); + string[] memory _descriptions = new string[](1); + _descriptions[0] = s_descriptions[0]; + + s_dataFeedsCache.setDecimalFeedConfigs(dataIds, _descriptions, s_workflowMetadata); + + vm.startPrank(REPORT_SENDER); + s_dataFeedsCache.onReport(METADATA, s_decimalReportlength1); + + uint256 timestamp = s_dataFeedsCache.getLatestTimestamp(dataIds[0]); + assertEq(timestamp, TIMESTAMP1); + + (uint80 roundId, int256 answer, uint256 TIMESTAMP2, uint256 timestamp3, uint80 roundId2) = + s_dataFeedsCache.getLatestRoundData(dataIds[0]); + assertEq(roundId, 1); + assertEq(roundId2, 1); + assertEq(answer, int256(PRICE1)); + assertEq(timestamp, TIMESTAMP2); + assertEq(timestamp, timestamp3); + + uint8 decimals = s_dataFeedsCache.getDecimals(dataIds[0]); + assertEq(decimals, 18); + + string memory description = s_dataFeedsCache.getDescription(dataIds[0]); + assertEq(description, s_descriptions[0]); + } +} + +contract DataFeedsCacheHarness is DataFeedsCache { + function getWorkflowMetaData( + bytes calldata metadata + ) public pure returns (address workflowOwner, bytes10 _workflowName) { + return _getWorkflowMetaData(metadata); + } + + function getDataType(bytes16 id, uint256 index) public pure returns (bytes1) { + return _getDataType(id, index); + } + + function createReportHash( + bytes16 dataId, + address sender, + address _workflowOwner, + bytes10 _workflowName + ) public pure returns (bytes32) { + return _createReportHash(dataId, sender, _workflowOwner, _workflowName); + } +} diff --git a/contracts/src/v0.8/data-feeds/test/DataFeedsCacheGas.t.sol b/contracts/src/v0.8/data-feeds/test/DataFeedsCacheGas.t.sol new file mode 100644 index 00000000000..0b906c75a6c --- /dev/null +++ b/contracts/src/v0.8/data-feeds/test/DataFeedsCacheGas.t.sol @@ -0,0 +1,236 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {DataFeedsSetupGas} from "./DataFeedsSetupGas.t.sol"; + +contract DataFeedsCacheGasTest is DataFeedsSetupGas { + address[] internal s_singleProxyList = new address[](1); + address[] internal s_proxyList = new address[](5); + address[] internal s_newSingleProxyList = new address[](1); + address[] internal s_newProxyList = new address[](5); + + bytes internal s_priceReportBytes1 = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // Offset + hex"0000000000000000000000000000000000000000000000000000000000000001", // Length + hex"010e12d1e0000032000000000000000000000000000000000000000000000000", + abi.encode(100), // Timestamp + abi.encode(s_prices[0]) + ); + bytes internal s_priceReportBytes5 = abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // Offset + hex"0000000000000000000000000000000000000000000000000000000000000005", // Length + hex"010e12d1e0000032000000000000000000000000000000000000000000000000", + abi.encode(100), // Timestamp + abi.encode(s_prices[0]), + hex"010e12dde0000032000000000000000000000000000000000000000000000000", + abi.encode(100), // Timestamp + abi.encode(s_prices[1]), + hex"01b476d70d000232000000000000000000000000000000000000000000000000", + abi.encode(100), // Timestamp + abi.encode(s_prices[2]), + hex"0169bd6041000132000000000000000000000000000000000000000000000000", + abi.encode(100), // Timestamp + abi.encode(s_prices[3]), + hex"010e12f1e0000032000000000000000000000000000000000000000000000000", + abi.encode(100), // Timestamp + abi.encode(s_prices[4]) + ); + + function setUp() public virtual override { + DataFeedsSetupGas.setUp(); + + s_singleProxyList[0] = address(10002); + + s_proxyList[0] = address(10002); + s_proxyList[1] = address(s_dataFeedsLegacyAggregatorProxy); + s_proxyList[2] = address(s_dataFeedsAggregatorProxy); + s_proxyList[3] = address(10005); + s_proxyList[4] = address(10006); + + s_newSingleProxyList[0] = address(10007); + + s_newProxyList[0] = address(10002); + s_newProxyList[1] = address(10003); + s_newProxyList[2] = address(10004); + s_newProxyList[3] = address(10005); + s_newProxyList[4] = address(10006); + + vm.startPrank(OWNER); + s_dataFeedsCache.updateDataIdMappingsForProxies(s_proxyList, s_batchValueIds); + } + + function test_write_setDecimalFeedConfigs_1_gas() public { + vm.startSnapshotGas("test_write_setDecimalFeedConfigs_1_gas"); + s_dataFeedsCache.setDecimalFeedConfigs(s_dataIds1New, s_descriptions1, s_workflowMetadata); + vm.stopSnapshotGas("test_write_setDecimalFeedConfigs_1_gas"); + } + + function test_write_setDecimalFeedConfigs_5_gas() public { + vm.startSnapshotGas("test_write_setDecimalFeedConfigs_5_gas"); + s_dataFeedsCache.setDecimalFeedConfigs(s_dataIds5New, s_descriptions5, s_workflowMetadata); + vm.stopSnapshotGas("test_write_setDecimalFeedConfigs_5_gas"); + } + + function test_write_setDecimalFeedConfigs_with_delete_1_gas() public { + vm.startSnapshotGas("test_write_setDecimalFeedConfigs_with_delete_1_gas"); + s_dataFeedsCache.setDecimalFeedConfigs(s_dataIds1Old, s_descriptions1, s_workflowMetadata); + vm.stopSnapshotGas("test_write_setDecimalFeedConfigs_with_delete_1_gas"); + } + + function test_write_setDecimalFeedConfigs_with_delete_5_gas() public { + vm.startSnapshotGas("test_write_setDecimalFeedConfigs_with_delete_5_gas"); + s_dataFeedsCache.setDecimalFeedConfigs(s_dataIds5Old, s_descriptions5, s_workflowMetadata); + vm.stopSnapshotGas("test_write_setDecimalFeedConfigs_with_delete_5_gas"); + } + + function test_write_setBundleFeedConfigs_1_gas() public { + vm.startSnapshotGas("test_write_setBundleFeedConfigs_1_gas"); + s_dataFeedsCache.setBundleFeedConfigs(s_dataIds1New, s_descriptions1, s_decimals1, s_workflowMetadata); + vm.stopSnapshotGas("test_write_setBundleFeedConfigs_1_gas"); + } + + function test_write_setBundleFeedConfigs_5_gas() public { + vm.startSnapshotGas("test_write_setBundleFeedConfigs_5_gas"); + s_dataFeedsCache.setBundleFeedConfigs(s_dataIds5New, s_descriptions5, s_decimals5, s_workflowMetadata); + vm.stopSnapshotGas("test_write_setBundleFeedConfigs_5_gas"); + } + + function test_write_setBundleFeedConfigs_with_delete_1_gas() public { + vm.startSnapshotGas("test_write_setBundleFeedConfigs_with_delete_1_gas"); + s_dataFeedsCache.setBundleFeedConfigs(s_dataIds1Old, s_descriptions1, s_decimals1, s_workflowMetadata); + vm.stopSnapshotGas("test_write_setBundleFeedConfigs_with_delete_1_gas"); + } + + function test_write_setBundleFeedConfigs_with_delete_5_gas() public { + vm.startSnapshotGas("test_write_setBundleFeedConfigs_with_delete_5_gas"); + s_dataFeedsCache.setBundleFeedConfigs(s_dataIds5Old, s_descriptions5, s_decimals5, s_workflowMetadata); + vm.stopSnapshotGas("test_write_setBundleFeedConfigs_with_delete_5_gas"); + } + + function test_write_removeFeedConfigs_1_gas() public { + vm.startSnapshotGas("test_write_removeFeedConfigs_1_gas"); + s_dataFeedsCache.removeFeedConfigs(s_dataIds1Old); + vm.stopSnapshotGas("test_write_removeFeedConfigs_1_gas"); + } + + function test_write_removeFeedConfigs_5_gas() public { + vm.startSnapshotGas("test_write_removeFeedConfigs_5_gas"); + s_dataFeedsCache.removeFeedConfigs(s_dataIds5Old); + vm.stopSnapshotGas("test_write_removeFeedConfigs_5_gas"); + } + + function test_write_onReport_prices_1_gas() public { + vm.startSnapshotGas("test_write_onReport_prices_1_gas"); + vm.startPrank(s_reportSender); + s_dataFeedsCache.onReport(s_metadata, s_priceReportBytes1); + vm.stopSnapshotGas("test_write_onReport_prices_1_gas"); + } + + function test_write_onReport_prices_5_gas() public { + vm.startSnapshotGas("test_write_onReport_prices_5_gas"); + vm.startPrank(s_reportSender); + s_dataFeedsCache.onReport(s_metadata, s_priceReportBytes5); + vm.stopSnapshotGas("test_write_onReport_prices_5_gas"); + } + + function test_updateDataIdMappingsForProxies1feed_gas() public { + vm.startSnapshotGas("test_updateDataIdMappingsForProxies1feed_gas"); + s_dataFeedsCache.updateDataIdMappingsForProxies(s_newSingleProxyList, s_singleValueId); + vm.stopSnapshotGas("test_updateDataIdMappingsForProxies1feed_gas"); + } + + function test_updateDataIdMappingsForProxies5feeds_gas() public { + vm.startSnapshotGas("test_updateDataIdMappingsForProxies5feeds_gas"); + s_dataFeedsCache.updateDataIdMappingsForProxies(s_newProxyList, s_batchValueIds); + vm.stopSnapshotGas("test_updateDataIdMappingsForProxies5feeds_gas"); + } + + function test_removeDataIdMappingsForProxies1feed_gas() public { + vm.startSnapshotGas("test_removeDataIdMappingsForProxies1feed_gas"); + s_dataFeedsCache.removeDataIdMappingsForProxies(s_singleProxyList); + vm.stopSnapshotGas("test_removeDataIdMappingsForProxies1feed_gas"); + } + + function test_removeDataIdMappingsForProxies5feeds_gas() public { + vm.startSnapshotGas("test_removeDataIdMappingsForProxies5feeds_gas"); + s_dataFeedsCache.removeDataIdMappingsForProxies(s_proxyList); + vm.stopSnapshotGas("test_removeDataIdMappingsForProxies5feeds_gas"); + } + + /// AggregatorInterface + + function test_latestAnswer_proxy_gas() public { + vm.startSnapshotGas("test_latestAnswer_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.latestAnswer(); + vm.stopSnapshotGas("test_latestAnswer_proxy_gas"); + } + + function test_latestTimestamp_proxy_gas() public { + vm.startSnapshotGas("test_latestTimestamp_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.latestTimestamp(); + vm.stopSnapshotGas("test_latestTimestamp_proxy_gas"); + } + + function test_latestRound_proxy_gas() public { + vm.startSnapshotGas("test_latestRound_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.latestRound(); + vm.stopSnapshotGas("test_latestRound_proxy_gas"); + } + + function test_getAnswer_proxy_gas() public { + vm.startSnapshotGas("test_getAnswer_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.getAnswer(18446744073709551617); + vm.stopSnapshotGas("test_getAnswer_proxy_gas"); + } + + function test_getTimestamp_proxy_gas() public { + vm.startSnapshotGas("test_getTimestamp_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.getTimestamp(18446744073709551617); + vm.stopSnapshotGas("test_getTimestamp_proxy_gas"); + } + + /// AggregatorV3Interface + + function test_decimals_proxy_gas() public { + vm.startSnapshotGas("test_decimals_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.decimals(); + vm.stopSnapshotGas("test_decimals_proxy_gas"); + } + + function test_description_proxy_gas() public { + vm.startSnapshotGas("test_description_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.description(); + vm.stopSnapshotGas("test_description_proxy_gas"); + } + + function test_getRoundData_proxy_gas() public { + vm.startSnapshotGas("test_getRoundData_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.getRoundData(uint80(18446744073709551617)); + vm.stopSnapshotGas("test_getRoundData_proxy_gas"); + } + + function test_latestRoundData_proxy_gas() public { + vm.startSnapshotGas("test_latestRoundData_proxy_gas"); + s_dataFeedsLegacyAggregatorProxy.latestRoundData(); + vm.stopSnapshotGas("test_latestRoundData_proxy_gas"); + } + + /// BundleAggregatorInterface + function test_bundleDecimals_proxy_gas() public { + vm.startSnapshotGas("test_bundleDecimals_proxy_gas"); + s_dataFeedsAggregatorProxy.bundleDecimals(); + vm.stopSnapshotGas("test_bundleDecimals_proxy_gas"); + } + + function test_latestBundle_proxy_gas() public { + vm.startSnapshotGas("test_latestBundle_proxy_gas"); + s_dataFeedsAggregatorProxy.latestBundle(); + vm.stopSnapshotGas("test_latestBundle_proxy_gas"); + } + + function test_latestBundleTimestamp_proxy_gas() public { + vm.startSnapshotGas("test_latestBundleTimestamp_proxy_gas"); + s_dataFeedsAggregatorProxy.latestBundleTimestamp(); + vm.stopSnapshotGas("test_latestBundleTimestamp_proxy_gas"); + } +} diff --git a/contracts/src/v0.8/data-feeds/test/DataFeedsSetupGas.t.sol b/contracts/src/v0.8/data-feeds/test/DataFeedsSetupGas.t.sol new file mode 100644 index 00000000000..fc8322e8ec0 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/test/DataFeedsSetupGas.t.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {BundleAggregatorProxy} from "../BundleAggregatorProxy.sol"; +import {DataFeedsCache} from "../DataFeedsCache.sol"; + +import {BaseTest} from "./BaseTest.t.sol"; +import {DataFeedsLegacyAggregatorProxy} from "./helpers/DataFeedsLegacyAggregatorProxy.sol"; + +// solhint-disable-next-line max-states-count +contract DataFeedsSetupGas is BaseTest { + struct ReceivedBundleReport { + bytes32 dataId; + uint32 timestamp; + bytes bundle; + } + + DataFeedsLegacyAggregatorProxy internal s_dataFeedsLegacyAggregatorProxy; + BundleAggregatorProxy internal s_dataFeedsAggregatorProxy; + DataFeedsCache internal s_dataFeedsCache; + + string[] internal s_descriptions1 = new string[](1); + string[] internal s_descriptions5 = new string[](5); + + uint8[][] internal s_decimals1 = new uint8[][](1); + uint8[][] internal s_decimals5 = new uint8[][](5); + + bytes16[] internal s_dataIds = new bytes16[](5); + bytes16[] internal s_dataIds1Old = new bytes16[](1); + bytes16[] internal s_dataIds1New = new bytes16[](1); + bytes16[] internal s_dataIds5Old = new bytes16[](5); + bytes16[] internal s_dataIds5New = new bytes16[](5); + + bytes16[] internal s_singleValueId = new bytes16[](1); + bytes16[] internal s_batchValueIds = new bytes16[](5); + + bytes32[] internal s_paddedDataIds = new bytes32[](5); + uint256 internal s_price1 = 123456; + uint256 internal s_price2 = 456789; + uint32 internal s_timestamp1 = 0; + uint32 internal s_timestamp2 = 0; + uint32 internal s_timestamp3 = 0; + + address internal s_reportSender = address(10002); + string internal s_description = "description"; + bytes32 internal s_workflowId = hex"6d795f6964000000000000000000000000000000000000000000000000000000"; + bytes2 internal s_reportId = hex"0001"; + address[] internal s_senders = [s_reportSender, s_reportSender]; + address[] internal s_workflowOwners = [address(10004), address(10005)]; + bytes10[] internal s_workflowNames = [bytes10("abc"), bytes10("xyz")]; + + DataFeedsCache.WorkflowMetadata internal s_workflowMetadata1 = DataFeedsCache.WorkflowMetadata({ + allowedSender: s_senders[0], + allowedWorkflowOwner: s_workflowOwners[0], + allowedWorkflowName: s_workflowNames[0] + }); + + DataFeedsCache.WorkflowMetadata internal s_workflowMetadata2 = DataFeedsCache.WorkflowMetadata({ + allowedSender: s_senders[1], + allowedWorkflowOwner: s_workflowOwners[1], + allowedWorkflowName: s_workflowNames[1] + }); + DataFeedsCache.WorkflowMetadata[] internal s_workflowMetadata; + + uint256[] internal s_prices = [123, 456, 789, 876, 543]; + uint32[] internal s_timestamps = [12, 34, 56, 78, 90]; + bytes internal s_metadata; + + function setUp() public virtual override { + BaseTest.setUp(); + + s_dataFeedsCache = new DataFeedsCache(); + s_dataFeedsLegacyAggregatorProxy = new DataFeedsLegacyAggregatorProxy(address(s_dataFeedsCache)); + s_dataFeedsAggregatorProxy = new BundleAggregatorProxy(address(s_dataFeedsCache), OWNER); + + s_paddedDataIds = new bytes32[](10); + s_paddedDataIds[0] = hex"010e12d1e0000032000000000000000000000000000000000000000000000000"; + s_paddedDataIds[1] = hex"010e12dde0000032000000000000000000000000000000000000000000000000"; + s_paddedDataIds[2] = hex"01b476d70d000232000000000000000000000000000000000000000000000000"; + s_paddedDataIds[3] = hex"0169bd6041000132000000000000000000000000000000000000000000000000"; + s_paddedDataIds[4] = hex"010e12f1e0000032000000000000000000000000000000000000000000000000"; + s_paddedDataIds[5] = hex"010e1ab1e0000004000000000000000000000000000000000000000000000000"; + s_paddedDataIds[6] = hex"0112345670000004000000000000000000000000000000000000000000000000"; + s_paddedDataIds[7] = hex"0198765432000004000000000000000000000000000000000000000000000000"; + s_paddedDataIds[8] = hex"0187654321000004000000000000000000000000000000000000000000000000"; + s_paddedDataIds[9] = hex"0112754834000004000000000000000000000000000000000000000000000000"; + + s_descriptions1 = new string[](1); + s_descriptions1[0] = "description0"; + + s_descriptions5 = new string[](5); + s_descriptions5[0] = "description0"; + s_descriptions5[1] = "description1"; + s_descriptions5[2] = "description2"; + s_descriptions5[3] = "description3"; + s_descriptions5[4] = "description4"; + + s_decimals1 = new uint8[][](1); + s_decimals1[0] = new uint8[](1); + s_decimals1[0][0] = 18; + + s_decimals5 = new uint8[][](5); + s_decimals5[0] = new uint8[](1); + s_decimals5[0][0] = 18; + s_decimals5[1] = new uint8[](2); + s_decimals5[1][0] = 18; + s_decimals5[1][1] = 0; + s_decimals5[2] = new uint8[](1); + s_decimals5[2][0] = 18; + s_decimals5[3] = new uint8[](3); + s_decimals5[3][0] = 18; + s_decimals5[3][1] = 8; + s_decimals5[3][2] = 1; + s_decimals5[4] = new uint8[](1); + s_decimals5[4][0] = 18; + + s_dataIds = new bytes16[](10); + s_dataIds[0] = bytes16(s_paddedDataIds[0]); + s_dataIds[1] = bytes16(s_paddedDataIds[1]); + s_dataIds[2] = bytes16(s_paddedDataIds[2]); + s_dataIds[3] = bytes16(s_paddedDataIds[3]); + s_dataIds[4] = bytes16(s_paddedDataIds[4]); + s_dataIds[5] = bytes16(s_paddedDataIds[5]); + s_dataIds[6] = bytes16(s_paddedDataIds[6]); + s_dataIds[7] = bytes16(s_paddedDataIds[7]); + s_dataIds[8] = bytes16(s_paddedDataIds[8]); + s_dataIds[9] = bytes16(s_paddedDataIds[9]); + + s_dataIds1Old[0] = s_dataIds[0]; + + s_dataIds1New[0] = s_dataIds[5]; + + s_dataIds5Old[0] = s_dataIds[0]; + s_dataIds5Old[1] = s_dataIds[1]; + s_dataIds5Old[2] = s_dataIds[2]; + s_dataIds5Old[3] = s_dataIds[3]; + s_dataIds5Old[4] = s_dataIds[4]; + + s_dataIds5New[0] = s_dataIds[5]; + s_dataIds5New[1] = s_dataIds[6]; + s_dataIds5New[2] = s_dataIds[7]; + s_dataIds5New[3] = s_dataIds[8]; + s_dataIds5New[4] = s_dataIds[9]; + + s_singleValueId = new bytes16[](1); + s_singleValueId[0] = s_dataIds[0]; + + s_batchValueIds = new bytes16[](5); + s_batchValueIds[0] = s_dataIds[0]; + s_batchValueIds[1] = s_dataIds[1]; + s_batchValueIds[2] = s_dataIds[2]; + s_batchValueIds[3] = s_dataIds[3]; + s_batchValueIds[4] = s_dataIds[4]; + + s_metadata = abi.encodePacked(s_workflowId, s_workflowNames[0], s_workflowOwners[0], s_reportId); + + s_workflowMetadata.push(s_workflowMetadata1); + s_workflowMetadata.push(s_workflowMetadata2); + + s_dataFeedsCache.setFeedAdmin(OWNER, true); + + s_dataFeedsCache.setDecimalFeedConfigs(s_dataIds5Old, s_descriptions5, s_workflowMetadata); + s_dataFeedsCache.setBundleFeedConfigs(s_dataIds5Old, s_descriptions5, s_decimals5, s_workflowMetadata); + + vm.stopPrank(); + vm.startPrank(s_reportSender); + + s_dataFeedsCache.onReport( + s_metadata, + abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // Offset + hex"0000000000000000000000000000000000000000000000000000000000000003", // Length + s_paddedDataIds[0], + abi.encode(s_timestamps[0]), + abi.encode(s_prices[0]), + s_paddedDataIds[1], + abi.encode(s_timestamps[1]), + abi.encode(s_prices[1]), + s_paddedDataIds[2], + abi.encode(s_timestamps[2]), + abi.encode(s_prices[2]) + ) + ); + + s_dataFeedsCache.onReport( + s_metadata, + abi.encodePacked( + hex"0000000000000000000000000000000000000000000000000000000000000020", // offset + hex"0000000000000000000000000000000000000000000000000000000000000002", // length + hex"0000000000000000000000000000000000000000000000000000000000000040", // offset of ReportOne + hex"0000000000000000000000000000000000000000000000000000000000000100", // offset of ReportTwo + s_paddedDataIds[0], // ReportOne FeedID + abi.encode(s_timestamps[0]), + hex"0000000000000000000000000000000000000000000000000000000000000060", // offset of ReportOne Bundle + hex"0000000000000000000000000000000000000000000000000000000000000040", // length of ReportOne Bundle + abi.encode(s_prices[0]), + abi.encode(s_prices[1]), + s_paddedDataIds[1], // ReportTwo FeedID + abi.encode(s_timestamps[1]), + hex"0000000000000000000000000000000000000000000000000000000000000060", // offset of ReportTwo Bundle + hex"0000000000000000000000000000000000000000000000000000000000000040", // length of ReportTwo Bundle + abi.encode(s_prices[2]), + abi.encode(s_prices[3]) + ) + ); + + vm.stopPrank(); + } +} diff --git a/contracts/src/v0.8/data-feeds/test/helpers/DataFeedsLegacyAggregatorProxy.sol b/contracts/src/v0.8/data-feeds/test/helpers/DataFeedsLegacyAggregatorProxy.sol new file mode 100644 index 00000000000..a9257919530 --- /dev/null +++ b/contracts/src/v0.8/data-feeds/test/helpers/DataFeedsLegacyAggregatorProxy.sol @@ -0,0 +1,318 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {ConfirmedOwner} from "../../../shared/access/ConfirmedOwner.sol"; +import {AggregatorV2V3Interface} from "../../../shared/interfaces/AggregatorV2V3Interface.sol"; + +/// @title A trusted proxy for updating where current answers are read from +/// @notice This contract provides a consistent address for the +/// CurrentAnswerInterface but delegates where it reads from to the owner, who is +/// trusted to update it. +contract DataFeedsLegacyAggregatorProxy is AggregatorV2V3Interface, ConfirmedOwner { + struct Phase { + uint16 id; + AggregatorV2V3Interface aggregator; + } + + AggregatorV2V3Interface private s_proposedAggregator; + mapping(uint16 => AggregatorV2V3Interface) private s_phaseAggregators; + Phase private s_currentPhase; + + uint256 private constant PHASE_OFFSET = 64; + uint256 private constant PHASE_SIZE = 16; + uint256 private constant MAX_ID = 2 ** (PHASE_OFFSET + PHASE_SIZE) - 1; + + event AggregatorProposed(address indexed current, address indexed proposed); + event AggregatorConfirmed(address indexed previous, address indexed latest); + + constructor( + address aggregatorAddress + ) ConfirmedOwner(msg.sender) { + setAggregator(aggregatorAddress); + } + + /// @notice Reads the current answer from aggregator delegated to. + /// @dev #[deprecated] Use latestRoundData instead. This does not error if no + /// answer has been reached, it will simply return 0. Either wait to point to + /// an already answered Aggregator or use the recommended latestRoundData + /// instead which includes better verification information. + function latestAnswer() external view virtual override returns (int256 answer) { + return s_currentPhase.aggregator.latestAnswer(); + } + + /// @notice Reads the last updated height from aggregator delegated to. + /// @dev #[deprecated] Use latestRoundData instead. This does not error if no + /// answer has been reached, it will simply return 0. Either wait to point to + /// an already answered Aggregator or use the recommended latestRoundData + /// instead which includes better verification information. + function latestTimestamp() external view virtual override returns (uint256 updatedAt) { + return s_currentPhase.aggregator.latestTimestamp(); + } + + /// @notice get past rounds answers + /// @param roundId the answer number to retrieve the answer for + /// @dev #[deprecated] Use getRoundData instead. This does not error if no + /// answer has been reached, it will simply return 0. Either wait to point to + /// an already answered Aggregator or use the recommended getRoundData + /// instead which includes better verification information. + function getAnswer( + uint256 roundId + ) external view virtual override returns (int256 answer) { + if (roundId > MAX_ID) return 0; + + (uint16 phaseId, uint64 aggregatorRoundId) = parseIds(roundId); + AggregatorV2V3Interface aggregator = s_phaseAggregators[phaseId]; + if (address(aggregator) == address(0)) return 0; + + return aggregator.getAnswer(aggregatorRoundId); + } + + /// @notice get block timestamp when an answer was last updated + /// @param roundId the answer number to retrieve the updated timestamp for + /// @dev #[deprecated] Use getRoundData instead. This does not error if no + /// answer has been reached, it will simply return 0. Either wait to point to + /// an already answered Aggregator or use the recommended getRoundData + /// instead which includes better verification information. + function getTimestamp( + uint256 roundId + ) external view virtual override returns (uint256 updatedAt) { + if (roundId > MAX_ID) return 0; + + (uint16 phaseId, uint64 aggregatorRoundId) = parseIds(roundId); + AggregatorV2V3Interface aggregator = s_phaseAggregators[phaseId]; + if (address(aggregator) == address(0)) return 0; + + return aggregator.getTimestamp(aggregatorRoundId); + } + + /// @notice get the latest completed round where the answer was updated. This + /// ID includes the proxy's phase, to make sure round IDs increase even when + /// switching to a newly deployed aggregator. + /// @dev #[deprecated] Use latestRoundData instead. This does not error if no + /// answer has been reached, it will simply return 0. Either wait to point to + /// an already answered Aggregator or use the recommended latestRoundData + /// instead which includes better verification information. + function latestRound() external view virtual override returns (uint256 roundId) { + Phase memory phase = s_currentPhase; // cache storage reads + return addPhase(phase.id, uint64(phase.aggregator.latestRound())); + } + + /// @notice get data about a round. Consumers are encouraged to check + /// that they're receiving fresh data by inspecting the updatedAt and + /// answeredInRound return values. + /// Note that different underlying implementations of AggregatorV3Interface + /// have slightly different semantics for some of the return values. Consumers + /// should determine what implementations they expect to receive + /// data from and validate that they can properly handle return data from all + /// of them. + /// @param roundId the requested round ID as presented through the proxy, this + /// is made up of the aggregator's round ID with the phase ID encoded in the + /// two highest order bytes + /// @return id is the round ID from the aggregator for which the data was + /// retrieved combined with an phase to ensure that round IDs get larger as + /// time moves forward. + /// @return answer is the answer for the given round + /// @return startedAt is the timestamp when the round was started. + /// (Only some AggregatorV3Interface implementations return meaningful values) + /// @return updatedAt is the timestamp when the round last was updated (i.e. + /// answer was last computed) + /// @return answeredInRound is the round ID of the round in which the answer + /// was computed. + /// (Only some AggregatorV3Interface implementations return meaningful values) + /// @dev Note that answer and updatedAt may change between queries. + function getRoundData( + uint80 roundId + ) + public + view + virtual + override + returns (uint80 id, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + (uint16 phaseId, uint64 aggregatorRoundId) = parseIds(roundId); + + (id, answer, startedAt, updatedAt, answeredInRound) = s_phaseAggregators[phaseId].getRoundData(aggregatorRoundId); + + return addPhaseIds(id, answer, startedAt, updatedAt, answeredInRound, phaseId); + } + + /// @notice get data about the latest round. Consumers are encouraged to check + /// that they're receiving fresh data by inspecting the updatedAt and + /// answeredInRound return values. + /// Note that different underlying implementations of AggregatorV3Interface + /// have slightly different semantics for some of the return values. Consumers + /// should determine what implementations they expect to receive + /// data from and validate that they can properly handle return data from all + /// of them. + /// @return id is the round ID from the aggregator for which the data was + /// retrieved combined with an phase to ensure that round IDs get larger as + /// time moves forward. + /// @return answer is the answer for the given round + /// @return startedAt is the timestamp when the round was started. + /// (Only some AggregatorV3Interface implementations return meaningful values) + /// @return updatedAt is the timestamp when the round last was updated (i.e. + /// answer was last computed) + /// @return answeredInRound is the round ID of the round in which the answer + /// was computed. + /// (Only some AggregatorV3Interface implementations return meaningful values) + /// @dev Note that answer and updatedAt may change between queries. + function latestRoundData() + public + view + virtual + override + returns (uint80 id, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + Phase memory current = s_currentPhase; // cache storage reads + + (id, answer, startedAt, updatedAt, answeredInRound) = current.aggregator.latestRoundData(); + + return addPhaseIds(id, answer, startedAt, updatedAt, answeredInRound, current.id); + } + + /// @notice Used if an aggregator contract has been proposed. + /// @param roundId the round ID to retrieve the round data for + /// @return id is the round ID for which data was retrieved + /// @return answer is the answer for the given round + /// @return startedAt is the timestamp when the round was started. + /// (Only some AggregatorV3Interface implementations return meaningful values) + /// @return updatedAt is the timestamp when the round last was updated (i.e. + /// answer was last computed) + /// @return answeredInRound is the round ID of the round in which the answer + /// was computed. + function proposedGetRoundData( + uint80 roundId + ) + external + view + virtual + hasProposal + returns (uint80 id, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + return s_proposedAggregator.getRoundData(roundId); + } + + /// @notice Used if an aggregator contract has been proposed. + /// @return id is the round ID for which data was retrieved + /// @return answer is the answer for the given round + /// @return startedAt is the timestamp when the round was started. + /// (Only some AggregatorV3Interface implementations return meaningful values) + /// @return updatedAt is the timestamp when the round last was updated (i.e. + /// answer was last computed) + /// @return answeredInRound is the round ID of the round in which the answer + /// was computed. + function proposedLatestRoundData() + external + view + virtual + hasProposal + returns (uint80 id, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound) + { + return s_proposedAggregator.latestRoundData(); + } + + /// @notice returns the current phase's aggregator address. + function aggregator() external view returns (address) { + return address(s_currentPhase.aggregator); + } + + /// @notice returns the current phase's ID. + function phaseId() external view returns (uint16) { + return s_currentPhase.id; + } + + /// @notice represents the number of decimals the aggregator responses represent. + function decimals() external view override returns (uint8) { + return s_currentPhase.aggregator.decimals(); + } + + /// @notice the version number representing the type of aggregator the proxy + /// points to. + function version() external view override returns (uint256) { + return s_currentPhase.aggregator.version(); + } + + /// @notice returns the description of the aggregator the proxy points to. + function description() external view returns (string memory) { + return s_currentPhase.aggregator.description(); + } + + /// @notice returns the current proposed aggregator + function proposedAggregator() external view returns (address) { + return address(s_proposedAggregator); + } + + /// @notice return a phase aggregator using the phaseId + /// @param phaseId uint16 + function phaseAggregators( + uint16 phaseId + ) external view returns (address) { + return address(s_phaseAggregators[phaseId]); + } + + /// @notice Allows the owner to propose a new address for the aggregator + /// @param aggregatorAddress The new address for the aggregator contract + function proposeAggregator( + address aggregatorAddress + ) external onlyOwner { + s_proposedAggregator = AggregatorV2V3Interface(aggregatorAddress); + emit AggregatorProposed(address(s_currentPhase.aggregator), aggregatorAddress); + } + + /// @notice Allows the owner to confirm and change the address + /// to the proposed aggregator + /// @dev Reverts if the given address doesn't match what was previously + /// proposed + /// @param aggregatorAddress The new address for the aggregator contract + function confirmAggregator( + address aggregatorAddress + ) external onlyOwner { + require(aggregatorAddress == address(s_proposedAggregator), "Invalid proposed aggregator"); + address previousAggregator = address(s_currentPhase.aggregator); + delete s_proposedAggregator; + setAggregator(aggregatorAddress); + emit AggregatorConfirmed(previousAggregator, aggregatorAddress); + } + + /// Internal + + function setAggregator( + address aggregatorAddress + ) internal { + uint16 id = s_currentPhase.id + 1; + s_currentPhase = Phase(id, AggregatorV2V3Interface(aggregatorAddress)); + s_phaseAggregators[id] = AggregatorV2V3Interface(aggregatorAddress); + } + + function addPhase(uint16 phase, uint64 originalId) internal pure returns (uint80) { + return uint80((uint256(phase) << PHASE_OFFSET) | originalId); + } + + function parseIds( + uint256 roundId + ) internal pure returns (uint16, uint64) { + uint16 phaseId = uint16(roundId >> PHASE_OFFSET); + uint64 aggregatorRoundId = uint64(roundId); + + return (phaseId, aggregatorRoundId); + } + + function addPhaseIds( + uint80 roundId, + int256 answer, + uint256 startedAt, + uint256 updatedAt, + uint80 answeredInRound, + uint16 phaseId + ) internal pure returns (uint80, int256, uint256, uint256, uint80) { + return + (addPhase(phaseId, uint64(roundId)), answer, startedAt, updatedAt, addPhase(phaseId, uint64(answeredInRound))); + } + + /// Modifiers + + modifier hasProposal() { + require(address(s_proposedAggregator) != address(0), "No proposed aggregator present"); + _; + } +} diff --git a/core/gethwrappers/data-feeds/generated/aggregator_proxy/aggregator_proxy.go b/core/gethwrappers/data-feeds/generated/aggregator_proxy/aggregator_proxy.go new file mode 100644 index 00000000000..5fc9de02457 --- /dev/null +++ b/core/gethwrappers/data-feeds/generated/aggregator_proxy/aggregator_proxy.go @@ -0,0 +1,1367 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package aggregator_proxy + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +var AggregatorProxyMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_aggregator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_accessController\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"int256\",\"name\":\"current\",\"type\":\"int256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"}],\"name\":\"AnswerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"roundId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"startedBy\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"}],\"name\":\"NewRound\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessController\",\"outputs\":[{\"internalType\":\"contractAccessControllerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"aggregator\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_aggregator\",\"type\":\"address\"}],\"name\":\"confirmAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"description\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_roundId\",\"type\":\"uint256\"}],\"name\":\"getAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint80\",\"name\":\"_roundId\",\"type\":\"uint80\"}],\"name\":\"getRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_roundId\",\"type\":\"uint256\"}],\"name\":\"getTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestAnswer\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"addresspayable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"name\":\"phaseAggregators\",\"outputs\":[{\"internalType\":\"contractAggregatorV2V3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"phaseId\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_aggregator\",\"type\":\"address\"}],\"name\":\"proposeAggregator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposedAggregator\",\"outputs\":[{\"internalType\":\"contractAggregatorV2V3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint80\",\"name\":\"_roundId\",\"type\":\"uint80\"}],\"name\":\"proposedGetRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proposedLatestRoundData\",\"outputs\":[{\"internalType\":\"uint80\",\"name\":\"roundId\",\"type\":\"uint80\"},{\"internalType\":\"int256\",\"name\":\"answer\",\"type\":\"int256\"},{\"internalType\":\"uint256\",\"name\":\"startedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"updatedAt\",\"type\":\"uint256\"},{\"internalType\":\"uint80\",\"name\":\"answeredInRound\",\"type\":\"uint80\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_accessController\",\"type\":\"address\"}],\"name\":\"setController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60806040523480156200001157600080fd5b50604051620026e8380380620026e8833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b031916331790558162000067816001600160e01b036200008416565b506200007c816001600160e01b03620000f316565b505062000175565b60028054604080518082018252600161ffff80851691909101168082526001600160a01b0395909516602091820181905261ffff19909316851762010000600160b01b0319166201000084021790935560009384526004909252912080546001600160a01b0319169091179055565b6000546001600160a01b0316331462000153576040805162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0392909216919091179055565b61256380620001856000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80638f6b4d91116100e3578063bc43cbaf1161008c578063f2fde38b11610066578063f2fde38b1461042b578063f8a2abd31461045e578063feaf968c146104915761018d565b8063bc43cbaf146103fa578063c159730414610402578063e8c4be30146104235761018d565b8063a928c096116100bd578063a928c0961461038d578063b5ab58dc146103c0578063b633620c146103dd5761018d565b80638f6b4d911461032957806392eefe9b146103315780639a6fc8f5146103645761018d565b80636001ac531161014557806379ba50971161011f57806379ba50971461030f5780638205bf6a146103195780638da5cb5b146103215761018d565b80636001ac5314610222578063668a0f021461028a5780637284e416146102925761018d565b806350d25bcd1161017657806350d25bcd146101e157806354fd4d50146101fb57806358303b10146102035761018d565b8063245a7bfc14610192578063313ce567146101c3575b600080fd5b61019a610499565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101cb6104bb565b6040805160ff9092168252519081900360200190f35b6101e9610559565b60408051918252519081900360200190f35b6101e96106e0565b61020b61074d565b6040805161ffff9092168252519081900360200190f35b61024b6004803603602081101561023857600080fd5b503569ffffffffffffffffffff16610757565b6040805169ffffffffffffffffffff96871681526020810195909552848101939093526060840191909152909216608082015290519081900360a00190f35b6101e9610978565b61029a610af9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d45781810151838201526020016102bc565b50505050905090810190601f1680156103015780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610317610c76565b005b6101e9610d78565b61019a610ef9565b61024b610f15565b6103176004803603602081101561034757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611134565b61024b6004803603602081101561037a57600080fd5b503569ffffffffffffffffffff16611201565b610317600480360360208110156103a357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661138b565b6101e9600480360360208110156103d657600080fd5b50356114ce565b6101e9600480360360208110156103f357600080fd5b5035611657565b61019a6117d9565b61019a6004803603602081101561041857600080fd5b503561ffff166117f5565b61019a61181d565b6103176004803603602081101561044157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611839565b6103176004803603602081101561047457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611935565b61024b611a02565b60025462010000900473ffffffffffffffffffffffffffffffffffffffff1690565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b505afa15801561053c573d6000803e3d6000fd5b505050506040513d602081101561055257600080fd5b5051905090565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806106675750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561063a57600080fd5b505afa15801561064e573d6000803e3d6000fd5b505050506040513d602081101561066457600080fd5b50515b6106d257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611b8b565b91505090565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166354fd4d506040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b60025461ffff1690565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061086d5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561084057600080fd5b505afa158015610854573d6000803e3d6000fd5b505050506040513d602081101561086a57600080fd5b50515b6108d857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff1661095c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b61096587611bf8565b939b929a50909850965090945092505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610a865750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610a5957600080fd5b505afa158015610a6d573d6000803e3d6000fd5b505050506040513d6020811015610a8357600080fd5b50515b610af157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611d57565b6060600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b158015610b6657600080fd5b505afa158015610b7a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015610bc157600080fd5b8101908080516040519392919084640100000000821115610be157600080fd5b908301906020820185811115610bf657600080fd5b8251640100000000811182820188101715610c1057600080fd5b82525081516020918201929091019080838360005b83811015610c3d578181015183820152602001610c25565b50505050905090810190601f168015610c6a5780820380516001836020036101000a031916815260200191505b50604052505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cfc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015290519081900360640190fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60055460009073ffffffffffffffffffffffffffffffffffffffff16801580610e865750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610e5957600080fd5b505afa158015610e6d573d6000803e3d6000fd5b505050506040513d6020811015610e8357600080fd5b50515b610ef157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6106da611e2e565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff1680158061102b5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015610ffe57600080fd5b505afa158015611012573d6000803e3d6000fd5b505050506040513d602081101561102857600080fd5b50515b61109657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff1661111a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b611122611e9b565b95509550955095509550509091929394565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff168015806113175750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156112ea57600080fd5b505afa1580156112fe573d6000803e3d6000fd5b505050506040513d602081101561131457600080fd5b50515b61138257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61096587611fe4565b60005473ffffffffffffffffffffffffffffffffffffffff16331461141157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff82811691161461149a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f496e76616c69642070726f706f7365642061676772656761746f720000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556114cb81612117565b50565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806115dc5750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d60208110156115d957600080fd5b50515b61164757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611650836121de565b9392505050565b60055460009073ffffffffffffffffffffffffffffffffffffffff168015806117655750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b15801561173857600080fd5b505afa15801561174c573d6000803e3d6000fd5b505050506040513d602081101561176257600080fd5b50515b6117d057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b611650836122d8565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1633146118bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146119bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600554600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16801580611b185750604080517f6b14daf8000000000000000000000000000000000000000000000000000000008152336004820181815260248301938452366044840181905273ffffffffffffffffffffffffffffffffffffffff861694636b14daf8946000939190606401848480828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201965060209550909350505081840390508186803b158015611aeb57600080fd5b505afa158015611aff573d6000803e3d6000fd5b505050506040513d6020811015611b1557600080fd5b50515b611b8357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f206163636573730000000000000000000000000000000000000000000000604482015290519081900360640190fd5b61112261239b565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b600354600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611c8757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600354604080517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff89166004820152905173ffffffffffffffffffffffffffffffffffffffff90921691639a6fc8f59160248082019260a092909190829003018186803b158015611d0457600080fd5b505afa158015611d18573d6000803e3d6000fd5b505050506040513d60a0811015611d2e57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6000611d61612516565b5060408051808201825260025461ffff81168083526201000090910473ffffffffffffffffffffffffffffffffffffffff16602080840182905284517f668a0f0200000000000000000000000000000000000000000000000000000000815294519394611e1c9463668a0f0292600480840193919291829003018186803b158015611deb57600080fd5b505afa158015611dff573d6000803e3d6000fd5b505050506040513d6020811015611e1557600080fd5b50516124b8565b69ffffffffffffffffffff1691505090565b6000600260000160029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638205bf6a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561052857600080fd5b600354600090819081908190819073ffffffffffffffffffffffffffffffffffffffff16611f2a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4e6f2070726f706f7365642061676772656761746f722070726573656e740000604482015290519081900360640190fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a06040518083038186803b158015611f9257600080fd5b505afa158015611fa6573d6000803e3d6000fd5b505050506040513d60a0811015611fbc57600080fd5b5080516020820151604083015160608401516080909401519299919850965091945092509050565b60008060008060008060006120048869ffffffffffffffffffff166124d8565b61ffff821660009081526004602081905260408083205481517f9a6fc8f500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169381019390935290519496509294509092839283928392839273ffffffffffffffffffffffffffffffffffffffff1691639a6fc8f59160248083019260a0929190829003018186803b1580156120a057600080fd5b505afa1580156120b4573d6000803e3d6000fd5b505050506040513d60a08110156120ca57600080fd5b508051602082015160408301516060840151608090940151929850909650945090925090506120fd85858585858c6124e0565b9b509b509b509b509b505050505050505091939590929450565b60028054604080518082018252600161ffff808516919091011680825273ffffffffffffffffffffffffffffffffffffffff9590951660209182018190527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090931685177fffffffffffffffffffff0000000000000000000000000000000000000000ffff166201000084021790935560009384526004909252912080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600069ffffffffffffffffffff8211156121fa575060006122d3565b600080612206846124d8565b61ffff8216600090815260046020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061224657600093505050506122d3565b8073ffffffffffffffffffffffffffffffffffffffff1663b5ab58dc836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b1580156122a157600080fd5b505afa1580156122b5573d6000803e3d6000fd5b505050506040513d60208110156122cb57600080fd5b505193505050505b919050565b600069ffffffffffffffffffff8211156122f4575060006122d3565b600080612300846124d8565b61ffff8216600090815260046020526040902054919350915073ffffffffffffffffffffffffffffffffffffffff168061234057600093505050506122d3565b8073ffffffffffffffffffffffffffffffffffffffff1663b633620c836040518263ffffffff1660e01b8152600401808267ffffffffffffffff16815260200191505060206040518083038186803b1580156122a157600080fd5b60008060008060006123ab612516565b5060408051808201825260025461ffff8116825262010000900473ffffffffffffffffffffffffffffffffffffffff166020820181905282517ffeaf968c0000000000000000000000000000000000000000000000000000000081529251919260009283928392839283929163feaf968c9160048083019260a0929190829003018186803b15801561243c57600080fd5b505afa158015612450573d6000803e3d6000fd5b505050506040513d60a081101561246657600080fd5b5080516020820151604083015160608401516080909401518a5193995091975095509193509091506124a190869086908690869086906124e0565b9a509a509a509a509a505050505050509091929394565b67ffffffffffffffff1660409190911b69ffff0000000000000000161790565b604081901c91565b60008060008060006124f2868c6124b8565b8a8a8a6124ff8a8c6124b8565b939f929e50909c509a509098509650505050505050565b60408051808201909152600080825260208201529056fea2646970667358221220c6148a0e63011d3b8b4f67078be31115256b163e26351db6fe3b70d7faf433f964736f6c63430006060033", +} + +var AggregatorProxyABI = AggregatorProxyMetaData.ABI + +var AggregatorProxyBin = AggregatorProxyMetaData.Bin + +func DeployAggregatorProxy(auth *bind.TransactOpts, backend bind.ContractBackend, _aggregator common.Address, _accessController common.Address) (common.Address, *types.Transaction, *AggregatorProxy, error) { + parsed, err := AggregatorProxyMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AggregatorProxyBin), backend, _aggregator, _accessController) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &AggregatorProxy{address: address, abi: *parsed, AggregatorProxyCaller: AggregatorProxyCaller{contract: contract}, AggregatorProxyTransactor: AggregatorProxyTransactor{contract: contract}, AggregatorProxyFilterer: AggregatorProxyFilterer{contract: contract}}, nil +} + +type AggregatorProxy struct { + address common.Address + abi abi.ABI + AggregatorProxyCaller + AggregatorProxyTransactor + AggregatorProxyFilterer +} + +type AggregatorProxyCaller struct { + contract *bind.BoundContract +} + +type AggregatorProxyTransactor struct { + contract *bind.BoundContract +} + +type AggregatorProxyFilterer struct { + contract *bind.BoundContract +} + +type AggregatorProxySession struct { + Contract *AggregatorProxy + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type AggregatorProxyCallerSession struct { + Contract *AggregatorProxyCaller + CallOpts bind.CallOpts +} + +type AggregatorProxyTransactorSession struct { + Contract *AggregatorProxyTransactor + TransactOpts bind.TransactOpts +} + +type AggregatorProxyRaw struct { + Contract *AggregatorProxy +} + +type AggregatorProxyCallerRaw struct { + Contract *AggregatorProxyCaller +} + +type AggregatorProxyTransactorRaw struct { + Contract *AggregatorProxyTransactor +} + +func NewAggregatorProxy(address common.Address, backend bind.ContractBackend) (*AggregatorProxy, error) { + abi, err := abi.JSON(strings.NewReader(AggregatorProxyABI)) + if err != nil { + return nil, err + } + contract, err := bindAggregatorProxy(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &AggregatorProxy{address: address, abi: abi, AggregatorProxyCaller: AggregatorProxyCaller{contract: contract}, AggregatorProxyTransactor: AggregatorProxyTransactor{contract: contract}, AggregatorProxyFilterer: AggregatorProxyFilterer{contract: contract}}, nil +} + +func NewAggregatorProxyCaller(address common.Address, caller bind.ContractCaller) (*AggregatorProxyCaller, error) { + contract, err := bindAggregatorProxy(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &AggregatorProxyCaller{contract: contract}, nil +} + +func NewAggregatorProxyTransactor(address common.Address, transactor bind.ContractTransactor) (*AggregatorProxyTransactor, error) { + contract, err := bindAggregatorProxy(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &AggregatorProxyTransactor{contract: contract}, nil +} + +func NewAggregatorProxyFilterer(address common.Address, filterer bind.ContractFilterer) (*AggregatorProxyFilterer, error) { + contract, err := bindAggregatorProxy(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &AggregatorProxyFilterer{contract: contract}, nil +} + +func bindAggregatorProxy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := AggregatorProxyMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_AggregatorProxy *AggregatorProxyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _AggregatorProxy.Contract.AggregatorProxyCaller.contract.Call(opts, result, method, params...) +} + +func (_AggregatorProxy *AggregatorProxyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _AggregatorProxy.Contract.AggregatorProxyTransactor.contract.Transfer(opts) +} + +func (_AggregatorProxy *AggregatorProxyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _AggregatorProxy.Contract.AggregatorProxyTransactor.contract.Transact(opts, method, params...) +} + +func (_AggregatorProxy *AggregatorProxyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _AggregatorProxy.Contract.contract.Call(opts, result, method, params...) +} + +func (_AggregatorProxy *AggregatorProxyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _AggregatorProxy.Contract.contract.Transfer(opts) +} + +func (_AggregatorProxy *AggregatorProxyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _AggregatorProxy.Contract.contract.Transact(opts, method, params...) +} + +func (_AggregatorProxy *AggregatorProxyCaller) AccessController(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "accessController") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_AggregatorProxy *AggregatorProxySession) AccessController() (common.Address, error) { + return _AggregatorProxy.Contract.AccessController(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) AccessController() (common.Address, error) { + return _AggregatorProxy.Contract.AccessController(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) Aggregator(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "aggregator") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_AggregatorProxy *AggregatorProxySession) Aggregator() (common.Address, error) { + return _AggregatorProxy.Contract.Aggregator(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) Aggregator() (common.Address, error) { + return _AggregatorProxy.Contract.Aggregator(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) Decimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "decimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_AggregatorProxy *AggregatorProxySession) Decimals() (uint8, error) { + return _AggregatorProxy.Contract.Decimals(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) Decimals() (uint8, error) { + return _AggregatorProxy.Contract.Decimals(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) Description(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "description") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_AggregatorProxy *AggregatorProxySession) Description() (string, error) { + return _AggregatorProxy.Contract.Description(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) Description() (string, error) { + return _AggregatorProxy.Contract.Description(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) GetAnswer(opts *bind.CallOpts, _roundId *big.Int) (*big.Int, error) { + var out []interface{} + err := _AggregatorProxy.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 + +} + +func (_AggregatorProxy *AggregatorProxySession) GetAnswer(_roundId *big.Int) (*big.Int, error) { + return _AggregatorProxy.Contract.GetAnswer(&_AggregatorProxy.CallOpts, _roundId) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) GetAnswer(_roundId *big.Int) (*big.Int, error) { + return _AggregatorProxy.Contract.GetAnswer(&_AggregatorProxy.CallOpts, _roundId) +} + +func (_AggregatorProxy *AggregatorProxyCaller) GetRoundData(opts *bind.CallOpts, _roundId *big.Int) (GetRoundData, + + error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "getRoundData", _roundId) + + outstruct := new(GetRoundData) + 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 + +} + +func (_AggregatorProxy *AggregatorProxySession) GetRoundData(_roundId *big.Int) (GetRoundData, + + error) { + return _AggregatorProxy.Contract.GetRoundData(&_AggregatorProxy.CallOpts, _roundId) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) GetRoundData(_roundId *big.Int) (GetRoundData, + + error) { + return _AggregatorProxy.Contract.GetRoundData(&_AggregatorProxy.CallOpts, _roundId) +} + +func (_AggregatorProxy *AggregatorProxyCaller) GetTimestamp(opts *bind.CallOpts, _roundId *big.Int) (*big.Int, error) { + var out []interface{} + err := _AggregatorProxy.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 + +} + +func (_AggregatorProxy *AggregatorProxySession) GetTimestamp(_roundId *big.Int) (*big.Int, error) { + return _AggregatorProxy.Contract.GetTimestamp(&_AggregatorProxy.CallOpts, _roundId) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) GetTimestamp(_roundId *big.Int) (*big.Int, error) { + return _AggregatorProxy.Contract.GetTimestamp(&_AggregatorProxy.CallOpts, _roundId) +} + +func (_AggregatorProxy *AggregatorProxyCaller) LatestAnswer(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AggregatorProxy.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 + +} + +func (_AggregatorProxy *AggregatorProxySession) LatestAnswer() (*big.Int, error) { + return _AggregatorProxy.Contract.LatestAnswer(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) LatestAnswer() (*big.Int, error) { + return _AggregatorProxy.Contract.LatestAnswer(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) LatestRound(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AggregatorProxy.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 + +} + +func (_AggregatorProxy *AggregatorProxySession) LatestRound() (*big.Int, error) { + return _AggregatorProxy.Contract.LatestRound(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) LatestRound() (*big.Int, error) { + return _AggregatorProxy.Contract.LatestRound(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) LatestRoundData(opts *bind.CallOpts) (LatestRoundData, + + error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "latestRoundData") + + outstruct := new(LatestRoundData) + 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 + +} + +func (_AggregatorProxy *AggregatorProxySession) LatestRoundData() (LatestRoundData, + + error) { + return _AggregatorProxy.Contract.LatestRoundData(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) LatestRoundData() (LatestRoundData, + + error) { + return _AggregatorProxy.Contract.LatestRoundData(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) LatestTimestamp(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AggregatorProxy.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 + +} + +func (_AggregatorProxy *AggregatorProxySession) LatestTimestamp() (*big.Int, error) { + return _AggregatorProxy.Contract.LatestTimestamp(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) LatestTimestamp() (*big.Int, error) { + return _AggregatorProxy.Contract.LatestTimestamp(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AggregatorProxy.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 + +} + +func (_AggregatorProxy *AggregatorProxySession) Owner() (common.Address, error) { + return _AggregatorProxy.Contract.Owner(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) Owner() (common.Address, error) { + return _AggregatorProxy.Contract.Owner(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) PhaseAggregators(opts *bind.CallOpts, arg0 uint16) (common.Address, error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "phaseAggregators", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_AggregatorProxy *AggregatorProxySession) PhaseAggregators(arg0 uint16) (common.Address, error) { + return _AggregatorProxy.Contract.PhaseAggregators(&_AggregatorProxy.CallOpts, arg0) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) PhaseAggregators(arg0 uint16) (common.Address, error) { + return _AggregatorProxy.Contract.PhaseAggregators(&_AggregatorProxy.CallOpts, arg0) +} + +func (_AggregatorProxy *AggregatorProxyCaller) PhaseId(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "phaseId") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +func (_AggregatorProxy *AggregatorProxySession) PhaseId() (uint16, error) { + return _AggregatorProxy.Contract.PhaseId(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) PhaseId() (uint16, error) { + return _AggregatorProxy.Contract.PhaseId(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) ProposedAggregator(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "proposedAggregator") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_AggregatorProxy *AggregatorProxySession) ProposedAggregator() (common.Address, error) { + return _AggregatorProxy.Contract.ProposedAggregator(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) ProposedAggregator() (common.Address, error) { + return _AggregatorProxy.Contract.ProposedAggregator(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) ProposedGetRoundData(opts *bind.CallOpts, _roundId *big.Int) (ProposedGetRoundData, + + error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "proposedGetRoundData", _roundId) + + outstruct := new(ProposedGetRoundData) + 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 + +} + +func (_AggregatorProxy *AggregatorProxySession) ProposedGetRoundData(_roundId *big.Int) (ProposedGetRoundData, + + error) { + return _AggregatorProxy.Contract.ProposedGetRoundData(&_AggregatorProxy.CallOpts, _roundId) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) ProposedGetRoundData(_roundId *big.Int) (ProposedGetRoundData, + + error) { + return _AggregatorProxy.Contract.ProposedGetRoundData(&_AggregatorProxy.CallOpts, _roundId) +} + +func (_AggregatorProxy *AggregatorProxyCaller) ProposedLatestRoundData(opts *bind.CallOpts) (ProposedLatestRoundData, + + error) { + var out []interface{} + err := _AggregatorProxy.contract.Call(opts, &out, "proposedLatestRoundData") + + outstruct := new(ProposedLatestRoundData) + 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 + +} + +func (_AggregatorProxy *AggregatorProxySession) ProposedLatestRoundData() (ProposedLatestRoundData, + + error) { + return _AggregatorProxy.Contract.ProposedLatestRoundData(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) ProposedLatestRoundData() (ProposedLatestRoundData, + + error) { + return _AggregatorProxy.Contract.ProposedLatestRoundData(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCaller) Version(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AggregatorProxy.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 + +} + +func (_AggregatorProxy *AggregatorProxySession) Version() (*big.Int, error) { + return _AggregatorProxy.Contract.Version(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyCallerSession) Version() (*big.Int, error) { + return _AggregatorProxy.Contract.Version(&_AggregatorProxy.CallOpts) +} + +func (_AggregatorProxy *AggregatorProxyTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _AggregatorProxy.contract.Transact(opts, "acceptOwnership") +} + +func (_AggregatorProxy *AggregatorProxySession) AcceptOwnership() (*types.Transaction, error) { + return _AggregatorProxy.Contract.AcceptOwnership(&_AggregatorProxy.TransactOpts) +} + +func (_AggregatorProxy *AggregatorProxyTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _AggregatorProxy.Contract.AcceptOwnership(&_AggregatorProxy.TransactOpts) +} + +func (_AggregatorProxy *AggregatorProxyTransactor) ConfirmAggregator(opts *bind.TransactOpts, _aggregator common.Address) (*types.Transaction, error) { + return _AggregatorProxy.contract.Transact(opts, "confirmAggregator", _aggregator) +} + +func (_AggregatorProxy *AggregatorProxySession) ConfirmAggregator(_aggregator common.Address) (*types.Transaction, error) { + return _AggregatorProxy.Contract.ConfirmAggregator(&_AggregatorProxy.TransactOpts, _aggregator) +} + +func (_AggregatorProxy *AggregatorProxyTransactorSession) ConfirmAggregator(_aggregator common.Address) (*types.Transaction, error) { + return _AggregatorProxy.Contract.ConfirmAggregator(&_AggregatorProxy.TransactOpts, _aggregator) +} + +func (_AggregatorProxy *AggregatorProxyTransactor) ProposeAggregator(opts *bind.TransactOpts, _aggregator common.Address) (*types.Transaction, error) { + return _AggregatorProxy.contract.Transact(opts, "proposeAggregator", _aggregator) +} + +func (_AggregatorProxy *AggregatorProxySession) ProposeAggregator(_aggregator common.Address) (*types.Transaction, error) { + return _AggregatorProxy.Contract.ProposeAggregator(&_AggregatorProxy.TransactOpts, _aggregator) +} + +func (_AggregatorProxy *AggregatorProxyTransactorSession) ProposeAggregator(_aggregator common.Address) (*types.Transaction, error) { + return _AggregatorProxy.Contract.ProposeAggregator(&_AggregatorProxy.TransactOpts, _aggregator) +} + +func (_AggregatorProxy *AggregatorProxyTransactor) SetController(opts *bind.TransactOpts, _accessController common.Address) (*types.Transaction, error) { + return _AggregatorProxy.contract.Transact(opts, "setController", _accessController) +} + +func (_AggregatorProxy *AggregatorProxySession) SetController(_accessController common.Address) (*types.Transaction, error) { + return _AggregatorProxy.Contract.SetController(&_AggregatorProxy.TransactOpts, _accessController) +} + +func (_AggregatorProxy *AggregatorProxyTransactorSession) SetController(_accessController common.Address) (*types.Transaction, error) { + return _AggregatorProxy.Contract.SetController(&_AggregatorProxy.TransactOpts, _accessController) +} + +func (_AggregatorProxy *AggregatorProxyTransactor) TransferOwnership(opts *bind.TransactOpts, _to common.Address) (*types.Transaction, error) { + return _AggregatorProxy.contract.Transact(opts, "transferOwnership", _to) +} + +func (_AggregatorProxy *AggregatorProxySession) TransferOwnership(_to common.Address) (*types.Transaction, error) { + return _AggregatorProxy.Contract.TransferOwnership(&_AggregatorProxy.TransactOpts, _to) +} + +func (_AggregatorProxy *AggregatorProxyTransactorSession) TransferOwnership(_to common.Address) (*types.Transaction, error) { + return _AggregatorProxy.Contract.TransferOwnership(&_AggregatorProxy.TransactOpts, _to) +} + +type AggregatorProxyAnswerUpdatedIterator struct { + Event *AggregatorProxyAnswerUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *AggregatorProxyAnswerUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(AggregatorProxyAnswerUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(AggregatorProxyAnswerUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *AggregatorProxyAnswerUpdatedIterator) Error() error { + return it.fail +} + +func (it *AggregatorProxyAnswerUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type AggregatorProxyAnswerUpdated struct { + Current *big.Int + RoundId *big.Int + UpdatedAt *big.Int + Raw types.Log +} + +func (_AggregatorProxy *AggregatorProxyFilterer) FilterAnswerUpdated(opts *bind.FilterOpts, current []*big.Int, roundId []*big.Int) (*AggregatorProxyAnswerUpdatedIterator, 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 := _AggregatorProxy.contract.FilterLogs(opts, "AnswerUpdated", currentRule, roundIdRule) + if err != nil { + return nil, err + } + return &AggregatorProxyAnswerUpdatedIterator{contract: _AggregatorProxy.contract, event: "AnswerUpdated", logs: logs, sub: sub}, nil +} + +func (_AggregatorProxy *AggregatorProxyFilterer) WatchAnswerUpdated(opts *bind.WatchOpts, sink chan<- *AggregatorProxyAnswerUpdated, 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 := _AggregatorProxy.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: + + event := new(AggregatorProxyAnswerUpdated) + if err := _AggregatorProxy.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 +} + +func (_AggregatorProxy *AggregatorProxyFilterer) ParseAnswerUpdated(log types.Log) (*AggregatorProxyAnswerUpdated, error) { + event := new(AggregatorProxyAnswerUpdated) + if err := _AggregatorProxy.contract.UnpackLog(event, "AnswerUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type AggregatorProxyNewRoundIterator struct { + Event *AggregatorProxyNewRound + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *AggregatorProxyNewRoundIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(AggregatorProxyNewRound) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(AggregatorProxyNewRound) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *AggregatorProxyNewRoundIterator) Error() error { + return it.fail +} + +func (it *AggregatorProxyNewRoundIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type AggregatorProxyNewRound struct { + RoundId *big.Int + StartedBy common.Address + StartedAt *big.Int + Raw types.Log +} + +func (_AggregatorProxy *AggregatorProxyFilterer) FilterNewRound(opts *bind.FilterOpts, roundId []*big.Int, startedBy []common.Address) (*AggregatorProxyNewRoundIterator, 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 := _AggregatorProxy.contract.FilterLogs(opts, "NewRound", roundIdRule, startedByRule) + if err != nil { + return nil, err + } + return &AggregatorProxyNewRoundIterator{contract: _AggregatorProxy.contract, event: "NewRound", logs: logs, sub: sub}, nil +} + +func (_AggregatorProxy *AggregatorProxyFilterer) WatchNewRound(opts *bind.WatchOpts, sink chan<- *AggregatorProxyNewRound, 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 := _AggregatorProxy.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: + + event := new(AggregatorProxyNewRound) + if err := _AggregatorProxy.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 +} + +func (_AggregatorProxy *AggregatorProxyFilterer) ParseNewRound(log types.Log) (*AggregatorProxyNewRound, error) { + event := new(AggregatorProxyNewRound) + if err := _AggregatorProxy.contract.UnpackLog(event, "NewRound", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type AggregatorProxyOwnershipTransferRequestedIterator struct { + Event *AggregatorProxyOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *AggregatorProxyOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(AggregatorProxyOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(AggregatorProxyOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *AggregatorProxyOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *AggregatorProxyOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type AggregatorProxyOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_AggregatorProxy *AggregatorProxyFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*AggregatorProxyOwnershipTransferRequestedIterator, 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 := _AggregatorProxy.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &AggregatorProxyOwnershipTransferRequestedIterator{contract: _AggregatorProxy.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_AggregatorProxy *AggregatorProxyFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *AggregatorProxyOwnershipTransferRequested, 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 := _AggregatorProxy.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: + + event := new(AggregatorProxyOwnershipTransferRequested) + if err := _AggregatorProxy.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 +} + +func (_AggregatorProxy *AggregatorProxyFilterer) ParseOwnershipTransferRequested(log types.Log) (*AggregatorProxyOwnershipTransferRequested, error) { + event := new(AggregatorProxyOwnershipTransferRequested) + if err := _AggregatorProxy.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type AggregatorProxyOwnershipTransferredIterator struct { + Event *AggregatorProxyOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *AggregatorProxyOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(AggregatorProxyOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(AggregatorProxyOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *AggregatorProxyOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *AggregatorProxyOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type AggregatorProxyOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_AggregatorProxy *AggregatorProxyFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*AggregatorProxyOwnershipTransferredIterator, 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 := _AggregatorProxy.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &AggregatorProxyOwnershipTransferredIterator{contract: _AggregatorProxy.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_AggregatorProxy *AggregatorProxyFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *AggregatorProxyOwnershipTransferred, 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 := _AggregatorProxy.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: + + event := new(AggregatorProxyOwnershipTransferred) + if err := _AggregatorProxy.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 +} + +func (_AggregatorProxy *AggregatorProxyFilterer) ParseOwnershipTransferred(log types.Log) (*AggregatorProxyOwnershipTransferred, error) { + event := new(AggregatorProxyOwnershipTransferred) + if err := _AggregatorProxy.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetRoundData struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +} +type LatestRoundData struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +} +type ProposedGetRoundData struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +} +type ProposedLatestRoundData struct { + RoundId *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +} + +func (_AggregatorProxy *AggregatorProxy) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _AggregatorProxy.abi.Events["AnswerUpdated"].ID: + return _AggregatorProxy.ParseAnswerUpdated(log) + case _AggregatorProxy.abi.Events["NewRound"].ID: + return _AggregatorProxy.ParseNewRound(log) + case _AggregatorProxy.abi.Events["OwnershipTransferRequested"].ID: + return _AggregatorProxy.ParseOwnershipTransferRequested(log) + case _AggregatorProxy.abi.Events["OwnershipTransferred"].ID: + return _AggregatorProxy.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (AggregatorProxyAnswerUpdated) Topic() common.Hash { + return common.HexToHash("0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f") +} + +func (AggregatorProxyNewRound) Topic() common.Hash { + return common.HexToHash("0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271") +} + +func (AggregatorProxyOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (AggregatorProxyOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_AggregatorProxy *AggregatorProxy) Address() common.Address { + return _AggregatorProxy.address +} + +type AggregatorProxyInterface interface { + AccessController(opts *bind.CallOpts) (common.Address, error) + + Aggregator(opts *bind.CallOpts) (common.Address, error) + + Decimals(opts *bind.CallOpts) (uint8, error) + + Description(opts *bind.CallOpts) (string, error) + + GetAnswer(opts *bind.CallOpts, _roundId *big.Int) (*big.Int, error) + + GetRoundData(opts *bind.CallOpts, _roundId *big.Int) (GetRoundData, + + error) + + GetTimestamp(opts *bind.CallOpts, _roundId *big.Int) (*big.Int, error) + + LatestAnswer(opts *bind.CallOpts) (*big.Int, error) + + LatestRound(opts *bind.CallOpts) (*big.Int, error) + + LatestRoundData(opts *bind.CallOpts) (LatestRoundData, + + error) + + LatestTimestamp(opts *bind.CallOpts) (*big.Int, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + PhaseAggregators(opts *bind.CallOpts, arg0 uint16) (common.Address, error) + + PhaseId(opts *bind.CallOpts) (uint16, error) + + ProposedAggregator(opts *bind.CallOpts) (common.Address, error) + + ProposedGetRoundData(opts *bind.CallOpts, _roundId *big.Int) (ProposedGetRoundData, + + error) + + ProposedLatestRoundData(opts *bind.CallOpts) (ProposedLatestRoundData, + + error) + + Version(opts *bind.CallOpts) (*big.Int, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ConfirmAggregator(opts *bind.TransactOpts, _aggregator common.Address) (*types.Transaction, error) + + ProposeAggregator(opts *bind.TransactOpts, _aggregator common.Address) (*types.Transaction, error) + + SetController(opts *bind.TransactOpts, _accessController common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, _to common.Address) (*types.Transaction, error) + + FilterAnswerUpdated(opts *bind.FilterOpts, current []*big.Int, roundId []*big.Int) (*AggregatorProxyAnswerUpdatedIterator, error) + + WatchAnswerUpdated(opts *bind.WatchOpts, sink chan<- *AggregatorProxyAnswerUpdated, current []*big.Int, roundId []*big.Int) (event.Subscription, error) + + ParseAnswerUpdated(log types.Log) (*AggregatorProxyAnswerUpdated, error) + + FilterNewRound(opts *bind.FilterOpts, roundId []*big.Int, startedBy []common.Address) (*AggregatorProxyNewRoundIterator, error) + + WatchNewRound(opts *bind.WatchOpts, sink chan<- *AggregatorProxyNewRound, roundId []*big.Int, startedBy []common.Address) (event.Subscription, error) + + ParseNewRound(log types.Log) (*AggregatorProxyNewRound, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*AggregatorProxyOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *AggregatorProxyOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*AggregatorProxyOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*AggregatorProxyOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *AggregatorProxyOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*AggregatorProxyOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/data-feeds/generated/bundle_aggregator_proxy/bundle_aggregator_proxy.go b/core/gethwrappers/data-feeds/generated/bundle_aggregator_proxy/bundle_aggregator_proxy.go new file mode 100644 index 00000000000..176b4f14b94 --- /dev/null +++ b/core/gethwrappers/data-feeds/generated/bundle_aggregator_proxy/bundle_aggregator_proxy.go @@ -0,0 +1,1054 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bundle_aggregator_proxy + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +var BundleAggregatorProxyMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"aggregatorAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"aggregator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bundleDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8[]\",\"internalType\":\"uint8[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"confirmAggregator\",\"inputs\":[{\"name\":\"aggregatorAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"description\",\"inputs\":[],\"outputs\":[{\"name\":\"aggregatorDescription\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBundle\",\"inputs\":[],\"outputs\":[{\"name\":\"bundle\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBundleTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeAggregator\",\"inputs\":[{\"name\":\"aggregatorAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"proposedAggregator\",\"inputs\":[],\"outputs\":[{\"name\":\"proposedAggregatorAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"aggregatorVersion\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AggregatorConfirmed\",\"inputs\":[{\"name\":\"previous\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"latest\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AggregatorProposed\",\"inputs\":[{\"name\":\"current\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"proposed\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"error\",\"name\":\"AggregatorNotProposed\",\"inputs\":[{\"name\":\"aggregator\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561001057600080fd5b50604051610e39380380610e3983398101604081905261002f916101ae565b808060006001600160a01b03821661008e5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156100be576100be816100e9565b5050600280546001600160a01b0319166001600160a01b039490941693909317909255506101e19050565b336001600160a01b038216036101415760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610085565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b03811681146101a957600080fd5b919050565b600080604083850312156101c157600080fd5b6101ca83610192565b91506101d860208401610192565b90509250929050565b610c49806101f06000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80639198274f1161008c578063a928c09611610066578063a928c096146101e0578063e8c4be30146101f3578063f2fde38b14610211578063f8a2abd31461022457600080fd5b80639198274f146101bb5780639d91348d146101c3578063a3d610cc146101d857600080fd5b80637284e416116100bd5780637284e4161461018b57806379ba5097146101935780638da5cb5b1461019d57600080fd5b8063181f5a77146100e4578063245a7bfc1461013657806354fd4d5014610175575b600080fd5b6101206040518060400160405280601b81526020017f42756e646c6541676772656761746f7250726f787920312e302e30000000000081525081565b60405161012d919061098e565b60405180910390f35b60025473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161012d565b61017d610237565b60405190815260200161012d565b6101206102d0565b61019b610386565b005b60005473ffffffffffffffffffffffffffffffffffffffff16610150565b610120610488565b6101cb6104f8565b60405161012d91906109a8565b61017d6105ae565b61019b6101ee3660046109ee565b61061e565b60035473ffffffffffffffffffffffffffffffffffffffff16610150565b61019b61021f3660046109ee565b610715565b61019b6102323660046109ee565b610729565b600254604080517f54fd4d50000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16916354fd4d509160048083019260209291908290030181865afa1580156102a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102cb9190610a24565b905090565b600254604080517f7284e416000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff1691637284e4169160048083019260009291908290030181865afa158015610340573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526102cb9190810190610b2c565b60015473ffffffffffffffffffffffffffffffffffffffff16331461040c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600254604080517f9198274f000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff1691639198274f9160048083019260009291908290030181865afa158015610340573d6000803e3d6000fd5b600254604080517f9d91348d000000000000000000000000000000000000000000000000000000008152905160609273ffffffffffffffffffffffffffffffffffffffff1691639d91348d9160048083019260009291908290030181865afa158015610568573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526102cb9190810190610b7d565b600254604080517fa3d610cc000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163a3d610cc9160048083019260209291908290030181865afa1580156102a7573d6000803e3d6000fd5b6106266107a8565b60035473ffffffffffffffffffffffffffffffffffffffff828116911614610692576040517feb61b92800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610403565b60028054600380547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915573ffffffffffffffffffffffffffffffffffffffff8481169183168217909355604051929091169182907f33745f67a407dcb785417f9c123dd3641479a102674b6e35c1f10975625b90e990600090a35050565b61071d6107a8565b6107268161082b565b50565b6107316107a8565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600254604051919216907fc0f151710f03d713b71d9970cee0d5b11ddc9a7552abaa3f6ee818010f21600d90600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff163314610829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610403565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036108aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610403565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8381101561093b578181015183820152602001610923565b50506000910152565b6000815180845261095c816020860160208601610920565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006109a16020830184610944565b9392505050565b602080825282518282018190526000918401906040840190835b818110156109e357835160ff168352602093840193909201916001016109c2565b509095945050505050565b600060208284031215610a0057600080fd5b813573ffffffffffffffffffffffffffffffffffffffff811681146109a157600080fd5b600060208284031215610a3657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610ab357610ab3610a3d565b604052919050565b60008067ffffffffffffffff841115610ad657610ad6610a3d565b50601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001610b0981610a6c565b915050828152838383011115610b1e57600080fd5b6109a1836020830184610920565b600060208284031215610b3e57600080fd5b815167ffffffffffffffff811115610b5557600080fd5b8201601f81018413610b6657600080fd5b610b7584825160208401610abb565b949350505050565b600060208284031215610b8f57600080fd5b815167ffffffffffffffff811115610ba657600080fd5b8201601f81018413610bb757600080fd5b805167ffffffffffffffff811115610bd157610bd1610a3d565b8060051b610be160208201610a6c565b91825260208184018101929081019087841115610bfd57600080fd5b6020850194505b83851015610c31578451925060ff83168314610c1f57600080fd5b82825260209485019490910190610c04565b97965050505050505056fea164736f6c634300081a000a", +} + +var BundleAggregatorProxyABI = BundleAggregatorProxyMetaData.ABI + +var BundleAggregatorProxyBin = BundleAggregatorProxyMetaData.Bin + +func DeployBundleAggregatorProxy(auth *bind.TransactOpts, backend bind.ContractBackend, aggregatorAddress common.Address, owner common.Address) (common.Address, *types.Transaction, *BundleAggregatorProxy, error) { + parsed, err := BundleAggregatorProxyMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(BundleAggregatorProxyBin), backend, aggregatorAddress, owner) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &BundleAggregatorProxy{address: address, abi: *parsed, BundleAggregatorProxyCaller: BundleAggregatorProxyCaller{contract: contract}, BundleAggregatorProxyTransactor: BundleAggregatorProxyTransactor{contract: contract}, BundleAggregatorProxyFilterer: BundleAggregatorProxyFilterer{contract: contract}}, nil +} + +type BundleAggregatorProxy struct { + address common.Address + abi abi.ABI + BundleAggregatorProxyCaller + BundleAggregatorProxyTransactor + BundleAggregatorProxyFilterer +} + +type BundleAggregatorProxyCaller struct { + contract *bind.BoundContract +} + +type BundleAggregatorProxyTransactor struct { + contract *bind.BoundContract +} + +type BundleAggregatorProxyFilterer struct { + contract *bind.BoundContract +} + +type BundleAggregatorProxySession struct { + Contract *BundleAggregatorProxy + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type BundleAggregatorProxyCallerSession struct { + Contract *BundleAggregatorProxyCaller + CallOpts bind.CallOpts +} + +type BundleAggregatorProxyTransactorSession struct { + Contract *BundleAggregatorProxyTransactor + TransactOpts bind.TransactOpts +} + +type BundleAggregatorProxyRaw struct { + Contract *BundleAggregatorProxy +} + +type BundleAggregatorProxyCallerRaw struct { + Contract *BundleAggregatorProxyCaller +} + +type BundleAggregatorProxyTransactorRaw struct { + Contract *BundleAggregatorProxyTransactor +} + +func NewBundleAggregatorProxy(address common.Address, backend bind.ContractBackend) (*BundleAggregatorProxy, error) { + abi, err := abi.JSON(strings.NewReader(BundleAggregatorProxyABI)) + if err != nil { + return nil, err + } + contract, err := bindBundleAggregatorProxy(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &BundleAggregatorProxy{address: address, abi: abi, BundleAggregatorProxyCaller: BundleAggregatorProxyCaller{contract: contract}, BundleAggregatorProxyTransactor: BundleAggregatorProxyTransactor{contract: contract}, BundleAggregatorProxyFilterer: BundleAggregatorProxyFilterer{contract: contract}}, nil +} + +func NewBundleAggregatorProxyCaller(address common.Address, caller bind.ContractCaller) (*BundleAggregatorProxyCaller, error) { + contract, err := bindBundleAggregatorProxy(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &BundleAggregatorProxyCaller{contract: contract}, nil +} + +func NewBundleAggregatorProxyTransactor(address common.Address, transactor bind.ContractTransactor) (*BundleAggregatorProxyTransactor, error) { + contract, err := bindBundleAggregatorProxy(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &BundleAggregatorProxyTransactor{contract: contract}, nil +} + +func NewBundleAggregatorProxyFilterer(address common.Address, filterer bind.ContractFilterer) (*BundleAggregatorProxyFilterer, error) { + contract, err := bindBundleAggregatorProxy(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &BundleAggregatorProxyFilterer{contract: contract}, nil +} + +func bindBundleAggregatorProxy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := BundleAggregatorProxyMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BundleAggregatorProxy.Contract.BundleAggregatorProxyCaller.contract.Call(opts, result, method, params...) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.BundleAggregatorProxyTransactor.contract.Transfer(opts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.BundleAggregatorProxyTransactor.contract.Transact(opts, method, params...) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BundleAggregatorProxy.Contract.contract.Call(opts, result, method, params...) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.contract.Transfer(opts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.contract.Transact(opts, method, params...) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) Aggregator(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BundleAggregatorProxy.contract.Call(opts, &out, "aggregator") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) Aggregator() (common.Address, error) { + return _BundleAggregatorProxy.Contract.Aggregator(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) Aggregator() (common.Address, error) { + return _BundleAggregatorProxy.Contract.Aggregator(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) BundleDecimals(opts *bind.CallOpts) ([]uint8, error) { + var out []interface{} + err := _BundleAggregatorProxy.contract.Call(opts, &out, "bundleDecimals") + + if err != nil { + return *new([]uint8), err + } + + out0 := *abi.ConvertType(out[0], new([]uint8)).(*[]uint8) + + return out0, err + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) BundleDecimals() ([]uint8, error) { + return _BundleAggregatorProxy.Contract.BundleDecimals(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) BundleDecimals() ([]uint8, error) { + return _BundleAggregatorProxy.Contract.BundleDecimals(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) Description(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _BundleAggregatorProxy.contract.Call(opts, &out, "description") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) Description() (string, error) { + return _BundleAggregatorProxy.Contract.Description(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) Description() (string, error) { + return _BundleAggregatorProxy.Contract.Description(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) LatestBundle(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _BundleAggregatorProxy.contract.Call(opts, &out, "latestBundle") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) LatestBundle() ([]byte, error) { + return _BundleAggregatorProxy.Contract.LatestBundle(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) LatestBundle() ([]byte, error) { + return _BundleAggregatorProxy.Contract.LatestBundle(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) LatestBundleTimestamp(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BundleAggregatorProxy.contract.Call(opts, &out, "latestBundleTimestamp") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) LatestBundleTimestamp() (*big.Int, error) { + return _BundleAggregatorProxy.Contract.LatestBundleTimestamp(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) LatestBundleTimestamp() (*big.Int, error) { + return _BundleAggregatorProxy.Contract.LatestBundleTimestamp(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BundleAggregatorProxy.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 + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) Owner() (common.Address, error) { + return _BundleAggregatorProxy.Contract.Owner(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) Owner() (common.Address, error) { + return _BundleAggregatorProxy.Contract.Owner(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) ProposedAggregator(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BundleAggregatorProxy.contract.Call(opts, &out, "proposedAggregator") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) ProposedAggregator() (common.Address, error) { + return _BundleAggregatorProxy.Contract.ProposedAggregator(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) ProposedAggregator() (common.Address, error) { + return _BundleAggregatorProxy.Contract.ProposedAggregator(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _BundleAggregatorProxy.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) TypeAndVersion() (string, error) { + return _BundleAggregatorProxy.Contract.TypeAndVersion(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) TypeAndVersion() (string, error) { + return _BundleAggregatorProxy.Contract.TypeAndVersion(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCaller) Version(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _BundleAggregatorProxy.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 + +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) Version() (*big.Int, error) { + return _BundleAggregatorProxy.Contract.Version(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyCallerSession) Version() (*big.Int, error) { + return _BundleAggregatorProxy.Contract.Version(&_BundleAggregatorProxy.CallOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BundleAggregatorProxy.contract.Transact(opts, "acceptOwnership") +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) AcceptOwnership() (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.AcceptOwnership(&_BundleAggregatorProxy.TransactOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.AcceptOwnership(&_BundleAggregatorProxy.TransactOpts) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactor) ConfirmAggregator(opts *bind.TransactOpts, aggregatorAddress common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.contract.Transact(opts, "confirmAggregator", aggregatorAddress) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) ConfirmAggregator(aggregatorAddress common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.ConfirmAggregator(&_BundleAggregatorProxy.TransactOpts, aggregatorAddress) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactorSession) ConfirmAggregator(aggregatorAddress common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.ConfirmAggregator(&_BundleAggregatorProxy.TransactOpts, aggregatorAddress) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactor) ProposeAggregator(opts *bind.TransactOpts, aggregatorAddress common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.contract.Transact(opts, "proposeAggregator", aggregatorAddress) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) ProposeAggregator(aggregatorAddress common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.ProposeAggregator(&_BundleAggregatorProxy.TransactOpts, aggregatorAddress) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactorSession) ProposeAggregator(aggregatorAddress common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.ProposeAggregator(&_BundleAggregatorProxy.TransactOpts, aggregatorAddress) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.contract.Transact(opts, "transferOwnership", to) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxySession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.TransferOwnership(&_BundleAggregatorProxy.TransactOpts, to) +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BundleAggregatorProxy.Contract.TransferOwnership(&_BundleAggregatorProxy.TransactOpts, to) +} + +type BundleAggregatorProxyAggregatorConfirmedIterator struct { + Event *BundleAggregatorProxyAggregatorConfirmed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BundleAggregatorProxyAggregatorConfirmedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BundleAggregatorProxyAggregatorConfirmed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BundleAggregatorProxyAggregatorConfirmed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BundleAggregatorProxyAggregatorConfirmedIterator) Error() error { + return it.fail +} + +func (it *BundleAggregatorProxyAggregatorConfirmedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BundleAggregatorProxyAggregatorConfirmed struct { + Previous common.Address + Latest common.Address + Raw types.Log +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) FilterAggregatorConfirmed(opts *bind.FilterOpts, previous []common.Address, latest []common.Address) (*BundleAggregatorProxyAggregatorConfirmedIterator, error) { + + var previousRule []interface{} + for _, previousItem := range previous { + previousRule = append(previousRule, previousItem) + } + var latestRule []interface{} + for _, latestItem := range latest { + latestRule = append(latestRule, latestItem) + } + + logs, sub, err := _BundleAggregatorProxy.contract.FilterLogs(opts, "AggregatorConfirmed", previousRule, latestRule) + if err != nil { + return nil, err + } + return &BundleAggregatorProxyAggregatorConfirmedIterator{contract: _BundleAggregatorProxy.contract, event: "AggregatorConfirmed", logs: logs, sub: sub}, nil +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) WatchAggregatorConfirmed(opts *bind.WatchOpts, sink chan<- *BundleAggregatorProxyAggregatorConfirmed, previous []common.Address, latest []common.Address) (event.Subscription, error) { + + var previousRule []interface{} + for _, previousItem := range previous { + previousRule = append(previousRule, previousItem) + } + var latestRule []interface{} + for _, latestItem := range latest { + latestRule = append(latestRule, latestItem) + } + + logs, sub, err := _BundleAggregatorProxy.contract.WatchLogs(opts, "AggregatorConfirmed", previousRule, latestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BundleAggregatorProxyAggregatorConfirmed) + if err := _BundleAggregatorProxy.contract.UnpackLog(event, "AggregatorConfirmed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) ParseAggregatorConfirmed(log types.Log) (*BundleAggregatorProxyAggregatorConfirmed, error) { + event := new(BundleAggregatorProxyAggregatorConfirmed) + if err := _BundleAggregatorProxy.contract.UnpackLog(event, "AggregatorConfirmed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BundleAggregatorProxyAggregatorProposedIterator struct { + Event *BundleAggregatorProxyAggregatorProposed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BundleAggregatorProxyAggregatorProposedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BundleAggregatorProxyAggregatorProposed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BundleAggregatorProxyAggregatorProposed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BundleAggregatorProxyAggregatorProposedIterator) Error() error { + return it.fail +} + +func (it *BundleAggregatorProxyAggregatorProposedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BundleAggregatorProxyAggregatorProposed struct { + Current common.Address + Proposed common.Address + Raw types.Log +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) FilterAggregatorProposed(opts *bind.FilterOpts, current []common.Address, proposed []common.Address) (*BundleAggregatorProxyAggregatorProposedIterator, error) { + + 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 := _BundleAggregatorProxy.contract.FilterLogs(opts, "AggregatorProposed", currentRule, proposedRule) + if err != nil { + return nil, err + } + return &BundleAggregatorProxyAggregatorProposedIterator{contract: _BundleAggregatorProxy.contract, event: "AggregatorProposed", logs: logs, sub: sub}, nil +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) WatchAggregatorProposed(opts *bind.WatchOpts, sink chan<- *BundleAggregatorProxyAggregatorProposed, current []common.Address, proposed []common.Address) (event.Subscription, error) { + + 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 := _BundleAggregatorProxy.contract.WatchLogs(opts, "AggregatorProposed", currentRule, proposedRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BundleAggregatorProxyAggregatorProposed) + if err := _BundleAggregatorProxy.contract.UnpackLog(event, "AggregatorProposed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) ParseAggregatorProposed(log types.Log) (*BundleAggregatorProxyAggregatorProposed, error) { + event := new(BundleAggregatorProxyAggregatorProposed) + if err := _BundleAggregatorProxy.contract.UnpackLog(event, "AggregatorProposed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BundleAggregatorProxyOwnershipTransferRequestedIterator struct { + Event *BundleAggregatorProxyOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BundleAggregatorProxyOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BundleAggregatorProxyOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BundleAggregatorProxyOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BundleAggregatorProxyOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *BundleAggregatorProxyOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BundleAggregatorProxyOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BundleAggregatorProxyOwnershipTransferRequestedIterator, 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 := _BundleAggregatorProxy.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &BundleAggregatorProxyOwnershipTransferRequestedIterator{contract: _BundleAggregatorProxy.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BundleAggregatorProxyOwnershipTransferRequested, 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 := _BundleAggregatorProxy.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: + + event := new(BundleAggregatorProxyOwnershipTransferRequested) + if err := _BundleAggregatorProxy.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 +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) ParseOwnershipTransferRequested(log types.Log) (*BundleAggregatorProxyOwnershipTransferRequested, error) { + event := new(BundleAggregatorProxyOwnershipTransferRequested) + if err := _BundleAggregatorProxy.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BundleAggregatorProxyOwnershipTransferredIterator struct { + Event *BundleAggregatorProxyOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BundleAggregatorProxyOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BundleAggregatorProxyOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BundleAggregatorProxyOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BundleAggregatorProxyOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *BundleAggregatorProxyOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BundleAggregatorProxyOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BundleAggregatorProxyOwnershipTransferredIterator, 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 := _BundleAggregatorProxy.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &BundleAggregatorProxyOwnershipTransferredIterator{contract: _BundleAggregatorProxy.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BundleAggregatorProxyOwnershipTransferred, 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 := _BundleAggregatorProxy.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: + + event := new(BundleAggregatorProxyOwnershipTransferred) + if err := _BundleAggregatorProxy.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 +} + +func (_BundleAggregatorProxy *BundleAggregatorProxyFilterer) ParseOwnershipTransferred(log types.Log) (*BundleAggregatorProxyOwnershipTransferred, error) { + event := new(BundleAggregatorProxyOwnershipTransferred) + if err := _BundleAggregatorProxy.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_BundleAggregatorProxy *BundleAggregatorProxy) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _BundleAggregatorProxy.abi.Events["AggregatorConfirmed"].ID: + return _BundleAggregatorProxy.ParseAggregatorConfirmed(log) + case _BundleAggregatorProxy.abi.Events["AggregatorProposed"].ID: + return _BundleAggregatorProxy.ParseAggregatorProposed(log) + case _BundleAggregatorProxy.abi.Events["OwnershipTransferRequested"].ID: + return _BundleAggregatorProxy.ParseOwnershipTransferRequested(log) + case _BundleAggregatorProxy.abi.Events["OwnershipTransferred"].ID: + return _BundleAggregatorProxy.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (BundleAggregatorProxyAggregatorConfirmed) Topic() common.Hash { + return common.HexToHash("0x33745f67a407dcb785417f9c123dd3641479a102674b6e35c1f10975625b90e9") +} + +func (BundleAggregatorProxyAggregatorProposed) Topic() common.Hash { + return common.HexToHash("0xc0f151710f03d713b71d9970cee0d5b11ddc9a7552abaa3f6ee818010f21600d") +} + +func (BundleAggregatorProxyOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (BundleAggregatorProxyOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_BundleAggregatorProxy *BundleAggregatorProxy) Address() common.Address { + return _BundleAggregatorProxy.address +} + +type BundleAggregatorProxyInterface interface { + Aggregator(opts *bind.CallOpts) (common.Address, error) + + BundleDecimals(opts *bind.CallOpts) ([]uint8, error) + + Description(opts *bind.CallOpts) (string, error) + + LatestBundle(opts *bind.CallOpts) ([]byte, error) + + LatestBundleTimestamp(opts *bind.CallOpts) (*big.Int, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + ProposedAggregator(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + Version(opts *bind.CallOpts) (*big.Int, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ConfirmAggregator(opts *bind.TransactOpts, aggregatorAddress common.Address) (*types.Transaction, error) + + ProposeAggregator(opts *bind.TransactOpts, aggregatorAddress common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAggregatorConfirmed(opts *bind.FilterOpts, previous []common.Address, latest []common.Address) (*BundleAggregatorProxyAggregatorConfirmedIterator, error) + + WatchAggregatorConfirmed(opts *bind.WatchOpts, sink chan<- *BundleAggregatorProxyAggregatorConfirmed, previous []common.Address, latest []common.Address) (event.Subscription, error) + + ParseAggregatorConfirmed(log types.Log) (*BundleAggregatorProxyAggregatorConfirmed, error) + + FilterAggregatorProposed(opts *bind.FilterOpts, current []common.Address, proposed []common.Address) (*BundleAggregatorProxyAggregatorProposedIterator, error) + + WatchAggregatorProposed(opts *bind.WatchOpts, sink chan<- *BundleAggregatorProxyAggregatorProposed, current []common.Address, proposed []common.Address) (event.Subscription, error) + + ParseAggregatorProposed(log types.Log) (*BundleAggregatorProxyAggregatorProposed, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BundleAggregatorProxyOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BundleAggregatorProxyOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*BundleAggregatorProxyOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BundleAggregatorProxyOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BundleAggregatorProxyOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*BundleAggregatorProxyOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/data-feeds/generated/data_feeds_cache/data_feeds_cache.go b/core/gethwrappers/data-feeds/generated/data_feeds_cache/data_feeds_cache.go new file mode 100644 index 00000000000..37a0b2147f4 --- /dev/null +++ b/core/gethwrappers/data-feeds/generated/data_feeds_cache/data_feeds_cache.go @@ -0,0 +1,3410 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package data_feeds_cache + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type DataFeedsCacheWorkflowMetadata struct { + AllowedSender common.Address + AllowedWorkflowOwner common.Address + AllowedWorkflowName [10]byte +} + +var DataFeedsCacheMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bundleDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"bundleFeedDecimals\",\"type\":\"uint8[]\",\"internalType\":\"uint8[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkFeedPermission\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"workflowMetadata\",\"type\":\"tuple\",\"internalType\":\"structDataFeedsCache.WorkflowMetadata\",\"components\":[{\"name\":\"allowedSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"}]}],\"outputs\":[{\"name\":\"hasPermission\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"feedDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"description\",\"inputs\":[],\"outputs\":[{\"name\":\"feedDescription\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAnswer\",\"inputs\":[{\"name\":\"roundId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBundleDecimals\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"bundleFeedDecimals\",\"type\":\"uint8[]\",\"internalType\":\"uint8[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDataIdForProxy\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDecimals\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"feedDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getDescription\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"feedDescription\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeedMetadata\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"},{\"name\":\"startIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxCount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"workflowMetadata\",\"type\":\"tuple[]\",\"internalType\":\"structDataFeedsCache.WorkflowMetadata[]\",\"components\":[{\"name\":\"allowedSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestAnswer\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestBundle\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"bundle\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestBundleTimestamp\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestRoundData\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"id\",\"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\":\"getLatestTimestamp\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRoundData\",\"inputs\":[{\"name\":\"roundId\",\"type\":\"uint80\",\"internalType\":\"uint80\"}],\"outputs\":[{\"name\":\"id\",\"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\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isFeedAdmin\",\"inputs\":[{\"name\":\"feedAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestAnswer\",\"inputs\":[],\"outputs\":[{\"name\":\"answer\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBundle\",\"inputs\":[],\"outputs\":[{\"name\":\"bundle\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBundleTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestRound\",\"inputs\":[],\"outputs\":[{\"name\":\"round\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestRoundData\",\"inputs\":[],\"outputs\":[{\"name\":\"id\",\"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\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onReport\",\"inputs\":[{\"name\":\"metadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDataIdMappingsForProxies\",\"inputs\":[{\"name\":\"proxies\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeFeedConfigs\",\"inputs\":[{\"name\":\"dataIds\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBundleFeedConfigs\",\"inputs\":[{\"name\":\"dataIds\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"},{\"name\":\"descriptions\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"decimalsMatrix\",\"type\":\"uint8[][]\",\"internalType\":\"uint8[][]\"},{\"name\":\"workflowMetadata\",\"type\":\"tuple[]\",\"internalType\":\"structDataFeedsCache.WorkflowMetadata[]\",\"components\":[{\"name\":\"allowedSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDecimalFeedConfigs\",\"inputs\":[{\"name\":\"dataIds\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"},{\"name\":\"descriptions\",\"type\":\"string[]\",\"internalType\":\"string[]\"},{\"name\":\"workflowMetadata\",\"type\":\"tuple[]\",\"internalType\":\"structDataFeedsCache.WorkflowMetadata[]\",\"components\":[{\"name\":\"allowedSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFeedAdmin\",\"inputs\":[{\"name\":\"feedAdmin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAdmin\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateDataIdMappingsForProxies\",\"inputs\":[{\"name\":\"proxies\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"dataIds\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"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\":\"BundleFeedConfigSet\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"},{\"name\":\"decimals\",\"type\":\"uint8[]\",\"indexed\":false,\"internalType\":\"uint8[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"workflowMetadata\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structDataFeedsCache.WorkflowMetadata[]\",\"components\":[{\"name\":\"allowedSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BundleReportUpdated\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"bundle\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DecimalFeedConfigSet\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"},{\"name\":\"workflowMetadata\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structDataFeedsCache.WorkflowMetadata[]\",\"components\":[{\"name\":\"allowedSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowedWorkflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DecimalReportUpdated\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"},{\"name\":\"roundId\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"answer\",\"type\":\"uint224\",\"indexed\":false,\"internalType\":\"uint224\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeedAdminSet\",\"inputs\":[{\"name\":\"feedAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isAdmin\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeedConfigRemoved\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InvalidUpdatePermission\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"indexed\":false,\"internalType\":\"bytes10\"}],\"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\":\"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\":\"ProxyDataIdRemoved\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProxyDataIdUpdated\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaleBundleReport\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"},{\"name\":\"reportTimestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"latestTimestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaleDecimalReport\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"indexed\":true,\"internalType\":\"bytes16\"},{\"name\":\"reportTimestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"latestTimestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenRecovered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AddressInsufficientBalance\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ErrorSendingNative\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeedNotConfigured\",\"inputs\":[{\"name\":\"dataId\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}]},{\"type\":\"error\",\"name\":\"InsufficientBalance\",\"inputs\":[{\"name\":\"balance\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requiredBalance\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidDataId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWorkflowName\",\"inputs\":[{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"}]},{\"type\":\"error\",\"name\":\"NoMappingForSender\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b614a5b806101576000396000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c806379ba509711610160578063b5ab58dc116100d8578063ec52b1f51161008c578063feaf968c11610071578063feaf968c146105d3578063feb5d172146105db578063ff25dbc81461067157600080fd5b8063ec52b1f5146105ad578063f2fde38b146105c057600080fd5b8063be4f0a9f116100bd578063be4f0a9f14610567578063cdd251001461057a578063d143dcd91461058d57600080fd5b8063b5ab58dc14610541578063b633620c1461055457600080fd5b80639198274f1161012f5780639a6fc8f5116101145780639a6fc8f51461051e5780639d91348d14610531578063a3d610cc1461053957600080fd5b80639198274f146104d15780639608e18f146104d957600080fd5b806379ba509714610493578063805f21321461049b5780638205bf6a146104ae5780638da5cb5b146104b657600080fd5b80634533dc981161020e5780635f25452b116101c2578063668a0f02116101a7578063668a0f02146104705780636a36e494146104785780637284e4161461048b57600080fd5b80635f25452b146104135780635f3e849f1461045d57600080fd5b806350d25bcd116101f357806350d25bcd146103f057806354fd4d50146103f8578063557a33c21461040057600080fd5b80634533dc98146103bd57806347381b08146103d057600080fd5b8063297dbf561161026557806335f611221161024a57806335f611221461036b5780633a0449741461037e57806343d5ba50146103aa57600080fd5b8063297dbf561461033c578063313ce5671461035157600080fd5b806301ffc9a71461029757806302ccb3ae146102bf578063181f5a77146102df5780631bb1610c1461031b575b600080fd5b6102aa6102a5366004613a2a565b610684565b60405190151581526020015b60405180910390f35b6102d26102cd366004613a89565b610801565b6040516102b69190613af4565b6102d26040518060400160405280601481526020017f446174614665656473436163686520312e302e3000000000000000000000000081525081565b61032e610329366004613a89565b6108f0565b6040519081526020016102b6565b61034f61034a366004613b53565b610976565b005b610359610b2b565b60405160ff90911681526020016102b6565b61034f610379366004613c09565b610b90565b6102aa61038c366004613cf5565b6001600160a01b031660009081526007602052604090205460ff1690565b6103596103b8366004613a89565b611209565b61034f6103cb366004613d12565b611255565b6103e36103de366004613a89565b611873565b6040516102b69190613db8565b61032e61193d565b61032e600781565b61032e61040e366004613a89565b6119cf565b610426610421366004613a89565b611a4d565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016102b6565b61034f61046b366004613dfe565b611b11565b61032e611db2565b6102d2610486366004613a89565b611e26565b6102d2611e8d565b61034f611f91565b61034f6104a9366004613e81565b612074565b61032e612782565b6000546040516001600160a01b0390911681526020016102b6565b6102d261281c565b6105056104e7366004613cf5565b6001600160a01b031660009081526002602052604090205460801b90565b6040516001600160801b031990911681526020016102b6565b61042661052c366004613ee6565b612899565b6103e361297e565b61032e612a5e565b61032e61054f366004613f12565b612adb565b61032e610562366004613f12565b612b7a565b61034f610575366004613f2b565b612c22565b61034f610588366004613f2b565b612d10565b6105a061059b366004613f6d565b612fa6565b6040516102b69190613fa0565b61034f6105bb36600461402d565b6131ce565b61034f6105ce366004613cf5565b613275565b610426613289565b6102aa6105e9366004614169565b805160208083015160409384015184516001600160801b031996909616868401526001600160a01b03938416868601529216606085015275ffffffffffffffffffffffffffffffffffffffffffff199091166080808501919091528251808503909101815260a090930182528251928101929092206000908152600990925290205460ff1690565b61032e61067f366004613a89565b613362565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fcce8054600000000000000000000000000000000000000000000000000000000148061071757507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b8061076357507fffffffff0000000000000000000000000000000000000000000000000000000082167f805f213200000000000000000000000000000000000000000000000000000000145b806107af57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5f3e849f00000000000000000000000000000000000000000000000000000000145b806107fb57507fffffffff0000000000000000000000000000000000000000000000000000000082167f181f5a7700000000000000000000000000000000000000000000000000000000145b92915050565b60606001600160801b03198216610844576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160801b031982166000908152600860205260409020600101805461086b9061419d565b80601f01602080910402602001604051908101604052809291908181526020018280546108979061419d565b80156108e45780601f106108b9576101008083540402835291602001916108e4565b820191906000526020600020905b8154815290600101906020018083116108c757829003601f168201915b50505050509050919050565b60006001600160801b03198216610933576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160801b0319166000908152600360205260409020547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1690565b3360009081526007602052604090205460ff166109c6576040517fd86ad9cf0000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b82818114610a00576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610b2357838382818110610a1d57610a1d6141f0565b9050602002016020810190610a329190613a89565b60026000888885818110610a4857610a486141f0565b9050602002016020810190610a5d9190613cf5565b6001600160a01b03168152602081019190915260400160002080546001600160801b03191660809290921c919091179055838382818110610aa057610aa06141f0565b9050602002016020810190610ab59190613a89565b6001600160801b031916868683818110610ad157610ad16141f0565b9050602002016020810190610ae69190613cf5565b6001600160a01b03167ff31b9e58190970ef07c23d0ba78c358eb3b416e829ef484b29b9993a6b1b285a60405160405180910390a3600101610a03565b505050505050565b3360009081526002602052604081205460801b6001600160801b03198116610b81576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b610b8a816133cb565b91505090565b3360009081526007602052604090205460ff16610bdb576040517fd86ad9cf0000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b801580610be6575086155b15610c1d576040517f60e8b63a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8685141580610c2c5750868314155b15610c63576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b878110156111fe576000898983818110610c8257610c826141f0565b9050602002016020810190610c979190613a89565b90506001600160801b03198116610cda576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160801b031981166000908152600860205260409020600281015415610e755760005b6002820154811015610dfc576000826002018281548110610d2357610d236141f0565b60009182526020808320604080516060808201835260029590950290920180546001600160a01b039081168085526001909201549081168486018190527401000000000000000000000000000000000000000090910460b01b75ffffffffffffffffffffffffffffffffffffffffffff191684840181905283516001600160801b03198d168188015280850193909352958201526080808201959095528151808203909501855260a0019052825192909101919091209092506000908152600960205260409020805460ff191690555050600101610d00565b506001600160801b03198216600090815260086020526040812090610e21828261388b565b610e2f6001830160006138b0565b610e3d6002830160006138ea565b50506040516001600160801b03198316907f871bcdef10dee59b87f17bab788b72faa8dfe1a9cc5bdc45c3baf4c18fa3391090600090a25b60005b848110156110fe576000868683818110610e9457610e946141f0565b905060600201803603810190610eaa919061421f565b905084600003610fcd5780516001600160a01b0316610f035780516040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016109bd565b60208101516001600160a01b0316610f585760208101516040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016109bd565b604081015175ffffffffffffffffffffffffffffffffffffffffffff1916610fcd5760408082015190517f114988d500000000000000000000000000000000000000000000000000000000815275ffffffffffffffffffffffffffffffffffffffffffff1990911660048201526024016109bd565b8051602080830180516040808601805182516001600160801b03198c16818801526001600160a01b0397881681850152938716606085015275ffffffffffffffffffffffffffffffffffffffffffff19166080808501919091528251808503909101815260a09093018252825192850192909220600090815260098552908120805460ff191660019081179091556002898101805480840182559084529590922096519490910290950180549385167fffffffffffffffffffffffff000000000000000000000000000000000000000090941693909317835590519184018054915160b01c74010000000000000000000000000000000000000000027fffff000000000000000000000000000000000000000000000000000000000000909216929093169190911717905501610e78565b50868684818110611111576111116141f0565b9050602002810190611123919061423b565b61112e91839161390b565b50888884818110611141576111416141f0565b905060200281019061115391906142a3565b6001830191611163919083614356565b506001600160801b031982167fdfebe0878c5611549f54908260ca12271c7ff3f0ebae0c1de47732612403869e8888868181106111a2576111a26141f0565b90506020028101906111b4919061423b565b8c8c888181106111c6576111c66141f0565b90506020028101906111d891906142a3565b8a8a6040516111ec969594939291906144d1565b60405180910390a25050600101610c66565b505050505050505050565b60006001600160801b0319821661124c576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107fb826133cb565b3360009081526007602052604090205460ff166112a0576040517fd86ad9cf0000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b8015806112ab575084155b156112e2576040517f60e8b63a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84831461131b576040517fa24a13a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8581101561186a57600087878381811061133a5761133a6141f0565b905060200201602081019061134f9190613a89565b90506001600160801b03198116611392576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160801b03198116600090815260086020526040902060028101541561152d5760005b60028201548110156114b45760008260020182815481106113db576113db6141f0565b60009182526020808320604080516060808201835260029590950290920180546001600160a01b039081168085526001909201549081168486018190527401000000000000000000000000000000000000000090910460b01b75ffffffffffffffffffffffffffffffffffffffffffff191684840181905283516001600160801b03198d168188015280850193909352958201526080808201959095528151808203909501855260a0019052825192909101919091209092506000908152600960205260409020805460ff1916905550506001016113b8565b506001600160801b031982166000908152600860205260408120906114d9828261388b565b6114e76001830160006138b0565b6114f56002830160006138ea565b50506040516001600160801b03198316907f871bcdef10dee59b87f17bab788b72faa8dfe1a9cc5bdc45c3baf4c18fa3391090600090a25b60005b848110156117b657600086868381811061154c5761154c6141f0565b905060600201803603810190611562919061421f565b9050846000036116855780516001600160a01b03166115bb5780516040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016109bd565b60208101516001600160a01b03166116105760208101516040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016109bd565b604081015175ffffffffffffffffffffffffffffffffffffffffffff19166116855760408082015190517f114988d500000000000000000000000000000000000000000000000000000000815275ffffffffffffffffffffffffffffffffffffffffffff1990911660048201526024016109bd565b8051602080830180516040808601805182516001600160801b03198c16818801526001600160a01b0397881681850152938716606085015275ffffffffffffffffffffffffffffffffffffffffffff19166080808501919091528251808503909101815260a09093018252825192850192909220600090815260098552908120805460ff191660019081179091556002898101805480840182559084529590922096519490910290950180549385167fffffffffffffffffffffffff000000000000000000000000000000000000000090941693909317835590519184018054915160b01c74010000000000000000000000000000000000000000027fffff000000000000000000000000000000000000000000000000000000000000909216929093169190911717905501611530565b508686848181106117c9576117c96141f0565b90506020028101906117db91906142a3565b60018301916117eb919083614356565b506001600160801b031982167f2dec0e9ffbb18c6499fc8bee8b9c35f765e76d9dbd436f25dd00a80de267ac0d611821846133cb565b898987818110611833576118336141f0565b905060200281019061184591906142a3565b898960405161185895949392919061454a565b60405180910390a2505060010161131e565b50505050505050565b60606001600160801b031982166118b6576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160801b03198216600090815260086020908152604091829020805483518184028101840190945280845290918301828280156108e457602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411611904575094979650505050505050565b3360009081526002602052604081205460801b6001600160801b03198116611993576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b6001600160801b0319166000908152600360205260409020547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919050565b60006001600160801b03198216611a12576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160801b0319166000908152600360205260409020547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b6000808080806001600160801b03198616611a94576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050506001600160801b03199190911660009081526006602090815260408083205460039092529091205490927bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821692507c010000000000000000000000000000000000000000000000000000000090910463ffffffff169081908490565b611b1961348c565b6001600160a01b038316611c065747811115611b6a576040517fcf479181000000000000000000000000000000000000000000000000000000008152476004820152602481018290526044016109bd565b600080836001600160a01b03168360405160006040518083038185875af1925050503d8060008114611bb8576040519150601f19603f3d011682016040523d82523d6000602084013e611bbd565b606091505b509150915081611bff578383826040517fc50febed0000000000000000000000000000000000000000000000000000000081526004016109bd93929190614586565b5050611d60565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611c63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8791906145b7565b811115611d4c576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611ceb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d0f91906145b7565b6040517fcf4791810000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016109bd565b611d606001600160a01b0384168383613502565b816001600160a01b0316836001600160a01b03167f879f92dded0f26b83c3e00b12e0395dc72cfc3077343d1854ed6988edd1f909683604051611da591815260200190565b60405180910390a3505050565b3360009081526002602052604081205460801b6001600160801b03198116611e08576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b6001600160801b031916600090815260066020526040902054919050565b60606001600160801b03198216611e69576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160801b031982166000908152600560205260409020805461086b9061419d565b3360009081526002602052604090205460609060801b6001600160801b03198116611ee6576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b6001600160801b0319811660009081526008602052604090206001018054611f0d9061419d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f399061419d565b8015611f865780601f10611f5b57610100808354040283529160200191611f86565b820191906000526020600020905b815481529060010190602001808311611f6957829003601f168201915b505050505091505090565b6001546001600160a01b03163314612005576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016109bd565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000806120b686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061358292505050565b909250905060006120cb6040602086886145d0565b6120d4916145fa565b90506120e1816060614647565b6120ec90604061465e565b84036124dd576000612100858701876146a9565b905060005b828110156124d6576000828281518110612121576121216141f0565b6020908102919091018101518051604080516001600160801b031983168186015233818301526001600160a01b038b16606082015275ffffffffffffffffffffffffffffffffffffffffffff198a166080808301919091528251808303909101815260a0909101825280519085012060008181526009909552932054919350919060ff1661222257604080513381526001600160a01b038a16602082015275ffffffffffffffffffffffffffffffffffffffffffff198916918101919091526001600160801b03198316907feeeaa8bf618ff6d960c6cf5935e68384f066abcc8b95d0de91bd773c16ae3ae3906060015b60405180910390a25050506124ce565b6001600160801b031982166000908152600360209081526040909120549084015163ffffffff7c010000000000000000000000000000000000000000000000000000000090920482169116116122f3576020838101516001600160801b0319841660008181526003845260409081902054815163ffffffff94851681527c010000000000000000000000000000000000000000000000000000000090910490931693830193909352917fcf16f5f704f981fa2279afa1877dd1fdaa462a03a71ec51b9d3b2416a59a013e9101612212565b604080518082018252848201517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208086015163ffffffff16818301526001600160801b0319851660009081526006909152918220805491929182906123589061479c565b91829055506001600160801b0319851660008181526003602090815260408083208751888401805163ffffffff9081167c01000000000000000000000000000000000000000000000000000000009081027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff94851617909455888752600486528487208888528652958490208a519151909616928302911690811790945590519283529394508492917f82584589cd7284d4503ed582275e22b2e8f459f9cf4170a7235844e367f966d5910160405180910390a460208086015160405163ffffffff909116815260009183917f0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271910160405180910390a38085604001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f426040516124c091815260200190565b60405180910390a350505050505b600101612105565b505061186a565b60006124eb858701876147b6565b905060005b81518110156111fe57600082828151811061250d5761250d6141f0565b6020908102919091018101518051604080516001600160801b031983168186015233818301526001600160a01b038b16606082015275ffffffffffffffffffffffffffffffffffffffffffff198a166080808301919091528251808303909101815260a0909101825280519085012060008181526009909552932054919350919060ff1661260e57604080513381526001600160a01b038a16602082015275ffffffffffffffffffffffffffffffffffffffffffff198916918101919091526001600160801b03198316907feeeaa8bf618ff6d960c6cf5935e68384f066abcc8b95d0de91bd773c16ae3ae3906060015b60405180910390a250505061277a565b6001600160801b031982166000908152600560209081526040909120600101549084015163ffffffff9182169116116126a3576020838101516001600160801b0319841660008181526005845260409081902060010154815163ffffffff9485168152931693830193909352917f51001b67094834cc084a0c1feb791cf84a481357aa66b924ba205d4cb56fd98191016125fe565b60408051808201825284820151815260208086015163ffffffff16818301526001600160801b031985166000908152600590915291909120815182919081906126ec908261492a565b5060209182015160019190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92831617905590820151825160405191909216916001600160801b03198616917f1dc1bef0b59d624eab3f0ec044781bb5b8594cd64f0ba09d789f5b51acab16149161276d91613af4565b60405180910390a3505050505b6001016124f0565b3360009081526002602052604081205460801b6001600160801b031981166127d8576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b6001600160801b0319166000908152600360205260409020547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16919050565b3360009081526002602052604090205460609060801b6001600160801b03198116612875576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b6001600160801b0319811660009081526005602052604090208054611f0d9061419d565b33600090815260026020526040812054819081908190819060801b6001600160801b031981166128f7576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b69ffffffffffffffffffff871660009081526004602090815260408083206001600160801b0319949094168352929052205495967bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8716967c0100000000000000000000000000000000000000000000000000000000900463ffffffff169550859450879350915050565b3360009081526002602052604090205460609060801b6001600160801b031981166129d7576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b6001600160801b0319811660009081526008602090815260409182902080548351818402810184019094528084529091830182828015611f8657602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411612a25579050505050505091505090565b3360009081526002602052604081205460801b6001600160801b03198116612ab4576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b6001600160801b03191660009081526005602052604090206001015463ffffffff16919050565b3360009081526002602052604081205460801b6001600160801b03198116612b31576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b60009283526004602090815260408085206001600160801b03199093168552919052909120547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919050565b3360009081526002602052604081205460801b6001600160801b03198116612bd0576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b60009283526004602090815260408085206001600160801b031990931685529190529091205463ffffffff7c010000000000000000000000000000000000000000000000000000000090910416919050565b3360009081526007602052604090205460ff16612c6d576040517fd86ad9cf0000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b8060005b81811015612d0a576000848483818110612c8d57612c8d6141f0565b9050602002016020810190612ca29190613cf5565b6001600160a01b03811660008181526002602052604080822080546001600160801b0319808216909255915194955060809190911b9390841692917f4200186b7bc2d4f13f7888c5bbe9461d57da88705be86521f3d78be691ad1d2a91a35050600101612c71565b50505050565b3360009081526007602052604090205460ff16612d5b576040517fd86ad9cf0000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b60005b81811015612fa1576000838383818110612d7a57612d7a6141f0565b9050602002016020810190612d8f9190613a89565b6001600160801b0319811660009081526008602052604081206002015491925003612df2576040517f8606a85b0000000000000000000000000000000000000000000000000000000081526001600160801b0319821660048201526024016109bd565b60005b6001600160801b03198216600090815260086020526040902060020154811015612f20576001600160801b031982166000908152600860205260408120600201805483908110612e4757612e476141f0565b60009182526020808320604080516060808201835260029590950290920180546001600160a01b039081168085526001909201549081168486018190527401000000000000000000000000000000000000000090910460b01b75ffffffffffffffffffffffffffffffffffffffffffff191684840181905283516001600160801b03198c168188015280850193909352958201526080808201959095528151808203909501855260a0019052825192909101919091209092506000908152600960205260409020805460ff191690555050600101612df5565b506001600160801b03198116600090815260086020526040812090612f45828261388b565b612f536001830160006138b0565b612f616002830160006138ea565b50506040516001600160801b03198216907f871bcdef10dee59b87f17bab788b72faa8dfe1a9cc5bdc45c3baf4c18fa3391090600090a250600101612d5e565b505050565b6001600160801b031983166000908152600860205260408120600281015460609281900361300c576040517f8606a85b0000000000000000000000000000000000000000000000000000000081526001600160801b0319871660048201526024016109bd565b808510613060576040805160008082526020820190925290613056565b60408051606081018252600080825260208083018290529282015282526000199092019101816130295790505b50925050506131c7565b600061306c858761465e565b90508181118061307a575084155b6130845780613086565b815b905061309286826149e9565b67ffffffffffffffff8111156130aa576130aa614066565b6040519080825280602002602001820160405280156130f557816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816130c85790505b50935060005b84518110156131c25760028401613112888361465e565b81548110613122576131226141f0565b60009182526020918290206040805160608101825260029390930290910180546001600160a01b039081168452600190910154908116938301939093527401000000000000000000000000000000000000000090920460b01b75ffffffffffffffffffffffffffffffffffffffffffff19169181019190915285518690839081106131af576131af6141f0565b60209081029190910101526001016130fb565b505050505b9392505050565b6131d661348c565b6001600160a01b038216613221576040517f8e4c8aa60000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016109bd565b6001600160a01b038216600081815260076020526040808220805460ff191685151590811790915590519092917f93a3fa5993d2a54de369386625330cc6d73caee7fece4b3983cf299b264473fd91a35050565b61327d61348c565b61328681613593565b50565b33600090815260026020526040812054819081908190819060801b6001600160801b031981166132e7576040517f718b09d00000000000000000000000000000000000000000000000000000000081523360048201526024016109bd565b6001600160801b03191660009081526006602090815260408083205460039092529091205490967bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821696507c010000000000000000000000000000000000000000000000000000000090910463ffffffff1694508493508692509050565b60006001600160801b031982166133a5576040517f0760371200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160801b03191660009081526005602052604090206001015463ffffffff1690565b6000806133d983600761366e565b90507f20000000000000000000000000000000000000000000000000000000000000007fff0000000000000000000000000000000000000000000000000000000000000082161080159061346f57507f60000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000821611155b15613483576131c7602060f883901c6149fc565b50600092915050565b6000546001600160a01b03163314613500576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016109bd565b565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612fa19084906136d6565b6040810151604a9091015160601c91565b336001600160a01b03821603613605576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016109bd565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6040516001600160801b03198316602082015260009060300160405160208183030381529060405282815181106136a7576136a76141f0565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016905092915050565b60006136eb6001600160a01b03841683613752565b9050805160001415801561371057508080602001905181019061370e9190614a15565b155b15612fa1576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016109bd565b60606131c78383600084600080856001600160a01b031684866040516137789190614a32565b60006040518083038185875af1925050503d80600081146137b5576040519150601f19603f3d011682016040523d82523d6000602084013e6137ba565b606091505b50915091506137ca8683836137d4565b9695505050505050565b6060826137e9576137e482613849565b6131c7565b815115801561380057506001600160a01b0384163b155b15613842576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016109bd565b50806131c7565b8051156138595780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50805460008255601f01602090049060005260206000209081019061328691906139b4565b5080546138bc9061419d565b6000825580601f106138cc575050565b601f01602090049060005260206000209081019061328691906139b4565b508054600082556002029060005260206000209081019061328691906139c9565b82805482825590600052602060002090601f016020900481019282156139a45791602002820160005b8382111561397557833560ff1683826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302613934565b80156139a25782816101000a81549060ff0219169055600101602081600001049283019260010302613975565b505b506139b09291506139b4565b5090565b5b808211156139b057600081556001016139b5565b5b808211156139b05780547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810180547fffff0000000000000000000000000000000000000000000000000000000000001690556002016139ca565b600060208284031215613a3c57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146131c757600080fd5b80356001600160801b031981168114613a8457600080fd5b919050565b600060208284031215613a9b57600080fd5b6131c782613a6c565b60005b83811015613abf578181015183820152602001613aa7565b50506000910152565b60008151808452613ae0816020860160208601613aa4565b601f01601f19169290920160200192915050565b6020815260006131c76020830184613ac8565b60008083601f840112613b1957600080fd5b50813567ffffffffffffffff811115613b3157600080fd5b6020830191508360208260051b8501011115613b4c57600080fd5b9250929050565b60008060008060408587031215613b6957600080fd5b843567ffffffffffffffff811115613b8057600080fd5b613b8c87828801613b07565b909550935050602085013567ffffffffffffffff811115613bac57600080fd5b613bb887828801613b07565b95989497509550505050565b60008083601f840112613bd657600080fd5b50813567ffffffffffffffff811115613bee57600080fd5b602083019150836020606083028501011115613b4c57600080fd5b6000806000806000806000806080898b031215613c2557600080fd5b883567ffffffffffffffff811115613c3c57600080fd5b613c488b828c01613b07565b909950975050602089013567ffffffffffffffff811115613c6857600080fd5b613c748b828c01613b07565b909750955050604089013567ffffffffffffffff811115613c9457600080fd5b613ca08b828c01613b07565b909550935050606089013567ffffffffffffffff811115613cc057600080fd5b613ccc8b828c01613bc4565b999c989b5096995094979396929594505050565b6001600160a01b038116811461328657600080fd5b600060208284031215613d0757600080fd5b81356131c781613ce0565b60008060008060008060608789031215613d2b57600080fd5b863567ffffffffffffffff811115613d4257600080fd5b613d4e89828a01613b07565b909750955050602087013567ffffffffffffffff811115613d6e57600080fd5b613d7a89828a01613b07565b909550935050604087013567ffffffffffffffff811115613d9a57600080fd5b613da689828a01613bc4565b979a9699509497509295939492505050565b602080825282518282018190526000918401906040840190835b81811015613df357835160ff16835260209384019390920191600101613dd2565b509095945050505050565b600080600060608486031215613e1357600080fd5b8335613e1e81613ce0565b92506020840135613e2e81613ce0565b929592945050506040919091013590565b60008083601f840112613e5157600080fd5b50813567ffffffffffffffff811115613e6957600080fd5b602083019150836020828501011115613b4c57600080fd5b60008060008060408587031215613e9757600080fd5b843567ffffffffffffffff811115613eae57600080fd5b613eba87828801613e3f565b909550935050602085013567ffffffffffffffff811115613eda57600080fd5b613bb887828801613e3f565b600060208284031215613ef857600080fd5b813569ffffffffffffffffffff811681146131c757600080fd5b600060208284031215613f2457600080fd5b5035919050565b60008060208385031215613f3e57600080fd5b823567ffffffffffffffff811115613f5557600080fd5b613f6185828601613b07565b90969095509350505050565b600080600060608486031215613f8257600080fd5b613f8b84613a6c565b95602085013595506040909401359392505050565b602080825282518282018190526000918401906040840190835b81811015613df35783516001600160a01b0381511684526001600160a01b03602082015116602085015275ffffffffffffffffffffffffffffffffffffffffffff19604082015116604085015250606083019250602084019350600181019050613fba565b801515811461328657600080fd5b6000806040838503121561404057600080fd5b823561404b81613ce0565b9150602083013561405b8161401f565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156140b8576140b8614066565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156140e7576140e7614066565b604052919050565b803575ffffffffffffffffffffffffffffffffffffffffffff1981168114613a8457600080fd5b60006060828403121561412857600080fd5b614130614095565b9050813561413d81613ce0565b8152602082013561414d81613ce0565b602082015261415e604083016140ef565b604082015292915050565b6000806080838503121561417c57600080fd5b61418583613a6c565b91506141948460208501614116565b90509250929050565b600181811c908216806141b157607f821691505b6020821081036141ea577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006060828403121561423157600080fd5b6131c78383614116565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261427057600080fd5b83018035915067ffffffffffffffff82111561428b57600080fd5b6020019150600581901b3603821315613b4c57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126142d857600080fd5b83018035915067ffffffffffffffff8211156142f357600080fd5b602001915036819003821315613b4c57600080fd5b601f821115612fa157806000526020600020601f840160051c8101602085101561432f5750805b601f840160051c820191505b8181101561434f576000815560010161433b565b5050505050565b67ffffffffffffffff83111561436e5761436e614066565b6143828361437c835461419d565b83614308565b6000601f8411600181146143b6576000851561439e5750838201355b600019600387901b1c1916600186901b17835561434f565b600083815260209020601f19861690835b828110156143e757868501358255602094850194600190920191016143c7565b50868210156144045760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b81835260208301925060008160005b848110156144c757813561446381613ce0565b6001600160a01b03168652602082013561447c81613ce0565b6001600160a01b0316602087015275ffffffffffffffffffffffffffffffffffffffffffff196144ae604084016140ef565b1660408701526060958601959190910190600101614450565b5093949350505050565b6060808252810186905260008760808301825b8981101561451357823560ff81168082146144fe57600080fd5b835250602092830192909101906001016144e4565b50838103602085015261452781888a614416565b915050828103604084015261453d818587614441565b9998505050505050505050565b60ff86168152606060208201526000614567606083018688614416565b828103604084015261457a818587614441565b98975050505050505050565b6001600160a01b03841681528260208201526060604082015260006145ae6060830184613ac8565b95945050505050565b6000602082840312156145c957600080fd5b5051919050565b600080858511156145e057600080fd5b838611156145ed57600080fd5b5050820193919092039150565b803560208310156107fb57600019602084900360031b1b1692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176107fb576107fb614618565b808201808211156107fb576107fb614618565b600067ffffffffffffffff82111561468b5761468b614066565b5060051b60200190565b803563ffffffff81168114613a8457600080fd5b6000602082840312156146bb57600080fd5b813567ffffffffffffffff8111156146d257600080fd5b8201601f810184136146e357600080fd5b80356146f66146f182614671565b6140be565b8082825260208201915060206060840285010192508683111561471857600080fd5b6020840193505b828410156137ca576060848803121561473757600080fd5b61473f614095565b8435815261474f60208601614695565b602082015260408501357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461478357600080fd5b604082015282526060939093019260209091019061471f565b600060001982036147af576147af614618565b5060010190565b6000602082840312156147c857600080fd5b813567ffffffffffffffff8111156147df57600080fd5b8201601f810184136147f057600080fd5b80356147fe6146f182614671565b8082825260208201915060208360051b85010192508683111561482057600080fd5b602084015b8381101561491f57803567ffffffffffffffff81111561484457600080fd5b85016060818a03601f1901121561485a57600080fd5b614862614095565b6020820135815261487560408301614695565b6020820152606082013567ffffffffffffffff81111561489457600080fd5b60208184010192505089601f8301126148ac57600080fd5b813567ffffffffffffffff8111156148c6576148c6614066565b6148d96020601f19601f840116016140be565b8181528b60208386010111156148ee57600080fd5b8160208501602083013760006020838301015280604084015250508085525050602083019250602081019050614825565b509695505050505050565b815167ffffffffffffffff81111561494457614944614066565b61495881614952845461419d565b84614308565b6020601f82116001811461498c57600083156149745750848201515b600019600385901b1c1916600184901b17845561434f565b600084815260208120601f198516915b828110156149bc578785015182556020948501946001909201910161499c565b50848210156149da5786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b818103818111156107fb576107fb614618565b60ff82811682821603908111156107fb576107fb614618565b600060208284031215614a2757600080fd5b81516131c78161401f565b60008251614a44818460208701613aa4565b919091019291505056fea164736f6c634300081a000a", +} + +var DataFeedsCacheABI = DataFeedsCacheMetaData.ABI + +var DataFeedsCacheBin = DataFeedsCacheMetaData.Bin + +func DeployDataFeedsCache(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *DataFeedsCache, error) { + parsed, err := DataFeedsCacheMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(DataFeedsCacheBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &DataFeedsCache{address: address, abi: *parsed, DataFeedsCacheCaller: DataFeedsCacheCaller{contract: contract}, DataFeedsCacheTransactor: DataFeedsCacheTransactor{contract: contract}, DataFeedsCacheFilterer: DataFeedsCacheFilterer{contract: contract}}, nil +} + +type DataFeedsCache struct { + address common.Address + abi abi.ABI + DataFeedsCacheCaller + DataFeedsCacheTransactor + DataFeedsCacheFilterer +} + +type DataFeedsCacheCaller struct { + contract *bind.BoundContract +} + +type DataFeedsCacheTransactor struct { + contract *bind.BoundContract +} + +type DataFeedsCacheFilterer struct { + contract *bind.BoundContract +} + +type DataFeedsCacheSession struct { + Contract *DataFeedsCache + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type DataFeedsCacheCallerSession struct { + Contract *DataFeedsCacheCaller + CallOpts bind.CallOpts +} + +type DataFeedsCacheTransactorSession struct { + Contract *DataFeedsCacheTransactor + TransactOpts bind.TransactOpts +} + +type DataFeedsCacheRaw struct { + Contract *DataFeedsCache +} + +type DataFeedsCacheCallerRaw struct { + Contract *DataFeedsCacheCaller +} + +type DataFeedsCacheTransactorRaw struct { + Contract *DataFeedsCacheTransactor +} + +func NewDataFeedsCache(address common.Address, backend bind.ContractBackend) (*DataFeedsCache, error) { + abi, err := abi.JSON(strings.NewReader(DataFeedsCacheABI)) + if err != nil { + return nil, err + } + contract, err := bindDataFeedsCache(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &DataFeedsCache{address: address, abi: abi, DataFeedsCacheCaller: DataFeedsCacheCaller{contract: contract}, DataFeedsCacheTransactor: DataFeedsCacheTransactor{contract: contract}, DataFeedsCacheFilterer: DataFeedsCacheFilterer{contract: contract}}, nil +} + +func NewDataFeedsCacheCaller(address common.Address, caller bind.ContractCaller) (*DataFeedsCacheCaller, error) { + contract, err := bindDataFeedsCache(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &DataFeedsCacheCaller{contract: contract}, nil +} + +func NewDataFeedsCacheTransactor(address common.Address, transactor bind.ContractTransactor) (*DataFeedsCacheTransactor, error) { + contract, err := bindDataFeedsCache(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &DataFeedsCacheTransactor{contract: contract}, nil +} + +func NewDataFeedsCacheFilterer(address common.Address, filterer bind.ContractFilterer) (*DataFeedsCacheFilterer, error) { + contract, err := bindDataFeedsCache(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &DataFeedsCacheFilterer{contract: contract}, nil +} + +func bindDataFeedsCache(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := DataFeedsCacheMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_DataFeedsCache *DataFeedsCacheRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _DataFeedsCache.Contract.DataFeedsCacheCaller.contract.Call(opts, result, method, params...) +} + +func (_DataFeedsCache *DataFeedsCacheRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DataFeedsCache.Contract.DataFeedsCacheTransactor.contract.Transfer(opts) +} + +func (_DataFeedsCache *DataFeedsCacheRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _DataFeedsCache.Contract.DataFeedsCacheTransactor.contract.Transact(opts, method, params...) +} + +func (_DataFeedsCache *DataFeedsCacheCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _DataFeedsCache.Contract.contract.Call(opts, result, method, params...) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DataFeedsCache.Contract.contract.Transfer(opts) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _DataFeedsCache.Contract.contract.Transact(opts, method, params...) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) BundleDecimals(opts *bind.CallOpts) ([]uint8, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "bundleDecimals") + + if err != nil { + return *new([]uint8), err + } + + out0 := *abi.ConvertType(out[0], new([]uint8)).(*[]uint8) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) BundleDecimals() ([]uint8, error) { + return _DataFeedsCache.Contract.BundleDecimals(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) BundleDecimals() ([]uint8, error) { + return _DataFeedsCache.Contract.BundleDecimals(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) CheckFeedPermission(opts *bind.CallOpts, dataId [16]byte, workflowMetadata DataFeedsCacheWorkflowMetadata) (bool, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "checkFeedPermission", dataId, workflowMetadata) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) CheckFeedPermission(dataId [16]byte, workflowMetadata DataFeedsCacheWorkflowMetadata) (bool, error) { + return _DataFeedsCache.Contract.CheckFeedPermission(&_DataFeedsCache.CallOpts, dataId, workflowMetadata) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) CheckFeedPermission(dataId [16]byte, workflowMetadata DataFeedsCacheWorkflowMetadata) (bool, error) { + return _DataFeedsCache.Contract.CheckFeedPermission(&_DataFeedsCache.CallOpts, dataId, workflowMetadata) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) Decimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "decimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) Decimals() (uint8, error) { + return _DataFeedsCache.Contract.Decimals(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) Decimals() (uint8, error) { + return _DataFeedsCache.Contract.Decimals(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) Description(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "description") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) Description() (string, error) { + return _DataFeedsCache.Contract.Description(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) Description() (string, error) { + return _DataFeedsCache.Contract.Description(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetAnswer(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetAnswer(roundId *big.Int) (*big.Int, error) { + return _DataFeedsCache.Contract.GetAnswer(&_DataFeedsCache.CallOpts, roundId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetAnswer(roundId *big.Int) (*big.Int, error) { + return _DataFeedsCache.Contract.GetAnswer(&_DataFeedsCache.CallOpts, roundId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetBundleDecimals(opts *bind.CallOpts, dataId [16]byte) ([]uint8, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getBundleDecimals", dataId) + + if err != nil { + return *new([]uint8), err + } + + out0 := *abi.ConvertType(out[0], new([]uint8)).(*[]uint8) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetBundleDecimals(dataId [16]byte) ([]uint8, error) { + return _DataFeedsCache.Contract.GetBundleDecimals(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetBundleDecimals(dataId [16]byte) ([]uint8, error) { + return _DataFeedsCache.Contract.GetBundleDecimals(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetDataIdForProxy(opts *bind.CallOpts, proxy common.Address) ([16]byte, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getDataIdForProxy", proxy) + + if err != nil { + return *new([16]byte), err + } + + out0 := *abi.ConvertType(out[0], new([16]byte)).(*[16]byte) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetDataIdForProxy(proxy common.Address) ([16]byte, error) { + return _DataFeedsCache.Contract.GetDataIdForProxy(&_DataFeedsCache.CallOpts, proxy) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetDataIdForProxy(proxy common.Address) ([16]byte, error) { + return _DataFeedsCache.Contract.GetDataIdForProxy(&_DataFeedsCache.CallOpts, proxy) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetDecimals(opts *bind.CallOpts, dataId [16]byte) (uint8, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getDecimals", dataId) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetDecimals(dataId [16]byte) (uint8, error) { + return _DataFeedsCache.Contract.GetDecimals(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetDecimals(dataId [16]byte) (uint8, error) { + return _DataFeedsCache.Contract.GetDecimals(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetDescription(opts *bind.CallOpts, dataId [16]byte) (string, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getDescription", dataId) + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetDescription(dataId [16]byte) (string, error) { + return _DataFeedsCache.Contract.GetDescription(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetDescription(dataId [16]byte) (string, error) { + return _DataFeedsCache.Contract.GetDescription(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetFeedMetadata(opts *bind.CallOpts, dataId [16]byte, startIndex *big.Int, maxCount *big.Int) ([]DataFeedsCacheWorkflowMetadata, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getFeedMetadata", dataId, startIndex, maxCount) + + if err != nil { + return *new([]DataFeedsCacheWorkflowMetadata), err + } + + out0 := *abi.ConvertType(out[0], new([]DataFeedsCacheWorkflowMetadata)).(*[]DataFeedsCacheWorkflowMetadata) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetFeedMetadata(dataId [16]byte, startIndex *big.Int, maxCount *big.Int) ([]DataFeedsCacheWorkflowMetadata, error) { + return _DataFeedsCache.Contract.GetFeedMetadata(&_DataFeedsCache.CallOpts, dataId, startIndex, maxCount) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetFeedMetadata(dataId [16]byte, startIndex *big.Int, maxCount *big.Int) ([]DataFeedsCacheWorkflowMetadata, error) { + return _DataFeedsCache.Contract.GetFeedMetadata(&_DataFeedsCache.CallOpts, dataId, startIndex, maxCount) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetLatestAnswer(opts *bind.CallOpts, dataId [16]byte) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getLatestAnswer", dataId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetLatestAnswer(dataId [16]byte) (*big.Int, error) { + return _DataFeedsCache.Contract.GetLatestAnswer(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetLatestAnswer(dataId [16]byte) (*big.Int, error) { + return _DataFeedsCache.Contract.GetLatestAnswer(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetLatestBundle(opts *bind.CallOpts, dataId [16]byte) ([]byte, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getLatestBundle", dataId) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetLatestBundle(dataId [16]byte) ([]byte, error) { + return _DataFeedsCache.Contract.GetLatestBundle(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetLatestBundle(dataId [16]byte) ([]byte, error) { + return _DataFeedsCache.Contract.GetLatestBundle(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetLatestBundleTimestamp(opts *bind.CallOpts, dataId [16]byte) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getLatestBundleTimestamp", dataId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetLatestBundleTimestamp(dataId [16]byte) (*big.Int, error) { + return _DataFeedsCache.Contract.GetLatestBundleTimestamp(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetLatestBundleTimestamp(dataId [16]byte) (*big.Int, error) { + return _DataFeedsCache.Contract.GetLatestBundleTimestamp(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetLatestRoundData(opts *bind.CallOpts, dataId [16]byte) (GetLatestRoundData, + + error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getLatestRoundData", dataId) + + outstruct := new(GetLatestRoundData) + if err != nil { + return *outstruct, err + } + + outstruct.Id = *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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetLatestRoundData(dataId [16]byte) (GetLatestRoundData, + + error) { + return _DataFeedsCache.Contract.GetLatestRoundData(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetLatestRoundData(dataId [16]byte) (GetLatestRoundData, + + error) { + return _DataFeedsCache.Contract.GetLatestRoundData(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetLatestTimestamp(opts *bind.CallOpts, dataId [16]byte) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getLatestTimestamp", dataId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetLatestTimestamp(dataId [16]byte) (*big.Int, error) { + return _DataFeedsCache.Contract.GetLatestTimestamp(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetLatestTimestamp(dataId [16]byte) (*big.Int, error) { + return _DataFeedsCache.Contract.GetLatestTimestamp(&_DataFeedsCache.CallOpts, dataId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetRoundData(opts *bind.CallOpts, roundId *big.Int) (GetRoundData, + + error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "getRoundData", roundId) + + outstruct := new(GetRoundData) + if err != nil { + return *outstruct, err + } + + outstruct.Id = *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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetRoundData(roundId *big.Int) (GetRoundData, + + error) { + return _DataFeedsCache.Contract.GetRoundData(&_DataFeedsCache.CallOpts, roundId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetRoundData(roundId *big.Int) (GetRoundData, + + error) { + return _DataFeedsCache.Contract.GetRoundData(&_DataFeedsCache.CallOpts, roundId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) GetTimestamp(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) GetTimestamp(roundId *big.Int) (*big.Int, error) { + return _DataFeedsCache.Contract.GetTimestamp(&_DataFeedsCache.CallOpts, roundId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) GetTimestamp(roundId *big.Int) (*big.Int, error) { + return _DataFeedsCache.Contract.GetTimestamp(&_DataFeedsCache.CallOpts, roundId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) IsFeedAdmin(opts *bind.CallOpts, feedAdmin common.Address) (bool, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "isFeedAdmin", feedAdmin) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) IsFeedAdmin(feedAdmin common.Address) (bool, error) { + return _DataFeedsCache.Contract.IsFeedAdmin(&_DataFeedsCache.CallOpts, feedAdmin) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) IsFeedAdmin(feedAdmin common.Address) (bool, error) { + return _DataFeedsCache.Contract.IsFeedAdmin(&_DataFeedsCache.CallOpts, feedAdmin) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) LatestAnswer(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) LatestAnswer() (*big.Int, error) { + return _DataFeedsCache.Contract.LatestAnswer(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) LatestAnswer() (*big.Int, error) { + return _DataFeedsCache.Contract.LatestAnswer(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) LatestBundle(opts *bind.CallOpts) ([]byte, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "latestBundle") + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) LatestBundle() ([]byte, error) { + return _DataFeedsCache.Contract.LatestBundle(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) LatestBundle() ([]byte, error) { + return _DataFeedsCache.Contract.LatestBundle(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) LatestBundleTimestamp(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "latestBundleTimestamp") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) LatestBundleTimestamp() (*big.Int, error) { + return _DataFeedsCache.Contract.LatestBundleTimestamp(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) LatestBundleTimestamp() (*big.Int, error) { + return _DataFeedsCache.Contract.LatestBundleTimestamp(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) LatestRound(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) LatestRound() (*big.Int, error) { + return _DataFeedsCache.Contract.LatestRound(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) LatestRound() (*big.Int, error) { + return _DataFeedsCache.Contract.LatestRound(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) LatestRoundData(opts *bind.CallOpts) (LatestRoundData, + + error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "latestRoundData") + + outstruct := new(LatestRoundData) + if err != nil { + return *outstruct, err + } + + outstruct.Id = *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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) LatestRoundData() (LatestRoundData, + + error) { + return _DataFeedsCache.Contract.LatestRoundData(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) LatestRoundData() (LatestRoundData, + + error) { + return _DataFeedsCache.Contract.LatestRoundData(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) LatestTimestamp(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) LatestTimestamp() (*big.Int, error) { + return _DataFeedsCache.Contract.LatestTimestamp(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) LatestTimestamp() (*big.Int, error) { + return _DataFeedsCache.Contract.LatestTimestamp(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _DataFeedsCache.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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) Owner() (common.Address, error) { + return _DataFeedsCache.Contract.Owner(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) Owner() (common.Address, error) { + return _DataFeedsCache.Contract.Owner(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _DataFeedsCache.Contract.SupportsInterface(&_DataFeedsCache.CallOpts, interfaceId) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _DataFeedsCache.Contract.SupportsInterface(&_DataFeedsCache.CallOpts, interfaceId) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _DataFeedsCache.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_DataFeedsCache *DataFeedsCacheSession) TypeAndVersion() (string, error) { + return _DataFeedsCache.Contract.TypeAndVersion(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) TypeAndVersion() (string, error) { + return _DataFeedsCache.Contract.TypeAndVersion(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCaller) Version(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _DataFeedsCache.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 + +} + +func (_DataFeedsCache *DataFeedsCacheSession) Version() (*big.Int, error) { + return _DataFeedsCache.Contract.Version(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheCallerSession) Version() (*big.Int, error) { + return _DataFeedsCache.Contract.Version(&_DataFeedsCache.CallOpts) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "acceptOwnership") +} + +func (_DataFeedsCache *DataFeedsCacheSession) AcceptOwnership() (*types.Transaction, error) { + return _DataFeedsCache.Contract.AcceptOwnership(&_DataFeedsCache.TransactOpts) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _DataFeedsCache.Contract.AcceptOwnership(&_DataFeedsCache.TransactOpts) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) OnReport(opts *bind.TransactOpts, metadata []byte, report []byte) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "onReport", metadata, report) +} + +func (_DataFeedsCache *DataFeedsCacheSession) OnReport(metadata []byte, report []byte) (*types.Transaction, error) { + return _DataFeedsCache.Contract.OnReport(&_DataFeedsCache.TransactOpts, metadata, report) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) OnReport(metadata []byte, report []byte) (*types.Transaction, error) { + return _DataFeedsCache.Contract.OnReport(&_DataFeedsCache.TransactOpts, metadata, report) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) RecoverTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "recoverTokens", token, to, amount) +} + +func (_DataFeedsCache *DataFeedsCacheSession) RecoverTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _DataFeedsCache.Contract.RecoverTokens(&_DataFeedsCache.TransactOpts, token, to, amount) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) RecoverTokens(token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _DataFeedsCache.Contract.RecoverTokens(&_DataFeedsCache.TransactOpts, token, to, amount) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) RemoveDataIdMappingsForProxies(opts *bind.TransactOpts, proxies []common.Address) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "removeDataIdMappingsForProxies", proxies) +} + +func (_DataFeedsCache *DataFeedsCacheSession) RemoveDataIdMappingsForProxies(proxies []common.Address) (*types.Transaction, error) { + return _DataFeedsCache.Contract.RemoveDataIdMappingsForProxies(&_DataFeedsCache.TransactOpts, proxies) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) RemoveDataIdMappingsForProxies(proxies []common.Address) (*types.Transaction, error) { + return _DataFeedsCache.Contract.RemoveDataIdMappingsForProxies(&_DataFeedsCache.TransactOpts, proxies) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) RemoveFeedConfigs(opts *bind.TransactOpts, dataIds [][16]byte) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "removeFeedConfigs", dataIds) +} + +func (_DataFeedsCache *DataFeedsCacheSession) RemoveFeedConfigs(dataIds [][16]byte) (*types.Transaction, error) { + return _DataFeedsCache.Contract.RemoveFeedConfigs(&_DataFeedsCache.TransactOpts, dataIds) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) RemoveFeedConfigs(dataIds [][16]byte) (*types.Transaction, error) { + return _DataFeedsCache.Contract.RemoveFeedConfigs(&_DataFeedsCache.TransactOpts, dataIds) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) SetBundleFeedConfigs(opts *bind.TransactOpts, dataIds [][16]byte, descriptions []string, decimalsMatrix [][]uint8, workflowMetadata []DataFeedsCacheWorkflowMetadata) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "setBundleFeedConfigs", dataIds, descriptions, decimalsMatrix, workflowMetadata) +} + +func (_DataFeedsCache *DataFeedsCacheSession) SetBundleFeedConfigs(dataIds [][16]byte, descriptions []string, decimalsMatrix [][]uint8, workflowMetadata []DataFeedsCacheWorkflowMetadata) (*types.Transaction, error) { + return _DataFeedsCache.Contract.SetBundleFeedConfigs(&_DataFeedsCache.TransactOpts, dataIds, descriptions, decimalsMatrix, workflowMetadata) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) SetBundleFeedConfigs(dataIds [][16]byte, descriptions []string, decimalsMatrix [][]uint8, workflowMetadata []DataFeedsCacheWorkflowMetadata) (*types.Transaction, error) { + return _DataFeedsCache.Contract.SetBundleFeedConfigs(&_DataFeedsCache.TransactOpts, dataIds, descriptions, decimalsMatrix, workflowMetadata) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) SetDecimalFeedConfigs(opts *bind.TransactOpts, dataIds [][16]byte, descriptions []string, workflowMetadata []DataFeedsCacheWorkflowMetadata) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "setDecimalFeedConfigs", dataIds, descriptions, workflowMetadata) +} + +func (_DataFeedsCache *DataFeedsCacheSession) SetDecimalFeedConfigs(dataIds [][16]byte, descriptions []string, workflowMetadata []DataFeedsCacheWorkflowMetadata) (*types.Transaction, error) { + return _DataFeedsCache.Contract.SetDecimalFeedConfigs(&_DataFeedsCache.TransactOpts, dataIds, descriptions, workflowMetadata) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) SetDecimalFeedConfigs(dataIds [][16]byte, descriptions []string, workflowMetadata []DataFeedsCacheWorkflowMetadata) (*types.Transaction, error) { + return _DataFeedsCache.Contract.SetDecimalFeedConfigs(&_DataFeedsCache.TransactOpts, dataIds, descriptions, workflowMetadata) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) SetFeedAdmin(opts *bind.TransactOpts, feedAdmin common.Address, isAdmin bool) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "setFeedAdmin", feedAdmin, isAdmin) +} + +func (_DataFeedsCache *DataFeedsCacheSession) SetFeedAdmin(feedAdmin common.Address, isAdmin bool) (*types.Transaction, error) { + return _DataFeedsCache.Contract.SetFeedAdmin(&_DataFeedsCache.TransactOpts, feedAdmin, isAdmin) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) SetFeedAdmin(feedAdmin common.Address, isAdmin bool) (*types.Transaction, error) { + return _DataFeedsCache.Contract.SetFeedAdmin(&_DataFeedsCache.TransactOpts, feedAdmin, isAdmin) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "transferOwnership", to) +} + +func (_DataFeedsCache *DataFeedsCacheSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _DataFeedsCache.Contract.TransferOwnership(&_DataFeedsCache.TransactOpts, to) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _DataFeedsCache.Contract.TransferOwnership(&_DataFeedsCache.TransactOpts, to) +} + +func (_DataFeedsCache *DataFeedsCacheTransactor) UpdateDataIdMappingsForProxies(opts *bind.TransactOpts, proxies []common.Address, dataIds [][16]byte) (*types.Transaction, error) { + return _DataFeedsCache.contract.Transact(opts, "updateDataIdMappingsForProxies", proxies, dataIds) +} + +func (_DataFeedsCache *DataFeedsCacheSession) UpdateDataIdMappingsForProxies(proxies []common.Address, dataIds [][16]byte) (*types.Transaction, error) { + return _DataFeedsCache.Contract.UpdateDataIdMappingsForProxies(&_DataFeedsCache.TransactOpts, proxies, dataIds) +} + +func (_DataFeedsCache *DataFeedsCacheTransactorSession) UpdateDataIdMappingsForProxies(proxies []common.Address, dataIds [][16]byte) (*types.Transaction, error) { + return _DataFeedsCache.Contract.UpdateDataIdMappingsForProxies(&_DataFeedsCache.TransactOpts, proxies, dataIds) +} + +type DataFeedsCacheAnswerUpdatedIterator struct { + Event *DataFeedsCacheAnswerUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheAnswerUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheAnswerUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheAnswerUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheAnswerUpdatedIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheAnswerUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheAnswerUpdated struct { + Current *big.Int + RoundId *big.Int + UpdatedAt *big.Int + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterAnswerUpdated(opts *bind.FilterOpts, current []*big.Int, roundId []*big.Int) (*DataFeedsCacheAnswerUpdatedIterator, 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 := _DataFeedsCache.contract.FilterLogs(opts, "AnswerUpdated", currentRule, roundIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheAnswerUpdatedIterator{contract: _DataFeedsCache.contract, event: "AnswerUpdated", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchAnswerUpdated(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheAnswerUpdated, 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 := _DataFeedsCache.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: + + event := new(DataFeedsCacheAnswerUpdated) + if err := _DataFeedsCache.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 +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseAnswerUpdated(log types.Log) (*DataFeedsCacheAnswerUpdated, error) { + event := new(DataFeedsCacheAnswerUpdated) + if err := _DataFeedsCache.contract.UnpackLog(event, "AnswerUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheBundleFeedConfigSetIterator struct { + Event *DataFeedsCacheBundleFeedConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheBundleFeedConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheBundleFeedConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheBundleFeedConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheBundleFeedConfigSetIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheBundleFeedConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheBundleFeedConfigSet struct { + DataId [16]byte + Decimals []uint8 + Description string + WorkflowMetadata []DataFeedsCacheWorkflowMetadata + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterBundleFeedConfigSet(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheBundleFeedConfigSetIterator, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "BundleFeedConfigSet", dataIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheBundleFeedConfigSetIterator{contract: _DataFeedsCache.contract, event: "BundleFeedConfigSet", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchBundleFeedConfigSet(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheBundleFeedConfigSet, dataId [][16]byte) (event.Subscription, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "BundleFeedConfigSet", dataIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheBundleFeedConfigSet) + if err := _DataFeedsCache.contract.UnpackLog(event, "BundleFeedConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseBundleFeedConfigSet(log types.Log) (*DataFeedsCacheBundleFeedConfigSet, error) { + event := new(DataFeedsCacheBundleFeedConfigSet) + if err := _DataFeedsCache.contract.UnpackLog(event, "BundleFeedConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheBundleReportUpdatedIterator struct { + Event *DataFeedsCacheBundleReportUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheBundleReportUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheBundleReportUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheBundleReportUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheBundleReportUpdatedIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheBundleReportUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheBundleReportUpdated struct { + DataId [16]byte + Timestamp *big.Int + Bundle []byte + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterBundleReportUpdated(opts *bind.FilterOpts, dataId [][16]byte, timestamp []*big.Int) (*DataFeedsCacheBundleReportUpdatedIterator, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + var timestampRule []interface{} + for _, timestampItem := range timestamp { + timestampRule = append(timestampRule, timestampItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "BundleReportUpdated", dataIdRule, timestampRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheBundleReportUpdatedIterator{contract: _DataFeedsCache.contract, event: "BundleReportUpdated", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchBundleReportUpdated(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheBundleReportUpdated, dataId [][16]byte, timestamp []*big.Int) (event.Subscription, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + var timestampRule []interface{} + for _, timestampItem := range timestamp { + timestampRule = append(timestampRule, timestampItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "BundleReportUpdated", dataIdRule, timestampRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheBundleReportUpdated) + if err := _DataFeedsCache.contract.UnpackLog(event, "BundleReportUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseBundleReportUpdated(log types.Log) (*DataFeedsCacheBundleReportUpdated, error) { + event := new(DataFeedsCacheBundleReportUpdated) + if err := _DataFeedsCache.contract.UnpackLog(event, "BundleReportUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheDecimalFeedConfigSetIterator struct { + Event *DataFeedsCacheDecimalFeedConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheDecimalFeedConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheDecimalFeedConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheDecimalFeedConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheDecimalFeedConfigSetIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheDecimalFeedConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheDecimalFeedConfigSet struct { + DataId [16]byte + Decimals uint8 + Description string + WorkflowMetadata []DataFeedsCacheWorkflowMetadata + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterDecimalFeedConfigSet(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheDecimalFeedConfigSetIterator, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "DecimalFeedConfigSet", dataIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheDecimalFeedConfigSetIterator{contract: _DataFeedsCache.contract, event: "DecimalFeedConfigSet", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchDecimalFeedConfigSet(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheDecimalFeedConfigSet, dataId [][16]byte) (event.Subscription, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "DecimalFeedConfigSet", dataIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheDecimalFeedConfigSet) + if err := _DataFeedsCache.contract.UnpackLog(event, "DecimalFeedConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseDecimalFeedConfigSet(log types.Log) (*DataFeedsCacheDecimalFeedConfigSet, error) { + event := new(DataFeedsCacheDecimalFeedConfigSet) + if err := _DataFeedsCache.contract.UnpackLog(event, "DecimalFeedConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheDecimalReportUpdatedIterator struct { + Event *DataFeedsCacheDecimalReportUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheDecimalReportUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheDecimalReportUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheDecimalReportUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheDecimalReportUpdatedIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheDecimalReportUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheDecimalReportUpdated struct { + DataId [16]byte + RoundId *big.Int + Timestamp *big.Int + Answer *big.Int + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterDecimalReportUpdated(opts *bind.FilterOpts, dataId [][16]byte, roundId []*big.Int, timestamp []*big.Int) (*DataFeedsCacheDecimalReportUpdatedIterator, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + var roundIdRule []interface{} + for _, roundIdItem := range roundId { + roundIdRule = append(roundIdRule, roundIdItem) + } + var timestampRule []interface{} + for _, timestampItem := range timestamp { + timestampRule = append(timestampRule, timestampItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "DecimalReportUpdated", dataIdRule, roundIdRule, timestampRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheDecimalReportUpdatedIterator{contract: _DataFeedsCache.contract, event: "DecimalReportUpdated", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchDecimalReportUpdated(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheDecimalReportUpdated, dataId [][16]byte, roundId []*big.Int, timestamp []*big.Int) (event.Subscription, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + var roundIdRule []interface{} + for _, roundIdItem := range roundId { + roundIdRule = append(roundIdRule, roundIdItem) + } + var timestampRule []interface{} + for _, timestampItem := range timestamp { + timestampRule = append(timestampRule, timestampItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "DecimalReportUpdated", dataIdRule, roundIdRule, timestampRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheDecimalReportUpdated) + if err := _DataFeedsCache.contract.UnpackLog(event, "DecimalReportUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseDecimalReportUpdated(log types.Log) (*DataFeedsCacheDecimalReportUpdated, error) { + event := new(DataFeedsCacheDecimalReportUpdated) + if err := _DataFeedsCache.contract.UnpackLog(event, "DecimalReportUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheFeedAdminSetIterator struct { + Event *DataFeedsCacheFeedAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheFeedAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheFeedAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheFeedAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheFeedAdminSetIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheFeedAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheFeedAdminSet struct { + FeedAdmin common.Address + IsAdmin bool + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterFeedAdminSet(opts *bind.FilterOpts, feedAdmin []common.Address, isAdmin []bool) (*DataFeedsCacheFeedAdminSetIterator, error) { + + var feedAdminRule []interface{} + for _, feedAdminItem := range feedAdmin { + feedAdminRule = append(feedAdminRule, feedAdminItem) + } + var isAdminRule []interface{} + for _, isAdminItem := range isAdmin { + isAdminRule = append(isAdminRule, isAdminItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "FeedAdminSet", feedAdminRule, isAdminRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheFeedAdminSetIterator{contract: _DataFeedsCache.contract, event: "FeedAdminSet", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchFeedAdminSet(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheFeedAdminSet, feedAdmin []common.Address, isAdmin []bool) (event.Subscription, error) { + + var feedAdminRule []interface{} + for _, feedAdminItem := range feedAdmin { + feedAdminRule = append(feedAdminRule, feedAdminItem) + } + var isAdminRule []interface{} + for _, isAdminItem := range isAdmin { + isAdminRule = append(isAdminRule, isAdminItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "FeedAdminSet", feedAdminRule, isAdminRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheFeedAdminSet) + if err := _DataFeedsCache.contract.UnpackLog(event, "FeedAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseFeedAdminSet(log types.Log) (*DataFeedsCacheFeedAdminSet, error) { + event := new(DataFeedsCacheFeedAdminSet) + if err := _DataFeedsCache.contract.UnpackLog(event, "FeedAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheFeedConfigRemovedIterator struct { + Event *DataFeedsCacheFeedConfigRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheFeedConfigRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheFeedConfigRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheFeedConfigRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheFeedConfigRemovedIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheFeedConfigRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheFeedConfigRemoved struct { + DataId [16]byte + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterFeedConfigRemoved(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheFeedConfigRemovedIterator, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "FeedConfigRemoved", dataIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheFeedConfigRemovedIterator{contract: _DataFeedsCache.contract, event: "FeedConfigRemoved", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchFeedConfigRemoved(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheFeedConfigRemoved, dataId [][16]byte) (event.Subscription, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "FeedConfigRemoved", dataIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheFeedConfigRemoved) + if err := _DataFeedsCache.contract.UnpackLog(event, "FeedConfigRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseFeedConfigRemoved(log types.Log) (*DataFeedsCacheFeedConfigRemoved, error) { + event := new(DataFeedsCacheFeedConfigRemoved) + if err := _DataFeedsCache.contract.UnpackLog(event, "FeedConfigRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheInvalidUpdatePermissionIterator struct { + Event *DataFeedsCacheInvalidUpdatePermission + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheInvalidUpdatePermissionIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheInvalidUpdatePermission) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheInvalidUpdatePermission) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheInvalidUpdatePermissionIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheInvalidUpdatePermissionIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheInvalidUpdatePermission struct { + DataId [16]byte + Sender common.Address + WorkflowOwner common.Address + WorkflowName [10]byte + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterInvalidUpdatePermission(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheInvalidUpdatePermissionIterator, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "InvalidUpdatePermission", dataIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheInvalidUpdatePermissionIterator{contract: _DataFeedsCache.contract, event: "InvalidUpdatePermission", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchInvalidUpdatePermission(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheInvalidUpdatePermission, dataId [][16]byte) (event.Subscription, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "InvalidUpdatePermission", dataIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheInvalidUpdatePermission) + if err := _DataFeedsCache.contract.UnpackLog(event, "InvalidUpdatePermission", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseInvalidUpdatePermission(log types.Log) (*DataFeedsCacheInvalidUpdatePermission, error) { + event := new(DataFeedsCacheInvalidUpdatePermission) + if err := _DataFeedsCache.contract.UnpackLog(event, "InvalidUpdatePermission", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheNewRoundIterator struct { + Event *DataFeedsCacheNewRound + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheNewRoundIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheNewRound) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheNewRound) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheNewRoundIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheNewRoundIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheNewRound struct { + RoundId *big.Int + StartedBy common.Address + StartedAt *big.Int + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterNewRound(opts *bind.FilterOpts, roundId []*big.Int, startedBy []common.Address) (*DataFeedsCacheNewRoundIterator, 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 := _DataFeedsCache.contract.FilterLogs(opts, "NewRound", roundIdRule, startedByRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheNewRoundIterator{contract: _DataFeedsCache.contract, event: "NewRound", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchNewRound(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheNewRound, 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 := _DataFeedsCache.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: + + event := new(DataFeedsCacheNewRound) + if err := _DataFeedsCache.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 +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseNewRound(log types.Log) (*DataFeedsCacheNewRound, error) { + event := new(DataFeedsCacheNewRound) + if err := _DataFeedsCache.contract.UnpackLog(event, "NewRound", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheOwnershipTransferRequestedIterator struct { + Event *DataFeedsCacheOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*DataFeedsCacheOwnershipTransferRequestedIterator, 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 := _DataFeedsCache.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheOwnershipTransferRequestedIterator{contract: _DataFeedsCache.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheOwnershipTransferRequested, 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 := _DataFeedsCache.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: + + event := new(DataFeedsCacheOwnershipTransferRequested) + if err := _DataFeedsCache.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 +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseOwnershipTransferRequested(log types.Log) (*DataFeedsCacheOwnershipTransferRequested, error) { + event := new(DataFeedsCacheOwnershipTransferRequested) + if err := _DataFeedsCache.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheOwnershipTransferredIterator struct { + Event *DataFeedsCacheOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*DataFeedsCacheOwnershipTransferredIterator, 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 := _DataFeedsCache.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheOwnershipTransferredIterator{contract: _DataFeedsCache.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheOwnershipTransferred, 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 := _DataFeedsCache.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: + + event := new(DataFeedsCacheOwnershipTransferred) + if err := _DataFeedsCache.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 +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseOwnershipTransferred(log types.Log) (*DataFeedsCacheOwnershipTransferred, error) { + event := new(DataFeedsCacheOwnershipTransferred) + if err := _DataFeedsCache.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheProxyDataIdRemovedIterator struct { + Event *DataFeedsCacheProxyDataIdRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheProxyDataIdRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheProxyDataIdRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheProxyDataIdRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheProxyDataIdRemovedIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheProxyDataIdRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheProxyDataIdRemoved struct { + Proxy common.Address + DataId [16]byte + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterProxyDataIdRemoved(opts *bind.FilterOpts, proxy []common.Address, dataId [][16]byte) (*DataFeedsCacheProxyDataIdRemovedIterator, error) { + + var proxyRule []interface{} + for _, proxyItem := range proxy { + proxyRule = append(proxyRule, proxyItem) + } + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "ProxyDataIdRemoved", proxyRule, dataIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheProxyDataIdRemovedIterator{contract: _DataFeedsCache.contract, event: "ProxyDataIdRemoved", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchProxyDataIdRemoved(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheProxyDataIdRemoved, proxy []common.Address, dataId [][16]byte) (event.Subscription, error) { + + var proxyRule []interface{} + for _, proxyItem := range proxy { + proxyRule = append(proxyRule, proxyItem) + } + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "ProxyDataIdRemoved", proxyRule, dataIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheProxyDataIdRemoved) + if err := _DataFeedsCache.contract.UnpackLog(event, "ProxyDataIdRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseProxyDataIdRemoved(log types.Log) (*DataFeedsCacheProxyDataIdRemoved, error) { + event := new(DataFeedsCacheProxyDataIdRemoved) + if err := _DataFeedsCache.contract.UnpackLog(event, "ProxyDataIdRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheProxyDataIdUpdatedIterator struct { + Event *DataFeedsCacheProxyDataIdUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheProxyDataIdUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheProxyDataIdUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheProxyDataIdUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheProxyDataIdUpdatedIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheProxyDataIdUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheProxyDataIdUpdated struct { + Proxy common.Address + DataId [16]byte + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterProxyDataIdUpdated(opts *bind.FilterOpts, proxy []common.Address, dataId [][16]byte) (*DataFeedsCacheProxyDataIdUpdatedIterator, error) { + + var proxyRule []interface{} + for _, proxyItem := range proxy { + proxyRule = append(proxyRule, proxyItem) + } + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "ProxyDataIdUpdated", proxyRule, dataIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheProxyDataIdUpdatedIterator{contract: _DataFeedsCache.contract, event: "ProxyDataIdUpdated", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchProxyDataIdUpdated(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheProxyDataIdUpdated, proxy []common.Address, dataId [][16]byte) (event.Subscription, error) { + + var proxyRule []interface{} + for _, proxyItem := range proxy { + proxyRule = append(proxyRule, proxyItem) + } + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "ProxyDataIdUpdated", proxyRule, dataIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheProxyDataIdUpdated) + if err := _DataFeedsCache.contract.UnpackLog(event, "ProxyDataIdUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseProxyDataIdUpdated(log types.Log) (*DataFeedsCacheProxyDataIdUpdated, error) { + event := new(DataFeedsCacheProxyDataIdUpdated) + if err := _DataFeedsCache.contract.UnpackLog(event, "ProxyDataIdUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheStaleBundleReportIterator struct { + Event *DataFeedsCacheStaleBundleReport + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheStaleBundleReportIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheStaleBundleReport) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheStaleBundleReport) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheStaleBundleReportIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheStaleBundleReportIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheStaleBundleReport struct { + DataId [16]byte + ReportTimestamp *big.Int + LatestTimestamp *big.Int + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterStaleBundleReport(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheStaleBundleReportIterator, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "StaleBundleReport", dataIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheStaleBundleReportIterator{contract: _DataFeedsCache.contract, event: "StaleBundleReport", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchStaleBundleReport(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheStaleBundleReport, dataId [][16]byte) (event.Subscription, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "StaleBundleReport", dataIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheStaleBundleReport) + if err := _DataFeedsCache.contract.UnpackLog(event, "StaleBundleReport", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseStaleBundleReport(log types.Log) (*DataFeedsCacheStaleBundleReport, error) { + event := new(DataFeedsCacheStaleBundleReport) + if err := _DataFeedsCache.contract.UnpackLog(event, "StaleBundleReport", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheStaleDecimalReportIterator struct { + Event *DataFeedsCacheStaleDecimalReport + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheStaleDecimalReportIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheStaleDecimalReport) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheStaleDecimalReport) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheStaleDecimalReportIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheStaleDecimalReportIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheStaleDecimalReport struct { + DataId [16]byte + ReportTimestamp *big.Int + LatestTimestamp *big.Int + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterStaleDecimalReport(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheStaleDecimalReportIterator, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "StaleDecimalReport", dataIdRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheStaleDecimalReportIterator{contract: _DataFeedsCache.contract, event: "StaleDecimalReport", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchStaleDecimalReport(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheStaleDecimalReport, dataId [][16]byte) (event.Subscription, error) { + + var dataIdRule []interface{} + for _, dataIdItem := range dataId { + dataIdRule = append(dataIdRule, dataIdItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "StaleDecimalReport", dataIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheStaleDecimalReport) + if err := _DataFeedsCache.contract.UnpackLog(event, "StaleDecimalReport", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseStaleDecimalReport(log types.Log) (*DataFeedsCacheStaleDecimalReport, error) { + event := new(DataFeedsCacheStaleDecimalReport) + if err := _DataFeedsCache.contract.UnpackLog(event, "StaleDecimalReport", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type DataFeedsCacheTokenRecoveredIterator struct { + Event *DataFeedsCacheTokenRecovered + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *DataFeedsCacheTokenRecoveredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheTokenRecovered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(DataFeedsCacheTokenRecovered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *DataFeedsCacheTokenRecoveredIterator) Error() error { + return it.fail +} + +func (it *DataFeedsCacheTokenRecoveredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type DataFeedsCacheTokenRecovered struct { + Token common.Address + To common.Address + Amount *big.Int + Raw types.Log +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) FilterTokenRecovered(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*DataFeedsCacheTokenRecoveredIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _DataFeedsCache.contract.FilterLogs(opts, "TokenRecovered", tokenRule, toRule) + if err != nil { + return nil, err + } + return &DataFeedsCacheTokenRecoveredIterator{contract: _DataFeedsCache.contract, event: "TokenRecovered", logs: logs, sub: sub}, nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) WatchTokenRecovered(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheTokenRecovered, token []common.Address, to []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _DataFeedsCache.contract.WatchLogs(opts, "TokenRecovered", tokenRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(DataFeedsCacheTokenRecovered) + if err := _DataFeedsCache.contract.UnpackLog(event, "TokenRecovered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_DataFeedsCache *DataFeedsCacheFilterer) ParseTokenRecovered(log types.Log) (*DataFeedsCacheTokenRecovered, error) { + event := new(DataFeedsCacheTokenRecovered) + if err := _DataFeedsCache.contract.UnpackLog(event, "TokenRecovered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetLatestRoundData struct { + Id *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +} +type GetRoundData struct { + Id *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +} +type LatestRoundData struct { + Id *big.Int + Answer *big.Int + StartedAt *big.Int + UpdatedAt *big.Int + AnsweredInRound *big.Int +} + +func (_DataFeedsCache *DataFeedsCache) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _DataFeedsCache.abi.Events["AnswerUpdated"].ID: + return _DataFeedsCache.ParseAnswerUpdated(log) + case _DataFeedsCache.abi.Events["BundleFeedConfigSet"].ID: + return _DataFeedsCache.ParseBundleFeedConfigSet(log) + case _DataFeedsCache.abi.Events["BundleReportUpdated"].ID: + return _DataFeedsCache.ParseBundleReportUpdated(log) + case _DataFeedsCache.abi.Events["DecimalFeedConfigSet"].ID: + return _DataFeedsCache.ParseDecimalFeedConfigSet(log) + case _DataFeedsCache.abi.Events["DecimalReportUpdated"].ID: + return _DataFeedsCache.ParseDecimalReportUpdated(log) + case _DataFeedsCache.abi.Events["FeedAdminSet"].ID: + return _DataFeedsCache.ParseFeedAdminSet(log) + case _DataFeedsCache.abi.Events["FeedConfigRemoved"].ID: + return _DataFeedsCache.ParseFeedConfigRemoved(log) + case _DataFeedsCache.abi.Events["InvalidUpdatePermission"].ID: + return _DataFeedsCache.ParseInvalidUpdatePermission(log) + case _DataFeedsCache.abi.Events["NewRound"].ID: + return _DataFeedsCache.ParseNewRound(log) + case _DataFeedsCache.abi.Events["OwnershipTransferRequested"].ID: + return _DataFeedsCache.ParseOwnershipTransferRequested(log) + case _DataFeedsCache.abi.Events["OwnershipTransferred"].ID: + return _DataFeedsCache.ParseOwnershipTransferred(log) + case _DataFeedsCache.abi.Events["ProxyDataIdRemoved"].ID: + return _DataFeedsCache.ParseProxyDataIdRemoved(log) + case _DataFeedsCache.abi.Events["ProxyDataIdUpdated"].ID: + return _DataFeedsCache.ParseProxyDataIdUpdated(log) + case _DataFeedsCache.abi.Events["StaleBundleReport"].ID: + return _DataFeedsCache.ParseStaleBundleReport(log) + case _DataFeedsCache.abi.Events["StaleDecimalReport"].ID: + return _DataFeedsCache.ParseStaleDecimalReport(log) + case _DataFeedsCache.abi.Events["TokenRecovered"].ID: + return _DataFeedsCache.ParseTokenRecovered(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (DataFeedsCacheAnswerUpdated) Topic() common.Hash { + return common.HexToHash("0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f") +} + +func (DataFeedsCacheBundleFeedConfigSet) Topic() common.Hash { + return common.HexToHash("0xdfebe0878c5611549f54908260ca12271c7ff3f0ebae0c1de47732612403869e") +} + +func (DataFeedsCacheBundleReportUpdated) Topic() common.Hash { + return common.HexToHash("0x1dc1bef0b59d624eab3f0ec044781bb5b8594cd64f0ba09d789f5b51acab1614") +} + +func (DataFeedsCacheDecimalFeedConfigSet) Topic() common.Hash { + return common.HexToHash("0x2dec0e9ffbb18c6499fc8bee8b9c35f765e76d9dbd436f25dd00a80de267ac0d") +} + +func (DataFeedsCacheDecimalReportUpdated) Topic() common.Hash { + return common.HexToHash("0x82584589cd7284d4503ed582275e22b2e8f459f9cf4170a7235844e367f966d5") +} + +func (DataFeedsCacheFeedAdminSet) Topic() common.Hash { + return common.HexToHash("0x93a3fa5993d2a54de369386625330cc6d73caee7fece4b3983cf299b264473fd") +} + +func (DataFeedsCacheFeedConfigRemoved) Topic() common.Hash { + return common.HexToHash("0x871bcdef10dee59b87f17bab788b72faa8dfe1a9cc5bdc45c3baf4c18fa33910") +} + +func (DataFeedsCacheInvalidUpdatePermission) Topic() common.Hash { + return common.HexToHash("0xeeeaa8bf618ff6d960c6cf5935e68384f066abcc8b95d0de91bd773c16ae3ae3") +} + +func (DataFeedsCacheNewRound) Topic() common.Hash { + return common.HexToHash("0x0109fc6f55cf40689f02fbaad7af7fe7bbac8a3d2186600afc7d3e10cac60271") +} + +func (DataFeedsCacheOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (DataFeedsCacheOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (DataFeedsCacheProxyDataIdRemoved) Topic() common.Hash { + return common.HexToHash("0x4200186b7bc2d4f13f7888c5bbe9461d57da88705be86521f3d78be691ad1d2a") +} + +func (DataFeedsCacheProxyDataIdUpdated) Topic() common.Hash { + return common.HexToHash("0xf31b9e58190970ef07c23d0ba78c358eb3b416e829ef484b29b9993a6b1b285a") +} + +func (DataFeedsCacheStaleBundleReport) Topic() common.Hash { + return common.HexToHash("0x51001b67094834cc084a0c1feb791cf84a481357aa66b924ba205d4cb56fd981") +} + +func (DataFeedsCacheStaleDecimalReport) Topic() common.Hash { + return common.HexToHash("0xcf16f5f704f981fa2279afa1877dd1fdaa462a03a71ec51b9d3b2416a59a013e") +} + +func (DataFeedsCacheTokenRecovered) Topic() common.Hash { + return common.HexToHash("0x879f92dded0f26b83c3e00b12e0395dc72cfc3077343d1854ed6988edd1f9096") +} + +func (_DataFeedsCache *DataFeedsCache) Address() common.Address { + return _DataFeedsCache.address +} + +type DataFeedsCacheInterface interface { + BundleDecimals(opts *bind.CallOpts) ([]uint8, error) + + CheckFeedPermission(opts *bind.CallOpts, dataId [16]byte, workflowMetadata DataFeedsCacheWorkflowMetadata) (bool, error) + + Decimals(opts *bind.CallOpts) (uint8, error) + + Description(opts *bind.CallOpts) (string, error) + + GetAnswer(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error) + + GetBundleDecimals(opts *bind.CallOpts, dataId [16]byte) ([]uint8, error) + + GetDataIdForProxy(opts *bind.CallOpts, proxy common.Address) ([16]byte, error) + + GetDecimals(opts *bind.CallOpts, dataId [16]byte) (uint8, error) + + GetDescription(opts *bind.CallOpts, dataId [16]byte) (string, error) + + GetFeedMetadata(opts *bind.CallOpts, dataId [16]byte, startIndex *big.Int, maxCount *big.Int) ([]DataFeedsCacheWorkflowMetadata, error) + + GetLatestAnswer(opts *bind.CallOpts, dataId [16]byte) (*big.Int, error) + + GetLatestBundle(opts *bind.CallOpts, dataId [16]byte) ([]byte, error) + + GetLatestBundleTimestamp(opts *bind.CallOpts, dataId [16]byte) (*big.Int, error) + + GetLatestRoundData(opts *bind.CallOpts, dataId [16]byte) (GetLatestRoundData, + + error) + + GetLatestTimestamp(opts *bind.CallOpts, dataId [16]byte) (*big.Int, error) + + GetRoundData(opts *bind.CallOpts, roundId *big.Int) (GetRoundData, + + error) + + GetTimestamp(opts *bind.CallOpts, roundId *big.Int) (*big.Int, error) + + IsFeedAdmin(opts *bind.CallOpts, feedAdmin common.Address) (bool, error) + + LatestAnswer(opts *bind.CallOpts) (*big.Int, error) + + LatestBundle(opts *bind.CallOpts) ([]byte, error) + + LatestBundleTimestamp(opts *bind.CallOpts) (*big.Int, error) + + LatestRound(opts *bind.CallOpts) (*big.Int, error) + + LatestRoundData(opts *bind.CallOpts) (LatestRoundData, + + error) + + LatestTimestamp(opts *bind.CallOpts) (*big.Int, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + Version(opts *bind.CallOpts) (*big.Int, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + OnReport(opts *bind.TransactOpts, metadata []byte, report []byte) (*types.Transaction, error) + + RecoverTokens(opts *bind.TransactOpts, token common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + RemoveDataIdMappingsForProxies(opts *bind.TransactOpts, proxies []common.Address) (*types.Transaction, error) + + RemoveFeedConfigs(opts *bind.TransactOpts, dataIds [][16]byte) (*types.Transaction, error) + + SetBundleFeedConfigs(opts *bind.TransactOpts, dataIds [][16]byte, descriptions []string, decimalsMatrix [][]uint8, workflowMetadata []DataFeedsCacheWorkflowMetadata) (*types.Transaction, error) + + SetDecimalFeedConfigs(opts *bind.TransactOpts, dataIds [][16]byte, descriptions []string, workflowMetadata []DataFeedsCacheWorkflowMetadata) (*types.Transaction, error) + + SetFeedAdmin(opts *bind.TransactOpts, feedAdmin common.Address, isAdmin bool) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdateDataIdMappingsForProxies(opts *bind.TransactOpts, proxies []common.Address, dataIds [][16]byte) (*types.Transaction, error) + + FilterAnswerUpdated(opts *bind.FilterOpts, current []*big.Int, roundId []*big.Int) (*DataFeedsCacheAnswerUpdatedIterator, error) + + WatchAnswerUpdated(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheAnswerUpdated, current []*big.Int, roundId []*big.Int) (event.Subscription, error) + + ParseAnswerUpdated(log types.Log) (*DataFeedsCacheAnswerUpdated, error) + + FilterBundleFeedConfigSet(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheBundleFeedConfigSetIterator, error) + + WatchBundleFeedConfigSet(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheBundleFeedConfigSet, dataId [][16]byte) (event.Subscription, error) + + ParseBundleFeedConfigSet(log types.Log) (*DataFeedsCacheBundleFeedConfigSet, error) + + FilterBundleReportUpdated(opts *bind.FilterOpts, dataId [][16]byte, timestamp []*big.Int) (*DataFeedsCacheBundleReportUpdatedIterator, error) + + WatchBundleReportUpdated(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheBundleReportUpdated, dataId [][16]byte, timestamp []*big.Int) (event.Subscription, error) + + ParseBundleReportUpdated(log types.Log) (*DataFeedsCacheBundleReportUpdated, error) + + FilterDecimalFeedConfigSet(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheDecimalFeedConfigSetIterator, error) + + WatchDecimalFeedConfigSet(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheDecimalFeedConfigSet, dataId [][16]byte) (event.Subscription, error) + + ParseDecimalFeedConfigSet(log types.Log) (*DataFeedsCacheDecimalFeedConfigSet, error) + + FilterDecimalReportUpdated(opts *bind.FilterOpts, dataId [][16]byte, roundId []*big.Int, timestamp []*big.Int) (*DataFeedsCacheDecimalReportUpdatedIterator, error) + + WatchDecimalReportUpdated(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheDecimalReportUpdated, dataId [][16]byte, roundId []*big.Int, timestamp []*big.Int) (event.Subscription, error) + + ParseDecimalReportUpdated(log types.Log) (*DataFeedsCacheDecimalReportUpdated, error) + + FilterFeedAdminSet(opts *bind.FilterOpts, feedAdmin []common.Address, isAdmin []bool) (*DataFeedsCacheFeedAdminSetIterator, error) + + WatchFeedAdminSet(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheFeedAdminSet, feedAdmin []common.Address, isAdmin []bool) (event.Subscription, error) + + ParseFeedAdminSet(log types.Log) (*DataFeedsCacheFeedAdminSet, error) + + FilterFeedConfigRemoved(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheFeedConfigRemovedIterator, error) + + WatchFeedConfigRemoved(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheFeedConfigRemoved, dataId [][16]byte) (event.Subscription, error) + + ParseFeedConfigRemoved(log types.Log) (*DataFeedsCacheFeedConfigRemoved, error) + + FilterInvalidUpdatePermission(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheInvalidUpdatePermissionIterator, error) + + WatchInvalidUpdatePermission(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheInvalidUpdatePermission, dataId [][16]byte) (event.Subscription, error) + + ParseInvalidUpdatePermission(log types.Log) (*DataFeedsCacheInvalidUpdatePermission, error) + + FilterNewRound(opts *bind.FilterOpts, roundId []*big.Int, startedBy []common.Address) (*DataFeedsCacheNewRoundIterator, error) + + WatchNewRound(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheNewRound, roundId []*big.Int, startedBy []common.Address) (event.Subscription, error) + + ParseNewRound(log types.Log) (*DataFeedsCacheNewRound, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*DataFeedsCacheOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*DataFeedsCacheOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*DataFeedsCacheOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*DataFeedsCacheOwnershipTransferred, error) + + FilterProxyDataIdRemoved(opts *bind.FilterOpts, proxy []common.Address, dataId [][16]byte) (*DataFeedsCacheProxyDataIdRemovedIterator, error) + + WatchProxyDataIdRemoved(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheProxyDataIdRemoved, proxy []common.Address, dataId [][16]byte) (event.Subscription, error) + + ParseProxyDataIdRemoved(log types.Log) (*DataFeedsCacheProxyDataIdRemoved, error) + + FilterProxyDataIdUpdated(opts *bind.FilterOpts, proxy []common.Address, dataId [][16]byte) (*DataFeedsCacheProxyDataIdUpdatedIterator, error) + + WatchProxyDataIdUpdated(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheProxyDataIdUpdated, proxy []common.Address, dataId [][16]byte) (event.Subscription, error) + + ParseProxyDataIdUpdated(log types.Log) (*DataFeedsCacheProxyDataIdUpdated, error) + + FilterStaleBundleReport(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheStaleBundleReportIterator, error) + + WatchStaleBundleReport(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheStaleBundleReport, dataId [][16]byte) (event.Subscription, error) + + ParseStaleBundleReport(log types.Log) (*DataFeedsCacheStaleBundleReport, error) + + FilterStaleDecimalReport(opts *bind.FilterOpts, dataId [][16]byte) (*DataFeedsCacheStaleDecimalReportIterator, error) + + WatchStaleDecimalReport(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheStaleDecimalReport, dataId [][16]byte) (event.Subscription, error) + + ParseStaleDecimalReport(log types.Log) (*DataFeedsCacheStaleDecimalReport, error) + + FilterTokenRecovered(opts *bind.FilterOpts, token []common.Address, to []common.Address) (*DataFeedsCacheTokenRecoveredIterator, error) + + WatchTokenRecovered(opts *bind.WatchOpts, sink chan<- *DataFeedsCacheTokenRecovered, token []common.Address, to []common.Address) (event.Subscription, error) + + ParseTokenRecovered(log types.Log) (*DataFeedsCacheTokenRecovered, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/data-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/data-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt new file mode 100644 index 00000000000..018373c5931 --- /dev/null +++ b/core/gethwrappers/data-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -0,0 +1,3 @@ +GETH_VERSION: 1.14.11 +bundle_aggregator_proxy: ../../../contracts/solc/data-feeds/BundleAggregatorProxy/BundleAggregatorProxy.sol/BundleAggregatorProxy.abi.json ../../../contracts/solc/data-feeds/BundleAggregatorProxy/BundleAggregatorProxy.sol/BundleAggregatorProxy.bin b28fb697d1d846523f4552143dc7fb162054d3d387d110c02500203b7cd08b7c +data_feeds_cache: ../../../contracts/solc/data-feeds/DataFeedsCache/DataFeedsCache.sol/DataFeedsCache.abi.json ../../../contracts/solc/data-feeds/DataFeedsCache/DataFeedsCache.sol/DataFeedsCache.bin dc334adf5274f87e5c05e5e6e794b22b1e313d6e8fda18e33699ab07e993cc27 diff --git a/core/gethwrappers/data-feeds/go_generate.go b/core/gethwrappers/data-feeds/go_generate.go new file mode 100644 index 00000000000..3a2dc95bc1a --- /dev/null +++ b/core/gethwrappers/data-feeds/go_generate.go @@ -0,0 +1,8 @@ +// Package gethwrappers provides tools for wrapping solidity contracts with +// golang packages, using abigen. +package gethwrappers + +// Chainlink Data Feeds + +//go:generate go run ../generation/wrap.go data-feeds BundleAggregatorProxy bundle_aggregator_proxy +//go:generate go run ../generation/wrap.go data-feeds DataFeedsCache data_feeds_cache From 1423e2581e8640d9e5cd06f745c6067bb2893af2 Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Mon, 10 Feb 2025 08:54:48 -0600 Subject: [PATCH 03/83] core: remove cosm wasm from Dockerfile (#16292) --- core/chainlink.Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/chainlink.Dockerfile b/core/chainlink.Dockerfile index bf88eae7dc5..171da2662a4 100644 --- a/core/chainlink.Dockerfile +++ b/core/chainlink.Dockerfile @@ -62,10 +62,6 @@ COPY --from=buildgo /go/bin/chainlink /usr/local/bin/ COPY --from=buildplugins /go/bin/chainlink-feeds /usr/local/bin/ COPY --from=buildplugins /go/bin/chainlink-solana /usr/local/bin/ -# Dependency of CosmWasm/wasmd -COPY --from=buildgo /go/pkg/mod/github.com/\!cosm\!wasm/wasmvm@v*/internal/api/libwasmvm.*.so /usr/lib/ -RUN chmod 755 /usr/lib/libwasmvm.*.so - # CCIP specific COPY ./cci[p]/confi[g] /ccip-config ARG CL_CHAIN_DEFAULTS From 2972bd06ee745bf7b4bfc61759438e5d88aa64ca Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Mon, 10 Feb 2025 09:33:29 -0600 Subject: [PATCH 04/83] tools/bin: fix broken cosm wasm cp (#16294) --- tools/bin/goreleaser_utils | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tools/bin/goreleaser_utils b/tools/bin/goreleaser_utils index e837222de7b..d924fb70a8c 100755 --- a/tools/bin/goreleaser_utils +++ b/tools/bin/goreleaser_utils @@ -6,12 +6,11 @@ set -xe before_hook() { local -r lib_path=$PWD/tmp - mkdir -p "$lib_path/libs" - # Copy over all platform versions of the wasmvm library - cp -f "$(go list -json -m github.com/CosmWasm/wasmvm | jq -r '.Dir')"/internal/api/libwasmvm.* "$lib_path/libs" - install_local_plugins install_remote_plugins + mkdir -p "$lib_path/libs" + # Copy over all platform versions of the wasmvm library + cp -f "$(go env GOMODCACHE)"/github.com/\!cosm\!wasm/wasmvm@v*/internal/api/libwasmvm.* "$lib_path/libs" mkdir -p "$lib_path/plugins" build_standard_capabilities From 59488fea8e34c9a9e8fd6e9cfd8206f0fe6d1414 Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Mon, 10 Feb 2025 10:17:39 -0600 Subject: [PATCH 05/83] bump framework/chains; use package heads (#16162) --- .mockery.yaml | 8 +- common/headtracker/mocks/broadcaster.go | 361 +++++++++++++++ common/headtracker/mocks/head_broadcaster.go | 361 --------------- common/headtracker/mocks/head_trackable.go | 72 --- common/headtracker/mocks/head_tracker.go | 427 ------------------ common/headtracker/mocks/trackable.go | 72 +++ common/headtracker/mocks/tracker.go | 427 ++++++++++++++++++ .../evm/headtracker/head_broadcaster.go | 6 +- .../evm/headtracker/head_broadcaster_test.go | 6 +- .../evm/headtracker/head_listener_test.go | 8 +- core/chains/evm/headtracker/head_saver.go | 12 +- core/chains/evm/headtracker/head_tracker.go | 10 +- .../evm/headtracker/head_tracker_test.go | 27 +- core/chains/evm/headtracker/heads.go | 16 +- core/chains/evm/headtracker/types/types.go | 15 +- core/chains/evm/log/broadcaster.go | 4 +- .../evm/logpoller/log_poller_internal_test.go | 16 +- core/chains/evm/logpoller/log_poller_test.go | 2 +- core/chains/legacyevm/mocks/chain.go | 26 +- core/scripts/go.mod | 4 +- core/scripts/go.sum | 8 +- core/services/ocr/contract_tracker_test.go | 12 +- .../evmregistry/v20/registry_test.go | 2 +- .../evmregistry/v21/block_subscriber_test.go | 2 +- .../relay/evm/chain_components_test.go | 2 +- .../relay/evm/mercury/v1/data_source_test.go | 14 +- .../relay/evm/request_round_tracker_test.go | 4 +- core/services/relay/evm/write_target_test.go | 2 +- deployment/go.mod | 4 +- deployment/go.sum | 8 +- go.mod | 4 +- go.sum | 8 +- integration-tests/go.mod | 4 +- integration-tests/go.sum | 8 +- integration-tests/load/go.mod | 4 +- integration-tests/load/go.sum | 8 +- 36 files changed, 984 insertions(+), 990 deletions(-) create mode 100644 common/headtracker/mocks/broadcaster.go delete mode 100644 common/headtracker/mocks/head_broadcaster.go delete mode 100644 common/headtracker/mocks/head_trackable.go delete mode 100644 common/headtracker/mocks/head_tracker.go create mode 100644 common/headtracker/mocks/trackable.go create mode 100644 common/headtracker/mocks/tracker.go diff --git a/.mockery.yaml b/.mockery.yaml index f28fc98f760..924ace73b0d 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -3,14 +3,14 @@ mockname: "{{ .InterfaceName }}" outpkg: mocks filename: "{{ .InterfaceName | snakecase }}.go" packages: - github.com/smartcontractkit/chainlink-framework/chains/headtracker: + github.com/smartcontractkit/chainlink-framework/chains/heads: config: dir: common/headtracker/mocks outpkg: mocks interfaces: - HeadTrackable: - HeadTracker: - HeadBroadcaster: + Trackable: + Tracker: + Broadcaster: github.com/smartcontractkit/chainlink-framework/chains/txmgr: config: dir: common/txmgr/mocks diff --git a/common/headtracker/mocks/broadcaster.go b/common/headtracker/mocks/broadcaster.go new file mode 100644 index 00000000000..d4c59a709dc --- /dev/null +++ b/common/headtracker/mocks/broadcaster.go @@ -0,0 +1,361 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package mocks + +import ( + context "context" + + chains "github.com/smartcontractkit/chainlink-framework/chains" + + heads "github.com/smartcontractkit/chainlink-framework/chains/heads" + + mock "github.com/stretchr/testify/mock" +) + +// Broadcaster is an autogenerated mock type for the Broadcaster type +type Broadcaster[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + mock.Mock +} + +type Broadcaster_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + mock *mock.Mock +} + +func (_m *Broadcaster[H, BLOCK_HASH]) EXPECT() *Broadcaster_Expecter[H, BLOCK_HASH] { + return &Broadcaster_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} +} + +// BroadcastNewLongestChain provides a mock function with given fields: _a0 +func (_m *Broadcaster[H, BLOCK_HASH]) BroadcastNewLongestChain(_a0 H) { + _m.Called(_a0) +} + +// Broadcaster_BroadcastNewLongestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastNewLongestChain' +type Broadcaster_BroadcastNewLongestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// BroadcastNewLongestChain is a helper method to define mock.On call +// - _a0 H +func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) BroadcastNewLongestChain(_a0 interface{}) *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { + return &Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("BroadcastNewLongestChain", _a0)} +} + +func (_c *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) Run(run func(_a0 H)) *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(H)) + }) + return _c +} + +func (_c *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) Return() *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { + _c.Call.Return() + return _c +} + +func (_c *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func(H)) *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { + _c.Run(run) + return _c +} + +// Close provides a mock function with no fields +func (_m *Broadcaster[H, BLOCK_HASH]) Close() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Close") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Broadcaster_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' +type Broadcaster_Close_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Close is a helper method to define mock.On call +func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Close() *Broadcaster_Close_Call[H, BLOCK_HASH] { + return &Broadcaster_Close_Call[H, BLOCK_HASH]{Call: _e.mock.On("Close")} +} + +func (_c *Broadcaster_Close_Call[H, BLOCK_HASH]) Run(run func()) *Broadcaster_Close_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Broadcaster_Close_Call[H, BLOCK_HASH]) Return(_a0 error) *Broadcaster_Close_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Broadcaster_Close_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *Broadcaster_Close_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// HealthReport provides a mock function with no fields +func (_m *Broadcaster[H, BLOCK_HASH]) HealthReport() map[string]error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for HealthReport") + } + + var r0 map[string]error + if rf, ok := ret.Get(0).(func() map[string]error); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]error) + } + } + + return r0 +} + +// Broadcaster_HealthReport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HealthReport' +type Broadcaster_HealthReport_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// HealthReport is a helper method to define mock.On call +func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) HealthReport() *Broadcaster_HealthReport_Call[H, BLOCK_HASH] { + return &Broadcaster_HealthReport_Call[H, BLOCK_HASH]{Call: _e.mock.On("HealthReport")} +} + +func (_c *Broadcaster_HealthReport_Call[H, BLOCK_HASH]) Run(run func()) *Broadcaster_HealthReport_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Broadcaster_HealthReport_Call[H, BLOCK_HASH]) Return(_a0 map[string]error) *Broadcaster_HealthReport_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Broadcaster_HealthReport_Call[H, BLOCK_HASH]) RunAndReturn(run func() map[string]error) *Broadcaster_HealthReport_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// Name provides a mock function with no fields +func (_m *Broadcaster[H, BLOCK_HASH]) Name() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Name") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Broadcaster_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name' +type Broadcaster_Name_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Name is a helper method to define mock.On call +func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Name() *Broadcaster_Name_Call[H, BLOCK_HASH] { + return &Broadcaster_Name_Call[H, BLOCK_HASH]{Call: _e.mock.On("Name")} +} + +func (_c *Broadcaster_Name_Call[H, BLOCK_HASH]) Run(run func()) *Broadcaster_Name_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Broadcaster_Name_Call[H, BLOCK_HASH]) Return(_a0 string) *Broadcaster_Name_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Broadcaster_Name_Call[H, BLOCK_HASH]) RunAndReturn(run func() string) *Broadcaster_Name_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// Ready provides a mock function with no fields +func (_m *Broadcaster[H, BLOCK_HASH]) Ready() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Ready") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Broadcaster_Ready_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ready' +type Broadcaster_Ready_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Ready is a helper method to define mock.On call +func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Ready() *Broadcaster_Ready_Call[H, BLOCK_HASH] { + return &Broadcaster_Ready_Call[H, BLOCK_HASH]{Call: _e.mock.On("Ready")} +} + +func (_c *Broadcaster_Ready_Call[H, BLOCK_HASH]) Run(run func()) *Broadcaster_Ready_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Broadcaster_Ready_Call[H, BLOCK_HASH]) Return(_a0 error) *Broadcaster_Ready_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Broadcaster_Ready_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *Broadcaster_Ready_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// Start provides a mock function with given fields: _a0 +func (_m *Broadcaster[H, BLOCK_HASH]) Start(_a0 context.Context) error { + ret := _m.Called(_a0) + + if len(ret) == 0 { + panic("no return value specified for Start") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Broadcaster_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type Broadcaster_Start_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Start is a helper method to define mock.On call +// - _a0 context.Context +func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Start(_a0 interface{}) *Broadcaster_Start_Call[H, BLOCK_HASH] { + return &Broadcaster_Start_Call[H, BLOCK_HASH]{Call: _e.mock.On("Start", _a0)} +} + +func (_c *Broadcaster_Start_Call[H, BLOCK_HASH]) Run(run func(_a0 context.Context)) *Broadcaster_Start_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *Broadcaster_Start_Call[H, BLOCK_HASH]) Return(_a0 error) *Broadcaster_Start_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Broadcaster_Start_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) error) *Broadcaster_Start_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// Subscribe provides a mock function with given fields: callback +func (_m *Broadcaster[H, BLOCK_HASH]) Subscribe(callback heads.Trackable[H, BLOCK_HASH]) (H, func()) { + ret := _m.Called(callback) + + if len(ret) == 0 { + panic("no return value specified for Subscribe") + } + + var r0 H + var r1 func() + if rf, ok := ret.Get(0).(func(heads.Trackable[H, BLOCK_HASH]) (H, func())); ok { + return rf(callback) + } + if rf, ok := ret.Get(0).(func(heads.Trackable[H, BLOCK_HASH]) H); ok { + r0 = rf(callback) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(H) + } + } + + if rf, ok := ret.Get(1).(func(heads.Trackable[H, BLOCK_HASH]) func()); ok { + r1 = rf(callback) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(func()) + } + } + + return r0, r1 +} + +// Broadcaster_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' +type Broadcaster_Subscribe_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Subscribe is a helper method to define mock.On call +// - callback heads.Trackable[H,BLOCK_HASH] +func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Subscribe(callback interface{}) *Broadcaster_Subscribe_Call[H, BLOCK_HASH] { + return &Broadcaster_Subscribe_Call[H, BLOCK_HASH]{Call: _e.mock.On("Subscribe", callback)} +} + +func (_c *Broadcaster_Subscribe_Call[H, BLOCK_HASH]) Run(run func(callback heads.Trackable[H, BLOCK_HASH])) *Broadcaster_Subscribe_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(heads.Trackable[H, BLOCK_HASH])) + }) + return _c +} + +func (_c *Broadcaster_Subscribe_Call[H, BLOCK_HASH]) Return(currentLongestChain H, unsubscribe func()) *Broadcaster_Subscribe_Call[H, BLOCK_HASH] { + _c.Call.Return(currentLongestChain, unsubscribe) + return _c +} + +func (_c *Broadcaster_Subscribe_Call[H, BLOCK_HASH]) RunAndReturn(run func(heads.Trackable[H, BLOCK_HASH]) (H, func())) *Broadcaster_Subscribe_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// NewBroadcaster creates a new instance of Broadcaster. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewBroadcaster[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { + mock.TestingT + Cleanup(func()) +}) *Broadcaster[H, BLOCK_HASH] { + mock := &Broadcaster[H, BLOCK_HASH]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/common/headtracker/mocks/head_broadcaster.go b/common/headtracker/mocks/head_broadcaster.go deleted file mode 100644 index 6036166f4a9..00000000000 --- a/common/headtracker/mocks/head_broadcaster.go +++ /dev/null @@ -1,361 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - chains "github.com/smartcontractkit/chainlink-framework/chains" - - headtracker "github.com/smartcontractkit/chainlink-framework/chains/headtracker" - - mock "github.com/stretchr/testify/mock" -) - -// HeadBroadcaster is an autogenerated mock type for the HeadBroadcaster type -type HeadBroadcaster[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock.Mock -} - -type HeadBroadcaster_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock *mock.Mock -} - -func (_m *HeadBroadcaster[H, BLOCK_HASH]) EXPECT() *HeadBroadcaster_Expecter[H, BLOCK_HASH] { - return &HeadBroadcaster_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} -} - -// BroadcastNewLongestChain provides a mock function with given fields: _a0 -func (_m *HeadBroadcaster[H, BLOCK_HASH]) BroadcastNewLongestChain(_a0 H) { - _m.Called(_a0) -} - -// HeadBroadcaster_BroadcastNewLongestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastNewLongestChain' -type HeadBroadcaster_BroadcastNewLongestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// BroadcastNewLongestChain is a helper method to define mock.On call -// - _a0 H -func (_e *HeadBroadcaster_Expecter[H, BLOCK_HASH]) BroadcastNewLongestChain(_a0 interface{}) *HeadBroadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { - return &HeadBroadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("BroadcastNewLongestChain", _a0)} -} - -func (_c *HeadBroadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) Run(run func(_a0 H)) *HeadBroadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(H)) - }) - return _c -} - -func (_c *HeadBroadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) Return() *HeadBroadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { - _c.Call.Return() - return _c -} - -func (_c *HeadBroadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func(H)) *HeadBroadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { - _c.Run(run) - return _c -} - -// Close provides a mock function with no fields -func (_m *HeadBroadcaster[H, BLOCK_HASH]) Close() error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Close") - } - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// HeadBroadcaster_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' -type HeadBroadcaster_Close_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Close is a helper method to define mock.On call -func (_e *HeadBroadcaster_Expecter[H, BLOCK_HASH]) Close() *HeadBroadcaster_Close_Call[H, BLOCK_HASH] { - return &HeadBroadcaster_Close_Call[H, BLOCK_HASH]{Call: _e.mock.On("Close")} -} - -func (_c *HeadBroadcaster_Close_Call[H, BLOCK_HASH]) Run(run func()) *HeadBroadcaster_Close_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadBroadcaster_Close_Call[H, BLOCK_HASH]) Return(_a0 error) *HeadBroadcaster_Close_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadBroadcaster_Close_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *HeadBroadcaster_Close_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// HealthReport provides a mock function with no fields -func (_m *HeadBroadcaster[H, BLOCK_HASH]) HealthReport() map[string]error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for HealthReport") - } - - var r0 map[string]error - if rf, ok := ret.Get(0).(func() map[string]error); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[string]error) - } - } - - return r0 -} - -// HeadBroadcaster_HealthReport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HealthReport' -type HeadBroadcaster_HealthReport_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// HealthReport is a helper method to define mock.On call -func (_e *HeadBroadcaster_Expecter[H, BLOCK_HASH]) HealthReport() *HeadBroadcaster_HealthReport_Call[H, BLOCK_HASH] { - return &HeadBroadcaster_HealthReport_Call[H, BLOCK_HASH]{Call: _e.mock.On("HealthReport")} -} - -func (_c *HeadBroadcaster_HealthReport_Call[H, BLOCK_HASH]) Run(run func()) *HeadBroadcaster_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadBroadcaster_HealthReport_Call[H, BLOCK_HASH]) Return(_a0 map[string]error) *HeadBroadcaster_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadBroadcaster_HealthReport_Call[H, BLOCK_HASH]) RunAndReturn(run func() map[string]error) *HeadBroadcaster_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Name provides a mock function with no fields -func (_m *HeadBroadcaster[H, BLOCK_HASH]) Name() string { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Name") - } - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// HeadBroadcaster_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name' -type HeadBroadcaster_Name_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Name is a helper method to define mock.On call -func (_e *HeadBroadcaster_Expecter[H, BLOCK_HASH]) Name() *HeadBroadcaster_Name_Call[H, BLOCK_HASH] { - return &HeadBroadcaster_Name_Call[H, BLOCK_HASH]{Call: _e.mock.On("Name")} -} - -func (_c *HeadBroadcaster_Name_Call[H, BLOCK_HASH]) Run(run func()) *HeadBroadcaster_Name_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadBroadcaster_Name_Call[H, BLOCK_HASH]) Return(_a0 string) *HeadBroadcaster_Name_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadBroadcaster_Name_Call[H, BLOCK_HASH]) RunAndReturn(run func() string) *HeadBroadcaster_Name_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Ready provides a mock function with no fields -func (_m *HeadBroadcaster[H, BLOCK_HASH]) Ready() error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Ready") - } - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// HeadBroadcaster_Ready_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ready' -type HeadBroadcaster_Ready_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Ready is a helper method to define mock.On call -func (_e *HeadBroadcaster_Expecter[H, BLOCK_HASH]) Ready() *HeadBroadcaster_Ready_Call[H, BLOCK_HASH] { - return &HeadBroadcaster_Ready_Call[H, BLOCK_HASH]{Call: _e.mock.On("Ready")} -} - -func (_c *HeadBroadcaster_Ready_Call[H, BLOCK_HASH]) Run(run func()) *HeadBroadcaster_Ready_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadBroadcaster_Ready_Call[H, BLOCK_HASH]) Return(_a0 error) *HeadBroadcaster_Ready_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadBroadcaster_Ready_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *HeadBroadcaster_Ready_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Start provides a mock function with given fields: _a0 -func (_m *HeadBroadcaster[H, BLOCK_HASH]) Start(_a0 context.Context) error { - ret := _m.Called(_a0) - - if len(ret) == 0 { - panic("no return value specified for Start") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context) error); ok { - r0 = rf(_a0) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// HeadBroadcaster_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' -type HeadBroadcaster_Start_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Start is a helper method to define mock.On call -// - _a0 context.Context -func (_e *HeadBroadcaster_Expecter[H, BLOCK_HASH]) Start(_a0 interface{}) *HeadBroadcaster_Start_Call[H, BLOCK_HASH] { - return &HeadBroadcaster_Start_Call[H, BLOCK_HASH]{Call: _e.mock.On("Start", _a0)} -} - -func (_c *HeadBroadcaster_Start_Call[H, BLOCK_HASH]) Run(run func(_a0 context.Context)) *HeadBroadcaster_Start_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *HeadBroadcaster_Start_Call[H, BLOCK_HASH]) Return(_a0 error) *HeadBroadcaster_Start_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadBroadcaster_Start_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) error) *HeadBroadcaster_Start_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Subscribe provides a mock function with given fields: callback -func (_m *HeadBroadcaster[H, BLOCK_HASH]) Subscribe(callback headtracker.HeadTrackable[H, BLOCK_HASH]) (H, func()) { - ret := _m.Called(callback) - - if len(ret) == 0 { - panic("no return value specified for Subscribe") - } - - var r0 H - var r1 func() - if rf, ok := ret.Get(0).(func(headtracker.HeadTrackable[H, BLOCK_HASH]) (H, func())); ok { - return rf(callback) - } - if rf, ok := ret.Get(0).(func(headtracker.HeadTrackable[H, BLOCK_HASH]) H); ok { - r0 = rf(callback) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(H) - } - } - - if rf, ok := ret.Get(1).(func(headtracker.HeadTrackable[H, BLOCK_HASH]) func()); ok { - r1 = rf(callback) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(func()) - } - } - - return r0, r1 -} - -// HeadBroadcaster_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' -type HeadBroadcaster_Subscribe_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Subscribe is a helper method to define mock.On call -// - callback headtracker.HeadTrackable[H,BLOCK_HASH] -func (_e *HeadBroadcaster_Expecter[H, BLOCK_HASH]) Subscribe(callback interface{}) *HeadBroadcaster_Subscribe_Call[H, BLOCK_HASH] { - return &HeadBroadcaster_Subscribe_Call[H, BLOCK_HASH]{Call: _e.mock.On("Subscribe", callback)} -} - -func (_c *HeadBroadcaster_Subscribe_Call[H, BLOCK_HASH]) Run(run func(callback headtracker.HeadTrackable[H, BLOCK_HASH])) *HeadBroadcaster_Subscribe_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(headtracker.HeadTrackable[H, BLOCK_HASH])) - }) - return _c -} - -func (_c *HeadBroadcaster_Subscribe_Call[H, BLOCK_HASH]) Return(currentLongestChain H, unsubscribe func()) *HeadBroadcaster_Subscribe_Call[H, BLOCK_HASH] { - _c.Call.Return(currentLongestChain, unsubscribe) - return _c -} - -func (_c *HeadBroadcaster_Subscribe_Call[H, BLOCK_HASH]) RunAndReturn(run func(headtracker.HeadTrackable[H, BLOCK_HASH]) (H, func())) *HeadBroadcaster_Subscribe_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// NewHeadBroadcaster creates a new instance of HeadBroadcaster. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewHeadBroadcaster[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { - mock.TestingT - Cleanup(func()) -}) *HeadBroadcaster[H, BLOCK_HASH] { - mock := &HeadBroadcaster[H, BLOCK_HASH]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/common/headtracker/mocks/head_trackable.go b/common/headtracker/mocks/head_trackable.go deleted file mode 100644 index 959445dd87a..00000000000 --- a/common/headtracker/mocks/head_trackable.go +++ /dev/null @@ -1,72 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - chains "github.com/smartcontractkit/chainlink-framework/chains" - - mock "github.com/stretchr/testify/mock" -) - -// HeadTrackable is an autogenerated mock type for the HeadTrackable type -type HeadTrackable[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock.Mock -} - -type HeadTrackable_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock *mock.Mock -} - -func (_m *HeadTrackable[H, BLOCK_HASH]) EXPECT() *HeadTrackable_Expecter[H, BLOCK_HASH] { - return &HeadTrackable_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} -} - -// OnNewLongestChain provides a mock function with given fields: ctx, head -func (_m *HeadTrackable[H, BLOCK_HASH]) OnNewLongestChain(ctx context.Context, head H) { - _m.Called(ctx, head) -} - -// HeadTrackable_OnNewLongestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'OnNewLongestChain' -type HeadTrackable_OnNewLongestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// OnNewLongestChain is a helper method to define mock.On call -// - ctx context.Context -// - head H -func (_e *HeadTrackable_Expecter[H, BLOCK_HASH]) OnNewLongestChain(ctx interface{}, head interface{}) *HeadTrackable_OnNewLongestChain_Call[H, BLOCK_HASH] { - return &HeadTrackable_OnNewLongestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("OnNewLongestChain", ctx, head)} -} - -func (_c *HeadTrackable_OnNewLongestChain_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context, head H)) *HeadTrackable_OnNewLongestChain_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(H)) - }) - return _c -} - -func (_c *HeadTrackable_OnNewLongestChain_Call[H, BLOCK_HASH]) Return() *HeadTrackable_OnNewLongestChain_Call[H, BLOCK_HASH] { - _c.Call.Return() - return _c -} - -func (_c *HeadTrackable_OnNewLongestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context, H)) *HeadTrackable_OnNewLongestChain_Call[H, BLOCK_HASH] { - _c.Run(run) - return _c -} - -// NewHeadTrackable creates a new instance of HeadTrackable. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewHeadTrackable[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { - mock.TestingT - Cleanup(func()) -}) *HeadTrackable[H, BLOCK_HASH] { - mock := &HeadTrackable[H, BLOCK_HASH]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/common/headtracker/mocks/head_tracker.go b/common/headtracker/mocks/head_tracker.go deleted file mode 100644 index b9e49b0a018..00000000000 --- a/common/headtracker/mocks/head_tracker.go +++ /dev/null @@ -1,427 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - chains "github.com/smartcontractkit/chainlink-framework/chains" - - mock "github.com/stretchr/testify/mock" -) - -// HeadTracker is an autogenerated mock type for the HeadTracker type -type HeadTracker[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock.Mock -} - -type HeadTracker_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock *mock.Mock -} - -func (_m *HeadTracker[H, BLOCK_HASH]) EXPECT() *HeadTracker_Expecter[H, BLOCK_HASH] { - return &HeadTracker_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} -} - -// Backfill provides a mock function with given fields: ctx, headWithChain -func (_m *HeadTracker[H, BLOCK_HASH]) Backfill(ctx context.Context, headWithChain H) error { - ret := _m.Called(ctx, headWithChain) - - if len(ret) == 0 { - panic("no return value specified for Backfill") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, H) error); ok { - r0 = rf(ctx, headWithChain) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// HeadTracker_Backfill_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Backfill' -type HeadTracker_Backfill_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Backfill is a helper method to define mock.On call -// - ctx context.Context -// - headWithChain H -func (_e *HeadTracker_Expecter[H, BLOCK_HASH]) Backfill(ctx interface{}, headWithChain interface{}) *HeadTracker_Backfill_Call[H, BLOCK_HASH] { - return &HeadTracker_Backfill_Call[H, BLOCK_HASH]{Call: _e.mock.On("Backfill", ctx, headWithChain)} -} - -func (_c *HeadTracker_Backfill_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context, headWithChain H)) *HeadTracker_Backfill_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(H)) - }) - return _c -} - -func (_c *HeadTracker_Backfill_Call[H, BLOCK_HASH]) Return(err error) *HeadTracker_Backfill_Call[H, BLOCK_HASH] { - _c.Call.Return(err) - return _c -} - -func (_c *HeadTracker_Backfill_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context, H) error) *HeadTracker_Backfill_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Close provides a mock function with no fields -func (_m *HeadTracker[H, BLOCK_HASH]) Close() error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Close") - } - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// HeadTracker_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' -type HeadTracker_Close_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Close is a helper method to define mock.On call -func (_e *HeadTracker_Expecter[H, BLOCK_HASH]) Close() *HeadTracker_Close_Call[H, BLOCK_HASH] { - return &HeadTracker_Close_Call[H, BLOCK_HASH]{Call: _e.mock.On("Close")} -} - -func (_c *HeadTracker_Close_Call[H, BLOCK_HASH]) Run(run func()) *HeadTracker_Close_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadTracker_Close_Call[H, BLOCK_HASH]) Return(_a0 error) *HeadTracker_Close_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadTracker_Close_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *HeadTracker_Close_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// HealthReport provides a mock function with no fields -func (_m *HeadTracker[H, BLOCK_HASH]) HealthReport() map[string]error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for HealthReport") - } - - var r0 map[string]error - if rf, ok := ret.Get(0).(func() map[string]error); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[string]error) - } - } - - return r0 -} - -// HeadTracker_HealthReport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HealthReport' -type HeadTracker_HealthReport_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// HealthReport is a helper method to define mock.On call -func (_e *HeadTracker_Expecter[H, BLOCK_HASH]) HealthReport() *HeadTracker_HealthReport_Call[H, BLOCK_HASH] { - return &HeadTracker_HealthReport_Call[H, BLOCK_HASH]{Call: _e.mock.On("HealthReport")} -} - -func (_c *HeadTracker_HealthReport_Call[H, BLOCK_HASH]) Run(run func()) *HeadTracker_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadTracker_HealthReport_Call[H, BLOCK_HASH]) Return(_a0 map[string]error) *HeadTracker_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadTracker_HealthReport_Call[H, BLOCK_HASH]) RunAndReturn(run func() map[string]error) *HeadTracker_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// LatestAndFinalizedBlock provides a mock function with given fields: ctx -func (_m *HeadTracker[H, BLOCK_HASH]) LatestAndFinalizedBlock(ctx context.Context) (H, H, error) { - ret := _m.Called(ctx) - - if len(ret) == 0 { - panic("no return value specified for LatestAndFinalizedBlock") - } - - var r0 H - var r1 H - var r2 error - if rf, ok := ret.Get(0).(func(context.Context) (H, H, error)); ok { - return rf(ctx) - } - if rf, ok := ret.Get(0).(func(context.Context) H); ok { - r0 = rf(ctx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(H) - } - } - - if rf, ok := ret.Get(1).(func(context.Context) H); ok { - r1 = rf(ctx) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(H) - } - } - - if rf, ok := ret.Get(2).(func(context.Context) error); ok { - r2 = rf(ctx) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// HeadTracker_LatestAndFinalizedBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LatestAndFinalizedBlock' -type HeadTracker_LatestAndFinalizedBlock_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// LatestAndFinalizedBlock is a helper method to define mock.On call -// - ctx context.Context -func (_e *HeadTracker_Expecter[H, BLOCK_HASH]) LatestAndFinalizedBlock(ctx interface{}) *HeadTracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { - return &HeadTracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]{Call: _e.mock.On("LatestAndFinalizedBlock", ctx)} -} - -func (_c *HeadTracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context)) *HeadTracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *HeadTracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) Return(latest H, finalized H, err error) *HeadTracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { - _c.Call.Return(latest, finalized, err) - return _c -} - -func (_c *HeadTracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) (H, H, error)) *HeadTracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// LatestChain provides a mock function with no fields -func (_m *HeadTracker[H, BLOCK_HASH]) LatestChain() H { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for LatestChain") - } - - var r0 H - if rf, ok := ret.Get(0).(func() H); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(H) - } - } - - return r0 -} - -// HeadTracker_LatestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LatestChain' -type HeadTracker_LatestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// LatestChain is a helper method to define mock.On call -func (_e *HeadTracker_Expecter[H, BLOCK_HASH]) LatestChain() *HeadTracker_LatestChain_Call[H, BLOCK_HASH] { - return &HeadTracker_LatestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("LatestChain")} -} - -func (_c *HeadTracker_LatestChain_Call[H, BLOCK_HASH]) Run(run func()) *HeadTracker_LatestChain_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadTracker_LatestChain_Call[H, BLOCK_HASH]) Return(_a0 H) *HeadTracker_LatestChain_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadTracker_LatestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func() H) *HeadTracker_LatestChain_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Name provides a mock function with no fields -func (_m *HeadTracker[H, BLOCK_HASH]) Name() string { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Name") - } - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// HeadTracker_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name' -type HeadTracker_Name_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Name is a helper method to define mock.On call -func (_e *HeadTracker_Expecter[H, BLOCK_HASH]) Name() *HeadTracker_Name_Call[H, BLOCK_HASH] { - return &HeadTracker_Name_Call[H, BLOCK_HASH]{Call: _e.mock.On("Name")} -} - -func (_c *HeadTracker_Name_Call[H, BLOCK_HASH]) Run(run func()) *HeadTracker_Name_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadTracker_Name_Call[H, BLOCK_HASH]) Return(_a0 string) *HeadTracker_Name_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadTracker_Name_Call[H, BLOCK_HASH]) RunAndReturn(run func() string) *HeadTracker_Name_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Ready provides a mock function with no fields -func (_m *HeadTracker[H, BLOCK_HASH]) Ready() error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Ready") - } - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// HeadTracker_Ready_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ready' -type HeadTracker_Ready_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Ready is a helper method to define mock.On call -func (_e *HeadTracker_Expecter[H, BLOCK_HASH]) Ready() *HeadTracker_Ready_Call[H, BLOCK_HASH] { - return &HeadTracker_Ready_Call[H, BLOCK_HASH]{Call: _e.mock.On("Ready")} -} - -func (_c *HeadTracker_Ready_Call[H, BLOCK_HASH]) Run(run func()) *HeadTracker_Ready_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *HeadTracker_Ready_Call[H, BLOCK_HASH]) Return(_a0 error) *HeadTracker_Ready_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadTracker_Ready_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *HeadTracker_Ready_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Start provides a mock function with given fields: _a0 -func (_m *HeadTracker[H, BLOCK_HASH]) Start(_a0 context.Context) error { - ret := _m.Called(_a0) - - if len(ret) == 0 { - panic("no return value specified for Start") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context) error); ok { - r0 = rf(_a0) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// HeadTracker_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' -type HeadTracker_Start_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Start is a helper method to define mock.On call -// - _a0 context.Context -func (_e *HeadTracker_Expecter[H, BLOCK_HASH]) Start(_a0 interface{}) *HeadTracker_Start_Call[H, BLOCK_HASH] { - return &HeadTracker_Start_Call[H, BLOCK_HASH]{Call: _e.mock.On("Start", _a0)} -} - -func (_c *HeadTracker_Start_Call[H, BLOCK_HASH]) Run(run func(_a0 context.Context)) *HeadTracker_Start_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *HeadTracker_Start_Call[H, BLOCK_HASH]) Return(_a0 error) *HeadTracker_Start_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *HeadTracker_Start_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) error) *HeadTracker_Start_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// NewHeadTracker creates a new instance of HeadTracker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewHeadTracker[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { - mock.TestingT - Cleanup(func()) -}) *HeadTracker[H, BLOCK_HASH] { - mock := &HeadTracker[H, BLOCK_HASH]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/common/headtracker/mocks/trackable.go b/common/headtracker/mocks/trackable.go new file mode 100644 index 00000000000..e3d35dc3a8e --- /dev/null +++ b/common/headtracker/mocks/trackable.go @@ -0,0 +1,72 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package mocks + +import ( + context "context" + + chains "github.com/smartcontractkit/chainlink-framework/chains" + + mock "github.com/stretchr/testify/mock" +) + +// Trackable is an autogenerated mock type for the Trackable type +type Trackable[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + mock.Mock +} + +type Trackable_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + mock *mock.Mock +} + +func (_m *Trackable[H, BLOCK_HASH]) EXPECT() *Trackable_Expecter[H, BLOCK_HASH] { + return &Trackable_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} +} + +// OnNewLongestChain provides a mock function with given fields: ctx, head +func (_m *Trackable[H, BLOCK_HASH]) OnNewLongestChain(ctx context.Context, head H) { + _m.Called(ctx, head) +} + +// Trackable_OnNewLongestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'OnNewLongestChain' +type Trackable_OnNewLongestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// OnNewLongestChain is a helper method to define mock.On call +// - ctx context.Context +// - head H +func (_e *Trackable_Expecter[H, BLOCK_HASH]) OnNewLongestChain(ctx interface{}, head interface{}) *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH] { + return &Trackable_OnNewLongestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("OnNewLongestChain", ctx, head)} +} + +func (_c *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context, head H)) *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(H)) + }) + return _c +} + +func (_c *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH]) Return() *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH] { + _c.Call.Return() + return _c +} + +func (_c *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context, H)) *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH] { + _c.Run(run) + return _c +} + +// NewTrackable creates a new instance of Trackable. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTrackable[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { + mock.TestingT + Cleanup(func()) +}) *Trackable[H, BLOCK_HASH] { + mock := &Trackable[H, BLOCK_HASH]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/common/headtracker/mocks/tracker.go b/common/headtracker/mocks/tracker.go new file mode 100644 index 00000000000..a8a9d538168 --- /dev/null +++ b/common/headtracker/mocks/tracker.go @@ -0,0 +1,427 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package mocks + +import ( + context "context" + + chains "github.com/smartcontractkit/chainlink-framework/chains" + + mock "github.com/stretchr/testify/mock" +) + +// Tracker is an autogenerated mock type for the Tracker type +type Tracker[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + mock.Mock +} + +type Tracker_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + mock *mock.Mock +} + +func (_m *Tracker[H, BLOCK_HASH]) EXPECT() *Tracker_Expecter[H, BLOCK_HASH] { + return &Tracker_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} +} + +// Backfill provides a mock function with given fields: ctx, headWithChain +func (_m *Tracker[H, BLOCK_HASH]) Backfill(ctx context.Context, headWithChain H) error { + ret := _m.Called(ctx, headWithChain) + + if len(ret) == 0 { + panic("no return value specified for Backfill") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, H) error); ok { + r0 = rf(ctx, headWithChain) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Tracker_Backfill_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Backfill' +type Tracker_Backfill_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Backfill is a helper method to define mock.On call +// - ctx context.Context +// - headWithChain H +func (_e *Tracker_Expecter[H, BLOCK_HASH]) Backfill(ctx interface{}, headWithChain interface{}) *Tracker_Backfill_Call[H, BLOCK_HASH] { + return &Tracker_Backfill_Call[H, BLOCK_HASH]{Call: _e.mock.On("Backfill", ctx, headWithChain)} +} + +func (_c *Tracker_Backfill_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context, headWithChain H)) *Tracker_Backfill_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context), args[1].(H)) + }) + return _c +} + +func (_c *Tracker_Backfill_Call[H, BLOCK_HASH]) Return(err error) *Tracker_Backfill_Call[H, BLOCK_HASH] { + _c.Call.Return(err) + return _c +} + +func (_c *Tracker_Backfill_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context, H) error) *Tracker_Backfill_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// Close provides a mock function with no fields +func (_m *Tracker[H, BLOCK_HASH]) Close() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Close") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Tracker_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' +type Tracker_Close_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Close is a helper method to define mock.On call +func (_e *Tracker_Expecter[H, BLOCK_HASH]) Close() *Tracker_Close_Call[H, BLOCK_HASH] { + return &Tracker_Close_Call[H, BLOCK_HASH]{Call: _e.mock.On("Close")} +} + +func (_c *Tracker_Close_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_Close_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Tracker_Close_Call[H, BLOCK_HASH]) Return(_a0 error) *Tracker_Close_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Tracker_Close_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *Tracker_Close_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// HealthReport provides a mock function with no fields +func (_m *Tracker[H, BLOCK_HASH]) HealthReport() map[string]error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for HealthReport") + } + + var r0 map[string]error + if rf, ok := ret.Get(0).(func() map[string]error); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]error) + } + } + + return r0 +} + +// Tracker_HealthReport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HealthReport' +type Tracker_HealthReport_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// HealthReport is a helper method to define mock.On call +func (_e *Tracker_Expecter[H, BLOCK_HASH]) HealthReport() *Tracker_HealthReport_Call[H, BLOCK_HASH] { + return &Tracker_HealthReport_Call[H, BLOCK_HASH]{Call: _e.mock.On("HealthReport")} +} + +func (_c *Tracker_HealthReport_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_HealthReport_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Tracker_HealthReport_Call[H, BLOCK_HASH]) Return(_a0 map[string]error) *Tracker_HealthReport_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Tracker_HealthReport_Call[H, BLOCK_HASH]) RunAndReturn(run func() map[string]error) *Tracker_HealthReport_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// LatestAndFinalizedBlock provides a mock function with given fields: ctx +func (_m *Tracker[H, BLOCK_HASH]) LatestAndFinalizedBlock(ctx context.Context) (H, H, error) { + ret := _m.Called(ctx) + + if len(ret) == 0 { + panic("no return value specified for LatestAndFinalizedBlock") + } + + var r0 H + var r1 H + var r2 error + if rf, ok := ret.Get(0).(func(context.Context) (H, H, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) H); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(H) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) H); ok { + r1 = rf(ctx) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(H) + } + } + + if rf, ok := ret.Get(2).(func(context.Context) error); ok { + r2 = rf(ctx) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// Tracker_LatestAndFinalizedBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LatestAndFinalizedBlock' +type Tracker_LatestAndFinalizedBlock_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// LatestAndFinalizedBlock is a helper method to define mock.On call +// - ctx context.Context +func (_e *Tracker_Expecter[H, BLOCK_HASH]) LatestAndFinalizedBlock(ctx interface{}) *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { + return &Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]{Call: _e.mock.On("LatestAndFinalizedBlock", ctx)} +} + +func (_c *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context)) *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) Return(latest H, finalized H, err error) *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { + _c.Call.Return(latest, finalized, err) + return _c +} + +func (_c *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) (H, H, error)) *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// LatestChain provides a mock function with no fields +func (_m *Tracker[H, BLOCK_HASH]) LatestChain() H { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for LatestChain") + } + + var r0 H + if rf, ok := ret.Get(0).(func() H); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(H) + } + } + + return r0 +} + +// Tracker_LatestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LatestChain' +type Tracker_LatestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// LatestChain is a helper method to define mock.On call +func (_e *Tracker_Expecter[H, BLOCK_HASH]) LatestChain() *Tracker_LatestChain_Call[H, BLOCK_HASH] { + return &Tracker_LatestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("LatestChain")} +} + +func (_c *Tracker_LatestChain_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_LatestChain_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Tracker_LatestChain_Call[H, BLOCK_HASH]) Return(_a0 H) *Tracker_LatestChain_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Tracker_LatestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func() H) *Tracker_LatestChain_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// Name provides a mock function with no fields +func (_m *Tracker[H, BLOCK_HASH]) Name() string { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Name") + } + + var r0 string + if rf, ok := ret.Get(0).(func() string); ok { + r0 = rf() + } else { + r0 = ret.Get(0).(string) + } + + return r0 +} + +// Tracker_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name' +type Tracker_Name_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Name is a helper method to define mock.On call +func (_e *Tracker_Expecter[H, BLOCK_HASH]) Name() *Tracker_Name_Call[H, BLOCK_HASH] { + return &Tracker_Name_Call[H, BLOCK_HASH]{Call: _e.mock.On("Name")} +} + +func (_c *Tracker_Name_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_Name_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Tracker_Name_Call[H, BLOCK_HASH]) Return(_a0 string) *Tracker_Name_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Tracker_Name_Call[H, BLOCK_HASH]) RunAndReturn(run func() string) *Tracker_Name_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// Ready provides a mock function with no fields +func (_m *Tracker[H, BLOCK_HASH]) Ready() error { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Ready") + } + + var r0 error + if rf, ok := ret.Get(0).(func() error); ok { + r0 = rf() + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Tracker_Ready_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ready' +type Tracker_Ready_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Ready is a helper method to define mock.On call +func (_e *Tracker_Expecter[H, BLOCK_HASH]) Ready() *Tracker_Ready_Call[H, BLOCK_HASH] { + return &Tracker_Ready_Call[H, BLOCK_HASH]{Call: _e.mock.On("Ready")} +} + +func (_c *Tracker_Ready_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_Ready_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Tracker_Ready_Call[H, BLOCK_HASH]) Return(_a0 error) *Tracker_Ready_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Tracker_Ready_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *Tracker_Ready_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// Start provides a mock function with given fields: _a0 +func (_m *Tracker[H, BLOCK_HASH]) Start(_a0 context.Context) error { + ret := _m.Called(_a0) + + if len(ret) == 0 { + panic("no return value specified for Start") + } + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context) error); ok { + r0 = rf(_a0) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// Tracker_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' +type Tracker_Start_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { + *mock.Call +} + +// Start is a helper method to define mock.On call +// - _a0 context.Context +func (_e *Tracker_Expecter[H, BLOCK_HASH]) Start(_a0 interface{}) *Tracker_Start_Call[H, BLOCK_HASH] { + return &Tracker_Start_Call[H, BLOCK_HASH]{Call: _e.mock.On("Start", _a0)} +} + +func (_c *Tracker_Start_Call[H, BLOCK_HASH]) Run(run func(_a0 context.Context)) *Tracker_Start_Call[H, BLOCK_HASH] { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(context.Context)) + }) + return _c +} + +func (_c *Tracker_Start_Call[H, BLOCK_HASH]) Return(_a0 error) *Tracker_Start_Call[H, BLOCK_HASH] { + _c.Call.Return(_a0) + return _c +} + +func (_c *Tracker_Start_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) error) *Tracker_Start_Call[H, BLOCK_HASH] { + _c.Call.Return(run) + return _c +} + +// NewTracker creates a new instance of Tracker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTracker[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { + mock.TestingT + Cleanup(func()) +}) *Tracker[H, BLOCK_HASH] { + mock := &Tracker[H, BLOCK_HASH]{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/chains/evm/headtracker/head_broadcaster.go b/core/chains/evm/headtracker/head_broadcaster.go index a16b64ce943..9f75275488c 100644 --- a/core/chains/evm/headtracker/head_broadcaster.go +++ b/core/chains/evm/headtracker/head_broadcaster.go @@ -4,14 +4,14 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-framework/chains/headtracker" + "github.com/smartcontractkit/chainlink-framework/chains/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ) -type headBroadcaster = headtracker.HeadBroadcaster[*evmtypes.Head, common.Hash] +type headBroadcaster = heads.Broadcaster[*evmtypes.Head, common.Hash] func NewHeadBroadcaster( lggr logger.Logger, ) headBroadcaster { - return headtracker.NewHeadBroadcaster[*evmtypes.Head, common.Hash](lggr) + return heads.NewBroadcaster[*evmtypes.Head, common.Hash](lggr) } diff --git a/core/chains/evm/headtracker/head_broadcaster_test.go b/core/chains/evm/headtracker/head_broadcaster_test.go index ede5978d6e3..f34636c2649 100644 --- a/core/chains/evm/headtracker/head_broadcaster_test.go +++ b/core/chains/evm/headtracker/head_broadcaster_test.go @@ -16,7 +16,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox/mailboxtest" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - commonhtrk "github.com/smartcontractkit/chainlink-framework/chains/headtracker" + "github.com/smartcontractkit/chainlink-framework/chains/heads" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" @@ -155,8 +155,8 @@ func TestHeadBroadcaster_TrackableCallbackTimeout(t *testing.T) { slowAwaiter := testutils.NewAwaiter() fastAwaiter := testutils.NewAwaiter() - slow := &sleepySubscriber{awaiter: slowAwaiter, delay: commonhtrk.TrackableCallbackTimeout * 2} - fast := &sleepySubscriber{awaiter: fastAwaiter, delay: commonhtrk.TrackableCallbackTimeout / 2} + slow := &sleepySubscriber{awaiter: slowAwaiter, delay: heads.TrackableCallbackTimeout * 2} + fast := &sleepySubscriber{awaiter: fastAwaiter, delay: heads.TrackableCallbackTimeout / 2} _, unsubscribe1 := broadcaster.Subscribe(slow) _, unsubscribe2 := broadcaster.Subscribe(fast) diff --git a/core/chains/evm/headtracker/head_listener_test.go b/core/chains/evm/headtracker/head_listener_test.go index 2f3234572ce..027dc8cbf3f 100644 --- a/core/chains/evm/headtracker/head_listener_test.go +++ b/core/chains/evm/headtracker/head_listener_test.go @@ -15,7 +15,7 @@ import ( commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - "github.com/smartcontractkit/chainlink-framework/chains/headtracker" + "github.com/smartcontractkit/chainlink-framework/chains/heads" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" @@ -59,7 +59,7 @@ func Test_HeadListener_HappyPath(t *testing.T) { }) func() { - hl := headtracker.NewHeadListener(lggr, ethClient, evmcfg.EVM(), nil, func(context.Context, *evmtypes.Head) error { + hl := heads.NewListener(lggr, ethClient, evmcfg.EVM(), nil, func(context.Context, *evmtypes.Head) error { headCount.Add(1) return nil }) @@ -111,7 +111,7 @@ func Test_HeadListener_NotReceivingHeads(t *testing.T) { }) func() { - hl := headtracker.NewHeadListener(lggr, ethClient, evmcfg.EVM(), nil, func(context.Context, *evmtypes.Head) error { + hl := heads.NewListener(lggr, ethClient, evmcfg.EVM(), nil, func(context.Context, *evmtypes.Head) error { firstHeadAwaiter.ItHappened() return nil }) @@ -166,7 +166,7 @@ func Test_HeadListener_SubscriptionErr(t *testing.T) { subscribeAwaiter.ItHappened() }) func() { - hl := headtracker.NewHeadListener(lggr, ethClient, evmcfg.EVM(), nil, func(_ context.Context, header *evmtypes.Head) error { + hl := heads.NewListener(lggr, ethClient, evmcfg.EVM(), nil, func(_ context.Context, header *evmtypes.Head) error { hnhCalled <- header return nil }) diff --git a/core/chains/evm/headtracker/head_saver.go b/core/chains/evm/headtracker/head_saver.go index 543ebbb419e..4927c038a73 100644 --- a/core/chains/evm/headtracker/head_saver.go +++ b/core/chains/evm/headtracker/head_saver.go @@ -7,9 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink-common/pkg/logger" - - "github.com/smartcontractkit/chainlink-framework/chains/headtracker" - commontypes "github.com/smartcontractkit/chainlink-framework/chains/headtracker/types" + "github.com/smartcontractkit/chainlink-framework/chains/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" @@ -17,15 +15,15 @@ import ( type headSaver struct { orm ORM - config commontypes.Config - htConfig commontypes.HeadTrackerConfig + config heads.ChainConfig + htConfig heads.TrackerConfig logger logger.Logger heads Heads } -var _ headtracker.HeadSaver[*evmtypes.Head, common.Hash] = (*headSaver)(nil) +var _ heads.Saver[*evmtypes.Head, common.Hash] = (*headSaver)(nil) -func NewHeadSaver(lggr logger.Logger, orm ORM, config commontypes.Config, htConfig commontypes.HeadTrackerConfig) httypes.HeadSaver { +func NewHeadSaver(lggr logger.Logger, orm ORM, config heads.ChainConfig, htConfig heads.TrackerConfig) httypes.HeadSaver { return &headSaver{ orm: orm, config: config, diff --git a/core/chains/evm/headtracker/head_tracker.go b/core/chains/evm/headtracker/head_tracker.go index 4ec7208f28c..b90f2342ed9 100644 --- a/core/chains/evm/headtracker/head_tracker.go +++ b/core/chains/evm/headtracker/head_tracker.go @@ -8,9 +8,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" - - "github.com/smartcontractkit/chainlink-framework/chains/headtracker" - commontypes "github.com/smartcontractkit/chainlink-framework/chains/headtracker/types" + "github.com/smartcontractkit/chainlink-framework/chains/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" ) @@ -18,13 +16,13 @@ import ( func NewHeadTracker( lggr logger.Logger, ethClient httypes.Client, - config commontypes.Config, - htConfig commontypes.HeadTrackerConfig, + config heads.ChainConfig, + htConfig heads.TrackerConfig, headBroadcaster httypes.HeadBroadcaster, headSaver httypes.HeadSaver, mailMon *mailbox.Monitor, ) httypes.HeadTracker { - return headtracker.NewHeadTracker[*evmtypes.Head, ethereum.Subscription]( + return heads.NewTracker[*evmtypes.Head, ethereum.Subscription]( lggr, ethClient, config, diff --git a/core/chains/evm/headtracker/head_tracker_test.go b/core/chains/evm/headtracker/head_tracker_test.go index 8bc370d7870..d9a36a18595 100644 --- a/core/chains/evm/headtracker/head_tracker_test.go +++ b/core/chains/evm/headtracker/head_tracker_test.go @@ -28,8 +28,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox/mailboxtest" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - commonht "github.com/smartcontractkit/chainlink-framework/chains/headtracker" - commontypes "github.com/smartcontractkit/chainlink-framework/chains/headtracker/types" + "github.com/smartcontractkit/chainlink-framework/chains/heads" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" @@ -549,7 +548,7 @@ func TestHeadTracker_SwitchesToLongestChainWithHeadSamplingEnabled(t *testing.T) ethClient := clienttest.NewClientWithDefaultChainID(t) - checker := htmocks.NewHeadTrackable[*evmtypes.Head, common.Hash](t) + checker := htmocks.NewTrackable[*evmtypes.Head, common.Hash](t) orm := headtracker.NewORM(*config.EVM().ChainID(), db) ht := createHeadTrackerWithChecker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm, checker) @@ -670,7 +669,7 @@ func TestHeadTracker_SwitchesToLongestChainWithHeadSamplingDisabled(t *testing.T ethClient := clienttest.NewClientWithDefaultChainID(t) - checker := htmocks.NewHeadTrackable[*evmtypes.Head, common.Hash](t) + checker := htmocks.NewTrackable[*evmtypes.Head, common.Hash](t) orm := headtracker.NewORM(*testutils.FixtureChainID, db) ht := createHeadTrackerWithChecker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm, checker) @@ -848,7 +847,7 @@ func testHeadTrackerBackfill(t *testing.T, newORM func(t *testing.T) headtracker h15 := testutils.Head(15) h15.ParentHash = h14.Hash - heads := []*evmtypes.Head{ + hs := []*evmtypes.Head{ h9, h11, h12, @@ -919,14 +918,14 @@ func testHeadTrackerBackfill(t *testing.T, newORM func(t *testing.T) headtracker require.EqualError(t, err, "invariant violation: expected head of canonical chain to be ahead of the latestFinalized") }) t.Run("Returns error if finalizedHead is not present in the canonical chain", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: heads, FinalityTagEnabled: true}) + htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h14Orphaned, nil).Once() err := htu.headTracker.Backfill(ctx, h15) - require.ErrorAs(t, err, &commonht.FinalizedMissingError[common.Hash]{}) + require.ErrorAs(t, err, &heads.FinalizedMissingError[common.Hash]{}) }) t.Run("Marks all blocks in chain that are older than finalized", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: heads, FinalityTagEnabled: true}) + htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) assertFinalized := func(expectedFinalized bool, msg string, heads ...*evmtypes.Head) { for _, h := range heads { @@ -943,7 +942,7 @@ func testHeadTrackerBackfill(t *testing.T, newORM func(t *testing.T) headtracker }) t.Run("fetches a missing head", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: heads, FinalityTagEnabled: true}) + htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h9, nil).Once() htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil) @@ -964,7 +963,7 @@ func testHeadTrackerBackfill(t *testing.T, newORM func(t *testing.T) headtracker assert.Equal(t, int64(10), writtenHead.Number) }) t.Run("fetches only heads that are missing", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: heads, FinalityTagEnabled: true}) + htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(&head8, nil).Once() htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). @@ -984,7 +983,7 @@ func testHeadTrackerBackfill(t *testing.T, newORM func(t *testing.T) headtracker }) t.Run("abandons backfill and returns error if the eth node returns not found", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: heads, FinalityTagEnabled: true}) + htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(&head8, nil).Once() htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil). @@ -1005,7 +1004,7 @@ func testHeadTrackerBackfill(t *testing.T, newORM func(t *testing.T) headtracker }) t.Run("abandons backfill and returns error if the context time budget is exceeded", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: heads, FinalityTagEnabled: true}) + htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(&head8, nil).Once() htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). Return(&head10, nil) @@ -1261,7 +1260,7 @@ func TestHeadTracker_LatestAndFinalizedBlock(t *testing.T) { }) } -func createHeadTracker(t testing.TB, ethClient *clienttest.Client, config commontypes.Config, htConfig commontypes.HeadTrackerConfig, orm headtracker.ORM) *headTrackerUniverse { +func createHeadTracker(t testing.TB, ethClient *clienttest.Client, config heads.ChainConfig, htConfig heads.TrackerConfig, orm headtracker.ORM) *headTrackerUniverse { lggr, ob := logger.TestObserved(t, zap.DebugLevel) hb := headtracker.NewHeadBroadcaster(lggr) hs := headtracker.NewHeadSaver(lggr, orm, config, htConfig) @@ -1278,7 +1277,7 @@ func createHeadTracker(t testing.TB, ethClient *clienttest.Client, config common } } -func createHeadTrackerWithChecker(t *testing.T, ethClient *clienttest.Client, config commontypes.Config, htConfig commontypes.HeadTrackerConfig, orm headtracker.ORM, checker httypes.HeadTrackable) *headTrackerUniverse { +func createHeadTrackerWithChecker(t *testing.T, ethClient *clienttest.Client, config heads.ChainConfig, htConfig heads.TrackerConfig, orm headtracker.ORM, checker httypes.HeadTrackable) *headTrackerUniverse { lggr, ob := logger.TestObserved(t, zap.DebugLevel) hb := headtracker.NewHeadBroadcaster(lggr) hs := headtracker.NewHeadSaver(lggr, orm, config, htConfig) diff --git a/core/chains/evm/headtracker/heads.go b/core/chains/evm/headtracker/heads.go index 106bd72fada..0f46910b0f5 100644 --- a/core/chains/evm/headtracker/heads.go +++ b/core/chains/evm/headtracker/heads.go @@ -26,7 +26,7 @@ type Heads interface { MarkFinalized(finalized common.Hash, minBlockToKeep int64) bool } -type heads struct { +type headSet struct { highest *evmtypes.Head headsAsc *headsHeap headsByHash map[common.Hash]*evmtypes.Head @@ -35,21 +35,21 @@ type heads struct { } func NewHeads() Heads { - return &heads{ + return &headSet{ headsAsc: &headsHeap{}, headsByHash: make(map[common.Hash]*evmtypes.Head), headsByParent: map[common.Hash]map[common.Hash]*evmtypes.Head{}, } } -func (h *heads) LatestHead() *evmtypes.Head { +func (h *headSet) LatestHead() *evmtypes.Head { h.mu.RLock() defer h.mu.RUnlock() return h.highest } -func (h *heads) HeadByHash(hash common.Hash) *evmtypes.Head { +func (h *headSet) HeadByHash(hash common.Hash) *evmtypes.Head { h.mu.RLock() defer h.mu.RUnlock() @@ -60,7 +60,7 @@ func (h *heads) HeadByHash(hash common.Hash) *evmtypes.Head { return h.headsByHash[hash] } -func (h *heads) Count() int { +func (h *headSet) Count() int { h.mu.RLock() defer h.mu.RUnlock() @@ -69,7 +69,7 @@ func (h *heads) Count() int { // MarkFinalized - marks block with hash equal to finalized and all it's direct ancestors as finalized. // Trims old blocks whose height is smaller than minBlockToKeep -func (h *heads) MarkFinalized(finalized common.Hash, minBlockToKeep int64) bool { +func (h *headSet) MarkFinalized(finalized common.Hash, minBlockToKeep int64) bool { h.mu.Lock() defer h.mu.Unlock() @@ -111,7 +111,7 @@ func markFinalized(head *evmtypes.Head) { } } -func (h *heads) ensureNoCycles(newHead *evmtypes.Head) error { +func (h *headSet) ensureNoCycles(newHead *evmtypes.Head) error { if newHead.ParentHash == newHead.Hash { return fmt.Errorf("cycle detected: newHeads reference itself newHead(%s)", newHead.String()) } @@ -130,7 +130,7 @@ func (h *heads) ensureNoCycles(newHead *evmtypes.Head) error { return nil } -func (h *heads) AddHeads(newHeads ...*evmtypes.Head) error { +func (h *headSet) AddHeads(newHeads ...*evmtypes.Head) error { h.mu.Lock() defer h.mu.Unlock() diff --git a/core/chains/evm/headtracker/types/types.go b/core/chains/evm/headtracker/types/types.go index 0752ce66b56..77e3cb84cfa 100644 --- a/core/chains/evm/headtracker/types/types.go +++ b/core/chains/evm/headtracker/types/types.go @@ -7,23 +7,22 @@ import ( "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/chainlink-framework/chains/headtracker" - htrktypes "github.com/smartcontractkit/chainlink-framework/chains/headtracker/types" + "github.com/smartcontractkit/chainlink-framework/chains/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ) // HeadSaver maintains chains persisted in DB. All methods are thread-safe. type HeadSaver interface { - headtracker.HeadSaver[*evmtypes.Head, common.Hash] + heads.Saver[*evmtypes.Head, common.Hash] // LatestHeadFromDB returns the highest seen head from DB. LatestHeadFromDB(ctx context.Context) (*evmtypes.Head, error) } // Type Alias for EVM Head Tracker Components type ( - HeadTracker = headtracker.HeadTracker[*evmtypes.Head, common.Hash] - HeadTrackable = headtracker.HeadTrackable[*evmtypes.Head, common.Hash] - HeadListener = headtracker.HeadListener[*evmtypes.Head, common.Hash] - HeadBroadcaster = headtracker.HeadBroadcaster[*evmtypes.Head, common.Hash] - Client = htrktypes.Client[*evmtypes.Head, ethereum.Subscription, *big.Int, common.Hash] + HeadTracker = heads.Tracker[*evmtypes.Head, common.Hash] + HeadTrackable = heads.Trackable[*evmtypes.Head, common.Hash] + HeadListener = heads.Listener[*evmtypes.Head, common.Hash] + HeadBroadcaster = heads.Broadcaster[*evmtypes.Head, common.Hash] + Client = heads.Client[*evmtypes.Head, ethereum.Subscription, *big.Int, common.Hash] ) diff --git a/core/chains/evm/log/broadcaster.go b/core/chains/evm/log/broadcaster.go index 03541433872..6180435dcba 100644 --- a/core/chains/evm/log/broadcaster.go +++ b/core/chains/evm/log/broadcaster.go @@ -18,7 +18,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" - "github.com/smartcontractkit/chainlink-framework/chains/headtracker" + "github.com/smartcontractkit/chainlink-framework/chains/heads" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" @@ -46,7 +46,7 @@ type ( Broadcaster interface { utils.DependentAwaiter services.Service - headtracker.HeadTrackable[*evmtypes.Head, common.Hash] + heads.Trackable[*evmtypes.Head, common.Hash] // ReplayFromBlock enqueues a replay from the provided block number. If forceBroadcast is // set to true, the broadcaster will broadcast logs that were already marked consumed diff --git a/core/chains/evm/logpoller/log_poller_internal_test.go b/core/chains/evm/logpoller/log_poller_internal_test.go index e8a45859d82..2eec0a87414 100644 --- a/core/chains/evm/logpoller/log_poller_internal_test.go +++ b/core/chains/evm/logpoller/log_poller_internal_test.go @@ -229,7 +229,7 @@ func TestLogPoller_BackupPollerStartup(t *testing.T) { ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) ec.On("ConfiguredChainID").Return(chainID, nil) - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(head, finalizedHead, nil) ctx := testutils.Context(t) @@ -336,7 +336,7 @@ func TestLogPoller_Replay(t *testing.T) { KeepFinalizedBlocksDepth: 20, BackupPollerBlockDelay: 0, } - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(func(ctx context.Context) (*evmtypes.Head, *evmtypes.Head, error) { h := head.Load() @@ -578,7 +578,7 @@ func Test_latestBlockAndFinalityDepth(t *testing.T) { } t.Run("headTracker returns an error", func(t *testing.T) { - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) const expectedError = "finalized block is not available yet" headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(&evmtypes.Head{}, &evmtypes.Head{}, fmt.Errorf(expectedError)) @@ -587,7 +587,7 @@ func Test_latestBlockAndFinalityDepth(t *testing.T) { require.ErrorContains(t, err, expectedError) }) t.Run("headTracker returns valid chain", func(t *testing.T) { - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) finalizedBlock := &evmtypes.Head{Number: 2} finalizedBlock.IsFinalized.Store(true) head := &evmtypes.Head{Number: 10} @@ -689,7 +689,7 @@ func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { t.Run("Finalized DB block is not present in RPC's chain", func(t *testing.T) { lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) finalized := newHead(5) latest := newHead(16) headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).RunAndReturn(func(ctx context.Context) (*evmtypes.Head, *evmtypes.Head, error) { @@ -710,7 +710,7 @@ func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { t.Run("RPCs contradict each other and return different finalized blocks", func(t *testing.T) { lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) finalized := newHead(5) latest := newHead(16) headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() @@ -730,7 +730,7 @@ func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { t.Run("Log's hash does not match block's", func(t *testing.T) { lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) finalized := newHead(5) latest := newHead(16) headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() @@ -748,7 +748,7 @@ func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) chainID := testutils.NewRandomEVMChainID() orm := NewORM(chainID, db, lggr) - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) finalized := newHead(5) latest := newHead(16) headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index cc6ec142903..c285c5b6ea6 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -1544,7 +1544,7 @@ func TestTooManyLogResults(t *testing.T) { RpcBatchSize: 10, KeepFinalizedBlocksDepth: 1000, } - headTracker := htMocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) lp := logpoller.NewLogPoller(o, ec, lggr, headTracker, lpOpts) expected := []int64{10, 5, 2, 1} diff --git a/core/chains/legacyevm/mocks/chain.go b/core/chains/legacyevm/mocks/chain.go index 75aa80cde72..1f28aedf987 100644 --- a/core/chains/legacyevm/mocks/chain.go +++ b/core/chains/legacyevm/mocks/chain.go @@ -16,7 +16,7 @@ import ( gas "github.com/smartcontractkit/chainlink-integrations/evm/gas" - headtracker "github.com/smartcontractkit/chainlink-framework/chains/headtracker" + heads "github.com/smartcontractkit/chainlink-framework/chains/heads" log "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" @@ -336,19 +336,19 @@ func (_c *Chain_GetChainStatus_Call) RunAndReturn(run func(context.Context) (typ } // HeadBroadcaster provides a mock function with no fields -func (_m *Chain) HeadBroadcaster() headtracker.HeadBroadcaster[*evmtypes.Head, common.Hash] { +func (_m *Chain) HeadBroadcaster() heads.Broadcaster[*evmtypes.Head, common.Hash] { ret := _m.Called() if len(ret) == 0 { panic("no return value specified for HeadBroadcaster") } - var r0 headtracker.HeadBroadcaster[*evmtypes.Head, common.Hash] - if rf, ok := ret.Get(0).(func() headtracker.HeadBroadcaster[*evmtypes.Head, common.Hash]); ok { + var r0 heads.Broadcaster[*evmtypes.Head, common.Hash] + if rf, ok := ret.Get(0).(func() heads.Broadcaster[*evmtypes.Head, common.Hash]); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(headtracker.HeadBroadcaster[*evmtypes.Head, common.Hash]) + r0 = ret.Get(0).(heads.Broadcaster[*evmtypes.Head, common.Hash]) } } @@ -372,30 +372,30 @@ func (_c *Chain_HeadBroadcaster_Call) Run(run func()) *Chain_HeadBroadcaster_Cal return _c } -func (_c *Chain_HeadBroadcaster_Call) Return(_a0 headtracker.HeadBroadcaster[*evmtypes.Head, common.Hash]) *Chain_HeadBroadcaster_Call { +func (_c *Chain_HeadBroadcaster_Call) Return(_a0 heads.Broadcaster[*evmtypes.Head, common.Hash]) *Chain_HeadBroadcaster_Call { _c.Call.Return(_a0) return _c } -func (_c *Chain_HeadBroadcaster_Call) RunAndReturn(run func() headtracker.HeadBroadcaster[*evmtypes.Head, common.Hash]) *Chain_HeadBroadcaster_Call { +func (_c *Chain_HeadBroadcaster_Call) RunAndReturn(run func() heads.Broadcaster[*evmtypes.Head, common.Hash]) *Chain_HeadBroadcaster_Call { _c.Call.Return(run) return _c } // HeadTracker provides a mock function with no fields -func (_m *Chain) HeadTracker() headtracker.HeadTracker[*evmtypes.Head, common.Hash] { +func (_m *Chain) HeadTracker() heads.Tracker[*evmtypes.Head, common.Hash] { ret := _m.Called() if len(ret) == 0 { panic("no return value specified for HeadTracker") } - var r0 headtracker.HeadTracker[*evmtypes.Head, common.Hash] - if rf, ok := ret.Get(0).(func() headtracker.HeadTracker[*evmtypes.Head, common.Hash]); ok { + var r0 heads.Tracker[*evmtypes.Head, common.Hash] + if rf, ok := ret.Get(0).(func() heads.Tracker[*evmtypes.Head, common.Hash]); ok { r0 = rf() } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(headtracker.HeadTracker[*evmtypes.Head, common.Hash]) + r0 = ret.Get(0).(heads.Tracker[*evmtypes.Head, common.Hash]) } } @@ -419,12 +419,12 @@ func (_c *Chain_HeadTracker_Call) Run(run func()) *Chain_HeadTracker_Call { return _c } -func (_c *Chain_HeadTracker_Call) Return(_a0 headtracker.HeadTracker[*evmtypes.Head, common.Hash]) *Chain_HeadTracker_Call { +func (_c *Chain_HeadTracker_Call) Return(_a0 heads.Tracker[*evmtypes.Head, common.Hash]) *Chain_HeadTracker_Call { _c.Call.Return(_a0) return _c } -func (_c *Chain_HeadTracker_Call) RunAndReturn(run func() headtracker.HeadTracker[*evmtypes.Head, common.Hash]) *Chain_HeadTracker_Call { +func (_c *Chain_HeadTracker_Call) RunAndReturn(run func() heads.Tracker[*evmtypes.Head, common.Hash]) *Chain_HeadTracker_Call { _c.Call.Return(run) return _c } diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 77cde161007..c742a33228d 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -36,7 +36,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 github.com/spf13/cobra v1.8.1 @@ -305,7 +305,7 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 3c00e7f6c1f..a7d7f656ff9 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1123,12 +1123,12 @@ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031 github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 h1:C4SZwpcq3SkDrQNAAPpEkFI7Zylurl4L59crgXYJNuA= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 h1:HaV043hwqfuHj/ahTTgUvub/3eBM3e8TQFeSZw759i0= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100/go.mod h1:tHXY4g75EjEo+CwvgQKgk8cD5ViRmw2BXJ806i5mEIM= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/core/services/ocr/contract_tracker_test.go b/core/services/ocr/contract_tracker_test.go index d54b853ce5d..9b6d70d1f60 100644 --- a/core/services/ocr/contract_tracker_test.go +++ b/core/services/ocr/contract_tracker_test.go @@ -48,7 +48,7 @@ func mustNewFilterer(t *testing.T) *offchainaggregator.OffchainAggregatorFiltere type contractTrackerUni struct { db *ocrmocks.OCRContractTrackerDB lb *logmocks.Broadcaster - hb *htmocks.HeadBroadcaster[*evmtypes.Head, common.Hash] + hb *htmocks.Broadcaster[*evmtypes.Head, common.Hash] ec *clienttest.Client tracker *ocr.OCRContractTracker } @@ -76,7 +76,7 @@ func newContractTrackerUni(t *testing.T, opts ...interface{}) (uni contractTrack } uni.db = ocrmocks.NewOCRContractTrackerDB(t) uni.lb = logmocks.NewBroadcaster(t) - uni.hb = htmocks.NewHeadBroadcaster[*evmtypes.Head, common.Hash](t) + uni.hb = htmocks.NewBroadcaster[*evmtypes.Head, common.Hash](t) uni.ec = evmtest.NewEthClientMock(t) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) @@ -136,7 +136,7 @@ func Test_OCRContractTracker_LatestBlockHeight(t *testing.T) { assert.Equal(t, uint64(42), l) }) - t.Run("if headbroadcaster has it, uses the given value on start", func(t *testing.T) { + t.Run("if Broadcaster has it, uses the given value on start", func(t *testing.T) { uni := newContractTrackerUni(t) uni.hb.On("Subscribe", uni.tracker).Return(&evmtypes.Head{Number: 42}, func() {}) @@ -324,8 +324,8 @@ func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testin uni.lb.On("Register", uni.tracker, mock.Anything).Return(func() { eventuallyCloseLogBroadcaster.ItHappened() }) uni.lb.On("IsConnected").Return(true).Maybe() - eventuallyCloseHeadBroadcaster := cltest.NewAwaiter() - uni.hb.On("Subscribe", uni.tracker).Return((*evmtypes.Head)(nil), func() { eventuallyCloseHeadBroadcaster.ItHappened() }) + eventuallyCloseBroadcaster := cltest.NewAwaiter() + uni.hb.On("Subscribe", uni.tracker).Return((*evmtypes.Head)(nil), func() { eventuallyCloseBroadcaster.ItHappened() }) uni.db.On("LoadLatestRoundRequested", mock.Anything).Return(rr, nil) @@ -339,7 +339,7 @@ func Test_OCRContractTracker_HandleLog_OCRContractLatestRoundRequested(t *testin require.NoError(t, uni.tracker.Close()) - eventuallyCloseHeadBroadcaster.AssertHappened(t, true) + eventuallyCloseBroadcaster.AssertHappened(t, true) eventuallyCloseLogBroadcaster.AssertHappened(t, true) }) } diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go index 269e871e864..6eb7c06beac 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go @@ -46,7 +46,7 @@ func TestGetActiveUpkeepKeys(t *testing.T) { actives[id] = activeUpkeep{ID: idNum} } - mht := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + mht := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) rg := &EvmRegistry{ HeadProvider: HeadProvider{ diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go index 771599d814e..19951ba12fd 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go @@ -275,7 +275,7 @@ func TestBlockSubscriber_Cleanup(t *testing.T) { func TestBlockSubscriber_Start(t *testing.T) { lggr := logger.TestLogger(t) - hb := htmocks.NewHeadBroadcaster[*evmtypes.Head, common.Hash](t) + hb := htmocks.NewBroadcaster[*evmtypes.Head, common.Hash](t) hb.On("Subscribe", mock.Anything).Return(&evmtypes.Head{Number: 42}, func() {}) lp := new(mocks.LogPoller) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: 100}, nil) diff --git a/core/services/relay/evm/chain_components_test.go b/core/services/relay/evm/chain_components_test.go index 337f86a18f4..c46f322162a 100644 --- a/core/services/relay/evm/chain_components_test.go +++ b/core/services/relay/evm/chain_components_test.go @@ -219,7 +219,7 @@ func TestContractReaderEventsInitValidation(t *testing.T) { func TestChainReader_HealthReport(t *testing.T) { lp := lpMocks.NewLogPoller(t) lp.EXPECT().HealthReport().Return(map[string]error{"lp_name": clcommontypes.ErrFinalityViolated}).Once() - ht := htMocks.NewHeadTracker[*clevmtypes.Head, common.Hash](t) + ht := htMocks.NewTracker[*clevmtypes.Head, common.Hash](t) htError := errors.New("head tracker error") ht.EXPECT().HealthReport().Return(map[string]error{"ht_name": htError}).Once() cr, err := evm.NewChainReaderService(testutils.Context(t), logger.Nop(), lp, ht, nil, types.ChainReaderConfig{Contracts: nil}) diff --git a/core/services/relay/evm/mercury/v1/data_source_test.go b/core/services/relay/evm/mercury/v1/data_source_test.go index 8d7e5fbcd4b..f95281231d0 100644 --- a/core/services/relay/evm/mercury/v1/data_source_test.go +++ b/core/services/relay/evm/mercury/v1/data_source_test.go @@ -116,7 +116,7 @@ func TestMercury_Observe(t *testing.T) { spec := pipeline.Spec{} ds.spec = spec - h := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + h := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) ds.mercuryChainReader = evm.NewMercuryChainReader(h) head := &evmtypes.Head{ @@ -207,7 +207,7 @@ func TestMercury_Observe(t *testing.T) { assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if no current block available", func(t *testing.T) { - h2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + h2 := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) @@ -318,7 +318,7 @@ func TestMercury_Observe(t *testing.T) { t.Run("LatestBlocks is populated correctly", func(t *testing.T) { t.Run("when chain length is zero", func(t *testing.T) { - ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + ht2 := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) @@ -342,7 +342,7 @@ func TestMercury_Observe(t *testing.T) { } h6.Parent.Store(h5) - ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + ht2 := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return(h6) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) @@ -365,7 +365,7 @@ func TestMercury_Observe(t *testing.T) { } } - ht2 := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + ht2 := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return(heads[len(heads)-1]) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) @@ -410,7 +410,7 @@ func TestMercury_SetLatestBlocks(t *testing.T) { } t.Run("returns head from headtracker if present", func(t *testing.T) { - headTracker := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) headTracker.On("LatestChain").Return(&h, nil) ds.mercuryChainReader = evm.NewMercuryChainReader(headTracker) @@ -427,7 +427,7 @@ func TestMercury_SetLatestBlocks(t *testing.T) { }) t.Run("if headtracker returns nil head", func(t *testing.T) { - headTracker := htmocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + headTracker := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) // This can happen in some cases e.g. RPC node is offline headTracker.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewChainReader(headTracker) diff --git a/core/services/relay/evm/request_round_tracker_test.go b/core/services/relay/evm/request_round_tracker_test.go index d98edfa0958..df02ab360c5 100644 --- a/core/services/relay/evm/request_round_tracker_test.go +++ b/core/services/relay/evm/request_round_tracker_test.go @@ -46,7 +46,7 @@ func mustNewFilterer(t *testing.T, address gethCommon.Address) *ocr2aggregator.O type contractTrackerUni struct { db *mocks.RequestRoundDB lb *logmocks.Broadcaster - hb *htmocks.HeadBroadcaster[*evmtypes.Head, common.Hash] + hb *htmocks.Broadcaster[*evmtypes.Head, common.Hash] ec *clienttest.Client requestRoundTracker *evm.RequestRoundTracker } @@ -74,7 +74,7 @@ func newContractTrackerUni(t *testing.T, opts ...interface{}) (uni contractTrack } uni.db = mocks.NewRequestRoundDB(t) uni.lb = logmocks.NewBroadcaster(t) - uni.hb = htmocks.NewHeadBroadcaster[*evmtypes.Head, common.Hash](t) + uni.hb = htmocks.NewBroadcaster[*evmtypes.Head, common.Hash](t) uni.ec = clienttest.NewClient(t) db := pgtest.NewSqlxDB(t) diff --git a/core/services/relay/evm/write_target_test.go b/core/services/relay/evm/write_target_test.go index f77e69386e2..bca79e5ca37 100644 --- a/core/services/relay/evm/write_target_test.go +++ b/core/services/relay/evm/write_target_test.go @@ -117,7 +117,7 @@ func TestEvmWrite(t *testing.T) { chain.On("TxManager").Return(txManager) chain.On("LogPoller").Return(poller) - ht := mocks.NewHeadTracker[*evmtypes.Head, common.Hash](t) + ht := mocks.NewTracker[*evmtypes.Head, common.Hash](t) ht.On("LatestAndFinalizedBlock", mock.Anything).Return(&evmtypes.Head{}, &evmtypes.Head{}, nil) chain.On("HeadTracker").Return(ht) diff --git a/deployment/go.mod b/deployment/go.mod index ae0b13ea6bd..3ef85293545 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -35,7 +35,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 @@ -349,7 +349,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index 140b568ddef..0ba9b654201 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1120,12 +1120,12 @@ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031 github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 h1:C4SZwpcq3SkDrQNAAPpEkFI7Zylurl4L59crgXYJNuA= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 h1:HaV043hwqfuHj/ahTTgUvub/3eBM3e8TQFeSZw759i0= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100/go.mod h1:tHXY4g75EjEo+CwvgQKgk8cD5ViRmw2BXJ806i5mEIM= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/go.mod b/go.mod index 754a29d8eb8..ad9a6fc258c 100644 --- a/go.mod +++ b/go.mod @@ -83,9 +83,9 @@ require ( github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-feeds v0.1.1 - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 diff --git a/go.sum b/go.sum index 25449d3e2f2..623c276b9a5 100644 --- a/go.sum +++ b/go.sum @@ -1020,12 +1020,12 @@ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031 github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 h1:C4SZwpcq3SkDrQNAAPpEkFI7Zylurl4L59crgXYJNuA= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 h1:HaV043hwqfuHj/ahTTgUvub/3eBM3e8TQFeSZw759i0= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100/go.mod h1:tHXY4g75EjEo+CwvgQKgk8cD5ViRmw2BXJ806i5mEIM= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 6c073dfed0f..0f415dcac48 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -50,7 +50,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 @@ -426,7 +426,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index eef332ff944..32cb0b02670 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1370,12 +1370,12 @@ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031 github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 h1:C4SZwpcq3SkDrQNAAPpEkFI7Zylurl4L59crgXYJNuA= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 h1:HaV043hwqfuHj/ahTTgUvub/3eBM3e8TQFeSZw759i0= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100/go.mod h1:tHXY4g75EjEo+CwvgQKgk8cD5ViRmw2BXJ806i5mEIM= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 9bce9a55b85..a33f72e3aaf 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -30,7 +30,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 @@ -412,7 +412,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect - github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 // indirect + github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index b9f60fe4555..8312511e2b4 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1353,12 +1353,12 @@ github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031 github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678 h1:C4SZwpcq3SkDrQNAAPpEkFI7Zylurl4L59crgXYJNuA= -github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250205171936-649f95193678/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= +github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100 h1:HaV043hwqfuHj/ahTTgUvub/3eBM3e8TQFeSZw759i0= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207143947-22151a16f100/go.mod h1:tHXY4g75EjEo+CwvgQKgk8cD5ViRmw2BXJ806i5mEIM= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= From 2496391400bf4a70cbd0b5b718f05e4d44a2da70 Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Mon, 10 Feb 2025 10:28:58 -0600 Subject: [PATCH 06/83] integration-tests: remove broken cosm wasm cp (#16295) --- integration-tests/test.Dockerfile | 3 --- 1 file changed, 3 deletions(-) diff --git a/integration-tests/test.Dockerfile b/integration-tests/test.Dockerfile index 17ea3875a1f..cae89a1142e 100644 --- a/integration-tests/test.Dockerfile +++ b/integration-tests/test.Dockerfile @@ -21,9 +21,6 @@ RUN /go/testdir/integration-tests/scripts/buildTests "${SUITES}" FROM ${BASE_IMAGE}:${IMAGE_VERSION} RUN mkdir -p /go/testdir/integration-tests/scripts -# Dependency of CosmWasm/wasmd -COPY --from=build-env /go/pkg/mod/github.com/\!cosm\!wasm/wasmvm@v*/internal/api/libwasmvm.*.so /usr/lib/ -RUN chmod 755 /usr/lib/libwasmvm.*.so COPY --from=build-env /go/testdir/integration-tests/*.test /go/testdir/integration-tests/ COPY --from=build-env /go/testdir/integration-tests/ccip-tests/*.test /go/testdir/integration-tests/ COPY --from=build-env /go/testdir/integration-tests/scripts /go/testdir/integration-tests/scripts/ From b6ee1aa638d5acf61ad2a5edcd155c76fcbe0739 Mon Sep 17 00:00:00 2001 From: chainchad <96362174+chainchad@users.noreply.github.com> Date: Mon, 10 Feb 2025 11:54:00 -0500 Subject: [PATCH 07/83] Allow stale PR workflow to delete branches (#15219) --- .github/workflows/stale.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 5972519426a..e10da5efe81 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -13,6 +13,7 @@ jobs: stale: runs-on: ubuntu-latest permissions: + contents: write # only for delete-branch option issues: write pull-requests: write @@ -23,5 +24,6 @@ jobs: exempt-all-pr-assignees: true stale-pr-message: "This PR is stale because it has been open 60 days with no activity. Remove stale label or comment or this will be closed in 7 days." days-before-issue-stale: -1 # disables marking issues as stale automatically. Issues can still be marked as stale manually, in which the closure policy applies. + delete-branch: true # Comma separated list of labels that exempt issues from being considered stale. exempt-pr-labels: "stale-exempt" From cb77616f9a5296c45e86a4b96a3191b7a8d9b758 Mon Sep 17 00:00:00 2001 From: Yashvardhan Nevatia Date: Mon, 10 Feb 2025 17:54:48 +0000 Subject: [PATCH 08/83] solana ccip contract split (#16159) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * clean commit history * adding test for setpool and pool lookuptable * fee quoter changes barring tests * fixing after fee quoter * updating receiver * bug fixes * go mods * logs * bug fix * offramp changes * Bump chainlink-solana * bug fix * linting * bug fix * Revert "solana tooling dev" This reverts commit 866a1d547c7773af59cf68fd2a2ad8d77e5fee68. * revert smoke * fix tests * lint * change address table init * fix tests * pass offramp in CCIP home * rename addresslookup to offrampaddresslookup * semantics * file split and extending lookup table * append pool instruction * fix chainlink_models_test.go * fix lint * Fix more tests * remove prints * remove deploy transferable * bug fix * const * lint * rename func * lint --------- Co-authored-by: Terry Tata Co-authored-by: Blaž Hrastnik --- .../ccip/ccipsolana/commitcodec.go | 18 +- .../ccip/ccipsolana/commitcodec_test.go | 14 +- .../ccip/ccipsolana/executecodec.go | 20 +- .../ccip/ccipsolana/executecodec_test.go | 18 +- .../ccip/ccipsolana/extradatadecoder.go | 6 +- .../ccip/ccipsolana/extradatadecoder_test.go | 6 +- .../capabilities/ccip/ccipsolana/msghasher.go | 14 +- .../ccip/ccipsolana/msghasher_test.go | 16 +- core/scripts/go.mod | 10 +- core/scripts/go.sum | 20 +- core/services/job/testdata/compact.toml | 2 +- core/services/job/testdata/pretty.toml | 2 + .../ccip/changeset/cs_chain_contracts.go | 33 +- deployment/ccip/changeset/cs_deploy_chain.go | 285 ++++-- .../changeset/solana/cs_add_remote_chain.go | 212 +++++ .../ccip/changeset/solana/cs_billing.go | 186 ++++ .../changeset/solana/cs_chain_contracts.go | 854 +----------------- .../solana/cs_chain_contracts_test.go | 253 ++++-- .../changeset/solana/cs_deploy_chain_test.go | 23 - .../ccip/changeset/solana/cs_set_ocr3.go | 88 ++ .../ccip/changeset/solana/cs_solana_token.go | 26 +- .../changeset/solana/cs_solana_token_test.go | 31 +- .../solana/cs_token_admin_registry.go | 257 ++++++ .../ccip/changeset/solana/cs_token_pool.go | 381 ++++++++ deployment/ccip/changeset/solana_state.go | 81 +- deployment/ccip/changeset/state.go | 2 +- .../changeset/testhelpers/test_helpers.go | 119 ++- deployment/environment/memory/chain.go | 20 +- .../nodeclient/chainlink_models_test.go | 2 +- deployment/go.mod | 10 +- deployment/go.sum | 20 +- deployment/solana_chain.go | 1 + go.mod | 10 +- go.sum | 20 +- integration-tests/go.mod | 6 +- integration-tests/go.sum | 12 +- integration-tests/load/go.mod | 6 +- integration-tests/load/go.sum | 12 +- 38 files changed, 1886 insertions(+), 1210 deletions(-) create mode 100644 deployment/ccip/changeset/solana/cs_add_remote_chain.go create mode 100644 deployment/ccip/changeset/solana/cs_billing.go create mode 100644 deployment/ccip/changeset/solana/cs_set_ocr3.go create mode 100644 deployment/ccip/changeset/solana/cs_token_admin_registry.go create mode 100644 deployment/ccip/changeset/solana/cs_token_pool.go diff --git a/core/capabilities/ccip/ccipsolana/commitcodec.go b/core/capabilities/ccip/ccipsolana/commitcodec.go index 3868d82d8e1..fec5c62b949 100644 --- a/core/capabilities/ccip/ccipsolana/commitcodec.go +++ b/core/capabilities/ccip/ccipsolana/commitcodec.go @@ -9,7 +9,7 @@ import ( agbinary "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" ) @@ -29,7 +29,7 @@ func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.Commi return nil, fmt.Errorf("unexpected merkle root length in report: %d", len(report.MerkleRoots)) } - mr := ccip_router.MerkleRoot{ + mr := ccip_offramp.MerkleRoot{ SourceChainSelector: uint64(report.MerkleRoots[0].ChainSel), OnRampAddress: report.MerkleRoots[0].OnRampAddress, MinSeqNr: uint64(report.MerkleRoots[0].SeqNumsRange.Start()), @@ -37,7 +37,7 @@ func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.Commi MerkleRoot: report.MerkleRoots[0].MerkleRoot, } - tpu := make([]ccip_router.TokenPriceUpdate, 0, len(report.PriceUpdates.TokenPriceUpdates)) + tpu := make([]ccip_offramp.TokenPriceUpdate, 0, len(report.PriceUpdates.TokenPriceUpdates)) for _, update := range report.PriceUpdates.TokenPriceUpdates { token, err := solana.PublicKeyFromBase58(string(update.TokenID)) if err != nil { @@ -46,27 +46,27 @@ func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.Commi if update.Price.IsEmpty() { return nil, fmt.Errorf("empty price for token: %s", update.TokenID) } - tpu = append(tpu, ccip_router.TokenPriceUpdate{ + tpu = append(tpu, ccip_offramp.TokenPriceUpdate{ SourceToken: token, UsdPerToken: [28]uint8(encodeBigIntToFixedLengthLE(update.Price.Int, 28)), }) } - gpu := make([]ccip_router.GasPriceUpdate, 0, len(report.PriceUpdates.GasPriceUpdates)) + gpu := make([]ccip_offramp.GasPriceUpdate, 0, len(report.PriceUpdates.GasPriceUpdates)) for _, update := range report.PriceUpdates.GasPriceUpdates { if update.GasPrice.IsEmpty() { return nil, fmt.Errorf("empty gas price for chain: %d", update.ChainSel) } - gpu = append(gpu, ccip_router.GasPriceUpdate{ + gpu = append(gpu, ccip_offramp.GasPriceUpdate{ DestChainSelector: uint64(update.ChainSel), UsdPerUnitGas: [28]uint8(encodeBigIntToFixedLengthLE(update.GasPrice.Int, 28)), }) } - commit := ccip_router.CommitInput{ + commit := ccip_offramp.CommitInput{ MerkleRoot: mr, - PriceUpdates: ccip_router.PriceUpdates{ + PriceUpdates: ccip_offramp.PriceUpdates{ TokenPriceUpdates: tpu, GasPriceUpdates: gpu, }, @@ -82,7 +82,7 @@ func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.Commi func (c *CommitPluginCodecV1) Decode(ctx context.Context, bytes []byte) (cciptypes.CommitPluginReport, error) { decoder := agbinary.NewBorshDecoder(bytes) - commitReport := ccip_router.CommitInput{} + commitReport := ccip_offramp.CommitInput{} err := commitReport.UnmarshalWithDecoder(decoder) if err != nil { return cciptypes.CommitPluginReport{}, err diff --git a/core/capabilities/ccip/ccipsolana/commitcodec_test.go b/core/capabilities/ccip/ccipsolana/commitcodec_test.go index 3f5916d6450..18b2756efa3 100644 --- a/core/capabilities/ccip/ccipsolana/commitcodec_test.go +++ b/core/capabilities/ccip/ccipsolana/commitcodec_test.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-integrations/evm/utils" @@ -172,28 +172,28 @@ func Test_DecodingCommitReport(t *testing.T) { gasPrice := encodeBigIntToFixedLengthLE(big.NewInt(rand.Int63()), 28) merkleRoot := utils.RandomBytes32() - tpu := []ccip_router.TokenPriceUpdate{ + tpu := []ccip_offramp.TokenPriceUpdate{ { SourceToken: tokenSource, UsdPerToken: [28]uint8(tokenPrice), }, } - gpu := []ccip_router.GasPriceUpdate{ + gpu := []ccip_offramp.GasPriceUpdate{ {UsdPerUnitGas: [28]uint8(gasPrice), DestChainSelector: uint64(chainSel)}, {UsdPerUnitGas: [28]uint8(gasPrice), DestChainSelector: uint64(chainSel)}, {UsdPerUnitGas: [28]uint8(gasPrice), DestChainSelector: uint64(chainSel)}, } - onChainReport := ccip_router.CommitInput{ - MerkleRoot: ccip_router.MerkleRoot{ + onChainReport := ccip_offramp.CommitInput{ + MerkleRoot: ccip_offramp.MerkleRoot{ SourceChainSelector: uint64(chainSel), OnRampAddress: onRampAddr.PublicKey().Bytes(), MinSeqNr: minSeqNr, MaxSeqNr: maxSeqNr, MerkleRoot: merkleRoot, }, - PriceUpdates: ccip_router.PriceUpdates{ + PriceUpdates: ccip_offramp.PriceUpdates{ TokenPriceUpdates: tpu, GasPriceUpdates: gpu, }, @@ -233,7 +233,7 @@ func Test_DecodingCommitReport(t *testing.T) { require.NoError(t, err) decoder := agbinary.NewBorshDecoder(decode) - decodedReport := ccip_router.CommitInput{} + decodedReport := ccip_offramp.CommitInput{} err = decodedReport.UnmarshalWithDecoder(decoder) require.NoError(t, err) diff --git a/core/capabilities/ccip/ccipsolana/executecodec.go b/core/capabilities/ccip/ccipsolana/executecodec.go index 0cf05e2df13..dceb0d19a42 100644 --- a/core/capabilities/ccip/ccipsolana/executecodec.go +++ b/core/capabilities/ccip/ccipsolana/executecodec.go @@ -11,7 +11,7 @@ import ( agbinary "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" ) @@ -35,12 +35,12 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec return nil, fmt.Errorf("unexpected report message length: %d", len(chainReport.Messages)) } - var message ccip_router.Any2SVMRampMessage + var message ccip_offramp.Any2SVMRampMessage var offChainTokenData [][]byte if len(chainReport.Messages) > 0 { // currently only allow executing one message at a time msg := chainReport.Messages[0] - tokenAmounts := make([]ccip_router.Any2SVMTokenTransfer, 0, len(msg.TokenAmounts)) + tokenAmounts := make([]ccip_offramp.Any2SVMTokenTransfer, 0, len(msg.TokenAmounts)) for _, tokenAmount := range msg.TokenAmounts { if tokenAmount.Amount.IsEmpty() { return nil, fmt.Errorf("empty amount for token: %s", tokenAmount.DestTokenAddress) @@ -55,16 +55,16 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec return nil, err } - tokenAmounts = append(tokenAmounts, ccip_router.Any2SVMTokenTransfer{ + tokenAmounts = append(tokenAmounts, ccip_offramp.Any2SVMTokenTransfer{ SourcePoolAddress: tokenAmount.SourcePoolAddress, DestTokenAddress: solana.PublicKeyFromBytes(tokenAmount.DestTokenAddress), ExtraData: tokenAmount.ExtraData, - Amount: ccip_router.CrossChainAmount{LeBytes: [32]uint8(encodeBigIntToFixedLengthLE(tokenAmount.Amount.Int, 32))}, + Amount: ccip_offramp.CrossChainAmount{LeBytes: [32]uint8(encodeBigIntToFixedLengthLE(tokenAmount.Amount.Int, 32))}, DestGasAmount: destGasAmount, }) } - var extraArgs ccip_router.Any2SVMRampExtraArgs + var extraArgs ccip_offramp.Any2SVMRampExtraArgs extraArgs, _, err := parseExtraArgsMapWithAccounts(msg.ExtraArgsDecoded) if err != nil { return nil, fmt.Errorf("invalid extra args map: %w", err) @@ -74,8 +74,8 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec return nil, fmt.Errorf("invalid receiver address: %v", msg.Receiver) } - message = ccip_router.Any2SVMRampMessage{ - Header: ccip_router.RampMessageHeader{ + message = ccip_offramp.Any2SVMRampMessage{ + Header: ccip_offramp.RampMessageHeader{ MessageId: msg.Header.MessageID, SourceChainSelector: uint64(msg.Header.SourceChainSelector), DestChainSelector: uint64(msg.Header.DestChainSelector), @@ -100,7 +100,7 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec solanaProofs = append(solanaProofs, proof) } - solanaReport := ccip_router.ExecutionReportSingleChain{ + solanaReport := ccip_offramp.ExecutionReportSingleChain{ SourceChainSelector: uint64(chainReport.SourceChainSelector), Message: message, OffchainTokenData: offChainTokenData, @@ -119,7 +119,7 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec func (e *ExecutePluginCodecV1) Decode(ctx context.Context, encodedReport []byte) (cciptypes.ExecutePluginReport, error) { decoder := agbinary.NewBorshDecoder(encodedReport) - executeReport := ccip_router.ExecutionReportSingleChain{} + executeReport := ccip_offramp.ExecutionReportSingleChain{} err := executeReport.UnmarshalWithDecoder(decoder) if err != nil { return cciptypes.ExecutePluginReport{}, fmt.Errorf("unpack encoded report: %w", err) diff --git a/core/capabilities/ccip/ccipsolana/executecodec_test.go b/core/capabilities/ccip/ccipsolana/executecodec_test.go index f36918cd077..833d83126be 100644 --- a/core/capabilities/ccip/ccipsolana/executecodec_test.go +++ b/core/capabilities/ccip/ccipsolana/executecodec_test.go @@ -10,7 +10,7 @@ import ( agbinary "github.com/gagliardetto/binary" solanago "github.com/gagliardetto/solana-go" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-integrations/evm/utils" @@ -54,7 +54,7 @@ var randomExecuteReport = func(t *testing.T, sourceChainSelector uint64) cciptyp } } - extraArgs := ccip_router.Any2SVMRampExtraArgs{ + extraArgs := ccip_offramp.Any2SVMRampExtraArgs{ ComputeUnits: 1000, IsWritableBitmap: 2, } @@ -189,22 +189,22 @@ func Test_DecodingExecuteReport(t *testing.T) { destGasAmount := uint32(10) tokenAmount := big.NewInt(rand.Int63()) tokenReceiver := solanago.MustPublicKeyFromBase58("C8WSPj3yyus1YN3yNB6YA5zStYtbjQWtpmKadmvyUXq8") - extraArgs := ccip_router.Any2SVMRampExtraArgs{ + extraArgs := ccip_offramp.Any2SVMRampExtraArgs{ ComputeUnits: 1000, IsWritableBitmap: 2, } - onChainReport := ccip_router.ExecutionReportSingleChain{ + onChainReport := ccip_offramp.ExecutionReportSingleChain{ SourceChainSelector: uint64(chainSel), - Message: ccip_router.Any2SVMRampMessage{ - Header: ccip_router.RampMessageHeader{ + Message: ccip_offramp.Any2SVMRampMessage{ + Header: ccip_offramp.RampMessageHeader{ SourceChainSelector: uint64(chainSel), }, TokenReceiver: tokenReceiver, ExtraArgs: extraArgs, - TokenAmounts: []ccip_router.Any2SVMTokenTransfer{ + TokenAmounts: []ccip_offramp.Any2SVMTokenTransfer{ { - Amount: ccip_router.CrossChainAmount{LeBytes: [32]uint8(encodeBigIntToFixedLengthLE(tokenAmount, 32))}, + Amount: ccip_offramp.CrossChainAmount{LeBytes: [32]uint8(encodeBigIntToFixedLengthLE(tokenAmount, 32))}, DestGasAmount: destGasAmount, }, }, @@ -243,7 +243,7 @@ func Test_DecodingExecuteReport(t *testing.T) { require.NoError(t, err) decoder := agbinary.NewBorshDecoder(encodedReport) - executeReport := ccip_router.ExecutionReportSingleChain{} + executeReport := ccip_offramp.ExecutionReportSingleChain{} err = executeReport.UnmarshalWithDecoder(decoder) require.NoError(t, err) diff --git a/core/capabilities/ccip/ccipsolana/extradatadecoder.go b/core/capabilities/ccip/ccipsolana/extradatadecoder.go index 4b2e72ef34e..b46692d0d98 100644 --- a/core/capabilities/ccip/ccipsolana/extradatadecoder.go +++ b/core/capabilities/ccip/ccipsolana/extradatadecoder.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" agbinary "github.com/gagliardetto/binary" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" ) const ( @@ -37,7 +37,7 @@ func DecodeExtraArgsToMap(extraArgs []byte) (map[string]any, error) { outputMap := make(map[string]any) switch string(extraArgs[:4]) { case string(evmExtraArgsV2Tag): - var args ccip_router.EVMExtraArgsV2 + var args fee_quoter.EVMExtraArgsV2 decoder := agbinary.NewBorshDecoder(extraArgs[4:]) err := args.UnmarshalWithDecoder(decoder) if err != nil { @@ -46,7 +46,7 @@ func DecodeExtraArgsToMap(extraArgs []byte) (map[string]any, error) { val = reflect.ValueOf(args) typ = reflect.TypeOf(args) case string(svmExtraArgsV1Tag): - var args ccip_router.SVMExtraArgsV1 + var args fee_quoter.SVMExtraArgsV1 decoder := agbinary.NewBorshDecoder(extraArgs[4:]) err := args.UnmarshalWithDecoder(decoder) if err != nil { diff --git a/core/capabilities/ccip/ccipsolana/extradatadecoder_test.go b/core/capabilities/ccip/ccipsolana/extradatadecoder_test.go index 8d39bd0cd7a..a4de8331d24 100644 --- a/core/capabilities/ccip/ccipsolana/extradatadecoder_test.go +++ b/core/capabilities/ccip/ccipsolana/extradatadecoder_test.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chains/solana/contracts/tests/config" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" ) func Test_decodeExtraArgs(t *testing.T) { @@ -30,7 +30,7 @@ func Test_decodeExtraArgs(t *testing.T) { t.Run("decode extra args into map svm", func(t *testing.T) { destGasAmount := uint32(10000) bitmap := uint64(0) - extraArgs := ccip_router.SVMExtraArgsV1{ + extraArgs := fee_quoter.SVMExtraArgsV1{ ComputeUnits: destGasAmount, AccountIsWritableBitmap: bitmap, AllowOutOfOrderExecution: false, @@ -64,7 +64,7 @@ func Test_decodeExtraArgs(t *testing.T) { }) t.Run("decode extra args into map evm", func(t *testing.T) { - extraArgs := ccip_router.EVMExtraArgsV2{ + extraArgs := fee_quoter.EVMExtraArgsV2{ GasLimit: agbinary.Uint128{Lo: 5000, Hi: 0}, AllowOutOfOrderExecution: false, } diff --git a/core/capabilities/ccip/ccipsolana/msghasher.go b/core/capabilities/ccip/ccipsolana/msghasher.go index ff595b83848..7c12de91026 100644 --- a/core/capabilities/ccip/ccipsolana/msghasher.go +++ b/core/capabilities/ccip/ccipsolana/msghasher.go @@ -8,7 +8,7 @@ import ( "github.com/gagliardetto/solana-go" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/ccip" "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -33,8 +33,8 @@ func NewMessageHasherV1(lggr logger.Logger) *MessageHasherV1 { func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (cciptypes.Bytes32, error) { h.lggr.Debugw("hashing message", "msg", msg) - anyToSolanaMessage := ccip_router.Any2SVMRampMessage{} - anyToSolanaMessage.Header = ccip_router.RampMessageHeader{ + anyToSolanaMessage := ccip_offramp.Any2SVMRampMessage{} + anyToSolanaMessage.Header = ccip_offramp.RampMessageHeader{ SourceChainSelector: uint64(msg.Header.SourceChainSelector), DestChainSelector: uint64(msg.Header.DestChainSelector), SequenceNumber: uint64(msg.Header.SequenceNumber), @@ -50,12 +50,12 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty return [32]byte{}, err } - anyToSolanaMessage.TokenAmounts = append(anyToSolanaMessage.TokenAmounts, ccip_router.Any2SVMTokenTransfer{ + anyToSolanaMessage.TokenAmounts = append(anyToSolanaMessage.TokenAmounts, ccip_offramp.Any2SVMTokenTransfer{ SourcePoolAddress: ta.SourcePoolAddress, DestTokenAddress: solana.PublicKeyFromBytes(ta.DestTokenAddress), ExtraData: ta.ExtraData, DestGasAmount: destGasAmount, - Amount: ccip_router.CrossChainAmount{LeBytes: tokens.ToLittleEndianU256(ta.Amount.Int.Uint64())}, + Amount: ccip_offramp.CrossChainAmount{LeBytes: tokens.ToLittleEndianU256(ta.Amount.Int.Uint64())}, }) } @@ -70,9 +70,9 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty return [32]byte(hash), err } -func parseExtraArgsMapWithAccounts(input map[string]any) (ccip_router.Any2SVMRampExtraArgs, []solana.PublicKey, error) { +func parseExtraArgsMapWithAccounts(input map[string]any) (ccip_offramp.Any2SVMRampExtraArgs, []solana.PublicKey, error) { // Parse input map into SolanaExtraArgs - var out ccip_router.Any2SVMRampExtraArgs + var out ccip_offramp.Any2SVMRampExtraArgs var accounts []solana.PublicKey // Iterate through the expected fields in the struct diff --git a/core/capabilities/ccip/ccipsolana/msghasher_test.go b/core/capabilities/ccip/ccipsolana/msghasher_test.go index 9ee22890d5c..c078b124b5b 100644 --- a/core/capabilities/ccip/ccipsolana/msghasher_test.go +++ b/core/capabilities/ccip/ccipsolana/msghasher_test.go @@ -12,7 +12,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-ccip/chains/solana/contracts/tests/config" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/ccip" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -33,7 +33,7 @@ func TestMessageHasher_Any2Solana(t *testing.T) { require.Equal(t, expectedHash, actualHash[:32]) } -func createAny2SolanaMessages(t *testing.T) (cciptypes.Message, ccip_router.Any2SVMRampMessage, []solana.PublicKey) { +func createAny2SolanaMessages(t *testing.T) (cciptypes.Message, ccip_offramp.Any2SVMRampMessage, []solana.PublicKey) { messageID := utils.RandomBytes32() sourceChain := rand.Uint64() @@ -50,7 +50,7 @@ func createAny2SolanaMessages(t *testing.T) (cciptypes.Message, ccip_router.Any2 computeUnit := uint32(1000) bitmap := uint64(10) - extraArgs := ccip_router.Any2SVMRampExtraArgs{ + extraArgs := ccip_offramp.Any2SVMRampExtraArgs{ ComputeUnits: computeUnit, IsWritableBitmap: bitmap, } @@ -72,18 +72,18 @@ func createAny2SolanaMessages(t *testing.T) (cciptypes.Message, ccip_router.Any2 } } - solTokenAmounts := make([]ccip_router.Any2SVMTokenTransfer, 5) + solTokenAmounts := make([]ccip_offramp.Any2SVMTokenTransfer, 5) for z := 0; z < 5; z++ { - solTokenAmounts[z] = ccip_router.Any2SVMTokenTransfer{ + solTokenAmounts[z] = ccip_offramp.Any2SVMTokenTransfer{ SourcePoolAddress: cciptypes.UnknownAddress("DS2tt4BX7YwCw7yrDNwbAdnYrxjeCPeGJbHmZEYC8RTb"), DestTokenAddress: receiver, - Amount: ccip_router.CrossChainAmount{LeBytes: [32]uint8(encodeBigIntToFixedLengthLE(tokenAmount.Int, 32))}, + Amount: ccip_offramp.CrossChainAmount{LeBytes: [32]uint8(encodeBigIntToFixedLengthLE(tokenAmount.Int, 32))}, DestGasAmount: uint32(10), } } - any2SolanaMsg := ccip_router.Any2SVMRampMessage{ - Header: ccip_router.RampMessageHeader{ + any2SolanaMsg := ccip_offramp.Any2SVMRampMessage{ + Header: ccip_offramp.RampMessageHeader{ MessageId: messageID, SourceChainSelector: sourceChain, DestChainSelector: destChain, diff --git a/core/scripts/go.mod b/core/scripts/go.mod index c742a33228d..094aafde042 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -34,7 +34,7 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 @@ -303,14 +303,14 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.9.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect @@ -390,8 +390,8 @@ require ( golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.15.1 // indirect google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect google.golang.org/grpc v1.67.1 // indirect gopkg.in/guregu/null.v4 v4.0.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index a7d7f656ff9..feca7a133ca 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1115,10 +1115,10 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b h1:eNsqumP7VVJudA7gEcTKVFofealwbPJRinUw24uEmII= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 h1:bS51NFGHVjkCy7yu9L2Ss4sBsCW6jpa5GuhRAdWWxzM= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= @@ -1135,8 +1135,8 @@ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2Lp github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 h1:LJQsEuDXSm17akdMjDtUdxkwk5vmaM+VwSCuDHvt25Y= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06/go.mod h1:mSaVleJajXjm9HpXKIIUI/s+R9FPcRXcZzvatRtejCQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVoZN8VwJb/kAZsbDjW+6cgZPgNTcQHJUH9JrA= @@ -1807,10 +1807,10 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/core/services/job/testdata/compact.toml b/core/services/job/testdata/compact.toml index 2fdbbe74763..98fcb32599c 100644 --- a/core/services/job/testdata/compact.toml +++ b/core/services/job/testdata/compact.toml @@ -24,7 +24,7 @@ contractABI = "[\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n [relayConfig.chainReader.contracts.median.configs] LatestRoundRequested = "{\n \"chainSpecificName\": \"RoundRequested\",\n \"readType\": \"event\"\n}\n" -LatestTransmissionDetails = "{\n \"chainSpecificName\": \"latestTransmissionDetails\",\n \"outputModifications\": [\n {\n \"Fields\": [\n \"LatestTimestamp_\"\n ],\n \"Type\": \"epoch to time\"\n },\n {\n \"Fields\": {\n \"LatestAnswer_\": \"LatestAnswer\",\n \"LatestTimestamp_\": \"LatestTimestamp\"\n },\n \"Type\": \"rename\"\n }\n ]\n}\n" +LatestTransmissionDetails = "{\n \"chainSpecificName\": \"latestTransmissionDetails\",\n \"outputModifications\": [\n {\n \"EnablePathTraverse\": false,\n \"Fields\": [\n \"LatestTimestamp_\"\n ],\n \"Type\": \"epoch to time\"\n },\n {\n \"EnablePathTraverse\": false,\n \"Fields\": {\n \"LatestAnswer_\": \"LatestAnswer\",\n \"LatestTimestamp_\": \"LatestTimestamp\"\n },\n \"Type\": \"rename\"\n }\n ]\n}\n" [relayConfig.codec] [relayConfig.codec.configs] diff --git a/core/services/job/testdata/pretty.toml b/core/services/job/testdata/pretty.toml index 1bed3efac0d..df0bad543ae 100644 --- a/core/services/job/testdata/pretty.toml +++ b/core/services/job/testdata/pretty.toml @@ -92,12 +92,14 @@ LatestTransmissionDetails = ''' "chainSpecificName": "latestTransmissionDetails", "outputModifications": [ { + "EnablePathTraverse": false, "Fields": [ "LatestTimestamp_" ], "Type": "epoch to time" }, { + "EnablePathTraverse": false, "Fields": { "LatestAnswer_": "LatestAnswer", "LatestTimestamp_": "LatestTimestamp" diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go index 90d0ce47c55..a1cf3b4c697 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/cs_chain_contracts.go @@ -32,6 +32,20 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" ) +const ( + // https://github.com/smartcontractkit/chainlink/blob/1423e2581e8640d9e5cd06f745c6067bb2893af2/contracts/src/v0.8/ccip/libraries/Internal.sol#L275-L279 + /* + ```Solidity + // bytes4(keccak256("CCIP ChainFamilySelector EVM")) + bytes4 public constant CHAIN_FAMILY_SELECTOR_EVM = 0x2812d52c; + // bytes4(keccak256("CCIP ChainFamilySelector SVM")); + bytes4 public constant CHAIN_FAMILY_SELECTOR_SVM = 0x1e10bdc4; + ``` + */ + EVMFamilySelector = "2812d52c" + SVMFamilySelector = "1e10bdc4" +) + var ( _ deployment.ChangeSet[UpdateOnRampDestsConfig] = UpdateOnRampsDestsChangeset _ deployment.ChangeSet[UpdateOnRampDynamicConfig] = UpdateOnRampDynamicConfigChangeset @@ -1619,15 +1633,14 @@ func isOCR3ConfigSetOnOffRamp( // DefaultFeeQuoterDestChainConfig returns the default FeeQuoterDestChainConfig // with the config enabled/disabled based on the configEnabled flag. -func DefaultFeeQuoterDestChainConfig(configEnabled bool) fee_quoter.FeeQuoterDestChainConfig { - // https://github.com/smartcontractkit/ccip/blob/c4856b64bd766f1ddbaf5d13b42d3c4b12efde3a/contracts/src/v0.8/ccip/libraries/Internal.sol#L337-L337 - /* - ```Solidity - // bytes4(keccak256("CCIP ChainFamilySelector EVM")) - bytes4 public constant CHAIN_FAMILY_SELECTOR_EVM = 0x2812d52c; - ``` - */ - evmFamilySelector, _ := hex.DecodeString("2812d52c") +func DefaultFeeQuoterDestChainConfig(configEnabled bool, destChainSelector ...uint64) fee_quoter.FeeQuoterDestChainConfig { + familySelector, _ := hex.DecodeString(EVMFamilySelector) // evm + if len(destChainSelector) > 0 { + destFamily, _ := chain_selectors.GetSelectorFamily(destChainSelector[0]) + if destFamily == chain_selectors.FamilySolana { + familySelector, _ = hex.DecodeString(SVMFamilySelector) // solana + } + } return fee_quoter.FeeQuoterDestChainConfig{ IsEnabled: configEnabled, MaxNumberOfTokensPerMsg: 10, @@ -1645,6 +1658,6 @@ func DefaultFeeQuoterDestChainConfig(configEnabled bool) fee_quoter.FeeQuoterDes DefaultTxGasLimit: 200_000, GasMultiplierWeiPerEth: 11e17, // Gas multiplier in wei per eth is scaled by 1e18, so 11e17 is 1.1 = 110% NetworkFeeUSDCents: 1, - ChainFamilySelector: [4]byte(evmFamilySelector), + ChainFamilySelector: [4]byte(familySelector), } } diff --git a/deployment/ccip/changeset/cs_deploy_chain.go b/deployment/ccip/changeset/cs_deploy_chain.go index 2aba98478e1..35684fd102b 100644 --- a/deployment/ccip/changeset/cs_deploy_chain.go +++ b/deployment/ccip/changeset/cs_deploy_chain.go @@ -12,11 +12,14 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "golang.org/x/sync/errgroup" + chainsel "github.com/smartcontractkit/chain-selectors" + solBinary "github.com/gagliardetto/binary" solRpc "github.com/gagliardetto/solana-go/rpc" - chainsel "github.com/smartcontractkit/chain-selectors" + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" @@ -34,10 +37,6 @@ import ( var _ deployment.ChangeSet[DeployChainContractsConfig] = DeployChainContractsChangeset -var ( - EnableExecutionAfter = int64(1800) // 30min -) - // DeployChainContracts deploys all new CCIP v1.6 or later contracts for the given chains. // It returns the new addresses for the contracts. // DeployChainContractsChangeset is idempotent. If there is an error, it will return the successfully deployed addresses and the error so that the caller can call the @@ -534,7 +533,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a } // TODO: move everything below to solana file -func solRouterProgramData(e deployment.Environment, chain deployment.SolChain, ccipRouterProgram solana.PublicKey) (struct { +func solProgramData(e deployment.Environment, chain deployment.SolChain, programID solana.PublicKey) (struct { DataType uint32 Address solana.PublicKey }, error) { @@ -542,7 +541,7 @@ func solRouterProgramData(e deployment.Environment, chain deployment.SolChain, c DataType uint32 Address solana.PublicKey } - data, err := chain.Client.GetAccountInfoWithOpts(e.GetContext(), ccipRouterProgram, &solRpc.GetAccountInfoOpts{ + data, err := chain.Client.GetAccountInfoWithOpts(e.GetContext(), programID, &solRpc.GetAccountInfoOpts{ Commitment: solRpc.CommitmentConfirmed, }) if err != nil { @@ -556,30 +555,31 @@ func solRouterProgramData(e deployment.Environment, chain deployment.SolChain, c return programData, nil } -func initializeRouter(e deployment.Environment, chain deployment.SolChain, ccipRouterProgram solana.PublicKey, linkTokenAddress solana.PublicKey) error { - programData, err := solRouterProgramData(e, chain, ccipRouterProgram) +func initializeRouter( + e deployment.Environment, + chain deployment.SolChain, + ccipRouterProgram solana.PublicKey, + linkTokenAddress solana.PublicKey, + feeQuoterAddress solana.PublicKey, +) error { + programData, err := solProgramData(e, chain, ccipRouterProgram) if err != nil { return fmt.Errorf("failed to get solana router program data: %w", err) } // addressing errcheck in the next PR routerConfigPDA, _, _ := solState.FindConfigPDA(ccipRouterProgram) - routerStatePDA, _, _ := solState.FindStatePDA(ccipRouterProgram) - externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(ccipRouterProgram) externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) instruction, err := solRouter.NewInitializeInstruction( - chain.Selector, // chain selector - EnableExecutionAfter, // period to wait before allowing manual execution - solana.PublicKey{}, // fee aggregator (TODO: changeset to set the fee aggregator) - linkTokenAddress, // link token mint - deployment.SolDefaultMaxFeeJuelsPerMsg, // max fee juels per msg + chain.Selector, // chain selector + solana.PublicKey{}, // fee aggregator (TODO: changeset to set the fee aggregator) + feeQuoterAddress, + linkTokenAddress, // link token mint routerConfigPDA, - routerStatePDA, chain.DeployerKey.PublicKey(), solana.SystemProgramID, ccipRouterProgram, programData.Address, - externalExecutionConfigPDA, externalTokenPoolsSignerPDA, ).ValidateAndBuild() @@ -593,6 +593,88 @@ func initializeRouter(e deployment.Environment, chain deployment.SolChain, ccipR return nil } +func initializeFeeQuoter( + e deployment.Environment, + chain deployment.SolChain, + ccipRouterProgram solana.PublicKey, + linkTokenAddress solana.PublicKey, + feeQuoterAddress solana.PublicKey, + offRampAddress solana.PublicKey, +) error { + programData, err := solProgramData(e, chain, feeQuoterAddress) + if err != nil { + return fmt.Errorf("failed to get solana router program data: %w", err) + } + offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) + feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) + + instruction, err := solFeeQuoter.NewInitializeInstruction( + linkTokenAddress, + deployment.SolDefaultMaxFeeJuelsPerMsg, + ccipRouterProgram, + offRampBillingSignerPDA, + feeQuoterConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + feeQuoterAddress, + programData.Address, + ).ValidateAndBuild() + + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { + return fmt.Errorf("failed to confirm instructions: %w", err) + } + e.Logger.Infow("Initialized fee quoter", "chain", chain.String()) + return nil +} + +func intializeOffRamp( + e deployment.Environment, + chain deployment.SolChain, + ccipRouterProgram solana.PublicKey, + feeQuoterAddress solana.PublicKey, + offRampAddress solana.PublicKey, + addressLookupTable solana.PublicKey, +) error { + programData, err := solProgramData(e, chain, offRampAddress) + if err != nil { + return fmt.Errorf("failed to get solana router program data: %w", err) + } + offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(offRampAddress) + offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) + offRampStatePDA, _, _ := solState.FindOfframpStatePDA(offRampAddress) + offRampExternalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(offRampAddress) + offRampTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(offRampAddress) + + instruction, err := solOffRamp.NewInitializeInstruction( + chain.Selector, + deployment.EnableExecutionAfter, + offRampConfigPDA, + offRampReferenceAddressesPDA, + ccipRouterProgram, + feeQuoterAddress, + addressLookupTable, + offRampStatePDA, + offRampExternalExecutionConfigPDA, + offRampTokenPoolsSignerPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + offRampAddress, + programData.Address, + ).ValidateAndBuild() + + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { + return fmt.Errorf("failed to confirm instructions: %w", err) + } + e.Logger.Infow("Initialized offRamp", "chain", chain.String()) + return nil +} + func deployChainContractsSolana( e deployment.Environment, chain deployment.SolChain, @@ -611,7 +693,57 @@ func deployChainContractsSolana( return fmt.Errorf("failed to get link token address for chain %s", chain.String()) } - // ROUTER DEPLOY AND INITIALIZE + // initialize this last with every address we need + var addressLookupTable solana.PublicKey + if chainState.OfframpAddressLookupTable.IsZero() { + addressLookupTable, err = solCommonUtil.SetupLookupTable( + e.GetContext(), + chain.Client, + *chain.DeployerKey, + []solana.PublicKey{ + // system + solana.SystemProgramID, + solana.ComputeBudget, + solana.SysVarInstructionsPubkey, + // token + solana.Token2022ProgramID, + solana.TokenProgramID, + solana.SPLAssociatedTokenAccountProgramID, + }) + + if err != nil { + return fmt.Errorf("failed to create lookup table: %w", err) + } + err = ab.Save(chain.Selector, addressLookupTable.String(), deployment.NewTypeAndVersion(OfframpAddressLookupTable, deployment.Version1_0_0)) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + } + + // FEE QUOTER DEPLOY + var feeQuoterAddress solana.PublicKey + if chainState.FeeQuoter.IsZero() { + // deploy fee quoter + programID, err := chain.DeployProgram(e.Logger, "fee_quoter") + if err != nil { + return fmt.Errorf("failed to deploy program: %w", err) + } + + tv := deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_0_0) + e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) + + feeQuoterAddress = solana.MustPublicKeyFromBase58(programID) + err = ab.Save(chain.Selector, programID, tv) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + } else { + e.Logger.Infow("Using existing fee quoter", "addr", chainState.FeeQuoter.String()) + feeQuoterAddress = chainState.FeeQuoter + } + solFeeQuoter.SetProgramID(feeQuoterAddress) + + // ROUTER DEPLOY var ccipRouterProgram solana.PublicKey if chainState.Router.IsZero() { // deploy router @@ -634,19 +766,65 @@ func deployChainContractsSolana( } solRouter.SetProgramID(ccipRouterProgram) - // check if solana router is initialised + // OFFRAMP DEPLOY + var offRampAddress solana.PublicKey + if chainState.OffRamp.IsZero() { + // deploy offramp + programID, err := chain.DeployProgram(e.Logger, "ccip_offramp") + if err != nil { + return fmt.Errorf("failed to deploy program: %w", err) + } + tv := deployment.NewTypeAndVersion(OffRamp, deployment.Version1_0_0) + e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) + offRampAddress = solana.MustPublicKeyFromBase58(programID) + err = ab.Save(chain.Selector, programID, tv) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + } else { + e.Logger.Infow("Using existing offramp", "addr", chainState.OffRamp.String()) + offRampAddress = chainState.OffRamp + } + solOffRamp.SetProgramID(offRampAddress) + + // FEE QUOTER INITIALIZE + var fqConfig solFeeQuoter.Config + feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) + err = chain.GetAccountDataBorshInto(e.GetContext(), feeQuoterConfigPDA, &fqConfig) + if err != nil { + if err2 := initializeFeeQuoter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress, offRampAddress); err2 != nil { + return err2 + } + } else { + e.Logger.Infow("Fee quoter already initialized, skipping initialization", "chain", chain.String()) + } + + // ROUTER INITIALIZE var routerConfigAccount solRouter.Config // addressing errcheck in the next PR routerConfigPDA, _, _ := solState.FindConfigPDA(ccipRouterProgram) err = chain.GetAccountDataBorshInto(e.GetContext(), routerConfigPDA, &routerConfigAccount) if err != nil { - if err2 := initializeRouter(e, chain, ccipRouterProgram, chainState.LinkToken); err2 != nil { + if err2 := initializeRouter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress); err2 != nil { return err2 } } else { e.Logger.Infow("Router already initialized, skipping initialization", "chain", chain.String()) } + // OFFRAMP INITIALIZE + var offRampConfigAccount solOffRamp.Config + offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(offRampAddress) + err = chain.GetAccountDataBorshInto(e.GetContext(), offRampConfigPDA, &offRampConfigAccount) + if err != nil { + if err2 := intializeOffRamp(e, chain, ccipRouterProgram, feeQuoterAddress, offRampAddress, addressLookupTable); err2 != nil { + return err2 + } + } else { + e.Logger.Infow("Offramp already initialized, skipping initialization", "chain", chain.String()) + } + + // TOKEN POOL DEPLOY var tokenPoolProgram solana.PublicKey if chainState.TokenPool.IsZero() { // TODO: there should be two token pools deployed one of each type (lock/burn) @@ -667,42 +845,35 @@ func deployChainContractsSolana( tokenPoolProgram = chainState.TokenPool } - // initialize this last with every address we need - if chainState.AddressLookupTable.IsZero() { - // addressing errcheck in the next PR - routerConfigPDA, _, _ := solState.FindConfigPDA(ccipRouterProgram) - routerStatePDA, _, _ := solState.FindStatePDA(ccipRouterProgram) - externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(ccipRouterProgram) - externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) - table, err := solCommonUtil.SetupLookupTable( - e.GetContext(), - chain.Client, - *chain.DeployerKey, - []solana.PublicKey{ - // system - solana.SystemProgramID, - solana.ComputeBudget, - solana.SysVarInstructionsPubkey, - // router - ccipRouterProgram, - routerConfigPDA, - routerStatePDA, - externalExecutionConfigPDA, - externalTokenPoolsSignerPDA, - // token pools - tokenPoolProgram, - // token - solana.Token2022ProgramID, - solana.TokenProgramID, - solana.SPLAssociatedTokenAccountProgramID, - }) - if err != nil { - return fmt.Errorf("failed to create lookup table: %w", err) - } - err = ab.Save(chain.Selector, table.String(), deployment.NewTypeAndVersion(AddressLookupTable, deployment.Version1_0_0)) - if err != nil { - return fmt.Errorf("failed to save address: %w", err) - } + externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(ccipRouterProgram) + externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) + feeBillingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(ccipRouterProgram) + linkFqBillingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(chainState.LinkToken, feeQuoterAddress) + offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) + offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) + + if err := solCommonUtil.ExtendLookupTable(e.GetContext(), chain.Client, addressLookupTable, *chain.DeployerKey, + []solana.PublicKey{ + // token pools + tokenPoolProgram, + // offramp + offRampAddress, + offRampConfigPDA, + offRampReferenceAddressesPDA, + offRampBillingSignerPDA, + // router + ccipRouterProgram, + routerConfigPDA, + externalExecutionConfigPDA, + externalTokenPoolsSignerPDA, + // fee quoter + feeBillingSignerPDA, + feeQuoterConfigPDA, + feeQuoterAddress, + linkFqBillingConfigPDA, + }); err != nil { + return fmt.Errorf("failed to extend lookup table: %w", err) } + return nil } diff --git a/deployment/ccip/changeset/solana/cs_add_remote_chain.go b/deployment/ccip/changeset/solana/cs_add_remote_chain.go new file mode 100644 index 00000000000..2053ff32c0d --- /dev/null +++ b/deployment/ccip/changeset/solana/cs_add_remote_chain.go @@ -0,0 +1,212 @@ +package solana + +import ( + "context" + // "errors" + "fmt" + "strconv" + + "github.com/gagliardetto/solana-go" + + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" + solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" + solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" + solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + + chainsel "github.com/smartcontractkit/chain-selectors" + + "github.com/smartcontractkit/chainlink/deployment" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" +) + +// ADD REMOTE CHAIN +type AddRemoteChainToSolanaConfig struct { + ChainSelector uint64 + // UpdatesByChain is a mapping of SVM chain selector -> remote chain selector -> remote chain config update + UpdatesByChain map[uint64]RemoteChainConfigSolana + // Disallow mixing MCMS/non-MCMS per chain for simplicity. + // (can still be achieved by calling this function multiple times) + MCMS *cs.MCMSConfig +} + +type RemoteChainConfigSolana struct { + // source + EnabledAsSource bool + // destination + RouterDestinationConfig solRouter.DestChainConfig + FeeQuoterDestinationConfig solFeeQuoter.DestChainConfig +} + +func (cfg AddRemoteChainToSolanaConfig) Validate(e deployment.Environment) error { + state, err := cs.LoadOnchainState(e) + if err != nil { + return fmt.Errorf("failed to load onchain state: %w", err) + } + chainState := state.SolChains[cfg.ChainSelector] + chain := e.SolChains[cfg.ChainSelector] + if err := validateRouterConfig(chain, chainState); err != nil { + return err + } + if err := validateFeeQuoterConfig(chain, chainState); err != nil { + return err + } + if err := validateOffRampConfig(chain, chainState); err != nil { + return err + } + + if err := commoncs.ValidateOwnershipSolana(e.GetContext(), cfg.MCMS != nil, e.SolChains[cfg.ChainSelector].DeployerKey.PublicKey(), chainState.Timelock, chainState.Router); err != nil { + return fmt.Errorf("failed to validate ownership: %w", err) + } + var routerConfigAccount solRouter.Config + // already validated that router config exists + _ = chain.GetAccountDataBorshInto(context.Background(), chainState.RouterConfigPDA, &routerConfigAccount) + + supportedChains := state.SupportedChains() + for remote := range cfg.UpdatesByChain { + if _, ok := supportedChains[remote]; !ok { + return fmt.Errorf("remote chain %d is not supported", remote) + } + if remote == routerConfigAccount.SvmChainSelector { + return fmt.Errorf("cannot add remote chain %d with same chain selector as current chain %d", remote, cfg.ChainSelector) + } + } + + return nil +} + +// Adds new remote chain configurations +func AddRemoteChainToSolana(e deployment.Environment, cfg AddRemoteChainToSolanaConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + + s, err := cs.LoadOnchainState(e) + if err != nil { + return deployment.ChangesetOutput{}, err + } + + ab := deployment.NewMemoryAddressBook() + err = doAddRemoteChainToSolana(e, s, cfg.ChainSelector, cfg.UpdatesByChain, ab) + if err != nil { + return deployment.ChangesetOutput{AddressBook: ab}, err + } + return deployment.ChangesetOutput{AddressBook: ab}, nil +} + +func doAddRemoteChainToSolana( + e deployment.Environment, + s cs.CCIPOnChainState, + chainSel uint64, + updates map[uint64]RemoteChainConfigSolana, + ab deployment.AddressBook) error { + chain := e.SolChains[chainSel] + ccipRouterID := s.SolChains[chainSel].Router + feeQuoterID := s.SolChains[chainSel].FeeQuoter + offRampID := s.SolChains[chainSel].OffRamp + lookUpTableEntries := make([]solana.PublicKey, 0) + + for remoteChainSel, update := range updates { + var onRampBytes [64]byte + // already verified, skipping errcheck + remoteChainFamily, _ := chainsel.GetSelectorFamily(remoteChainSel) + switch remoteChainFamily { + case chainsel.FamilySolana: + return fmt.Errorf("support for solana chain as remote chain is not implemented yet %d", remoteChainSel) + case chainsel.FamilyEVM: + onRampAddress := s.Chains[remoteChainSel].OnRamp.Address().String() + if onRampAddress == "" { + return fmt.Errorf("onramp address not found for chain %d", remoteChainSel) + } + addressBytes := []byte(onRampAddress) + copy(onRampBytes[:], addressBytes) + } + + // verified while loading state + fqDestChainPDA, _, _ := solState.FindFqDestChainPDA(remoteChainSel, feeQuoterID) + routerDestChainPDA, _ := solState.FindDestChainStatePDA(remoteChainSel, ccipRouterID) + offRampSourceChainPDA, _, _ := solState.FindOfframpSourceChainPDA(remoteChainSel, s.SolChains[chainSel].OffRamp) + + lookUpTableEntries = append(lookUpTableEntries, + fqDestChainPDA, + routerDestChainPDA, + offRampSourceChainPDA, + ) + + solRouter.SetProgramID(ccipRouterID) + routerIx, err := solRouter.NewAddChainSelectorInstruction( + remoteChainSel, + update.RouterDestinationConfig, + routerDestChainPDA, + s.SolChains[chainSel].RouterConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to generate instructions: %w", err) + } + + solFeeQuoter.SetProgramID(feeQuoterID) + feeQuoterIx, err := solFeeQuoter.NewAddDestChainInstruction( + remoteChainSel, + update.FeeQuoterDestinationConfig, + s.SolChains[chainSel].FeeQuoterConfigPDA, + fqDestChainPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to generate instructions: %w", err) + } + + solOffRamp.SetProgramID(offRampID) + validSourceChainConfig := solOffRamp.SourceChainConfig{ + OnRamp: [2][64]byte{onRampBytes, [64]byte{}}, + IsEnabled: update.EnabledAsSource, + } + offRampIx, err := solOffRamp.NewAddSourceChainInstruction( + remoteChainSel, + validSourceChainConfig, + offRampSourceChainPDA, + s.SolChains[chainSel].OffRampConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to generate instructions: %w", err) + } + + err = chain.Confirm([]solana.Instruction{routerIx, feeQuoterIx, offRampIx}) + if err != nil { + return fmt.Errorf("failed to confirm instructions: %w", err) + } + + tv := deployment.NewTypeAndVersion(cs.RemoteDest, deployment.Version1_0_0) + remoteChainSelStr := strconv.FormatUint(remoteChainSel, 10) + tv.AddLabel(remoteChainSelStr) + err = ab.Save(chainSel, routerDestChainPDA.String(), tv) + if err != nil { + return fmt.Errorf("failed to save dest chain state to address book: %w", err) + } + + tv = deployment.NewTypeAndVersion(cs.RemoteSource, deployment.Version1_0_0) + tv.AddLabel(remoteChainSelStr) + err = ab.Save(chainSel, offRampSourceChainPDA.String(), tv) + if err != nil { + return fmt.Errorf("failed to save source chain state to address book: %w", err) + } + } + + if err := solCommonUtil.ExtendLookupTable( + e.GetContext(), + chain.Client, + s.SolChains[chainSel].OfframpAddressLookupTable, + *chain.DeployerKey, + lookUpTableEntries, + ); err != nil { + return fmt.Errorf("failed to extend lookup table: %w", err) + } + + return nil +} diff --git a/deployment/ccip/changeset/solana/cs_billing.go b/deployment/ccip/changeset/solana/cs_billing.go new file mode 100644 index 00000000000..af1518ddd44 --- /dev/null +++ b/deployment/ccip/changeset/solana/cs_billing.go @@ -0,0 +1,186 @@ +package solana + +import ( + "context" + "fmt" + + "github.com/gagliardetto/solana-go" + + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" + solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" + solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" + + ata "github.com/gagliardetto/solana-go/programs/associated-token-account" + + "github.com/smartcontractkit/chainlink/deployment" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" +) + +var _ deployment.ChangeSet[BillingTokenConfig] = AddBillingToken +var _ deployment.ChangeSet[BillingTokenForRemoteChainConfig] = AddBillingTokenForRemoteChain + +// ADD BILLING TOKEN +type BillingTokenConfig struct { + ChainSelector uint64 + TokenPubKey string + TokenProgramName string + Config solFeeQuoter.BillingTokenConfig +} + +func (cfg BillingTokenConfig) Validate(e deployment.Environment) error { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { + return err + } + if _, err := GetTokenProgramID(cfg.TokenProgramName); err != nil { + return err + } + + chain := e.SolChains[cfg.ChainSelector] + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + if err := validateFeeQuoterConfig(chain, chainState); err != nil { + return err + } + // check if already setup + billingConfigPDA, _, err := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) + if err != nil { + return fmt.Errorf("failed to find billing token config pda (mint: %s, feeQuoter: %s): %w", tokenPubKey.String(), chainState.FeeQuoter.String(), err) + } + var token0ConfigAccount solFeeQuoter.BillingTokenConfigWrapper + if err := chain.GetAccountDataBorshInto(context.Background(), billingConfigPDA, &token0ConfigAccount); err == nil { + return fmt.Errorf("billing token config already exists for (mint: %s, feeQuoter: %s)", tokenPubKey.String(), chainState.FeeQuoter.String()) + } + return nil +} + +func AddBillingToken(e deployment.Environment, cfg BillingTokenConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + chain, ok := e.SolChains[cfg.ChainSelector] + if !ok { + return deployment.ChangesetOutput{}, fmt.Errorf("chain selector %d not found in environment", cfg.ChainSelector) + } + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + // verified + tokenprogramID, _ := GetTokenProgramID(cfg.TokenProgramName) + // TODO: add this to offramp address lookup table + tokenBillingPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) + + // addressing errcheck in the next PR + billingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(chainState.Router) + token2022Receiver, _, _ := solTokenUtil.FindAssociatedTokenAddress(tokenprogramID, tokenPubKey, billingSignerPDA) + + e.Logger.Infow("chainState.FeeQuoterConfigPDA", "feeQuoterConfigPDA", chainState.FeeQuoterConfigPDA.String()) + solFeeQuoter.SetProgramID(chainState.FeeQuoter) + ixConfig, cerr := solFeeQuoter.NewAddBillingTokenConfigInstruction( + cfg.Config, + chainState.FeeQuoterConfigPDA, + tokenBillingPDA, + tokenprogramID, + tokenPubKey, + token2022Receiver, + chain.DeployerKey.PublicKey(), // ccip admin + billingSignerPDA, + ata.ProgramID, + solana.SystemProgramID, + ).ValidateAndBuild() + if cerr != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", cerr) + } + + instructions := []solana.Instruction{ixConfig} + if err := chain.Confirm(instructions); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + + if err := solCommonUtil.ExtendLookupTable( + e.GetContext(), + chain.Client, + chainState.OfframpAddressLookupTable, + *chain.DeployerKey, + []solana.PublicKey{tokenBillingPDA}, + ); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to extend lookup table: %w", err) + } + + e.Logger.Infow("Billing token added", "chainSelector", cfg.ChainSelector, "tokenPubKey", tokenPubKey.String()) + return deployment.ChangesetOutput{}, nil +} + +// ADD BILLING TOKEN FOR REMOTE CHAIN +type BillingTokenForRemoteChainConfig struct { + ChainSelector uint64 + RemoteChainSelector uint64 + Config solFeeQuoter.TokenTransferFeeConfig + TokenPubKey string +} + +func (cfg BillingTokenForRemoteChainConfig) Validate(e deployment.Environment) error { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { + return err + } + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + chain := e.SolChains[cfg.ChainSelector] + if err := validateFeeQuoterConfig(chain, chainState); err != nil { + return fmt.Errorf("fee quoter validation failed: %w", err) + } + // check if desired state already exists + remoteBillingPDA, _, err := solState.FindFqPerChainPerTokenConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.FeeQuoter) + if err != nil { + return fmt.Errorf("failed to find remote billing token config pda for (remoteSelector: %d, mint: %s, feeQuoter: %s): %w", cfg.RemoteChainSelector, tokenPubKey.String(), chainState.FeeQuoter.String(), err) + } + var remoteBillingAccount solFeeQuoter.PerChainPerTokenConfig + if err := chain.GetAccountDataBorshInto(context.Background(), remoteBillingPDA, &remoteBillingAccount); err == nil { + return fmt.Errorf("billing token config already exists for (remoteSelector: %d, mint: %s, feeQuoter: %s)", cfg.RemoteChainSelector, tokenPubKey.String(), chainState.FeeQuoter.String()) + } + return nil +} + +func AddBillingTokenForRemoteChain(e deployment.Environment, cfg BillingTokenForRemoteChainConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + + chain := e.SolChains[cfg.ChainSelector] + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + remoteBillingPDA, _, _ := solState.FindFqPerChainPerTokenConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.FeeQuoter) + + ix, err := solFeeQuoter.NewSetTokenTransferFeeConfigInstruction( + cfg.RemoteChainSelector, + tokenPubKey, + cfg.Config, + chainState.FeeQuoterConfigPDA, + remoteBillingPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + instructions := []solana.Instruction{ix} + if err := chain.Confirm(instructions); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + + if err := solCommonUtil.ExtendLookupTable( + e.GetContext(), + chain.Client, + chainState.OfframpAddressLookupTable, + *chain.DeployerKey, + []solana.PublicKey{remoteBillingPDA}, + ); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to extend lookup table: %w", err) + } + + e.Logger.Infow("Token billing set for remote chain", "chainSelector ", cfg.ChainSelector, "remoteChainSelector ", cfg.RemoteChainSelector, "tokenPubKey", tokenPubKey.String()) + return deployment.ChangesetOutput{}, nil +} diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts.go b/deployment/ccip/changeset/solana/cs_chain_contracts.go index a5a4bfae663..1dd965571c4 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts.go @@ -2,38 +2,29 @@ package solana import ( "context" - "errors" "fmt" - "strconv" "github.com/gagliardetto/solana-go" + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/token_pool" - solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" + solTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/token_pool" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" - solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" - - ata "github.com/gagliardetto/solana-go/programs/associated-token-account" - - chainsel "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink/deployment" cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" - commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" ) -var _ deployment.ChangeSet[AddRemoteChainToSolanaConfig] = AddRemoteChainToSolana -var _ deployment.ChangeSet[TokenPoolConfig] = AddTokenPool -var _ deployment.ChangeSet[RemoteChainTokenPoolConfig] = SetupTokenPoolForRemoteChain var _ deployment.ChangeSet[cs.SetOCR3OffRampConfig] = SetOCR3ConfigSolana +var _ deployment.ChangeSet[AddRemoteChainToSolanaConfig] = AddRemoteChainToSolana var _ deployment.ChangeSet[BillingTokenConfig] = AddBillingToken var _ deployment.ChangeSet[BillingTokenForRemoteChainConfig] = AddBillingTokenForRemoteChain var _ deployment.ChangeSet[RegisterTokenAdminRegistryConfig] = RegisterTokenAdminRegistry var _ deployment.ChangeSet[TransferAdminRoleTokenAdminRegistryConfig] = TransferAdminRoleTokenAdminRegistry var _ deployment.ChangeSet[AcceptAdminRoleTokenAdminRegistryConfig] = AcceptAdminRoleTokenAdminRegistry +// HELPER FUNCTIONS // GetTokenProgramID returns the program ID for the given token program name func GetTokenProgramID(programName string) (solana.PublicKey, error) { tokenPrograms := map[string]solana.PublicKey{ @@ -49,10 +40,10 @@ func GetTokenProgramID(programName string) (solana.PublicKey, error) { } // GetPoolType returns the token pool type constant for the given string -func GetPoolType(poolType string) (token_pool.PoolType, error) { - poolTypes := map[string]token_pool.PoolType{ - "LockAndRelease": token_pool.LockAndRelease_PoolType, - "BurnAndMint": token_pool.BurnAndMint_PoolType, +func GetPoolType(poolType string) (solTokenPool.PoolType, error) { + poolTypes := map[string]solTokenPool.PoolType{ + "LockAndRelease": solTokenPool.LockAndRelease_PoolType, + "BurnAndMint": solTokenPool.BurnAndMint_PoolType, } poolTypeConstant, ok := poolTypes[poolType] @@ -93,7 +84,7 @@ func commonValidation(e deployment.Environment, selector uint64, tokenPubKey sol func validateRouterConfig(chain deployment.SolChain, chainState cs.SolCCIPChainState) error { if chainState.Router.IsZero() { - return fmt.Errorf("router not found in existing state, deploy the router first chain %d", chain.Selector) + return fmt.Errorf("router not found in existing state, deploy the router first for chain %d", chain.Selector) } // addressing errcheck in the next PR var routerConfigAccount solRouter.Config @@ -104,825 +95,28 @@ func validateRouterConfig(chain deployment.SolChain, chainState cs.SolCCIPChainS return nil } -// ADD REMOTE CHAIN -type AddRemoteChainToSolanaConfig struct { - // UpdatesByChain is a mapping of SVM chain selector -> remote chain selector -> remote chain config update - UpdatesByChain map[uint64]map[uint64]RemoteChainConfigSolana - // Disallow mixing MCMS/non-MCMS per chain for simplicity. - // (can still be achieved by calling this function multiple times) - MCMS *cs.MCMSConfig -} - -// https://github.com/smartcontractkit/chainlink-ccip/blob/771fb9957d818253d833431e7e980669984e1d6a/chains/solana/gobindings/ccip_router/types.go#L1141 -// https://github.com/smartcontractkit/chainlink-ccip/blob/771fb9957d818253d833431e7e980669984e1d6a/chains/solana/contracts/tests/ccip/ccip_router_test.go#L130 -// We are not using solRouter.SourceChainConfig because that would involve the user -// converting the onRamp address into [2][64]byte{} which is not intuitive. -// The solRouter.DestChainConfig on the other hand has a lot of fields and most of them are uint -// So we are using that directly instead of copying over the fields here to reduce -// overhead cost if that type is bumped in chainlink-ccip -type RemoteChainConfigSolana struct { - // source - EnabledAsSource bool - // destination - DestinationConfig solRouter.DestChainConfig -} - -func (cfg AddRemoteChainToSolanaConfig) Validate(e deployment.Environment) error { - state, err := cs.LoadOnchainState(e) - if err != nil { - return fmt.Errorf("failed to load onchain state: %w", err) - } - - supportedChains := state.SupportedChains() - for chainSel, updates := range cfg.UpdatesByChain { - chainState, ok := state.SolChains[chainSel] - if !ok { - return fmt.Errorf("chain %d not found in onchain state", chainSel) - } - chain := e.SolChains[chainSel] - if err := validateRouterConfig(chain, chainState); err != nil { - return err - } - if err := commoncs.ValidateOwnershipSolana(e.GetContext(), cfg.MCMS != nil, e.SolChains[chainSel].DeployerKey.PublicKey(), chainState.Timelock, chainState.Router); err != nil { - return fmt.Errorf("failed to validate ownership: %w", err) - } - var routerConfigAccount solRouter.Config - // already validated that router config exists - _ = chain.GetAccountDataBorshInto(context.Background(), chainState.RouterConfigPDA, &routerConfigAccount) - - for remote := range updates { - if _, ok := supportedChains[remote]; !ok { - return fmt.Errorf("remote chain %d is not supported", remote) - } - if remote == routerConfigAccount.SvmChainSelector { - return fmt.Errorf("cannot add remote chain %d with same chain selector as current chain %d", remote, chainSel) - } - } - } - - return nil -} - -// AddRemoteChainToSolana adds new remote chain configurations to Solana CCIP routers -func AddRemoteChainToSolana(e deployment.Environment, cfg AddRemoteChainToSolanaConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - - s, err := cs.LoadOnchainState(e) - if err != nil { - return deployment.ChangesetOutput{}, err - } - - ab := deployment.NewMemoryAddressBook() - for chainSel, updates := range cfg.UpdatesByChain { - err := doAddRemoteChainToSolana(e, s, chainSel, updates, ab) - if err != nil { - return deployment.ChangesetOutput{AddressBook: ab}, err - } - } - return deployment.ChangesetOutput{AddressBook: ab}, nil -} - -func doAddRemoteChainToSolana( - e deployment.Environment, - s cs.CCIPOnChainState, - chainSel uint64, - updates map[uint64]RemoteChainConfigSolana, - ab deployment.AddressBook) error { - chain := e.SolChains[chainSel] - ccipRouterID := s.SolChains[chainSel].Router - - for remoteChainSel, update := range updates { - var onRampBytes [64]byte - // already verified, skipping errcheck - remoteChainFamily, _ := chainsel.GetSelectorFamily(remoteChainSel) - switch remoteChainFamily { - case chainsel.FamilySolana: - return fmt.Errorf("support for solana chain as remote chain is not implemented yet %d", remoteChainSel) - case chainsel.FamilyEVM: - onRampAddress := s.Chains[remoteChainSel].OnRamp.Address().String() - if onRampAddress == "" { - return fmt.Errorf("onramp address not found for chain %d", remoteChainSel) - } - addressBytes := []byte(onRampAddress) - copy(onRampBytes[:], addressBytes) - } - - validSourceChainConfig := solRouter.SourceChainConfig{ - OnRamp: [2][64]byte{onRampBytes, [64]byte{}}, - IsEnabled: update.EnabledAsSource, - } - // addressing errcheck in the next PR - destChainStatePDA, _ := solState.FindDestChainStatePDA(remoteChainSel, ccipRouterID) - sourceChainStatePDA, _ := solState.FindSourceChainStatePDA(remoteChainSel, ccipRouterID) - - instruction, err := solRouter.NewAddChainSelectorInstruction( - remoteChainSel, - validSourceChainConfig, - update.DestinationConfig, - sourceChainStatePDA, - destChainStatePDA, - s.SolChains[chainSel].RouterConfigPDA, - chain.DeployerKey.PublicKey(), - solana.SystemProgramID, - ).ValidateAndBuild() - - if err != nil { - return fmt.Errorf("failed to generate instructions: %w", err) - } - - err = chain.Confirm([]solana.Instruction{instruction}) - if err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) - } - e.Logger.Infow("Confirmed instruction", "instruction", instruction) - - tv := deployment.NewTypeAndVersion(cs.RemoteDest, deployment.Version1_0_0) - remoteChainSelStr := strconv.FormatUint(remoteChainSel, 10) - tv.AddLabel(remoteChainSelStr) - err = ab.Save(chainSel, destChainStatePDA.String(), tv) - if err != nil { - return fmt.Errorf("failed to save dest chain state to address book: %w", err) - } - - tv = deployment.NewTypeAndVersion(cs.RemoteSource, deployment.Version1_0_0) - tv.AddLabel(remoteChainSelStr) - err = ab.Save(chainSel, sourceChainStatePDA.String(), tv) - if err != nil { - return fmt.Errorf("failed to save source chain state to address book: %w", err) - } - } - - return nil -} - -// SET OCR3 CONFIG -func btoi(b bool) uint8 { - if b { - return 1 - } - return 0 -} - -// SetOCR3OffRamp will set the OCR3 offramp for the given chain. -// to the active configuration on CCIPHome. This -// is used to complete the candidate->active promotion cycle, it's -// run after the candidate is confirmed to be working correctly. -// Multichain is especially helpful for NOP rotations where we have -// to touch all the chain to change signers. -func SetOCR3ConfigSolana(e deployment.Environment, cfg cs.SetOCR3OffRampConfig) (deployment.ChangesetOutput, error) { - state, err := cs.LoadOnchainState(e) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) - } - - if err := cfg.Validate(e, state); err != nil { - return deployment.ChangesetOutput{}, err - } - solChains := state.SolChains - - // cfg.RemoteChainSels will be a bunch of solana chains - // can add this in validate - for _, remote := range cfg.RemoteChainSels { - donID, err := internal.DonIDForChain( - state.Chains[cfg.HomeChainSel].CapabilityRegistry, - state.Chains[cfg.HomeChainSel].CCIPHome, - remote) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to get don id for chain %d: %w", remote, err) - } - args, err := internal.BuildSetOCR3ConfigArgsSolana(donID, state.Chains[cfg.HomeChainSel].CCIPHome, remote) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to build set ocr3 config args: %w", err) - } - // TODO: check if ocr3 has already been set - // set, err := isOCR3ConfigSetSolana(e.Logger, e.Chains[remote], state.Chains[remote].OffRamp, args) - var instructions []solana.Instruction - routerConfigPDA := solChains[remote].RouterConfigPDA - routerStatePDA := solChains[remote].RouterStatePDA - for _, arg := range args { - instruction, err := solRouter.NewSetOcrConfigInstruction( - arg.OCRPluginType, - solRouter.Ocr3ConfigInfo{ - ConfigDigest: arg.ConfigDigest, - F: arg.F, - IsSignatureVerificationEnabled: btoi(arg.IsSignatureVerificationEnabled), - }, - arg.Signers, - arg.Transmitters, - routerConfigPDA, - routerStatePDA, - e.SolChains[remote].DeployerKey.PublicKey(), - ).ValidateAndBuild() - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - instructions = append(instructions, instruction) - } - if cfg.MCMS == nil { - err := e.SolChains[remote].Confirm(instructions) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) - } - } - } - - return deployment.ChangesetOutput{}, nil - - // TODO: timelock mcms support -} - -// ADD TOKEN POOL -type TokenPoolConfig struct { - ChainSelector uint64 - PoolType string - Authority string - TokenPubKey string - TokenProgramName string -} - -func (cfg TokenPoolConfig) Validate(e deployment.Environment) error { - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { - return err - } - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - if chainState.TokenPool.IsZero() { - return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) - } - if _, err := GetPoolType(cfg.PoolType); err != nil { - return err - } - if _, err := GetTokenProgramID(cfg.TokenProgramName); err != nil { - return err - } - - tokenPool := chainState.TokenPool - poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, tokenPool) - if err != nil { - return fmt.Errorf("failed to get token pool config address (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) - } - chain := e.SolChains[cfg.ChainSelector] - var poolConfigAccount token_pool.Config - if err := chain.GetAccountDataBorshInto(context.Background(), poolConfigPDA, &poolConfigAccount); err == nil { - return fmt.Errorf("token pool config already exists for (mint: %s, pool: %s)", tokenPubKey.String(), tokenPool.String()) - } - return nil -} - -func AddTokenPool(e deployment.Environment, cfg TokenPoolConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - authorityPubKey := solana.MustPublicKeyFromBase58(cfg.Authority) - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - - // verified - tokenprogramID, _ := GetTokenProgramID(cfg.TokenProgramName) - poolType, _ := GetPoolType(cfg.PoolType) - poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) - poolSigner, _ := solTokenUtil.TokenPoolSignerAddress(tokenPubKey, chainState.TokenPool) - - // addressing errcheck in the next PR - rampAuthorityPubKey, _, _ := solState.FindExternalExecutionConfigPDA(chainState.Router) - - // ata for token pool - createI, tokenPoolATA, err := solTokenUtil.CreateAssociatedTokenAccount( - tokenprogramID, - tokenPubKey, - poolSigner, - chain.DeployerKey.PublicKey(), - ) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to create associated token account for tokenpool (mint: %s, pool: %s): %w", tokenPubKey.String(), chainState.TokenPool.String(), err) - } - - token_pool.SetProgramID(chainState.TokenPool) - // initialize token pool for token - poolInitI, err := token_pool.NewInitializeInstruction( - poolType, - rampAuthorityPubKey, - poolConfigPDA, - tokenPubKey, - poolSigner, - authorityPubKey, // this is assumed to be chain.DeployerKey for now (owner of token pool) - solana.SystemProgramID, - ).ValidateAndBuild() - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - // make pool mint_authority for token (required for burn/mint) - authI, err := solTokenUtil.SetTokenMintAuthority( - tokenprogramID, - poolSigner, - tokenPubKey, - chain.DeployerKey.PublicKey(), - ) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - instructions := []solana.Instruction{createI, poolInitI, authI} - - // add signer here if authority is different from deployer key - if err := chain.Confirm(instructions); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) - } - e.Logger.Infow("Created new token pool config", "token_pool_ata", tokenPoolATA.String(), "pool_config", poolConfigPDA.String(), "pool_signer", poolSigner.String()) - e.Logger.Infow("Set mint authority", "poolSigner", poolSigner.String()) - - return deployment.ChangesetOutput{}, nil -} - -// ADD TOKEN POOL FOR REMOTE CHAIN -type RemoteChainTokenPoolConfig struct { - ChainSelector uint64 - RemoteChainSelector uint64 - TokenPubKey string - RemoteConfig token_pool.RemoteConfig - InboundRateLimit token_pool.RateLimitConfig - OutboundRateLimit token_pool.RateLimitConfig -} - -func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - if err := commonValidation(e, cfg.ChainSelector, solana.MustPublicKeyFromBase58(cfg.TokenPubKey)); err != nil { - return err - } - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - if chainState.TokenPool.IsZero() { - return fmt.Errorf("token pool not found in existing state, deploy token pool for chain %d", cfg.ChainSelector) - } - - chain := e.SolChains[cfg.ChainSelector] - tokenPool := chainState.TokenPool - - // check if pool config exists (cannot do remote setup without it) - poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, tokenPool) - if err != nil { - return fmt.Errorf("failed to get token pool config address (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) - } - var poolConfigAccount token_pool.Config - if err := chain.GetAccountDataBorshInto(context.Background(), poolConfigPDA, &poolConfigAccount); err != nil { - return fmt.Errorf("token pool config not found (mint: %s, pool: %s): %w", tokenPubKey.String(), chainState.TokenPool.String(), err) - } - - // check if existing pool setup already has this remote chain configured - remoteChainConfigPDA, _, err := solTokenUtil.TokenPoolChainConfigPDA(cfg.RemoteChainSelector, tokenPubKey, tokenPool) - if err != nil { - return fmt.Errorf("failed to get token pool remote chain config pda (remoteSelector: %d, mint: %s, pool: %s): %w", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String(), err) - } - var remoteChainConfigAccount token_pool.ChainConfig - if err := chain.GetAccountDataBorshInto(context.Background(), remoteChainConfigPDA, &remoteChainConfigAccount); err == nil { - return fmt.Errorf("remote chain config already exists for (remoteSelector: %d, mint: %s, pool: %s)", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String()) - } - return nil -} - -func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainTokenPoolConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - // verified - poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) - remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.TokenPool) - - token_pool.SetProgramID(chainState.TokenPool) - ixConfigure, err := token_pool.NewInitChainRemoteConfigInstruction( - cfg.RemoteChainSelector, - tokenPubKey, - cfg.RemoteConfig, - poolConfigPDA, - remoteChainConfigPDA, - chain.DeployerKey.PublicKey(), - solana.SystemProgramID, - ).ValidateAndBuild() - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) +func validateFeeQuoterConfig(chain deployment.SolChain, chainState cs.SolCCIPChainState) error { + if chainState.FeeQuoter.IsZero() { + return fmt.Errorf("fee quoter not found in existing state, deploy the fee quoter first for chain %d", chain.Selector) } - ixRates, err := token_pool.NewSetChainRateLimitInstruction( - cfg.RemoteChainSelector, - tokenPubKey, - cfg.InboundRateLimit, - cfg.OutboundRateLimit, - poolConfigPDA, - remoteChainConfigPDA, - chain.DeployerKey.PublicKey(), - solana.SystemProgramID, - ).ValidateAndBuild() + var fqConfig solFeeQuoter.Config + feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(chainState.FeeQuoter) + err := chain.GetAccountDataBorshInto(context.Background(), feeQuoterConfigPDA, &fqConfig) if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - instructions := []solana.Instruction{ixConfigure, ixRates} - err = chain.Confirm(instructions) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) - } - return deployment.ChangesetOutput{}, nil -} - -// ADD BILLING TOKEN -type BillingTokenConfig struct { - ChainSelector uint64 - TokenPubKey string - TokenProgramName string - Config solRouter.BillingTokenConfig -} - -func (cfg BillingTokenConfig) Validate(e deployment.Environment) error { - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { - return err - } - if _, err := GetTokenProgramID(cfg.TokenProgramName); err != nil { - return err - } - - chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - if err := validateRouterConfig(chain, chainState); err != nil { - return err - } - // check if already setup - billingConfigPDA, _, err := solState.FindFeeBillingTokenConfigPDA(tokenPubKey, chainState.Router) - if err != nil { - return fmt.Errorf("failed to find billing token config pda (mint: %s, router: %s): %w", tokenPubKey.String(), chainState.Router.String(), err) - } - var token0ConfigAccount solRouter.BillingTokenConfigWrapper - if err := chain.GetAccountDataBorshInto(context.Background(), billingConfigPDA, &token0ConfigAccount); err == nil { - return fmt.Errorf("billing token config already exists for (mint: %s, router: %s)", tokenPubKey.String(), chainState.Router.String()) + return fmt.Errorf("fee quoter config not found in existing state, initialize the fee quoter first %d", chain.Selector) } return nil } -func AddBillingToken(e deployment.Environment, cfg BillingTokenConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - chain, ok := e.SolChains[cfg.ChainSelector] - if !ok { - return deployment.ChangesetOutput{}, fmt.Errorf("chain selector %d not found in environment", cfg.ChainSelector) - } - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - - solRouter.SetProgramID(chainState.Router) - - // verified - tokenprogramID, _ := GetTokenProgramID(cfg.TokenProgramName) - billingConfigPDA, _, _ := solState.FindFeeBillingTokenConfigPDA(tokenPubKey, chainState.Router) - - // addressing errcheck in the next PR - billingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(chainState.Router) - token2022Receiver, _, _ := solTokenUtil.FindAssociatedTokenAddress(tokenprogramID, tokenPubKey, billingSignerPDA) - - ixConfig, cerr := solRouter.NewAddBillingTokenConfigInstruction( - cfg.Config, - chainState.RouterConfigPDA, - billingConfigPDA, - tokenprogramID, - tokenPubKey, - token2022Receiver, - chain.DeployerKey.PublicKey(), // ccip admin - billingSignerPDA, - ata.ProgramID, - solana.SystemProgramID, - ).ValidateAndBuild() - if cerr != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", cerr) +func validateOffRampConfig(chain deployment.SolChain, chainState cs.SolCCIPChainState) error { + if chainState.OffRamp.IsZero() { + return fmt.Errorf("offramp not found in existing state, deploy the offramp first for chain %d", chain.Selector) } - - instructions := []solana.Instruction{ixConfig} - if err := chain.Confirm(instructions); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) - } - e.Logger.Infow("Billing token added", "chainSelector", cfg.ChainSelector, "tokenPubKey", tokenPubKey.String()) - return deployment.ChangesetOutput{}, nil -} - -// ADD BILLING TOKEN FOR REMOTE CHAIN -type BillingTokenForRemoteChainConfig struct { - ChainSelector uint64 - RemoteChainSelector uint64 - Config solRouter.TokenBilling - TokenPubKey string -} - -func (cfg BillingTokenForRemoteChainConfig) Validate(e deployment.Environment) error { - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { - return err - } - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - chain := e.SolChains[cfg.ChainSelector] - if err := validateRouterConfig(chain, chainState); err != nil { - return fmt.Errorf("router validation failed: %w", err) - } - // check if desired state already exists - remoteBillingPDA, _, err := solState.FindCcipTokenpoolBillingPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.Router) + var offRampConfig solOffRamp.Config + offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(chainState.OffRamp) + err := chain.GetAccountDataBorshInto(context.Background(), offRampConfigPDA, &offRampConfig) if err != nil { - return fmt.Errorf("failed to find remote billing token config pda for (remoteSelector: %d, mint: %s, router: %s): %w", cfg.RemoteChainSelector, tokenPubKey.String(), chainState.Router.String(), err) - } - var remoteBillingAccount solRouter.TokenBilling - if err := chain.GetAccountDataBorshInto(context.Background(), remoteBillingPDA, &remoteBillingAccount); err == nil { - return fmt.Errorf("billing token config already exists for (remoteSelector: %d, mint: %s, router: %s)", cfg.RemoteChainSelector, tokenPubKey.String(), chainState.Router.String()) + return fmt.Errorf("offramp config not found in existing state, initialize the offramp first %d", chain.Selector) } return nil } - -func AddBillingTokenForRemoteChain(e deployment.Environment, cfg BillingTokenForRemoteChainConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - - chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - // verified - remoteBillingPDA, _, _ := solState.FindCcipTokenpoolBillingPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.Router) - - ix, err := solRouter.NewSetTokenBillingInstruction( - cfg.RemoteChainSelector, - tokenPubKey, - cfg.Config, - chainState.RouterConfigPDA, - remoteBillingPDA, - chain.DeployerKey.PublicKey(), - solana.SystemProgramID, - ).ValidateAndBuild() - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - instructions := []solana.Instruction{ix} - if err := chain.Confirm(instructions); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) - } - e.Logger.Infow("Token billing set for remote chain", "chainSelector ", cfg.ChainSelector, "remoteChainSelector ", cfg.RemoteChainSelector, "tokenPubKey", tokenPubKey.String()) - return deployment.ChangesetOutput{}, nil -} - -// TOKEN ADMIN REGISTRY -type RegisterTokenAdminRegistryType int - -const ( - ViaGetCcipAdminInstruction RegisterTokenAdminRegistryType = iota - ViaOwnerInstruction -) - -type RegisterTokenAdminRegistryConfig struct { - ChainSelector uint64 - TokenPubKey string - TokenAdminRegistryAdmin string - RegisterType RegisterTokenAdminRegistryType -} - -func (cfg RegisterTokenAdminRegistryConfig) Validate(e deployment.Environment) error { - if cfg.RegisterType != ViaGetCcipAdminInstruction && cfg.RegisterType != ViaOwnerInstruction { - return fmt.Errorf("invalid register type, valid types are %d and %d", ViaGetCcipAdminInstruction, ViaOwnerInstruction) - } - - if cfg.RegisterType == ViaOwnerInstruction && cfg.TokenAdminRegistryAdmin != "" { - return errors.New("token admin registry should be empty for via owner instruction") - } - - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { - return err - } - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - chain := e.SolChains[cfg.ChainSelector] - if err := validateRouterConfig(chain, chainState); err != nil { - return err - } - tokenAdminRegistryPDA, _, err := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) - if err != nil { - return fmt.Errorf("failed to find token admin registry pda (mint: %s, router: %s): %w", tokenPubKey.String(), chainState.Router.String(), err) - } - var tokenAdminRegistryAccount solRouter.TokenAdminRegistry - if err := chain.GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount); err == nil { - return fmt.Errorf("token admin registry already exists for (mint: %s, router: %s)", tokenPubKey.String(), chainState.Router.String()) - } - return nil -} - -func RegisterTokenAdminRegistry(e deployment.Environment, cfg RegisterTokenAdminRegistryConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - - // verified - tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) - - var instruction *solRouter.Instruction - var err error - switch cfg.RegisterType { - // the ccip admin signs and makes tokenAdminRegistryAdmin the authority of the tokenAdminRegistry PDA - case ViaGetCcipAdminInstruction: - tokenAdminRegistryAdmin := solana.MustPublicKeyFromBase58(cfg.TokenAdminRegistryAdmin) - instruction, err = solRouter.NewRegisterTokenAdminRegistryViaGetCcipAdminInstruction( - tokenPubKey, - tokenAdminRegistryAdmin, // admin of the tokenAdminRegistry PDA - chainState.RouterConfigPDA, - tokenAdminRegistryPDA, // this gets created - chain.DeployerKey.PublicKey(), // (ccip admin) - solana.SystemProgramID, - ).ValidateAndBuild() - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - case ViaOwnerInstruction: - // the token mint authority signs and makes itself the authority of the tokenAdminRegistry PDA - instruction, err = solRouter.NewRegisterTokenAdminRegistryViaOwnerInstruction( - chainState.RouterConfigPDA, - tokenAdminRegistryPDA, // this gets created - tokenPubKey, - chain.DeployerKey.PublicKey(), // (token mint authority) becomes the authority of the tokenAdminRegistry PDA - solana.SystemProgramID, - ).ValidateAndBuild() - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - } - // if we want to have a different authority, we will need to add the corresponding singer here - // for now we are assuming both token owner and ccip admin will always be deployer key - instructions := []solana.Instruction{instruction} - if err := chain.Confirm(instructions); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) - } - return deployment.ChangesetOutput{}, nil -} - -// TRANSFER AND ACCEPT TOKEN ADMIN REGISTRY -type TransferAdminRoleTokenAdminRegistryConfig struct { - ChainSelector uint64 - TokenPubKey string - NewRegistryAdminPublicKey string - CurrentRegistryAdminPrivateKey string -} - -func (cfg TransferAdminRoleTokenAdminRegistryConfig) Validate(e deployment.Environment) error { - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { - return err - } - - currentRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.CurrentRegistryAdminPrivateKey) - newRegistryAdminPubKey := solana.MustPublicKeyFromBase58(cfg.NewRegistryAdminPublicKey) - - if currentRegistryAdminPrivateKey.PublicKey().Equals(newRegistryAdminPubKey) { - return fmt.Errorf("new registry admin public key (%s) cannot be the same as current registry admin public key (%s) for token %s", - newRegistryAdminPubKey.String(), - currentRegistryAdminPrivateKey.PublicKey().String(), - tokenPubKey.String(), - ) - } - - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - chain := e.SolChains[cfg.ChainSelector] - if err := validateRouterConfig(chain, chainState); err != nil { - return err - } - tokenAdminRegistryPDA, _, err := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) - if err != nil { - return fmt.Errorf("failed to find token admin registry pda (mint: %s, router: %s): %w", tokenPubKey.String(), chainState.Router.String(), err) - } - var tokenAdminRegistryAccount solRouter.TokenAdminRegistry - if err := chain.GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount); err != nil { - return fmt.Errorf("token admin registry not found for (mint: %s, router: %s), cannot transfer admin role", tokenPubKey.String(), chainState.Router.String()) - } - // check if passed admin is the current admin - if !tokenAdminRegistryAccount.Administrator.Equals(currentRegistryAdminPrivateKey.PublicKey()) { - return fmt.Errorf("current registry admin private key (%s) does not match administrator (%s) for token %s", - currentRegistryAdminPrivateKey.PublicKey().String(), - tokenAdminRegistryAccount.Administrator.String(), - tokenPubKey.String(), - ) - } - return nil -} - -func TransferAdminRoleTokenAdminRegistry(e deployment.Environment, cfg TransferAdminRoleTokenAdminRegistryConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - - // verified - tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) - - currentRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.CurrentRegistryAdminPrivateKey) - newRegistryAdminPubKey := solana.MustPublicKeyFromBase58(cfg.NewRegistryAdminPublicKey) - - ix1, err := solRouter.NewTransferAdminRoleTokenAdminRegistryInstruction( - tokenPubKey, - newRegistryAdminPubKey, - chainState.RouterConfigPDA, - tokenAdminRegistryPDA, - currentRegistryAdminPrivateKey.PublicKey(), // as we are assuming this is the default authority for everything in the beginning - ).ValidateAndBuild() - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - instructions := []solana.Instruction{ix1} - // the existing authority will have to sign the transfer - if err := chain.Confirm(instructions, solCommonUtil.AddSigners(currentRegistryAdminPrivateKey)); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) - } - return deployment.ChangesetOutput{}, nil -} - -type AcceptAdminRoleTokenAdminRegistryConfig struct { - ChainSelector uint64 - TokenPubKey string - NewRegistryAdminPrivateKey string -} - -func (cfg AcceptAdminRoleTokenAdminRegistryConfig) Validate(e deployment.Environment) error { - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { - return err - } - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - chain := e.SolChains[cfg.ChainSelector] - if err := validateRouterConfig(chain, chainState); err != nil { - return err - } - tokenAdminRegistryPDA, _, err := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) - if err != nil { - return fmt.Errorf("failed to find token admin registry pda (mint: %s, router: %s): %w", tokenPubKey.String(), chainState.Router.String(), err) - } - var tokenAdminRegistryAccount solRouter.TokenAdminRegistry - if err := chain.GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount); err != nil { - return fmt.Errorf("token admin registry not found for (mint: %s, router: %s), cannot accept admin role", tokenPubKey.String(), chainState.Router.String()) - } - // check if accepting admin is the pending admin - newRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.NewRegistryAdminPrivateKey) - newRegistryAdminPublicKey := newRegistryAdminPrivateKey.PublicKey() - if !tokenAdminRegistryAccount.PendingAdministrator.Equals(newRegistryAdminPublicKey) { - return fmt.Errorf("new admin public key (%s) does not match pending registry admin role (%s) for token %s", - newRegistryAdminPublicKey.String(), - tokenAdminRegistryAccount.PendingAdministrator.String(), - tokenPubKey.String(), - ) - } - return nil -} - -func AcceptAdminRoleTokenAdminRegistry(e deployment.Environment, cfg AcceptAdminRoleTokenAdminRegistryConfig) (deployment.ChangesetOutput, error) { - if err := cfg.Validate(e); err != nil { - return deployment.ChangesetOutput{}, err - } - chain := e.SolChains[cfg.ChainSelector] - state, _ := cs.LoadOnchainState(e) - chainState := state.SolChains[cfg.ChainSelector] - tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) - newRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.NewRegistryAdminPrivateKey) - - // verified - tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) - - ix1, err := solRouter.NewAcceptAdminRoleTokenAdminRegistryInstruction( - tokenPubKey, - chainState.RouterConfigPDA, - tokenAdminRegistryPDA, - newRegistryAdminPrivateKey.PublicKey(), - ).ValidateAndBuild() - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) - } - - instructions := []solana.Instruction{ix1} - // the new authority will have to sign the acceptance - if err := chain.Confirm(instructions, solCommonUtil.AddSigners(newRegistryAdminPrivateKey)); err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) - } - return deployment.ChangesetOutput{}, nil -} - -// TODO (all look up table related changesets): -// Update look up tables with tokens and pools -// Set Pool (https://smartcontract-it.atlassian.net/browse/INTAUTO-437) -// NewAppendRemotePoolAddressesInstruction (https://smartcontract-it.atlassian.net/browse/INTAUTO-436) diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go index a8e122d48a7..192bf2984e7 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go @@ -1,25 +1,25 @@ package solana_test import ( - "context" "math/big" "testing" "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/deployment" - solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/token_pool" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" + solTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/token_pool" + solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" ) @@ -33,14 +33,14 @@ func TestAddRemoteChain(t *testing.T) { evmChain := tenv.Env.AllChainSelectors()[0] solChain := tenv.Env.AllChainSelectorsSolana()[0] - state, err := changeset.LoadOnchainState(tenv.Env) + _, err := ccipChangeset.LoadOnchainStateSolana(tenv.Env) require.NoError(t, err) tenv.Env, err = commonchangeset.ApplyChangesets(t, tenv.Env, nil, []commonchangeset.ChangesetApplication{ { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), - Config: changeset.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ + Changeset: commonchangeset.WrapChangeSet(ccipChangeset.UpdateOnRampsDestsChangeset), + Config: ccipChangeset.UpdateOnRampDestsConfig{ + UpdatesByChain: map[uint64]map[uint64]ccipChangeset.OnRampDestinationUpdate{ evmChain: { solChain: { IsEnabled: true, @@ -54,22 +54,22 @@ func TestAddRemoteChain(t *testing.T) { { Changeset: commonchangeset.WrapChangeSet(changeset_solana.AddRemoteChainToSolana), Config: changeset_solana.AddRemoteChainToSolanaConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset_solana.RemoteChainConfigSolana{ - solChain: { - evmChain: { - EnabledAsSource: true, - DestinationConfig: solRouter.DestChainConfig{ - IsEnabled: true, - DefaultTxGasLimit: 200000, - MaxPerMsgGasLimit: 3000000, - MaxDataBytes: 30000, - MaxNumberOfTokensPerMsg: 5, - DefaultTokenDestGasOverhead: 5000, - // bytes4(keccak256("CCIP ChainFamilySelector EVM")) - // TODO: do a similar test for other chain families - // https://smartcontract-it.atlassian.net/browse/INTAUTO-438 - ChainFamilySelector: [4]uint8{40, 18, 213, 44}, - }, + ChainSelector: solChain, + UpdatesByChain: map[uint64]changeset_solana.RemoteChainConfigSolana{ + evmChain: { + EnabledAsSource: true, + RouterDestinationConfig: solRouter.DestChainConfig{}, + FeeQuoterDestinationConfig: solFeeQuoter.DestChainConfig{ + IsEnabled: true, + DefaultTxGasLimit: 200000, + MaxPerMsgGasLimit: 3000000, + MaxDataBytes: 30000, + MaxNumberOfTokensPerMsg: 5, + DefaultTokenDestGasOverhead: 5000, + // bytes4(keccak256("CCIP ChainFamilySelector EVM")) + // TODO: do a similar test for other chain families + // https://smartcontract-it.atlassian.net/browse/INTAUTO-438 + ChainFamilySelector: [4]uint8{40, 18, 213, 44}, }, }, }, @@ -78,19 +78,20 @@ func TestAddRemoteChain(t *testing.T) { }) require.NoError(t, err) - state, err = changeset.LoadOnchainStateSolana(tenv.Env) + state, err := ccipChangeset.LoadOnchainStateSolana(tenv.Env) require.NoError(t, err) - var sourceChainStateAccount solRouter.SourceChain - evmSourceChainStatePDA := state.SolChains[solChain].SourceChainStatePDAs[evmChain] - err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, evmSourceChainStatePDA, &sourceChainStateAccount) - require.NoError(t, err) - require.Equal(t, uint64(1), sourceChainStateAccount.State.MinSeqNr) - require.True(t, sourceChainStateAccount.Config.IsEnabled) var destChainStateAccount solRouter.DestChain evmDestChainStatePDA := state.SolChains[solChain].DestChainStatePDAs[evmChain] err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, evmDestChainStatePDA, &destChainStateAccount) require.NoError(t, err) + + var destChainFqAccount solFeeQuoter.DestChain + fqEvmDestChainPDA, _, _ := solState.FindFqDestChainPDA(evmChain, state.SolChains[solChain].FeeQuoter) + err = tenv.Env.SolChains[solChain].GetAccountDataBorshInto(ctx, fqEvmDestChainPDA, &destChainFqAccount) + require.NoError(t, err, "failed to get account info") + require.Equal(t, solFeeQuoter.TimestampedPackedU224{}, destChainFqAccount.State.UsdPerUnitGas) + require.True(t, destChainFqAccount.Config.IsEnabled) } func TestDeployCCIPContracts(t *testing.T) { @@ -100,7 +101,7 @@ func TestDeployCCIPContracts(t *testing.T) { func TestAddTokenPool(t *testing.T) { t.Parallel() - + ctx := testcontext.Get(t) tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) evmChain := tenv.Env.AllChainSelectors()[0] @@ -139,20 +140,21 @@ func TestAddTokenPool(t *testing.T) { { Changeset: commonchangeset.WrapChangeSet(changeset_solana.SetupTokenPoolForRemoteChain), Config: changeset_solana.RemoteChainTokenPoolConfig{ - ChainSelector: solChain, + SolChainSelector: solChain, RemoteChainSelector: evmChain, - TokenPubKey: tokenAddress.String(), - RemoteConfig: token_pool.RemoteConfig{ - PoolAddresses: []token_pool.RemoteAddress{{Address: []byte{1, 2, 3}}}, - TokenAddress: token_pool.RemoteAddress{Address: []byte{4, 5, 6}}, + SolTokenPubKey: tokenAddress.String(), + RemoteConfig: solTokenPool.RemoteConfig{ + // TODO:this can be potentially read from the state if we are given the token symbol + PoolAddresses: []solTokenPool.RemoteAddress{{Address: []byte{1, 2, 3}}}, + TokenAddress: solTokenPool.RemoteAddress{Address: []byte{4, 5, 6}}, Decimals: 9, }, - InboundRateLimit: token_pool.RateLimitConfig{ + InboundRateLimit: solTokenPool.RateLimitConfig{ Enabled: true, Capacity: uint64(1000), Rate: 1, }, - OutboundRateLimit: token_pool.RateLimitConfig{ + OutboundRateLimit: solTokenPool.RateLimitConfig{ Enabled: false, Capacity: 0, Rate: 0, @@ -165,25 +167,25 @@ func TestAddTokenPool(t *testing.T) { // test AddTokenPool results poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenAddress, state.SolChains[solChain].TokenPool) require.NoError(t, err) - var configAccount token_pool.Config - err = e.SolChains[solChain].GetAccountDataBorshInto(context.Background(), poolConfigPDA, &configAccount) + var configAccount solTokenPool.Config + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, poolConfigPDA, &configAccount) t.Logf("configAccount: %+v", configAccount) require.NoError(t, err) - require.Equal(t, token_pool.LockAndRelease_PoolType, configAccount.PoolType) + require.Equal(t, solTokenPool.LockAndRelease_PoolType, configAccount.PoolType) require.Equal(t, tokenAddress, configAccount.Mint) // try minting after this and see if the pool or the deployer key is the authority // test SetupTokenPoolForRemoteChain results remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(evmChain, tokenAddress, state.SolChains[solChain].TokenPool) - var remoteChainConfigAccount token_pool.ChainConfig - err = e.SolChains[solChain].GetAccountDataBorshInto(context.Background(), remoteChainConfigPDA, &remoteChainConfigAccount) + var remoteChainConfigAccount solTokenPool.ChainConfig + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, remoteChainConfigPDA, &remoteChainConfigAccount) require.NoError(t, err) require.Equal(t, uint8(9), remoteChainConfigAccount.Remote.Decimals) } func TestBilling(t *testing.T) { t.Parallel() - + ctx := testcontext.Get(t) tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) evmChain := tenv.Env.AllChainSelectors()[0] @@ -216,10 +218,10 @@ func TestBilling(t *testing.T) { ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenProgramName: deployment.SPL2022Tokens, - Config: solRouter.BillingTokenConfig{ + Config: solFeeQuoter.BillingTokenConfig{ Enabled: true, Mint: tokenAddress, - UsdPerToken: solRouter.TimestampedPackedU224{ + UsdPerToken: solFeeQuoter.TimestampedPackedU224{ Timestamp: validTimestamp, Value: value, }, @@ -233,7 +235,7 @@ func TestBilling(t *testing.T) { ChainSelector: solChain, RemoteChainSelector: evmChain, TokenPubKey: tokenAddress.String(), - Config: solRouter.TokenBilling{ + Config: solFeeQuoter.TokenTransferFeeConfig{ MinFeeUsdcents: 800, MaxFeeUsdcents: 1600, DeciBps: 0, @@ -246,24 +248,24 @@ func TestBilling(t *testing.T) { }) require.NoError(t, err) - billingConfigPDA, _, _ := solState.FindFeeBillingTokenConfigPDA(tokenAddress, state.SolChains[solChain].Router) - var token0ConfigAccount solRouter.BillingTokenConfigWrapper - err = e.SolChains[solChain].GetAccountDataBorshInto(context.Background(), billingConfigPDA, &token0ConfigAccount) + billingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenAddress, state.SolChains[solChain].FeeQuoter) + var token0ConfigAccount solFeeQuoter.BillingTokenConfigWrapper + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, billingConfigPDA, &token0ConfigAccount) require.NoError(t, err) require.True(t, token0ConfigAccount.Config.Enabled) require.Equal(t, tokenAddress, token0ConfigAccount.Config.Mint) - remoteBillingPDA, _, _ := solState.FindCcipTokenpoolBillingPDA(evmChain, tokenAddress, state.SolChains[solChain].Router) - var remoteBillingAccount solRouter.PerChainPerTokenConfig - err = e.SolChains[solChain].GetAccountDataBorshInto(context.Background(), remoteBillingPDA, &remoteBillingAccount) + remoteBillingPDA, _, _ := solState.FindFqPerChainPerTokenConfigPDA(evmChain, tokenAddress, state.SolChains[solChain].FeeQuoter) + var remoteBillingAccount solFeeQuoter.PerChainPerTokenConfig + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, remoteBillingPDA, &remoteBillingAccount) require.NoError(t, err) require.Equal(t, tokenAddress, remoteBillingAccount.Mint) - require.Equal(t, uint32(800), remoteBillingAccount.Billing.MinFeeUsdcents) + require.Equal(t, uint32(800), remoteBillingAccount.TokenTransferConfig.MinFeeUsdcents) } func TestTokenAdminRegistry(t *testing.T) { t.Parallel() - + ctx := testcontext.Get(t) tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) solChain := tenv.Env.AllChainSelectorsSolana()[0] @@ -285,11 +287,11 @@ func TestTokenAdminRegistry(t *testing.T) { tokenAddress := state.SolChains[solChain].SPL2022Tokens[0] tokenAdminRegistryAdminPrivKey, _ := solana.NewRandomPrivateKey() - // We have to do run the ViaOwnerInstruction testcase for linkToken as we already registered a PDA for tokenAddress in the previous testcase + // We have to do run the ViaOwnerInstruction testcase for linkToken as we already register a PDA for tokenAddress in the previous testcase linkTokenAddress := state.SolChains[solChain].LinkToken e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { // register token admin registry for tokenAddress via getCcipAdminInstruction + { // register token admin registry for tokenAddress via admin instruction Changeset: commonchangeset.WrapChangeSet(changeset_solana.RegisterTokenAdminRegistry), Config: changeset_solana.RegisterTokenAdminRegistryConfig{ ChainSelector: solChain, @@ -301,51 +303,146 @@ func TestTokenAdminRegistry(t *testing.T) { { // register token admin registry for linkToken via owner instruction Changeset: commonchangeset.WrapChangeSet(changeset_solana.RegisterTokenAdminRegistry), Config: changeset_solana.RegisterTokenAdminRegistryConfig{ - ChainSelector: solChain, - TokenPubKey: linkTokenAddress.String(), - RegisterType: changeset_solana.ViaOwnerInstruction, + ChainSelector: solChain, + TokenPubKey: linkTokenAddress.String(), + TokenAdminRegistryAdmin: tokenAdminRegistryAdminPrivKey.PublicKey().String(), + RegisterType: changeset_solana.ViaOwnerInstruction, + }, + }, + }) + require.NoError(t, err) + + tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenAddress, state.SolChains[solChain].Router) + var tokenAdminRegistryAccount solRouter.TokenAdminRegistry + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, tokenAdminRegistryPDA, &tokenAdminRegistryAccount) + require.NoError(t, err) + require.Equal(t, solana.PublicKey{}, tokenAdminRegistryAccount.Administrator) + // pending administrator should be the proposed admin key + require.Equal(t, tokenAdminRegistryAdminPrivKey.PublicKey(), tokenAdminRegistryAccount.PendingAdministrator) + + linkTokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(linkTokenAddress, state.SolChains[solChain].Router) + var linkTokenAdminRegistryAccount solRouter.TokenAdminRegistry + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, linkTokenAdminRegistryPDA, &linkTokenAdminRegistryAccount) + require.NoError(t, err) + require.Equal(t, tokenAdminRegistryAdminPrivKey.PublicKey(), linkTokenAdminRegistryAccount.PendingAdministrator) + + e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ + { // accept admin role for tokenAddress + Changeset: commonchangeset.WrapChangeSet(changeset_solana.AcceptAdminRoleTokenAdminRegistry), + Config: changeset_solana.AcceptAdminRoleTokenAdminRegistryConfig{ + ChainSelector: solChain, + TokenPubKey: tokenAddress.String(), + NewRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), }, }, + }) + require.NoError(t, err) + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, tokenAdminRegistryPDA, &tokenAdminRegistryAccount) + require.NoError(t, err) + // confirm that the administrator is the deployer key + require.Equal(t, tokenAdminRegistryAdminPrivKey.PublicKey(), tokenAdminRegistryAccount.Administrator) + require.Equal(t, solana.PublicKey{}, tokenAdminRegistryAccount.PendingAdministrator) + + // TODO: transfer and accept is breaking + newTokenAdminRegistryAdminPrivKey, _ := solana.NewRandomPrivateKey() + e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ { // transfer admin role for tokenAddress Changeset: commonchangeset.WrapChangeSet(changeset_solana.TransferAdminRoleTokenAdminRegistry), Config: changeset_solana.TransferAdminRoleTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), + NewRegistryAdminPublicKey: newTokenAdminRegistryAdminPrivKey.PublicKey().String(), CurrentRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), - NewRegistryAdminPublicKey: e.SolChains[solChain].DeployerKey.PublicKey().String(), }, }, }) require.NoError(t, err) + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, tokenAdminRegistryPDA, &tokenAdminRegistryAccount) + require.NoError(t, err) + require.Equal(t, newTokenAdminRegistryAdminPrivKey.PublicKey(), tokenAdminRegistryAccount.PendingAdministrator) +} - tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenAddress, state.SolChains[solChain].Router) - var tokenAdminRegistryAccount solRouter.TokenAdminRegistry - err = e.SolChains[solChain].GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount) +func TestPoolLookupTable(t *testing.T) { + t.Parallel() + ctx := testcontext.Get(t) + tenv, _ := testhelpers.NewMemoryEnvironment(t, testhelpers.WithSolChains(1)) + + solChain := tenv.Env.AllChainSelectorsSolana()[0] + + e, err := commonchangeset.ApplyChangesets(t, tenv.Env, nil, []commonchangeset.ChangesetApplication{ + { // deploy token + Changeset: commonchangeset.WrapChangeSet(changeset_solana.DeploySolanaToken), + Config: changeset_solana.DeploySolanaTokenConfig{ + ChainSelector: solChain, + TokenProgramName: deployment.SPL2022Tokens, + TokenDecimals: 9, + }, + }, + }) require.NoError(t, err) - require.Equal(t, tokenAdminRegistryAdminPrivKey.PublicKey(), tokenAdminRegistryAccount.Administrator) - // pending administrator should be the deployer key - require.Equal(t, e.SolChains[solChain].DeployerKey.PublicKey(), tokenAdminRegistryAccount.PendingAdministrator) - linkTokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(linkTokenAddress, state.SolChains[solChain].Router) - var linkTokenAdminRegistryAccount solRouter.TokenAdminRegistry - err = e.SolChains[solChain].GetAccountDataBorshInto(context.Background(), linkTokenAdminRegistryPDA, &linkTokenAdminRegistryAccount) + state, err := ccipChangeset.LoadOnchainStateSolana(e) + require.NoError(t, err) + tokenAddress := state.SolChains[solChain].SPL2022Tokens[0] + + e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ + { // add token pool lookup table + Changeset: commonchangeset.WrapChangeSet(changeset_solana.AddTokenPoolLookupTable), + Config: changeset_solana.TokenPoolLookupTableConfig{ + ChainSelector: solChain, + TokenPubKey: tokenAddress.String(), + TokenProgram: deployment.SPL2022Tokens, + }, + }, + }) + require.NoError(t, err) + + state, err = ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) - // as DeployLinkToken (DeploySolanaToken) makes the deployer key the authority of the token, it should be the administrator of the tokenAdminRegistry via owner instruction - require.Equal(t, e.SolChains[solChain].DeployerKey.PublicKey(), linkTokenAdminRegistryAccount.Administrator) + lookupTablePubKey := state.SolChains[solChain].TokenPoolLookupTable[tokenAddress] + + lookupTableEntries0, err := solCommonUtil.GetAddressLookupTable(ctx, e.SolChains[solChain].Client, lookupTablePubKey) + require.NoError(t, err) + require.Equal(t, lookupTablePubKey, lookupTableEntries0[0]) + require.Equal(t, tokenAddress, lookupTableEntries0[7]) + + tokenAdminRegistryAdminPrivKey, _ := solana.NewRandomPrivateKey() e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ + { // register token admin registry for linkToken via owner instruction + Changeset: commonchangeset.WrapChangeSet(changeset_solana.RegisterTokenAdminRegistry), + Config: changeset_solana.RegisterTokenAdminRegistryConfig{ + ChainSelector: solChain, + TokenPubKey: tokenAddress.String(), + TokenAdminRegistryAdmin: tokenAdminRegistryAdminPrivKey.PublicKey().String(), + RegisterType: changeset_solana.ViaGetCcipAdminInstruction, + }, + }, { // accept admin role for tokenAddress Changeset: commonchangeset.WrapChangeSet(changeset_solana.AcceptAdminRoleTokenAdminRegistry), Config: changeset_solana.AcceptAdminRoleTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), - NewRegistryAdminPrivateKey: e.SolChains[solChain].DeployerKey.String(), + NewRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), + }, + }, + { // set pool -> this updates tokenAdminRegistryPDA, hence above changeset is required + Changeset: commonchangeset.WrapChangeSet(changeset_solana.SetPool), + Config: changeset_solana.SetPoolConfig{ + ChainSelector: solChain, + TokenPubKey: tokenAddress.String(), + PoolLookupTable: lookupTablePubKey.String(), + TokenAdminRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), + WritableIndexes: []uint8{3, 4, 7}, }, }, }) require.NoError(t, err) - err = e.SolChains[solChain].GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount) + tokenAdminRegistry := solRouter.TokenAdminRegistry{} + tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenAddress, state.SolChains[solChain].Router) + + err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, tokenAdminRegistryPDA, &tokenAdminRegistry) require.NoError(t, err) - // confirm that the administrator is the deployer key - require.Equal(t, e.SolChains[solChain].DeployerKey.PublicKey(), tokenAdminRegistryAccount.Administrator) + require.Equal(t, tokenAdminRegistryAdminPrivKey.PublicKey(), tokenAdminRegistry.Administrator) + require.Equal(t, lookupTablePubKey, tokenAdminRegistry.LookupTable) } diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index 01416f0dd23..cb720e3129e 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -93,29 +93,6 @@ func TestDeployChainContractsChangeset(t *testing.T) { }, }) require.NoError(t, err) - - // load onchain state - state, err := changeset.LoadOnchainState(e) - require.NoError(t, err) - - // verify all contracts populated - require.NotNil(t, state.Chains[homeChainSel].CapabilityRegistry) - require.NotNil(t, state.Chains[homeChainSel].CCIPHome) - require.NotNil(t, state.Chains[homeChainSel].RMNHome) - for _, sel := range evmSelectors { - require.NotNil(t, state.Chains[sel].LinkToken) - require.NotNil(t, state.Chains[sel].Weth9) - require.NotNil(t, state.Chains[sel].TokenAdminRegistry) - require.NotNil(t, state.Chains[sel].RegistryModule) - require.NotNil(t, state.Chains[sel].Router) - require.NotNil(t, state.Chains[sel].RMNRemote) - require.NotNil(t, state.Chains[sel].TestRouter) - require.NotNil(t, state.Chains[sel].NonceManager) - require.NotNil(t, state.Chains[sel].FeeQuoter) - require.NotNil(t, state.Chains[sel].OffRamp) - require.NotNil(t, state.Chains[sel].OnRamp) - } - // solana verification testhelpers.ValidateSolanaState(t, e, solChainSelectors) } diff --git a/deployment/ccip/changeset/solana/cs_set_ocr3.go b/deployment/ccip/changeset/solana/cs_set_ocr3.go new file mode 100644 index 00000000000..e79c9a1239d --- /dev/null +++ b/deployment/ccip/changeset/solana/cs_set_ocr3.go @@ -0,0 +1,88 @@ +package solana + +import ( + "fmt" + + // "strconv" + + "github.com/gagliardetto/solana-go" + + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" + + "github.com/smartcontractkit/chainlink/deployment" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" +) + +// SET OCR3 CONFIG +func btoi(b bool) uint8 { + if b { + return 1 + } + return 0 +} + +// SetOCR3OffRamp will set the OCR3 offramp for the given chain. +// to the active configuration on CCIPHome. This +// is used to complete the candidate->active promotion cycle, it's +// run after the candidate is confirmed to be working correctly. +// Multichain is especially helpful for NOP rotations where we have +// to touch all the chain to change signers. +func SetOCR3ConfigSolana(e deployment.Environment, cfg cs.SetOCR3OffRampConfig) (deployment.ChangesetOutput, error) { + state, err := cs.LoadOnchainState(e) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to load onchain state: %w", err) + } + + if err := cfg.Validate(e, state); err != nil { + return deployment.ChangesetOutput{}, err + } + solChains := state.SolChains + + // cfg.RemoteChainSels will be a bunch of solana chains + // can add this in validate + for _, remote := range cfg.RemoteChainSels { + donID, err := internal.DonIDForChain( + state.Chains[cfg.HomeChainSel].CapabilityRegistry, + state.Chains[cfg.HomeChainSel].CCIPHome, + remote) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to get don id for chain %d: %w", remote, err) + } + args, err := internal.BuildSetOCR3ConfigArgsSolana(donID, state.Chains[cfg.HomeChainSel].CCIPHome, remote) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to build set ocr3 config args: %w", err) + } + // TODO: check if ocr3 has already been set + // set, err := isOCR3ConfigSetSolana(e.Logger, e.Chains[remote], state.Chains[remote].OffRamp, args) + var instructions []solana.Instruction + offRampConfigPDA := solChains[remote].OffRampConfigPDA + offRampStatePDA := solChains[remote].OffRampStatePDA + solOffRamp.SetProgramID(solChains[remote].OffRamp) + for _, arg := range args { + instruction, err := solOffRamp.NewSetOcrConfigInstruction( + arg.OCRPluginType, + solOffRamp.Ocr3ConfigInfo{ + ConfigDigest: arg.ConfigDigest, + F: arg.F, + IsSignatureVerificationEnabled: btoi(arg.IsSignatureVerificationEnabled), + }, + arg.Signers, + arg.Transmitters, + offRampConfigPDA, + offRampStatePDA, + e.SolChains[remote].DeployerKey.PublicKey(), + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + instructions = append(instructions, instruction) + } + if cfg.MCMS == nil { + if err := e.SolChains[remote].Confirm(instructions); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + } + } + return deployment.ChangesetOutput{}, nil +} diff --git a/deployment/ccip/changeset/solana/cs_solana_token.go b/deployment/ccip/changeset/solana/cs_solana_token.go index e34584a7247..bfce1e70da5 100644 --- a/deployment/ccip/changeset/solana/cs_solana_token.go +++ b/deployment/ccip/changeset/solana/cs_solana_token.go @@ -16,6 +16,8 @@ var _ deployment.ChangeSet[DeploySolanaTokenConfig] = DeploySolanaToken var _ deployment.ChangeSet[MintSolanaTokenConfig] = MintSolanaToken var _ deployment.ChangeSet[CreateSolanaTokenATAConfig] = CreateSolanaTokenATA +// TODO: add option to set token mint authority by taking in its public key +// might need to take authority private key if it needs to sign that type DeploySolanaTokenConfig struct { ChainSelector uint64 TokenProgramName string @@ -27,13 +29,15 @@ func NewTokenInstruction(chain deployment.SolChain, cfg DeploySolanaTokenConfig) if err != nil { return nil, nil, err } + // token mint authority + // can accept a private key in config and pass in pub key here and private key as signer tokenAdminPubKey := chain.DeployerKey.PublicKey() - mint, _ := solana.NewRandomPrivateKey() - mintPublicKey := mint.PublicKey() // this is the token address + mintPrivKey, _ := solana.NewRandomPrivateKey() + mint := mintPrivKey.PublicKey() // this is the token address instructions, err := solTokenUtil.CreateToken( context.Background(), tokenprogramID, - mintPublicKey, + mint, tokenAdminPubKey, cfg.TokenDecimals, chain.Client, @@ -42,7 +46,7 @@ func NewTokenInstruction(chain deployment.SolChain, cfg DeploySolanaTokenConfig) if err != nil { return nil, nil, err } - return instructions, mint, nil + return instructions, mintPrivKey, nil } func DeploySolanaToken(e deployment.Environment, cfg DeploySolanaTokenConfig) (deployment.ChangesetOutput, error) { @@ -50,12 +54,13 @@ func DeploySolanaToken(e deployment.Environment, cfg DeploySolanaTokenConfig) (d if !ok { return deployment.ChangesetOutput{}, fmt.Errorf("chain %d not found in environment", cfg.ChainSelector) } - instructions, mint, err := NewTokenInstruction(chain, cfg) + instructions, mintPrivKey, err := NewTokenInstruction(chain, cfg) + mint := mintPrivKey.PublicKey() if err != nil { return deployment.ChangesetOutput{}, err } - - err = chain.Confirm(instructions, solCommomUtil.AddSigners(mint)) + // TODO:does the mint need to be added as a signer here ? + err = chain.Confirm(instructions, solCommomUtil.AddSigners(mintPrivKey)) if err != nil { e.Logger.Errorw("Failed to confirm instructions for link token deployment", "chain", chain.String(), "err", err) return deployment.ChangesetOutput{}, err @@ -63,13 +68,13 @@ func DeploySolanaToken(e deployment.Environment, cfg DeploySolanaTokenConfig) (d newAddresses := deployment.NewMemoryAddressBook() tv := deployment.NewTypeAndVersion(deployment.ContractType(cfg.TokenProgramName), deployment.Version1_0_0) - err = newAddresses.Save(cfg.ChainSelector, mint.PublicKey().String(), tv) + err = newAddresses.Save(cfg.ChainSelector, mint.String(), tv) if err != nil { e.Logger.Errorw("Failed to save link token", "chain", chain.String(), "err", err) return deployment.ChangesetOutput{}, err } - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", mint.PublicKey().String(), "chain", chain.String()) + e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", mint.String(), "chain", chain.String()) return deployment.ChangesetOutput{ AddressBook: newAddresses, @@ -106,6 +111,7 @@ func MintSolanaToken(e deployment.Environment, cfg MintSolanaTokenConfig) (deplo return deployment.ChangesetOutput{}, err } instructions = append(instructions, mintToI) + e.Logger.Infow("Minting", "amount", amount, "to", toAddress, "for token", tokenAddress.String()) } // confirm instructions err = chain.Confirm(instructions) @@ -113,6 +119,7 @@ func MintSolanaToken(e deployment.Environment, cfg MintSolanaTokenConfig) (deplo e.Logger.Errorw("Failed to confirm instructions for token minting", "chain", chain.String(), "err", err) return deployment.ChangesetOutput{}, err } + e.Logger.Infow("Minted tokens on", "chain", cfg.ChainSelector, "for token", cfg.TokenPubkey.String()) return deployment.ChangesetOutput{}, nil } @@ -152,6 +159,7 @@ func CreateSolanaTokenATA(e deployment.Environment, cfg CreateSolanaTokenATAConf e.Logger.Errorw("Failed to confirm instructions for ATA creation", "chain", chain.String(), "err", err) return deployment.ChangesetOutput{}, err } + e.Logger.Infow("Created ATAs on", "chain", cfg.ChainSelector, "for token", cfg.TokenPubkey.String(), "numATAs", len(cfg.ATAList)) return deployment.ChangesetOutput{}, nil } diff --git a/deployment/ccip/changeset/solana/cs_solana_token_test.go b/deployment/ccip/changeset/solana/cs_solana_token_test.go index 67573b20c71..f15aeb4cf22 100644 --- a/deployment/ccip/changeset/solana/cs_solana_token_test.go +++ b/deployment/ccip/changeset/solana/cs_solana_token_test.go @@ -28,7 +28,7 @@ func TestSolanaTokenOps(t *testing.T) { }) solChain1 := e.AllChainSelectorsSolana()[0] e, err := commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { + { // deployer creates token Changeset: commonchangeset.WrapChangeSet(changeset_solana.DeploySolanaToken), Config: changeset_solana.DeploySolanaTokenConfig{ ChainSelector: solChain1, @@ -42,26 +42,29 @@ func TestSolanaTokenOps(t *testing.T) { state, err := ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) tokenAddress := state.SolChains[solChain1].SPL2022Tokens[0] + deployerKey := e.SolChains[solChain1].DeployerKey.PublicKey() + testUser, _ := solana.NewRandomPrivateKey() testUserPubKey := testUser.PublicKey() e, err = changeset.ApplyChangesets(t, e, nil, []changeset.ChangesetApplication{ - { + { // deployer creates ATA for itself and testUser Changeset: changeset.WrapChangeSet(changeset_solana.CreateSolanaTokenATA), Config: changeset_solana.CreateSolanaTokenATAConfig{ ChainSelector: solChain1, TokenPubkey: tokenAddress, TokenProgram: deployment.SPL2022Tokens, - ATAList: []string{testUserPubKey.String()}, + ATAList: []string{deployerKey.String(), testUserPubKey.String()}, }, }, - { + { // deployer mints token to itself and testUser Changeset: commonchangeset.WrapChangeSet(changeset_solana.MintSolanaToken), Config: changeset_solana.MintSolanaTokenConfig{ ChainSelector: solChain1, TokenPubkey: tokenAddress, TokenProgram: deployment.SPL2022Tokens, AmountToAddress: map[string]uint64{ + deployerKey.String(): uint64(1000), testUserPubKey.String(): uint64(1000), }, }, @@ -69,9 +72,25 @@ func TestSolanaTokenOps(t *testing.T) { }) require.NoError(t, err) - ata, _, _ := solTokenUtil.FindAssociatedTokenAddress(solana.Token2022ProgramID, tokenAddress, testUserPubKey) - outDec, outVal, err := solTokenUtil.TokenBalance(context.Background(), e.SolChains[solChain1].Client, ata, solRpc.CommitmentConfirmed) + testUserATA, _, err := solTokenUtil.FindAssociatedTokenAddress(solana.Token2022ProgramID, tokenAddress, testUserPubKey) + require.NoError(t, err) + deployerATA, _, err := solTokenUtil.FindAssociatedTokenAddress( + solana.Token2022ProgramID, + tokenAddress, + e.SolChains[solChain1].DeployerKey.PublicKey(), + ) + require.NoError(t, err) + + // test if minting was done correctly + outDec, outVal, err := solTokenUtil.TokenBalance(context.Background(), e.SolChains[solChain1].Client, deployerATA, solRpc.CommitmentConfirmed) + require.NoError(t, err) + t.Logf("outDec: %d, outVal: %d", outDec, outVal) + require.Equal(t, int(1000), outVal) + require.Equal(t, 9, int(outDec)) + + outDec, outVal, err = solTokenUtil.TokenBalance(context.Background(), e.SolChains[solChain1].Client, testUserATA, solRpc.CommitmentConfirmed) require.NoError(t, err) + t.Logf("outDec: %d, outVal: %d", outDec, outVal) require.Equal(t, int(1000), outVal) require.Equal(t, 9, int(outDec)) } diff --git a/deployment/ccip/changeset/solana/cs_token_admin_registry.go b/deployment/ccip/changeset/solana/cs_token_admin_registry.go new file mode 100644 index 00000000000..8b4ee857852 --- /dev/null +++ b/deployment/ccip/changeset/solana/cs_token_admin_registry.go @@ -0,0 +1,257 @@ +package solana + +import ( + "context" + "errors" + "fmt" + + "github.com/gagliardetto/solana-go" + + solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" + solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + + "github.com/smartcontractkit/chainlink/deployment" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" +) + +type RegisterTokenAdminRegistryType int + +const ( + ViaGetCcipAdminInstruction RegisterTokenAdminRegistryType = iota + ViaOwnerInstruction +) + +type RegisterTokenAdminRegistryConfig struct { + ChainSelector uint64 + TokenPubKey string + TokenAdminRegistryAdmin string + RegisterType RegisterTokenAdminRegistryType +} + +func (cfg RegisterTokenAdminRegistryConfig) Validate(e deployment.Environment) error { + if cfg.RegisterType != ViaGetCcipAdminInstruction && cfg.RegisterType != ViaOwnerInstruction { + return fmt.Errorf("invalid register type, valid types are %d and %d", ViaGetCcipAdminInstruction, ViaOwnerInstruction) + } + + if cfg.TokenAdminRegistryAdmin == "" { + return errors.New("token admin registry admin is required") + } + + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { + return err + } + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + chain := e.SolChains[cfg.ChainSelector] + if err := validateRouterConfig(chain, chainState); err != nil { + return err + } + tokenAdminRegistryPDA, _, err := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + if err != nil { + return fmt.Errorf("failed to find token admin registry pda (mint: %s, router: %s): %w", tokenPubKey.String(), chainState.Router.String(), err) + } + var tokenAdminRegistryAccount solRouter.TokenAdminRegistry + if err := chain.GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount); err == nil { + return fmt.Errorf("token admin registry already exists for (mint: %s, router: %s)", tokenPubKey.String(), chainState.Router.String()) + } + return nil +} + +func RegisterTokenAdminRegistry(e deployment.Environment, cfg RegisterTokenAdminRegistryConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + chain := e.SolChains[cfg.ChainSelector] + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + + // verified + tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + tokenAdminRegistryAdmin := solana.MustPublicKeyFromBase58(cfg.TokenAdminRegistryAdmin) + + var instruction *solRouter.Instruction + var err error + switch cfg.RegisterType { + // the ccip admin signs and makes tokenAdminRegistryAdmin the authority of the tokenAdminRegistry PDA + case ViaGetCcipAdminInstruction: + instruction, err = solRouter.NewCcipAdminProposeAdministratorInstruction( + tokenAdminRegistryAdmin, // admin of the tokenAdminRegistry PDA + chainState.RouterConfigPDA, + tokenAdminRegistryPDA, // this gets created + tokenPubKey, + chain.DeployerKey.PublicKey(), // (ccip admin) + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + case ViaOwnerInstruction: + // the token mint authority signs and makes itself the authority of the tokenAdminRegistry PDA + instruction, err = solRouter.NewOwnerProposeAdministratorInstruction( + tokenAdminRegistryAdmin, // admin of the tokenAdminRegistry PDA + chainState.RouterConfigPDA, + tokenAdminRegistryPDA, // this gets created + tokenPubKey, + chain.DeployerKey.PublicKey(), // (token mint authority) becomes the authority of the tokenAdminRegistry PDA + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + } + // if we want to have a different authority, we will need to add the corresponding singer here + // for now we are assuming both token owner and ccip admin will always be deployer key + instructions := []solana.Instruction{instruction} + if err := chain.Confirm(instructions); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + return deployment.ChangesetOutput{}, nil +} + +// TRANSFER AND ACCEPT TOKEN ADMIN REGISTRY +type TransferAdminRoleTokenAdminRegistryConfig struct { + ChainSelector uint64 + TokenPubKey string + NewRegistryAdminPublicKey string + CurrentRegistryAdminPrivateKey string +} + +func (cfg TransferAdminRoleTokenAdminRegistryConfig) Validate(e deployment.Environment) error { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { + return err + } + + currentRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.CurrentRegistryAdminPrivateKey) + newRegistryAdminPubKey := solana.MustPublicKeyFromBase58(cfg.NewRegistryAdminPublicKey) + + if currentRegistryAdminPrivateKey.PublicKey().Equals(newRegistryAdminPubKey) { + return fmt.Errorf("new registry admin public key (%s) cannot be the same as current registry admin public key (%s) for token %s", + newRegistryAdminPubKey.String(), + currentRegistryAdminPrivateKey.PublicKey().String(), + tokenPubKey.String(), + ) + } + + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + chain := e.SolChains[cfg.ChainSelector] + if err := validateRouterConfig(chain, chainState); err != nil { + return err + } + tokenAdminRegistryPDA, _, err := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + if err != nil { + return fmt.Errorf("failed to find token admin registry pda (mint: %s, router: %s): %w", tokenPubKey.String(), chainState.Router.String(), err) + } + var tokenAdminRegistryAccount solRouter.TokenAdminRegistry + if err := chain.GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount); err != nil { + return fmt.Errorf("token admin registry not found for (mint: %s, router: %s), cannot transfer admin role", tokenPubKey.String(), chainState.Router.String()) + } + return nil +} + +func TransferAdminRoleTokenAdminRegistry(e deployment.Environment, cfg TransferAdminRoleTokenAdminRegistryConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + chain := e.SolChains[cfg.ChainSelector] + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + + // verified + tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + + currentRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.CurrentRegistryAdminPrivateKey) + newRegistryAdminPubKey := solana.MustPublicKeyFromBase58(cfg.NewRegistryAdminPublicKey) + + ix1, err := solRouter.NewTransferAdminRoleTokenAdminRegistryInstruction( + newRegistryAdminPubKey, + chainState.RouterConfigPDA, + tokenAdminRegistryPDA, + tokenPubKey, + currentRegistryAdminPrivateKey.PublicKey(), + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + instructions := []solana.Instruction{ix1} + // the existing authority will have to sign the transfer + if err := chain.Confirm(instructions, solCommonUtil.AddSigners(currentRegistryAdminPrivateKey)); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + return deployment.ChangesetOutput{}, nil +} + +// ACCEPT TOKEN ADMIN REGISTRY +type AcceptAdminRoleTokenAdminRegistryConfig struct { + ChainSelector uint64 + TokenPubKey string + NewRegistryAdminPrivateKey string +} + +func (cfg AcceptAdminRoleTokenAdminRegistryConfig) Validate(e deployment.Environment) error { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { + return err + } + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + chain := e.SolChains[cfg.ChainSelector] + if err := validateRouterConfig(chain, chainState); err != nil { + return err + } + tokenAdminRegistryPDA, _, err := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + if err != nil { + return fmt.Errorf("failed to find token admin registry pda (mint: %s, router: %s): %w", tokenPubKey.String(), chainState.Router.String(), err) + } + var tokenAdminRegistryAccount solRouter.TokenAdminRegistry + if err := chain.GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount); err != nil { + return fmt.Errorf("token admin registry not found for (mint: %s, router: %s), cannot accept admin role", tokenPubKey.String(), chainState.Router.String()) + } + // check if accepting admin is the pending admin + newRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.NewRegistryAdminPrivateKey) + newRegistryAdminPublicKey := newRegistryAdminPrivateKey.PublicKey() + if !tokenAdminRegistryAccount.PendingAdministrator.Equals(newRegistryAdminPublicKey) { + return fmt.Errorf("new admin public key (%s) does not match pending registry admin role (%s) for token %s", + newRegistryAdminPublicKey.String(), + tokenAdminRegistryAccount.PendingAdministrator.String(), + tokenPubKey.String(), + ) + } + return nil +} + +func AcceptAdminRoleTokenAdminRegistry(e deployment.Environment, cfg AcceptAdminRoleTokenAdminRegistryConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + chain := e.SolChains[cfg.ChainSelector] + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + newRegistryAdminPrivateKey := solana.MustPrivateKeyFromBase58(cfg.NewRegistryAdminPrivateKey) + + // verified + tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + + ix1, err := solRouter.NewAcceptAdminRoleTokenAdminRegistryInstruction( + chainState.RouterConfigPDA, + tokenAdminRegistryPDA, + tokenPubKey, + newRegistryAdminPrivateKey.PublicKey(), + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + + instructions := []solana.Instruction{ix1} + // the new authority will have to sign the acceptance + if err := chain.Confirm(instructions, solCommonUtil.AddSigners(newRegistryAdminPrivateKey)); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + return deployment.ChangesetOutput{}, nil +} diff --git a/deployment/ccip/changeset/solana/cs_token_pool.go b/deployment/ccip/changeset/solana/cs_token_pool.go new file mode 100644 index 00000000000..e0bf2421842 --- /dev/null +++ b/deployment/ccip/changeset/solana/cs_token_pool.go @@ -0,0 +1,381 @@ +package solana + +import ( + "context" + "fmt" + + "github.com/gagliardetto/solana-go" + + solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + solTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/token_pool" + solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" + solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" + + "github.com/smartcontractkit/chainlink/deployment" + cs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" +) + +var _ deployment.ChangeSet[TokenPoolConfig] = AddTokenPool +var _ deployment.ChangeSet[RemoteChainTokenPoolConfig] = SetupTokenPoolForRemoteChain + +type TokenPoolConfig struct { + ChainSelector uint64 + PoolType string + Authority string + TokenPubKey string + TokenProgramName string +} + +func (cfg TokenPoolConfig) Validate(e deployment.Environment) error { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { + return err + } + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + if chainState.TokenPool.IsZero() { + return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) + } + if _, err := GetPoolType(cfg.PoolType); err != nil { + return err + } + if _, err := GetTokenProgramID(cfg.TokenProgramName); err != nil { + return err + } + + tokenPool := chainState.TokenPool + poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, tokenPool) + if err != nil { + return fmt.Errorf("failed to get token pool config address (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) + } + chain := e.SolChains[cfg.ChainSelector] + var poolConfigAccount solTokenPool.Config + if err := chain.GetAccountDataBorshInto(context.Background(), poolConfigPDA, &poolConfigAccount); err == nil { + return fmt.Errorf("token pool config already exists for (mint: %s, pool: %s)", tokenPubKey.String(), tokenPool.String()) + } + return nil +} + +func AddTokenPool(e deployment.Environment, cfg TokenPoolConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + chain := e.SolChains[cfg.ChainSelector] + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + authorityPubKey := solana.MustPublicKeyFromBase58(cfg.Authority) + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + + // verified + tokenprogramID, _ := GetTokenProgramID(cfg.TokenProgramName) + poolType, _ := GetPoolType(cfg.PoolType) + poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) + poolSigner, _ := solTokenUtil.TokenPoolSignerAddress(tokenPubKey, chainState.TokenPool) + + // addressing errcheck in the next PR + rampAuthorityPubKey, _, _ := solState.FindExternalExecutionConfigPDA(chainState.Router) + + // ata for token pool + createI, tokenPoolATA, err := solTokenUtil.CreateAssociatedTokenAccount( + tokenprogramID, + tokenPubKey, + poolSigner, + chain.DeployerKey.PublicKey(), + ) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create associated token account for tokenpool (mint: %s, pool: %s): %w", tokenPubKey.String(), chainState.TokenPool.String(), err) + } + + solTokenPool.SetProgramID(chainState.TokenPool) + // initialize token pool for token + poolInitI, err := solTokenPool.NewInitializeInstruction( + poolType, + rampAuthorityPubKey, + poolConfigPDA, + tokenPubKey, + poolSigner, + authorityPubKey, // this is assumed to be chain.DeployerKey for now (owner of token pool) + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + // make pool mint_authority for token (required for burn/mint) + authI, err := solTokenUtil.SetTokenMintAuthority( + tokenprogramID, + poolSigner, + tokenPubKey, + authorityPubKey, + ) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + instructions := []solana.Instruction{createI, poolInitI, authI} + + // add signer here if authority is different from deployer key + if err := chain.Confirm(instructions); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + e.Logger.Infow("Created new token pool config", "token_pool_ata", tokenPoolATA.String(), "pool_config", poolConfigPDA.String(), "pool_signer", poolSigner.String()) + e.Logger.Infow("Set mint authority", "poolSigner", poolSigner.String()) + + return deployment.ChangesetOutput{}, nil +} + +// ADD TOKEN POOL FOR REMOTE CHAIN +type RemoteChainTokenPoolConfig struct { + SolChainSelector uint64 + RemoteChainSelector uint64 + SolTokenPubKey string + // this is actually derivable from on chain given token symbol + RemoteConfig solTokenPool.RemoteConfig + InboundRateLimit solTokenPool.RateLimitConfig + OutboundRateLimit solTokenPool.RateLimitConfig +} + +func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.SolTokenPubKey) + if err := commonValidation(e, cfg.SolChainSelector, tokenPubKey); err != nil { + return err + } + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.SolChainSelector] + if chainState.TokenPool.IsZero() { + return fmt.Errorf("token pool not found in existing state, deploy token pool for chain %d", cfg.SolChainSelector) + } + + chain := e.SolChains[cfg.SolChainSelector] + tokenPool := chainState.TokenPool + + // check if pool config exists (cannot do remote setup without it) + poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, tokenPool) + if err != nil { + return fmt.Errorf("failed to get token pool config address (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) + } + var poolConfigAccount solTokenPool.Config + if err := chain.GetAccountDataBorshInto(context.Background(), poolConfigPDA, &poolConfigAccount); err != nil { + return fmt.Errorf("token pool config not found (mint: %s, pool: %s): %w", tokenPubKey.String(), chainState.TokenPool.String(), err) + } + + // check if this remote chain is already configured for this token + remoteChainConfigPDA, _, err := solTokenUtil.TokenPoolChainConfigPDA(cfg.RemoteChainSelector, tokenPubKey, tokenPool) + if err != nil { + return fmt.Errorf("failed to get token pool remote chain config pda (remoteSelector: %d, mint: %s, pool: %s): %w", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String(), err) + } + var remoteChainConfigAccount solTokenPool.ChainConfig + if err := chain.GetAccountDataBorshInto(context.Background(), remoteChainConfigPDA, &remoteChainConfigAccount); err == nil { + return fmt.Errorf("remote chain config already exists for (remoteSelector: %d, mint: %s, pool: %s)", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String()) + } + return nil +} + +func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainTokenPoolConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.SolTokenPubKey) + chain := e.SolChains[cfg.SolChainSelector] + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.SolChainSelector] + // verified + poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) + remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.TokenPool) + + solTokenPool.SetProgramID(chainState.TokenPool) + ixConfigure, err := solTokenPool.NewInitChainRemoteConfigInstruction( + cfg.RemoteChainSelector, + tokenPubKey, + cfg.RemoteConfig, + poolConfigPDA, + remoteChainConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + ixRates, err := solTokenPool.NewSetChainRateLimitInstruction( + cfg.RemoteChainSelector, + tokenPubKey, + cfg.InboundRateLimit, + cfg.OutboundRateLimit, + poolConfigPDA, + remoteChainConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + + ixAppend, err := solTokenPool.NewAppendRemotePoolAddressesInstruction( + cfg.RemoteChainSelector, + tokenPubKey, + cfg.RemoteConfig.PoolAddresses, // i dont know why this is a list (is it for different types of pool of the same token?) + poolConfigPDA, + remoteChainConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) + } + + instructions := []solana.Instruction{ixConfigure, ixRates, ixAppend} + err = chain.Confirm(instructions) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to confirm instructions: %w", err) + } + e.Logger.Infow("Configured token pool for remote chain", "remote_chain_selector", cfg.RemoteChainSelector, "token_pubkey", tokenPubKey.String()) + return deployment.ChangesetOutput{}, nil +} + +// ADD TOKEN POOL LOOKUP TABLE +type TokenPoolLookupTableConfig struct { + ChainSelector uint64 + TokenPubKey string + TokenProgram string // this can go as a address book tag +} + +func (cfg TokenPoolLookupTableConfig) Validate(e deployment.Environment) error { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { + return err + } + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + if chainState.TokenPool.IsZero() { + return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) + } + + // TODO: do we need to validate if everything that goes into the lookup table is already created ? + return nil +} + +func AddTokenPoolLookupTable(e deployment.Environment, cfg TokenPoolLookupTableConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + chain := e.SolChains[cfg.ChainSelector] + ctx := e.GetContext() + client := chain.Client + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + authorityPrivKey := chain.DeployerKey // assuming the authority is the deployer key + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + + tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + tokenPoolChainConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) + tokenPoolSigner, _ := solTokenUtil.TokenPoolSignerAddress(tokenPubKey, chainState.TokenPool) + tokenProgram, _ := GetTokenProgramID(cfg.TokenProgram) + poolTokenAccount, _, _ := solTokenUtil.FindAssociatedTokenAddress(tokenProgram, tokenPubKey, tokenPoolSigner) + feeTokenConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenPubKey, chainState.FeeQuoter) + + // the 'table' address is not derivable + // but this will be stored in tokenAdminRegistryPDA as a part of the SetPool changeset + // and tokenAdminRegistryPDA is derivable using token and router address + table, err := solCommonUtil.CreateLookupTable(ctx, client, *authorityPrivKey) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create lookup table for token pool (mint: %s): %w", tokenPubKey.String(), err) + } + list := solana.PublicKeySlice{ + table, // 0 + tokenAdminRegistryPDA, // 1 + chainState.TokenPool, // 2 + tokenPoolChainConfigPDA, // 3 - writable + poolTokenAccount, // 4 - writable + tokenPoolSigner, // 5 + tokenProgram, // 6 + tokenPubKey, // 7 - writable + feeTokenConfigPDA, // 8 + } + if err = solCommonUtil.ExtendLookupTable(ctx, client, table, *authorityPrivKey, list); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to extend lookup table for token pool (mint: %s): %w", tokenPubKey.String(), err) + } + if err := solCommonUtil.AwaitSlotChange(ctx, client); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to await slot change while extending lookup table: %w", err) + } + newAddressBook := deployment.NewMemoryAddressBook() + tv := deployment.NewTypeAndVersion(cs.TokenPoolLookupTable, deployment.Version1_0_0) + tv.Labels.Add(tokenPubKey.String()) + if err := newAddressBook.Save(cfg.ChainSelector, table.String(), tv); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to save tokenpool address lookup table: %w", err) + } + e.Logger.Infow("Added token pool lookup table", "token_pubkey", tokenPubKey.String()) + return deployment.ChangesetOutput{ + AddressBook: newAddressBook, + }, nil +} + +type SetPoolConfig struct { + ChainSelector uint64 + TokenPubKey string + TokenAdminRegistryAdminPrivateKey string + PoolLookupTable string + WritableIndexes []uint8 +} + +func (cfg SetPoolConfig) Validate(e deployment.Environment) error { + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + if err := commonValidation(e, cfg.ChainSelector, tokenPubKey); err != nil { + return err + } + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + chain := e.SolChains[cfg.ChainSelector] + if chainState.TokenPool.IsZero() { + return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) + } + if err := validateRouterConfig(chain, chainState); err != nil { + return err + } + tokenAdminRegistryPDA, _, err := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + if err != nil { + return fmt.Errorf("failed to find token admin registry pda (mint: %s, router: %s): %w", tokenPubKey.String(), chainState.Router.String(), err) + } + var tokenAdminRegistryAccount solRouter.TokenAdminRegistry + if err := chain.GetAccountDataBorshInto(context.Background(), tokenAdminRegistryPDA, &tokenAdminRegistryAccount); err != nil { + return fmt.Errorf("token admin registry not found for (mint: %s, router: %s), cannot set pool", tokenPubKey.String(), chainState.Router.String()) + } + return nil +} + +// this sets the writable indexes of the token pool lookup table +func SetPool(e deployment.Environment, cfg SetPoolConfig) (deployment.ChangesetOutput, error) { + if err := cfg.Validate(e); err != nil { + return deployment.ChangesetOutput{}, err + } + + chain := e.SolChains[cfg.ChainSelector] + state, _ := cs.LoadOnchainState(e) + chainState := state.SolChains[cfg.ChainSelector] + tokenPubKey := solana.MustPublicKeyFromBase58(cfg.TokenPubKey) + routerConfigPDA, _, _ := solState.FindConfigPDA(chainState.Router) + tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenPubKey, chainState.Router) + tokenAdminRegistryAdminPrivKey := solana.MustPrivateKeyFromBase58(cfg.TokenAdminRegistryAdminPrivateKey) + lookupTablePubKey := solana.MustPublicKeyFromBase58(cfg.PoolLookupTable) + + base := solRouter.NewSetPoolInstruction( + cfg.WritableIndexes, + routerConfigPDA, + tokenAdminRegistryPDA, + tokenPubKey, + lookupTablePubKey, + tokenAdminRegistryAdminPrivKey.PublicKey(), + ) + + base.AccountMetaSlice = append(base.AccountMetaSlice, solana.Meta(lookupTablePubKey)) + instruction, err := base.ValidateAndBuild() + if err != nil { + return deployment.ChangesetOutput{}, err + } + + instructions := []solana.Instruction{instruction} + err = chain.Confirm(instructions, solCommonUtil.AddSigners(tokenAdminRegistryAdminPrivKey)) + if err != nil { + return deployment.ChangesetOutput{}, err + } + e.Logger.Infow("Set pool config", "token_pubkey", tokenPubKey.String()) + return deployment.ChangesetOutput{}, nil +} diff --git a/deployment/ccip/changeset/solana_state.go b/deployment/ccip/changeset/solana_state.go index 1a4e8161a88..2bead429d46 100644 --- a/deployment/ccip/changeset/solana_state.go +++ b/deployment/ccip/changeset/solana_state.go @@ -14,32 +14,40 @@ import ( ) var ( - AddressLookupTable deployment.ContractType = "AddressLookupTable" - TokenPool deployment.ContractType = "TokenPool" - Receiver deployment.ContractType = "Receiver" - SPL2022Tokens deployment.ContractType = "SPL2022Tokens" - WSOL deployment.ContractType = "WSOL" + OfframpAddressLookupTable deployment.ContractType = "OfframpAddressLookupTable" + TokenPool deployment.ContractType = "TokenPool" + Receiver deployment.ContractType = "Receiver" + SPL2022Tokens deployment.ContractType = "SPL2022Tokens" + WSOL deployment.ContractType = "WSOL" // for PDAs from AddRemoteChainToSolana RemoteSource deployment.ContractType = "RemoteSource" RemoteDest deployment.ContractType = "RemoteDest" + + // Tokenpool lookup table + TokenPoolLookupTable deployment.ContractType = "TokenPoolLookupTable" ) // SolChainState holds a Go binding for all the currently deployed CCIP programs // on a chain. If a binding is nil, it means here is no such contract on the chain. type SolCCIPChainState struct { - LinkToken solana.PublicKey - Router solana.PublicKey - Timelock solana.PublicKey - AddressLookupTable solana.PublicKey // for chain writer - Receiver solana.PublicKey // for tests only - SPL2022Tokens []solana.PublicKey - TokenPool solana.PublicKey - WSOL solana.PublicKey + LinkToken solana.PublicKey + Router solana.PublicKey + Timelock solana.PublicKey + OfframpAddressLookupTable solana.PublicKey + Receiver solana.PublicKey // for tests only + SPL2022Tokens []solana.PublicKey + TokenPool solana.PublicKey + WSOL solana.PublicKey + FeeQuoter solana.PublicKey + OffRamp solana.PublicKey // PDAs to avoid redundant lookups - RouterStatePDA solana.PublicKey RouterConfigPDA solana.PublicKey - SourceChainStatePDAs map[uint64]solana.PublicKey + SourceChainStatePDAs map[uint64]solana.PublicKey // deprecated DestChainStatePDAs map[uint64]solana.PublicKey + TokenPoolLookupTable map[solana.PublicKey]solana.PublicKey + FeeQuoterConfigPDA solana.PublicKey + OffRampConfigPDA solana.PublicKey + OffRampStatePDA solana.PublicKey } func LoadOnchainStateSolana(e deployment.Environment) (CCIPOnChainState, error) { @@ -69,8 +77,9 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy state := SolCCIPChainState{ SourceChainStatePDAs: make(map[uint64]solana.PublicKey), DestChainStatePDAs: make(map[uint64]solana.PublicKey), + SPL2022Tokens: make([]solana.PublicKey, 0), + TokenPoolLookupTable: make(map[solana.PublicKey]solana.PublicKey), } - var spl2022Tokens []solana.PublicKey for address, tvStr := range addresses { switch tvStr.Type { case commontypes.LinkToken: @@ -79,25 +88,20 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy case Router: pub := solana.MustPublicKeyFromBase58(address) state.Router = pub - routerStatePDA, _, err := solState.FindStatePDA(state.Router) - if err != nil { - return state, err - } - state.RouterStatePDA = routerStatePDA routerConfigPDA, _, err := solState.FindConfigPDA(state.Router) if err != nil { return state, err } state.RouterConfigPDA = routerConfigPDA - case AddressLookupTable: + case OfframpAddressLookupTable: pub := solana.MustPublicKeyFromBase58(address) - state.AddressLookupTable = pub + state.OfframpAddressLookupTable = pub case Receiver: pub := solana.MustPublicKeyFromBase58(address) state.Receiver = pub case SPL2022Tokens: pub := solana.MustPublicKeyFromBase58(address) - spl2022Tokens = append(spl2022Tokens, pub) + state.SPL2022Tokens = append(state.SPL2022Tokens, pub) case TokenPool: pub := solana.MustPublicKeyFromBase58(address) state.TokenPool = pub @@ -121,11 +125,38 @@ func LoadChainStateSolana(chain deployment.SolChain, addresses map[string]deploy } state.DestChainStatePDAs[selector] = pub } + case TokenPoolLookupTable: + lookupTablePubKey := solana.MustPublicKeyFromBase58(address) + // Labels should only have one entry + for tokenPubKeyStr := range tvStr.Labels { + tokenPubKey := solana.MustPublicKeyFromBase58(tokenPubKeyStr) + state.TokenPoolLookupTable[tokenPubKey] = lookupTablePubKey + } + case FeeQuoter: + pub := solana.MustPublicKeyFromBase58(address) + state.FeeQuoter = pub + feeQuoterConfigPDA, _, err := solState.FindFqConfigPDA(state.FeeQuoter) + if err != nil { + return state, err + } + state.FeeQuoterConfigPDA = feeQuoterConfigPDA + case OffRamp: + pub := solana.MustPublicKeyFromBase58(address) + state.OffRamp = pub + offRampConfigPDA, _, err := solState.FindOfframpConfigPDA(state.OffRamp) + if err != nil { + return state, err + } + state.OffRampConfigPDA = offRampConfigPDA + offRampStatePDA, _, err := solState.FindOfframpStatePDA(state.OffRamp) + if err != nil { + return state, err + } + state.OffRampStatePDA = offRampStatePDA default: return state, fmt.Errorf("unknown contract %s", tvStr) } } state.WSOL = solana.SolMint - state.SPL2022Tokens = spl2022Tokens return state, nil } diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go index 739333b720b..3154b4c6998 100644 --- a/deployment/ccip/changeset/state.go +++ b/deployment/ccip/changeset/state.go @@ -464,7 +464,7 @@ func (s CCIPOnChainState) GetOffRampAddress(chainSelector uint64) ([]byte, error case chain_selectors.FamilyEVM: offRampAddress = s.Chains[chainSelector].OffRamp.Address().Bytes() case chain_selectors.FamilySolana: - offRampAddress = s.SolChains[chainSelector].Router.Bytes() + offRampAddress = s.SolChains[chainSelector].OffRamp.Bytes() default: return nil, fmt.Errorf("unsupported chain family %s", family) } diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 75d190ae3f0..0984721e4b1 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -46,10 +46,13 @@ import ( "github.com/smartcontractkit/chainlink/deployment/environment/devenv" "github.com/smartcontractkit/chainlink/deployment/environment/memory" + solTestConfig "github.com/smartcontractkit/chainlink-ccip/chains/solana/contracts/tests/config" + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" + solTestReceiver "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_ccip_receiver" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" - solTestConfig "github.com/smartcontractkit/chainlink-ccip/chains/solana/contracts/tests/config" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" @@ -61,8 +64,6 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/gagliardetto/solana-go" - - "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_receiver" ) const ( @@ -464,6 +465,20 @@ func AddLane( }, }, }, + { + Changeset: commoncs.WrapChangeSet(changeset.UpdateRouterRampsChangeset), + Config: changeset.UpdateRouterRampsConfig{ + TestRouter: isTestRouter, + UpdatesByChain: map[uint64]changeset.RouterUpdates{ + // onRamp update on source chain + from: { + OnRampUpdates: map[uint64]bool{ + to: true, + }, + }, + }, + }, + }, } require.NoError(t, err) @@ -489,12 +504,6 @@ func AddLane( Config: changeset.UpdateRouterRampsConfig{ TestRouter: isTestRouter, UpdatesByChain: map[uint64]changeset.RouterUpdates{ - // onRamp update on source chain - from: { - OnRampUpdates: map[uint64]bool{ - to: true, - }, - }, // offramp update on dest chain to: { OffRampUpdates: map[uint64]bool{ @@ -515,21 +524,21 @@ func AddLane( { Changeset: commoncs.WrapChangeSet(changeset_solana.AddRemoteChainToSolana), Config: changeset_solana.AddRemoteChainToSolanaConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset_solana.RemoteChainConfigSolana{ - to: { - from: { - EnabledAsSource: true, - DestinationConfig: solRouter.DestChainConfig{ - IsEnabled: true, - DefaultTxGasLimit: 200000, - MaxPerMsgGasLimit: 3000000, - MaxDataBytes: 30000, - MaxNumberOfTokensPerMsg: 5, - DefaultTokenDestGasOverhead: 5000, - // bytes4(keccak256("CCIP ChainFamilySelector EVM")) - // TODO: do a similar test for other chain families - ChainFamilySelector: [4]uint8{40, 18, 213, 44}, - }, + ChainSelector: to, + UpdatesByChain: map[uint64]changeset_solana.RemoteChainConfigSolana{ + from: { + EnabledAsSource: true, + RouterDestinationConfig: solRouter.DestChainConfig{}, + FeeQuoterDestinationConfig: solFeeQuoter.DestChainConfig{ + IsEnabled: true, + DefaultTxGasLimit: 200000, + MaxPerMsgGasLimit: 3000000, + MaxDataBytes: 30000, + MaxNumberOfTokensPerMsg: 5, + DefaultTokenDestGasOverhead: 5000, + // bytes4(keccak256("CCIP ChainFamilySelector EVM")) + // TODO: do a similar test for other chain families + ChainFamilySelector: [4]uint8{40, 18, 213, 44}, }, }, }, @@ -601,7 +610,7 @@ func AddLaneWithDefaultPricesAndFeeQuoterConfig(t *testing.T, e *DeployedEnv, st }, map[common.Address]*big.Int{ stateChainFrom.LinkToken.Address(): DefaultLinkPrice, stateChainFrom.Weth9.Address(): DefaultWethPrice, - }, changeset.DefaultFeeQuoterDestChainConfig(true)) + }, changeset.DefaultFeeQuoterDestChainConfig(true, to)) } // AddLanesForAll adds densely connected lanes for all chains in the environment so that each chain @@ -761,7 +770,7 @@ func DeployTransferableToken( // Configure pools in parallel configurePoolGrp := errgroup.Group{} configurePoolGrp.Go(func() error { - err := setTokenPoolCounterPart(chains[src], srcPool, srcActor, dst, dstToken.Address(), dstPool.Address()) + err := setTokenPoolCounterPart(chains[src], srcPool, srcActor, dst, dstToken.Address().Bytes(), dstPool.Address().Bytes()) if err != nil { return fmt.Errorf("failed to set token pool counter part chain %d: %w", src, err) } @@ -772,7 +781,7 @@ func DeployTransferableToken( return nil }) configurePoolGrp.Go(func() error { - err := setTokenPoolCounterPart(chains[dst], dstPool, dstActor, src, srcToken.Address(), srcPool.Address()) + err := setTokenPoolCounterPart(chains[dst], dstPool, dstActor, src, srcToken.Address().Bytes(), srcPool.Address().Bytes()) if err != nil { return fmt.Errorf("failed to set token pool counter part chain %d: %w", dst, err) } @@ -887,18 +896,25 @@ func setUSDCTokenPoolCounterPart( return err } - return setTokenPoolCounterPart(chain, pool, actor, destChainSelector, destTokenAddress, destTokenPoolAddress) + return setTokenPoolCounterPart(chain, pool, actor, destChainSelector, destTokenAddress.Bytes(), destTokenPoolAddress.Bytes()) } -func setTokenPoolCounterPart(chain deployment.Chain, tokenPool *burn_mint_token_pool.BurnMintTokenPool, actor *bind.TransactOpts, destChainSelector uint64, destTokenAddress common.Address, destTokenPoolAddress common.Address) error { +func setTokenPoolCounterPart( + chain deployment.Chain, + tokenPool *burn_mint_token_pool.BurnMintTokenPool, + actor *bind.TransactOpts, + destChainSelector uint64, + destTokenAddress []byte, + destTokenPoolAddress []byte, +) error { tx, err := tokenPool.ApplyChainUpdates( actor, []uint64{}, []burn_mint_token_pool.TokenPoolChainUpdate{ { RemoteChainSelector: destChainSelector, - RemotePoolAddresses: [][]byte{common.LeftPadBytes(destTokenPoolAddress.Bytes(), 32)}, - RemoteTokenAddress: common.LeftPadBytes(destTokenAddress.Bytes(), 32), + RemotePoolAddresses: [][]byte{common.LeftPadBytes(destTokenPoolAddress, 32)}, + RemoteTokenAddress: common.LeftPadBytes(destTokenAddress, 32), OutboundRateLimiterConfig: burn_mint_token_pool.RateLimiterConfig{ IsEnabled: false, Capacity: big.NewInt(0), @@ -921,10 +937,18 @@ func setTokenPoolCounterPart(chain deployment.Chain, tokenPool *burn_mint_token_ return err } + supported, err := tokenPool.IsSupportedChain(&bind.CallOpts{}, destChainSelector) + if err != nil { + return err + } + if !supported { + return fmt.Errorf("token pool %s is not supported on chain %d", tokenPool.Address(), destChainSelector) + } + tx, err = tokenPool.AddRemotePool( actor, destChainSelector, - destTokenPoolAddress.Bytes(), + destTokenPoolAddress, ) if err != nil { return fmt.Errorf("failed to set remote pool on token pool %s: %w", tokenPool.Address(), err) @@ -1368,6 +1392,12 @@ func SavePreloadedSolAddresses(t *testing.T, e deployment.Environment, solChainS tv = deployment.NewTypeAndVersion(changeset.TokenPool, deployment.Version1_0_0) err = e.ExistingAddresses.Save(solChainSelector, solTestConfig.CcipTokenPoolProgram.String(), tv) require.NoError(t, err) + tv = deployment.NewTypeAndVersion(changeset.FeeQuoter, deployment.Version1_0_0) + err = e.ExistingAddresses.Save(solChainSelector, solTestConfig.FeeQuoterProgram.String(), tv) + require.NoError(t, err) + tv = deployment.NewTypeAndVersion(changeset.OffRamp, deployment.Version1_0_0) + err = e.ExistingAddresses.Save(solChainSelector, solTestConfig.CcipOfframpProgram.String(), tv) + require.NoError(t, err) } func ValidateSolanaState(t *testing.T, e deployment.Environment, solChainSelectors []uint64) { @@ -1380,18 +1410,27 @@ func ValidateSolanaState(t *testing.T, e deployment.Environment, solChainSelecto require.True(t, exists, "Chain selector %d not found in Solana state", sel) // Validate addresses - require.False(t, chainState.LinkToken.IsZero(), "Link token address is zero for chain %d", sel) require.False(t, chainState.Router.IsZero(), "Router address is zero for chain %d", sel) - require.False(t, chainState.RouterConfigPDA.IsZero(), "RouterConfigPDA is zero for chain %d", sel) - require.False(t, chainState.RouterStatePDA.IsZero(), "RouterStatePDA is zero for chain %d", sel) - require.False(t, chainState.AddressLookupTable.IsZero(), "Address lookup table is zero for chain %d", sel) + require.False(t, chainState.OffRamp.IsZero(), "OffRamp address is zero for chain %d", sel) + require.False(t, chainState.FeeQuoter.IsZero(), "FeeQuoter address is zero for chain %d", sel) + require.False(t, chainState.LinkToken.IsZero(), "Link token address is zero for chain %d", sel) + require.False(t, chainState.OfframpAddressLookupTable.IsZero(), "Offramp address lookup table is zero for chain %d", sel) // Get router config var routerConfigAccount solRouter.Config - - // Check if account exists first err = e.SolChains[sel].GetAccountDataBorshInto(testcontext.Get(t), chainState.RouterConfigPDA, &routerConfigAccount) require.NoError(t, err, "Failed to deserialize router config for chain %d", sel) + + // Get fee quoter config + var feeQuoterConfigAccount solFeeQuoter.Config + err = e.SolChains[sel].GetAccountDataBorshInto(testcontext.Get(t), chainState.FeeQuoterConfigPDA, &feeQuoterConfigAccount) + require.NoError(t, err, "Failed to deserialize fee quoter config for chain %d", sel) + + // Get offramp config + var offRampConfigAccount solOffRamp.Config + err = e.SolChains[sel].GetAccountDataBorshInto(testcontext.Get(t), chainState.OffRampConfigPDA, &offRampConfigAccount) + require.NoError(t, err, "Failed to deserialize offramp config for chain %d", sel) + } } @@ -1399,9 +1438,9 @@ func DeploySolanaCcipReceiver(t *testing.T, e deployment.Environment) { state, err := changeset.LoadOnchainStateSolana(e) require.NoError(t, err) for solSelector, chainState := range state.SolChains { - ccip_receiver.SetProgramID(chainState.Receiver) + solTestReceiver.SetProgramID(chainState.Receiver) externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(chainState.Receiver) - instruction, ixErr := ccip_receiver.NewInitializeInstruction( + instruction, ixErr := solTestReceiver.NewInitializeInstruction( FindReceiverTargetAccount(chainState.Receiver), externalExecutionConfigPDA, e.SolChains[solSelector].DeployerKey.PublicKey(), diff --git a/deployment/environment/memory/chain.go b/deployment/environment/memory/chain.go index 8ca162690f2..e0901bd244c 100644 --- a/deployment/environment/memory/chain.go +++ b/deployment/environment/memory/chain.go @@ -196,19 +196,19 @@ func solChain(t *testing.T, chainID uint64, adminKey *solana.PrivateKey) (string port := freeport.GetOne(t) programIds := map[string]string{ - "ccip_router": solTestConfig.CcipRouterProgram.String(), - "token_pool": solTestConfig.CcipTokenPoolProgram.String(), - "ccip_receiver": solTestConfig.CcipLogicReceiver.String(), + "ccip_router": solTestConfig.CcipRouterProgram.String(), + "token_pool": solTestConfig.CcipTokenPoolProgram.String(), + "fee_quoter": solTestConfig.FeeQuoterProgram.String(), + "test_ccip_receiver": solTestConfig.CcipLogicReceiver.String(), + "ccip_offramp": solTestConfig.CcipOfframpProgram.String(), } bcInput := &blockchain.Input{ - Type: "solana", - ChainID: strconv.FormatUint(chainID, 10), - PublicKey: adminKey.PublicKey().String(), - Port: strconv.Itoa(port), - ContractsDir: ProgramsPath, - // TODO: this should be solTestConfig.CCIPRouterProgram - // TODO: make this a function + Type: "solana", + ChainID: strconv.FormatUint(chainID, 10), + PublicKey: adminKey.PublicKey().String(), + Port: strconv.Itoa(port), + ContractsDir: ProgramsPath, SolanaPrograms: programIds, } output, err := blockchain.NewBlockchainNetwork(bcInput) diff --git a/deployment/environment/nodeclient/chainlink_models_test.go b/deployment/environment/nodeclient/chainlink_models_test.go index 64a8551ff0d..ae1e35eb33f 100644 --- a/deployment/environment/nodeclient/chainlink_models_test.go +++ b/deployment/environment/nodeclient/chainlink_models_test.go @@ -116,7 +116,7 @@ contractABI = "[\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n [relayConfig.chainReader.contracts.median.configs] LatestRoundRequested = "{\n \"chainSpecificName\": \"RoundRequested\",\n \"readType\": \"event\"\n}\n" -LatestTransmissionDetails = "{\n \"chainSpecificName\": \"latestTransmissionDetails\",\n \"outputModifications\": [\n {\n \"Fields\": [\n \"LatestTimestamp_\"\n ],\n \"Type\": \"epoch to time\"\n },\n {\n \"Fields\": {\n \"LatestAnswer_\": \"LatestAnswer\",\n \"LatestTimestamp_\": \"LatestTimestamp\"\n },\n \"Type\": \"rename\"\n }\n ]\n}\n" +LatestTransmissionDetails = "{\n \"chainSpecificName\": \"latestTransmissionDetails\",\n \"outputModifications\": [\n {\n \"EnablePathTraverse\": false,\n \"Fields\": [\n \"LatestTimestamp_\"\n ],\n \"Type\": \"epoch to time\"\n },\n {\n \"EnablePathTraverse\": false,\n \"Fields\": {\n \"LatestAnswer_\": \"LatestAnswer\",\n \"LatestTimestamp_\": \"LatestTimestamp\"\n },\n \"Type\": \"rename\"\n }\n ]\n}\n" [relayConfig.codec] [relayConfig.codec.configs] diff --git a/deployment/go.mod b/deployment/go.mod index 3ef85293545..93cf1bbcdc1 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -32,12 +32,12 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 @@ -429,8 +429,8 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.1 // indirect google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index 0ba9b654201..a9846aabd49 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1112,10 +1112,10 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b h1:eNsqumP7VVJudA7gEcTKVFofealwbPJRinUw24uEmII= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 h1:bS51NFGHVjkCy7yu9L2Ss4sBsCW6jpa5GuhRAdWWxzM= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= @@ -1132,8 +1132,8 @@ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2Lp github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 h1:LJQsEuDXSm17akdMjDtUdxkwk5vmaM+VwSCuDHvt25Y= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06/go.mod h1:mSaVleJajXjm9HpXKIIUI/s+R9FPcRXcZzvatRtejCQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVoZN8VwJb/kAZsbDjW+6cgZPgNTcQHJUH9JrA= @@ -1797,10 +1797,10 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/deployment/solana_chain.go b/deployment/solana_chain.go index 1bc643924be..b0e2e0119a1 100644 --- a/deployment/solana_chain.go +++ b/deployment/solana_chain.go @@ -28,6 +28,7 @@ var ( SolDefaultMaxFeeJuelsPerMsg = solBinary.Uint128{Lo: 300000000, Hi: 0, Endianness: nil} SPL2022Tokens = "SPL2022Tokens" SPLTokens = "SPLTokens" + EnableExecutionAfter = int64(1800) // 30min ) // SolChain represents a Solana chain. diff --git a/go.mod b/go.mod index ad9a6fc258c..6add84b60ca 100644 --- a/go.mod +++ b/go.mod @@ -79,15 +79,15 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-feeds v0.1.1 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de @@ -364,8 +364,8 @@ require ( golang.org/x/sys v0.29.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 // indirect gopkg.in/guregu/null.v2 v2.1.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 623c276b9a5..490b41fbcf9 100644 --- a/go.sum +++ b/go.sum @@ -1012,10 +1012,10 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b h1:eNsqumP7VVJudA7gEcTKVFofealwbPJRinUw24uEmII= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 h1:bS51NFGHVjkCy7yu9L2Ss4sBsCW6jpa5GuhRAdWWxzM= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= @@ -1030,8 +1030,8 @@ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2Lp github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 h1:LJQsEuDXSm17akdMjDtUdxkwk5vmaM+VwSCuDHvt25Y= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06/go.mod h1:mSaVleJajXjm9HpXKIIUI/s+R9FPcRXcZzvatRtejCQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= @@ -1689,10 +1689,10 @@ google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaE google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38 h1:2oV8dfuIkM1Ti7DwXc0BJfnwr9csz4TDXI9EmiI+Rbw= -google.golang.org/genproto/googleapis/api v0.0.0-20241021214115-324edc3d5d38/go.mod h1:vuAjtvlwkDKF6L1GQ0SokiRLCGFfeBUXWr/aFFkHACc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28 h1:XVhgTWWV3kGQlwJHR3upFWZeTsei6Oks1apkZSeonIE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 0f415dcac48..432d434b33e 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 @@ -423,14 +423,14 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.9.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 32cb0b02670..d7fce2028e2 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1362,10 +1362,10 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b h1:eNsqumP7VVJudA7gEcTKVFofealwbPJRinUw24uEmII= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 h1:bS51NFGHVjkCy7yu9L2Ss4sBsCW6jpa5GuhRAdWWxzM= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= @@ -1382,8 +1382,8 @@ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2Lp github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 h1:LJQsEuDXSm17akdMjDtUdxkwk5vmaM+VwSCuDHvt25Y= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06/go.mod h1:mSaVleJajXjm9HpXKIIUI/s+R9FPcRXcZzvatRtejCQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index a33f72e3aaf..cf249cf3064 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -29,7 +29,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 @@ -409,7 +409,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect @@ -417,7 +417,7 @@ require ( github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 // indirect github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 8312511e2b4..31a4a2b95e3 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1345,10 +1345,10 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b h1:eNsqumP7VVJudA7gEcTKVFofealwbPJRinUw24uEmII= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250130162116-1b2ee24da54b/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36 h1:bS51NFGHVjkCy7yu9L2Ss4sBsCW6jpa5GuhRAdWWxzM= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130202959-6f1f48342e36/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= @@ -1365,8 +1365,8 @@ github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2Lp github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06 h1:LJQsEuDXSm17akdMjDtUdxkwk5vmaM+VwSCuDHvt25Y= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250205221351-c3ca04743e06/go.mod h1:mSaVleJajXjm9HpXKIIUI/s+R9FPcRXcZzvatRtejCQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE= From 978533a3ea696e9c6beb4f5d00261800c8459784 Mon Sep 17 00:00:00 2001 From: kylesmartin <54827727+kylesmartin@users.noreply.github.com> Date: Mon, 10 Feb 2025 13:33:38 -0500 Subject: [PATCH 09/83] Patch token pool ownership validation (#16262) --- deployment/ccip/changeset/cs_configure_token_pools.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/deployment/ccip/changeset/cs_configure_token_pools.go b/deployment/ccip/changeset/cs_configure_token_pools.go index d333a2b1a89..7fbd3eb3c01 100644 --- a/deployment/ccip/changeset/cs_configure_token_pools.go +++ b/deployment/ccip/changeset/cs_configure_token_pools.go @@ -85,9 +85,13 @@ func (c TokenPoolConfig) Validate(ctx context.Context, chain deployment.Chain, s if !ok { return fmt.Errorf("token pool does not exist on %s with symbol %s, type %s, and version %s", chain.String(), tokenSymbol, c.Type, c.Version) } + tokenPool, err := token_pool.NewTokenPool(tokenPoolAddress, chain.Client) + if err != nil { + return fmt.Errorf("failed to connect address %s with token pool bindings: %w", tokenPoolAddress, err) + } // Validate that the token pool is owned by the address that will be actioning the transactions (i.e. Timelock or deployer key) - if err := commoncs.ValidateOwnership(ctx, useMcms, chain.DeployerKey.From, state.Timelock.Address(), state.TokenAdminRegistry); err != nil { + if err := commoncs.ValidateOwnership(ctx, useMcms, chain.DeployerKey.From, state.Timelock.Address(), tokenPool); err != nil { return fmt.Errorf("token pool with address %s on %s failed ownership validation: %w", tokenPoolAddress, chain.String(), err) } From 5139948a1a5edf8467ea4f58bbc669f689c128cb Mon Sep 17 00:00:00 2001 From: Adam Hamrick Date: Mon, 10 Feb 2025 15:19:46 -0500 Subject: [PATCH 10/83] Fixes flakeguard bug with bad reporting to GitHub summary (#16301) --- .github/workflows/flakeguard.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/flakeguard.yml b/.github/workflows/flakeguard.yml index 51427b91ba0..79b4cba7229 100644 --- a/.github/workflows/flakeguard.yml +++ b/.github/workflows/flakeguard.yml @@ -133,7 +133,7 @@ jobs: - name: Install flakeguard if: ${{ inputs.runAllTests == false }} shell: bash - run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@103764eb5a9f02e0f3dc677f0d9da2e6796a978c # flakguard@0.1.0 + run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@76e3b96cab242e7fc4be2a296b4232335e245a67 # flakguard@0.1.0 - name: Find new or updated test packages if: ${{ inputs.runAllTests == false && env.RUN_CUSTOM_TEST_PACKAGES == '' }} @@ -334,7 +334,7 @@ jobs: - name: Install flakeguard shell: bash - run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@103764eb5a9f02e0f3dc677f0d9da2e6796a978c # flakguard@0.1.0 + run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@76e3b96cab242e7fc4be2a296b4232335e245a67 # flakguard@0.1.0 - name: Run tests with flakeguard shell: bash @@ -348,9 +348,9 @@ jobs: # Output the status of the flakeguard run to files so that the next step can aggregate them and act accordingly EXIT_CODE=$? echo "$EXIT_CODE" > status_${GITHUB_JOB}.txt - if [ $EXIT_CODE -e 1 ]; then + if [ $EXIT_CODE -eq 1 ]; then echo "Found flaky tests" - elif [ $EXIT_CODE -e 2 ]; then + elif [ $EXIT_CODE -eq 2 ]; then echo "ERROR: Flakeguard encountered an error while running tests" echo "flakeguard_error=true" >> $GITHUB_OUTPUT fi @@ -411,7 +411,7 @@ jobs: - name: Install flakeguard shell: bash - run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@103764eb5a9f02e0f3dc677f0d9da2e6796a978c # flakguard@0.1.0 + run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@76e3b96cab242e7fc4be2a296b4232335e245a67 # flakguard@0.1.0 - name: Aggregate Flakeguard Results id: results @@ -446,7 +446,7 @@ jobs: --splunk-token "${{ secrets.FLAKEGUARD_SPLUNK_HEC }}" \ --splunk-event "${{ github.event_name }}" EXIT_CODE=$? - if [ $EXIT_CODE -e 2 ]; then + if [ $EXIT_CODE -eq 2 ]; then echo "ERROR: Flakeguard encountered an error while aggregating results" echo "ERROR: Flakeguard encountered an error while aggregating results" >> $GITHUB_STEP_SUMMARY exit $EXIT_CODE @@ -529,7 +529,7 @@ jobs: --max-pass-ratio "$GH_INPUTS_MAX_PASS_RATIO" fi EXIT_CODE=$? - if [ $EXIT_CODE -e 2 ]; then + if [ $EXIT_CODE -eq 2 ]; then echo "ERROR: Flakeguard encountered an error while generating reports" echo "ERROR: Flakeguard encountered an error while generating reports" >> $GITHUB_STEP_SUMMARY exit $EXIT_CODE From 762bbf842d0b81829d2b6e58f19cf168f16f2be2 Mon Sep 17 00:00:00 2001 From: Dimitrios Naikopoulos <48590504+DimitriosNaikopoulos@users.noreply.github.com> Date: Tue, 11 Feb 2025 09:24:07 +0000 Subject: [PATCH 11/83] Fix: Upgrade go-releaser (#16315) --- .github/actions/goreleaser-build-sign-publish/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/goreleaser-build-sign-publish/action.yml b/.github/actions/goreleaser-build-sign-publish/action.yml index e2472f7eaa4..dcf21844e3d 100644 --- a/.github/actions/goreleaser-build-sign-publish/action.yml +++ b/.github/actions/goreleaser-build-sign-publish/action.yml @@ -57,7 +57,7 @@ runs: only-modules: 'true' - name: Setup goreleaser - uses: goreleaser/goreleaser-action@9ed2f89a662bf1735a48bc8557fd212fa902bebf # v6.1.0 + uses: goreleaser/goreleaser-action@90a3faa9d0182683851fbfa97ca1a2cb983bfca3 # v6.2.1 with: distribution: goreleaser-pro install-only: true From f5de11f6c0347c9427b0c8e0802ee0311d728f4d Mon Sep 17 00:00:00 2001 From: Bartek Tofel Date: Tue, 11 Feb 2025 11:58:03 +0100 Subject: [PATCH 12/83] [TT-1975] use mocked data source in keystone smoke test (#16257) * allow ip and ipcidr whitelisting with core gateway * allow tests to use real and mocked price endpoint * allow multiple extra allowed ports * test mocked data source in the CI * remove support for allowed ip ranges from http client, clean up the test and add comments * update env config * Fix lints, add changeset * tidy go.mod * adjust mock ip resolution to linux * fix CI part of ip resolution * check only 1 price in the CI * use updated binary & config that works with mock, when running in the CI * config for CI should use Docker host IP on linux system, not host.docker.internal * rename price-related interface and helpers * fix transmission schedule to match current develop * more uniform naming, extra comments --- .changeset/silent-ducks-report.md | 5 + .github/e2e-tests.yml | 2 +- .github/workflows/integration-tests.yml | 2 +- core/services/gateway/network/httpclient.go | 6 +- .../gateway/network/httpclient_test.go | 2 +- integration-tests/go.mod | 2 +- .../smoke/capabilities/environment-ci.toml | 19 +- .../smoke/capabilities/environment.toml | 16 +- .../smoke/capabilities/workflow_test.go | 333 ++++++++++++++++-- 9 files changed, 344 insertions(+), 43 deletions(-) create mode 100644 .changeset/silent-ducks-report.md diff --git a/.changeset/silent-ducks-report.md b/.changeset/silent-ducks-report.md new file mode 100644 index 00000000000..578cfccac3d --- /dev/null +++ b/.changeset/silent-ducks-report.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#updated Allow to whitelist IPs in Gateway's HTTP Client diff --git a/.github/e2e-tests.yml b/.github/e2e-tests.yml index 707ef8c6027..2207ae4a38f 100644 --- a/.github/e2e-tests.yml +++ b/.github/e2e-tests.yml @@ -196,7 +196,7 @@ runner-test-matrix: E2E_TEST_CHAINLINK_VERSION: '{{ env.DEFAULT_CHAINLINK_PLUGINS_VERSION }}' # This is the chainlink version that has the plugins E2E_JD_VERSION: 0.6.0 # there is no latest tag for this repo, so we need to specify the version GITHUB_READ_TOKEN: '{{ env.GITHUB_API_TOKEN }}' # GATI-provided token that can read from capabilities and dev-platform repos - IS_CI: "true" + CI: "true" CTF_CONFIGS: "environment-ci.toml" # Anvil developer key, not a secret PRIVATE_KEY: "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index b0026b8ed92..0a101c7ff77 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -183,7 +183,7 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && ( needs.changes.outputs.keystone_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f5baaf5e95d718546820cc5fecb42b6df410343d + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@668a588b1865068140c888c253b72ba8809eb030 with: workflow_name: Run Core Workflow Engine Tests For PR chainlink_version: ${{ inputs.evm-ref || github.sha }} diff --git a/core/services/gateway/network/httpclient.go b/core/services/gateway/network/httpclient.go index f09abf31733..20460ebb03d 100644 --- a/core/services/gateway/network/httpclient.go +++ b/core/services/gateway/network/httpclient.go @@ -27,9 +27,7 @@ type HTTPClientConfig struct { BlockedIPsCIDR []string AllowedPorts []int AllowedSchemes []string - - // for testing - allowedIPs []string + AllowedIPs []string } var ( @@ -91,7 +89,7 @@ func NewHTTPClient(config HTTPClientConfig, lggr logger.Logger) (HTTPClient, err safeConfig := safeurl. GetConfigBuilder(). SetTimeout(config.DefaultTimeout). - SetAllowedIPs(config.allowedIPs...). + SetAllowedIPs(config.AllowedIPs...). SetAllowedPorts(config.AllowedPorts...). SetAllowedSchemes(config.AllowedSchemes...). SetBlockedIPs(config.BlockedIPs...). diff --git a/core/services/gateway/network/httpclient_test.go b/core/services/gateway/network/httpclient_test.go index 14a9935a031..9d0318815a0 100644 --- a/core/services/gateway/network/httpclient_test.go +++ b/core/services/gateway/network/httpclient_test.go @@ -180,7 +180,7 @@ func TestHTTPClient_Send(t *testing.T) { config := HTTPClientConfig{ MaxResponseBytes: tt.giveMaxRespBytes, DefaultTimeout: 5 * time.Second, - allowedIPs: []string{hostname}, + AllowedIPs: []string{hostname}, AllowedPorts: []int{int(portInt)}, } diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 432d434b33e..4a07041d99a 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -28,6 +28,7 @@ require ( github.com/deckarep/golang-set/v2 v2.6.0 github.com/ethereum/go-ethereum v1.14.11 github.com/fxamacker/cbor/v2 v2.7.0 + github.com/gin-gonic/gin v1.10.0 github.com/go-resty/resty/v2 v2.15.3 github.com/go-yaml/yaml v2.1.0+incompatible github.com/google/go-cmp v0.6.0 @@ -216,7 +217,6 @@ require ( github.com/getsentry/sentry-go v0.27.0 // indirect github.com/gin-contrib/sessions v0.0.5 // indirect github.com/gin-contrib/sse v0.1.0 // indirect - github.com/gin-gonic/gin v1.10.0 // indirect github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-json-experiment/json v0.0.0-20231102232822-2e55bd4e08b0 // indirect diff --git a/integration-tests/smoke/capabilities/environment-ci.toml b/integration-tests/smoke/capabilities/environment-ci.toml index fc995e42e26..3c9d3c89f97 100644 --- a/integration-tests/smoke/capabilities/environment-ci.toml +++ b/integration-tests/smoke/capabilities/environment-ci.toml @@ -6,11 +6,20 @@ [jd] image = "replace-me" +[price_provider] + # without 0x prefix! + feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" + # used only if [data_source_config.fake] is not present + # url = "api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD" + + [price_provider.fake] + port = 8171 + # use only 1 price, so that test doesn't run too long in the CI + prices = [182.9] + [workflow_config] don_id = 1 workflow_name = "abcdefgasd" - # without 0x prefix! - feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" use_cre_cli = true should_compile_new_workflow = false @@ -20,8 +29,10 @@ cre_cli_version = "v0.0.2" [workflow_config.compiled_config] - binary_url = "https://gist.githubusercontent.com/Tofel/8a39af5b68c213d2200446c175b5c99e/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" - config_url = "https://gist.githubusercontent.com/Tofel/19c80e6297914a79449f916e5e65dfdd/raw/1344c259ef7e970dbabaa1e9e885845b8eba5da9/config.json3674692696" + binary_url = "https://gist.githubusercontent.com/Tofel/e5aef5a3e926a127f38174a6755382c5/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" + # if fake is enabled AND we do not compile a new workflow, this config needs to use URL pointing to IP, on which Docker host is available in Linux systems + # since that's the OS of our CI runners. + config_url = "https://gist.githubusercontent.com/Tofel/49308be74a7cc95bb50e4ab4f35fb49a/raw/aa893cc3412d66df214e1ad0af3d8b3533f796c2/config.json3083467369" [nodeset] nodes = 5 diff --git a/integration-tests/smoke/capabilities/environment.toml b/integration-tests/smoke/capabilities/environment.toml index 4fe561ca1b5..67e632bb2e3 100644 --- a/integration-tests/smoke/capabilities/environment.toml +++ b/integration-tests/smoke/capabilities/environment.toml @@ -7,11 +7,19 @@ # change to your version image = "jd-test-1:latest" +[price_provider] + # without 0x prefix! + feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" + # used only if [data_source_config.fake] is not present + # url = "api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD" + + [price_provider.fake] + port = 8171 + prices = [182.9, 162.71, 172.02] + [workflow_config] don_id = 1 workflow_name = "abcdefgasd" - # without 0x prefix! - feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" use_cre_cli = true should_compile_new_workflow = false @@ -22,8 +30,8 @@ cre_cli_version = "v0.0.2" [workflow_config.compiled_config] - binary_url = "https://gist.githubusercontent.com/Tofel/8a39af5b68c213d2200446c175b5c99e/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" - config_url = "https://gist.githubusercontent.com/Tofel/19c80e6297914a79449f916e5e65dfdd/raw/1344c259ef7e970dbabaa1e9e885845b8eba5da9/config.json3674692696" + binary_url = "https://gist.githubusercontent.com/Tofel/a91a240f16bb64bd1be44c93a38e6703/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" + config_url = "https://gist.githubusercontent.com/Tofel/27c96141aac0c6eac832660c2abea6d4/raw/c8a3776ac34d484b81374bec01926619e1f54757/config.json2739136466" [nodeset] nodes = 5 diff --git a/integration-tests/smoke/capabilities/workflow_test.go b/integration-tests/smoke/capabilities/workflow_test.go index eb54875eafe..4e5e99ad376 100644 --- a/integration-tests/smoke/capabilities/workflow_test.go +++ b/integration-tests/smoke/capabilities/workflow_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/ethereum/go-ethereum/common" + "github.com/gin-gonic/gin" "github.com/go-yaml/yaml" "github.com/google/go-github/v41/github" "github.com/google/uuid" @@ -40,6 +41,7 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/framework" "github.com/smartcontractkit/chainlink-testing-framework/framework/clclient" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" + "github.com/smartcontractkit/chainlink-testing-framework/framework/components/fake" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/jd" ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" @@ -74,7 +76,6 @@ type WorkflowConfig struct { // and when instructing the Gateway job on the bootstrap node as to which workflow to run. DonID uint32 `toml:"don_id" validate:"required"` WorkflowName string `toml:"workflow_name" validate:"required" ` - FeedID string `toml:"feed_id" validate:"required"` } // Defines relases/versions of test dependencies that will be downloaded from Github @@ -92,10 +93,22 @@ type CompiledConfig struct { } type WorkflowTestConfig struct { - BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` - NodeSet *ns.Input `toml:"nodeset" validate:"required"` - WorkflowConfig *WorkflowConfig `toml:"workflow_config" validate:"required"` - JD *jd.Input `toml:"jd" validate:"required"` + BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` + NodeSet *ns.Input `toml:"nodeset" validate:"required"` + WorkflowConfig *WorkflowConfig `toml:"workflow_config" validate:"required"` + JD *jd.Input `toml:"jd" validate:"required"` + PriceProvider *PriceProviderConfig `toml:"price_provider"` +} + +type FakeConfig struct { + *fake.Input + Prices []float64 `toml:"prices"` +} + +type PriceProviderConfig struct { + Fake *FakeConfig `toml:"fake"` + FeedID string `toml:"feed_id" validate:"required"` + URL string `toml:"url"` } func downloadGHAssetFromRelease(owner, repository, releaseTag, assetName, ghToken string) ([]byte, error) { @@ -280,6 +293,7 @@ const ( e2eJobDistributorImageEnvVarName = "E2E_JD_IMAGE" e2eJobDistributorVersionEnvVarName = "E2E_JD_VERSION" ghReadTokenEnvVarName = "GITHUB_READ_TOKEN" + GistIP = "185.199.108.133" ) var ( @@ -380,7 +394,7 @@ func validateInputsAndEnvVars(t *testing.T, in *WorkflowTestConfig) { var ghReadToken string // this is a small hack to avoid changing the reusable workflow - if os.Getenv("IS_CI") == "true" { + if os.Getenv("CI") == "true" { // This part should ideally happen outside of the test, but due to how our reusable e2e test workflow is structured now // we cannot execute this part in workflow steps (it doesn't support any pre-execution hooks) require.NotEmpty(t, os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV), "missing env var: "+ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV) @@ -428,8 +442,12 @@ func validateInputsAndEnvVars(t *testing.T, in *WorkflowTestConfig) { } } + if in.PriceProvider.Fake == nil { + require.NotEmpty(t, in.PriceProvider.URL, "URL must be set in the price provider config, if fake provider is not used") + } + // make sure the feed id is in the correct format - in.WorkflowConfig.FeedID = strings.TrimPrefix(in.WorkflowConfig.FeedID, "0x") + in.PriceProvider.FeedID = strings.TrimPrefix(in.PriceProvider.FeedID, "0x") } // copied from Bala's unmerged PR: https://github.com/smartcontractkit/chainlink/pull/15751 @@ -722,7 +740,7 @@ func registerWorkflowDirectly(t *testing.T, in *WorkflowTestConfig, sc *seth.Cli } //revive:disable // ignore confusing-results -func compileWorkflowWithCRECLI(t *testing.T, in *WorkflowTestConfig, feedsConsumerAddress common.Address, feedID string, settingsFile *os.File) (string, string) { +func compileWorkflowWithCRECLI(t *testing.T, in *WorkflowTestConfig, feedsConsumerAddress common.Address, feedID, dataURL string, settingsFile *os.File) (string, string) { configFile, err := os.CreateTemp("", "config.json") require.NoError(t, err, "failed to create workflow config file") @@ -739,7 +757,7 @@ func compileWorkflowWithCRECLI(t *testing.T, in *WorkflowTestConfig, feedsConsum workflowConfig := PoRWorkflowConfig{ FeedID: feedIDToUse, - URL: "https://api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD", + URL: dataURL, ConsumerAddress: feedsConsumerAddress.Hex(), } @@ -830,7 +848,7 @@ func preapreCRECLISettingsFile(t *testing.T, sc *seth.Client, capRegAddr, workfl return settingsFile } -func registerWorkflow(t *testing.T, in *WorkflowTestConfig, sc *seth.Client, capRegAddr, workflowRegistryAddr, feedsConsumerAddress common.Address, donID uint32, chainSelector uint64, workflowName, pkey, rpcHTTPURL string) { +func registerWorkflow(t *testing.T, in *WorkflowTestConfig, sc *seth.Client, capRegAddr, workflowRegistryAddr, feedsConsumerAddress common.Address, donID uint32, chainSelector uint64, workflowName, pkey, rpcHTTPURL, dataURL string) { // Register workflow directly using the provided binary and config URLs // This is a legacy solution, probably we can remove it soon if !in.WorkflowConfig.ShouldCompileNewWorkflow && !in.WorkflowConfig.UseCRECLI { @@ -854,7 +872,7 @@ func registerWorkflow(t *testing.T, in *WorkflowTestConfig, sc *seth.Client, cap // compile and upload the workflow, if we are not using an existing one if in.WorkflowConfig.ShouldCompileNewWorkflow { - workflowGistURL, workflowConfigURL = compileWorkflowWithCRECLI(t, in, feedsConsumerAddress, in.WorkflowConfig.FeedID, settingsFile) + workflowGistURL, workflowConfigURL = compileWorkflowWithCRECLI(t, in, feedsConsumerAddress, in.PriceProvider.FeedID, dataURL, settingsFile) } else { workflowGistURL = in.WorkflowConfig.CompiledWorkflowConfig.BinaryURL workflowConfigURL = in.WorkflowConfig.CompiledWorkflowConfig.ConfigURL @@ -871,7 +889,7 @@ func registerWorkflow(t *testing.T, in *WorkflowTestConfig, sc *seth.Client, cap func startNodes(t *testing.T, in *WorkflowTestConfig, bc *blockchain.Output) *ns.Output { // Hack for CI that allows us to dynamically set the chainlink image and version // CTFv2 currently doesn't support dynamic image and version setting - if os.Getenv("IS_CI") == "true" { + if os.Getenv("CI") == "true" { // Due to how we pass custom env vars to reusable workflow we need to use placeholders, so first we need to resolve what's the name of the target environment variable // that stores chainlink version and then we can use it to resolve the image name image := fmt.Sprintf("%s:%s", os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV), ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_CHAINLINK_VERSION_ENV)) @@ -886,6 +904,28 @@ func startNodes(t *testing.T, in *WorkflowTestConfig, bc *blockchain.Output) *ns return nodeset } +// In order to whitelist host IP in the gateway, we need to resolve the host.docker.internal to the host IP, +// and since CL image doesn't have dig or nslookup, we need to use curl. +func resolveHostDockerInternaIp(testLogger zerolog.Logger, nsOutput *ns.Output) (string, error) { + containerName := nsOutput.CLNodes[0].Node.ContainerName + cmd := []string{"curl", "-v", "http://host.docker.internal"} + output, err := framework.ExecContainer(containerName, cmd) + if err != nil { + return "", err + } + + re := regexp.MustCompile(`.*Trying ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*`) + matches := re.FindStringSubmatch(output) + if len(matches) < 2 { + testLogger.Error().Msgf("failed to extract IP address from curl output:\n%s", output) + return "", errors.New("failed to extract IP address from curl output") + } + + testLogger.Info().Msgf("Resolved host.docker.internal to %s", matches[1]) + + return matches[1], nil +} + func fundNodes(t *testing.T, don *devenv.DON, sc *seth.Client) { for _, node := range don.Nodes { _, err := actions.SendFunds(zerolog.Logger{}, sc, actions.FundsToSendPayload{ @@ -967,7 +1007,6 @@ func configureNodes(t *testing.T, don *devenv.DON, in *WorkflowTestConfig, bc *b # assuming that node0 is the bootstrap node DefaultBootstrappers = ['%s@node0:6690'] - # This is needed for the target capability to be initialized [[EVM]] ChainID = '%s' @@ -976,6 +1015,7 @@ func configureNodes(t *testing.T, don *devenv.DON, in *WorkflowTestConfig, bc *b WSURL = '%s' HTTPURL = '%s' + # This is needed for the target capability to be initialized [EVM.Workflow] FromAddress = '%s' ForwarderAddress = '%s' @@ -1055,7 +1095,7 @@ func mustSafeUint64(input int64) uint64 { return uint64(input) } -func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *devenv.DON, bc *blockchain.Output, keystoneContractSet keystone_changeset.ContractSet) { +func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *devenv.DON, bc *blockchain.Output, keystoneContractSet keystone_changeset.ContractSet, extraAllowedPorts []int, extraAllowedIps []string) { // if there's only one OCR3 contract in the set, we can use `nil` as the address to get its instance ocr3Contract, err := keystoneContractSet.GetOCR3Contract(nil) require.NoError(t, err, "failed to get OCR3 contract address") @@ -1165,6 +1205,31 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev don.Nodes[4].AccountAddr[chainIDUint64], ) + if len(extraAllowedPorts) != 0 { + var allowedPorts string + for _, port := range extraAllowedPorts { + allowedPorts += fmt.Sprintf("%d, ", port) + } + + // when we pass custom allowed IPs, defaults are not used and we need to + // pass HTTP and HTTPS explicitly + gatewayJobSpec += fmt.Sprintf(` + AllowedPorts = [80, 443, %s] + `, + allowedPorts, + ) + } + + if len(extraAllowedIps) != 0 { + allowedIPs := strings.Join(extraAllowedIps, `", "`) + + gatewayJobSpec += fmt.Sprintf(` + AllowedIps = ["%s"] + `, + allowedIPs, + ) + } + gatewayJobRequest := &jobv1.ProposeJobRequest{ NodeId: don.Nodes[0].NodeID, Spec: gatewayJobSpec, @@ -1391,10 +1456,7 @@ func configureWorkflowDON(t *testing.T, ctfEnv *deployment.Environment, don *dev Capabilities: kcrAllCaps, } - transmissionSchedule := make([]int, len(don.Nodes)-1) - for i := range transmissionSchedule { - transmissionSchedule[i] = i + 1 - } + transmissionSchedule := []int{len(don.Nodes) - 1} // values supplied by Alexandr Yepishev as the expected values for OCR3 config oracleConfig := keystone_changeset.OracleConfig{ @@ -1430,7 +1492,7 @@ func configureWorkflowDON(t *testing.T, ctfEnv *deployment.Environment, don *dev } func startJobDistributor(t *testing.T, in *WorkflowTestConfig) *jd.Output { - if os.Getenv("IS_CI") == "true" { + if os.Getenv("CI") == "true" { jdImage := ctfconfig.MustReadEnvVar_String(e2eJobDistributorImageEnvVarName) jdVersion := os.Getenv(e2eJobDistributorVersionEnvVarName) in.JD.Image = fmt.Sprintf("%s:%s", jdImage, jdVersion) @@ -1692,13 +1754,223 @@ func logTestInfo(l zerolog.Logger, feedId, workflowName, feedConsumerAddr, forwa l.Info().Msgf("KeystoneForwarder address: %s", forwarderAddr) } +func float64ToBigInt(f float64) *big.Int { + f *= 100 + + bigFloat := new(big.Float).SetFloat64(f) + + bigInt := new(big.Int) + bigFloat.Int(bigInt) // Truncate towards zero + + return bigInt +} + +func setupFakeDataProvider(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig, priceIndex *int) string { + _, err := fake.NewFakeDataProvider(in.PriceProvider.Fake.Input) + require.NoError(t, err) + fakeApiPath := "/fake/api/price" + fakeFinalUrl := fmt.Sprintf("%s:%d%s", framework.HostDockerInternal(), in.PriceProvider.Fake.Port, fakeApiPath) + + getPriceResponseFn := func() map[string]interface{} { + response := map[string]interface{}{ + "accountName": "TrueUSD", + "totalTrust": in.PriceProvider.Fake.Prices[*priceIndex], + "ripcord": false, + "updatedAt": time.Now().Format(time.RFC3339), + } + + marshalled, err := json.Marshal(response) + if err == nil { + testLogger.Info().Msgf("Returning response: %s", string(marshalled)) + } else { + testLogger.Info().Msgf("Returning response: %v", response) + } + + return response + } + + err = fake.Func("GET", fakeApiPath, func(c *gin.Context) { + c.JSON(200, getPriceResponseFn()) + }) + + require.NoError(t, err, "failed to set up fake data provider") + + return fakeFinalUrl +} + +func setupPriceProvider(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig) PriceProvider { + if in.PriceProvider.Fake != nil { + return NewFakePriceProvider(t, testLogger, in) + } + + return NewLivePriceProvider(t, testLogger, in) +} + +// PriceProvider abstracts away the logic of checking whether the feed has been correctly updated +// and it also returns port and URL of the price provider. This is so, because when using a mocked +// price provider we need start a separate service and whitelist its port and IP with the gateway job. +// Also, since it's a mocked price provider we can now check whether the feed has been correctly updated +// instead of only checking whether it has some price that's != 0. +type PriceProvider interface { + URL() string + NextPrice(price *big.Int, elapsed time.Duration) bool + CheckPrices() +} + +// LivePriceProvider is a PriceProvider implementation that uses a live feed to get the price, typically http://api.real-time-reserves.verinumus.io +type LivePriceProvider struct { + t *testing.T + testLogger zerolog.Logger + url string + actualPrices []*big.Int +} + +func NewLivePriceProvider(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig) PriceProvider { + return &LivePriceProvider{ + testLogger: testLogger, + url: in.PriceProvider.URL, + t: t, + } +} + +func (l *LivePriceProvider) NextPrice(price *big.Int, elapsed time.Duration) bool { + // if price is nil or 0 it means that the feed hasn't been updated yet + if price == nil || price.Cmp(big.NewInt(0)) == 0 { + return true + } + + l.testLogger.Info().Msgf("Feed updated after %s - price set, price=%s", elapsed, price) + l.actualPrices = append(l.actualPrices, price) + + // no other price to return, we are done + return false +} + +func (l *LivePriceProvider) URL() string { + return l.url +} + +func (l *LivePriceProvider) CheckPrices() { + // we don't have a way to check the price in the live feed, so we always assume it's correct + // as long as it's != 0. And we only wait for the first price to be set. + require.NotEmpty(l.t, l.actualPrices, "no prices found in the feed") + require.NotEqual(l.t, l.actualPrices[0], big.NewInt(0), "price found in the feed is 0") +} + +// FakePriceProvider is a PriceProvider implementation that uses a mocked feed to get the price +// It returns a configured price sequence and makes sure that the feed has been correctly updated +type FakePriceProvider struct { + t *testing.T + testLogger zerolog.Logger + priceIndex *int + url string + expectedPrices []*big.Int + actualPrices []*big.Int +} + +func NewFakePriceProvider(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig) PriceProvider { + priceIndex := ptr.Ptr(0) + expectedPrices := make([]*big.Int, len(in.PriceProvider.Fake.Prices)) + for i, p := range in.PriceProvider.Fake.Prices { + // convert float64 to big.Int by multiplying by 100 + // just like the PoR workflow does + expectedPrices[i] = float64ToBigInt(p) + } + + return &FakePriceProvider{ + t: t, + testLogger: testLogger, + expectedPrices: expectedPrices, + priceIndex: priceIndex, + url: setupFakeDataProvider(t, testLogger, in, priceIndex), + } +} + +func (f *FakePriceProvider) priceAlreadyFound(price *big.Int) bool { + for _, p := range f.actualPrices { + if p.Cmp(price) == 0 { + return true + } + } + + return false +} + +func (f *FakePriceProvider) NextPrice(price *big.Int, elapsed time.Duration) bool { + // if price is nil or 0 it means that the feed hasn't been updated yet + if price == nil || price.Cmp(big.NewInt(0)) == 0 { + return true + } + + if !f.priceAlreadyFound(price) { + f.testLogger.Info().Msgf("Feed updated after %s - price set, price=%s", elapsed, price) + f.actualPrices = append(f.actualPrices, price) + + if len(f.actualPrices) == len(f.expectedPrices) { + // all prices found, nothing more to check + return false + } else { + require.Less(f.t, len(f.actualPrices), len(f.expectedPrices), "more prices found than expected") + f.testLogger.Info().Msgf("Changing price provider price to %f", f.expectedPrices[len(f.actualPrices)]) + *f.priceIndex = len(f.actualPrices) + + // set new price and continue checking + return true + } + } + + // continue checking, price not updated yet + return true +} + +func (f *FakePriceProvider) CheckPrices() { + require.EqualValues(f.t, f.expectedPrices, f.actualPrices, "prices found in the feed do not match prices set in the mock") + f.testLogger.Info().Msgf("All %d mocked prices were found in the feed", len(f.expectedPrices)) +} + +func (f *FakePriceProvider) URL() string { + return f.url +} + +func extraAllowedPortsAndIps(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig, nodeOutput *ns.Output) ([]string, []int) { + // no need to allow anything, if we are using live feed + if in.PriceProvider.Fake == nil { + return nil, nil + } + + // we need to explicitly allow the port used by the fake data provider + // and IP corresponding to host.docker.internal or the IP of the host machine, if we are running on Linux, + // because that's where the fake data provider is running + var hostIp string + var err error + + system := runtime.GOOS + switch system { + case "darwin": + hostIp, err = resolveHostDockerInternaIp(testLogger, nodeOutput) + require.NoError(t, err, "failed to resolve host.docker.internal IP") + case "linux": + // for linux framework already returns an IP, so we don't need to resolve it, + // but we need to remove the http:// prefix + hostIp = strings.ReplaceAll(framework.HostDockerInternal(), "http://", "") + default: + err = fmt.Errorf("unsupported OS: %s", system) + } + require.NoError(t, err, "failed to resolve host.docker.internal IP") + + testLogger.Info().Msgf("Will allow IP %s and port %d for the fake data provider", hostIp, in.PriceProvider.Fake.Port) + + // we also need to explicitly allow Gist's IP + return []string{hostIp, GistIP}, []int{in.PriceProvider.Fake.Port} +} + /* !!! ATTENTION !!! Do not use this test as a template for your tests. It's hacky, since we were working under time pressure. We will soon refactor it follow best practices and a golden example. Apart from its structure what is currently missing is: -- using Job Distribution to create jobs for the nodes -- using a mock service to provide the feed data +- DON-2-DON support +- better structured and reusable methods */ func TestKeystoneWithOCR3Workflow(t *testing.T) { testLogger := framework.L @@ -1737,6 +2009,10 @@ func TestKeystoneWithOCR3Workflow(t *testing.T) { Build() require.NoError(t, err, "failed to create seth client") + // Get either a no-op price provider (for live endpoint) + // or a fake price provider (for mock endpoint) + priceProvider := setupPriceProvider(t, testLogger, in) + // Start job distributor jdOutput := startJobDistributor(t, in) @@ -1759,18 +2035,20 @@ func TestKeystoneWithOCR3Workflow(t *testing.T) { feedsConsumerAddress := prepareFeedsConsumer(t, testLogger, ctfEnv, chainSelector, sc, keystoneContractSet.Forwarder.Address(), in.WorkflowConfig.WorkflowName) // Register the workflow (either via CRE CLI or by calling the workflow registry directly) - registerWorkflow(t, in, sc, keystoneContractSet.CapabilitiesRegistry.Address(), workflowRegistryAddr, feedsConsumerAddress, in.WorkflowConfig.DonID, chainSelector, in.WorkflowConfig.WorkflowName, pkey, bc.Nodes[0].HostHTTPUrl) + registerWorkflow(t, in, sc, keystoneContractSet.CapabilitiesRegistry.Address(), workflowRegistryAddr, feedsConsumerAddress, in.WorkflowConfig.DonID, chainSelector, in.WorkflowConfig.WorkflowName, pkey, bc.Nodes[0].HostHTTPUrl, priceProvider.URL()) // Create OCR3 and capability jobs for each node JD ns, _ := configureNodes(t, don, in, bc, keystoneContractSet.CapabilitiesRegistry.Address(), workflowRegistryAddr, keystoneContractSet.Forwarder.Address()) // JD client needs to be reinitialised after restarting nodes ctfEnv = ptr.Ptr(reinitialiseJDClient(t, ctfEnv, jdOutput, nodeOutput)) - createNodeJobsWithJd(t, ctfEnv, don, bc, keystoneContractSet) + + ips, ports := extraAllowedPortsAndIps(t, testLogger, in, ns) + createNodeJobsWithJd(t, ctfEnv, don, bc, keystoneContractSet, ports, ips) // Log extra information that might help debugging t.Cleanup(func() { if t.Failed() { - logTestInfo(testLogger, in.WorkflowConfig.FeedID, in.WorkflowConfig.WorkflowName, feedsConsumerAddress.Hex(), keystoneContractSet.Forwarder.Address().Hex()) + logTestInfo(testLogger, in.PriceProvider.FeedID, in.WorkflowConfig.WorkflowName, feedsConsumerAddress.Hex(), keystoneContractSet.Forwarder.Address().Hex()) } }) @@ -1799,7 +2077,7 @@ func TestKeystoneWithOCR3Workflow(t *testing.T) { testLogger.Info().Msg("Waiting for feed to update...") startTime := time.Now() - feedBytes := common.HexToHash(in.WorkflowConfig.FeedID) + feedBytes := common.HexToHash(in.PriceProvider.FeedID) for { select { @@ -1814,8 +2092,9 @@ func TestKeystoneWithOCR3Workflow(t *testing.T) { ) require.NoError(t, err, "failed to get price from Keystone Consumer contract") - if price.String() != "0" { - testLogger.Info().Msgf("Feed updated after %s - price set, price=%s", elapsed, price) + if !priceProvider.NextPrice(price, elapsed) { + // check if all expected prices were found and finish the test + priceProvider.CheckPrices() return } testLogger.Info().Msgf("Feed not updated yet, waiting for %s", elapsed) From a7347124f6e7058affecfa33c0f0eae348ca96d0 Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Tue, 11 Feb 2025 07:51:12 -0500 Subject: [PATCH 13/83] move solana deployment code to solana directory (#16303) * add deployment code to solana directory; add owners * lint * fix tests --- .github/CODEOWNERS | 1 + deployment/ccip/changeset/cs_deploy_chain.go | 367 +--------------- .../ccip/changeset/solana/cs_deploy_chain.go | 410 ++++++++++++++++++ .../changeset/solana/cs_deploy_chain_test.go | 28 +- .../changeset/testhelpers/test_environment.go | 35 +- 5 files changed, 456 insertions(+), 385 deletions(-) create mode 100644 deployment/ccip/changeset/solana/cs_deploy_chain.go diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ef1bafc41ee..ebcf5e2a374 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -147,6 +147,7 @@ core/scripts/gateway @smartcontractkit/dev-services /deployment @smartcontractkit/ccip-tooling @smartcontractkit/ccip-offchain @smartcontractkit/keystone @smartcontractkit/core @smartcontractkit/deployment-automation /deployment/ccip @smartcontractkit/ccip-tooling @smartcontractkit/ccip-offchain @smartcontractkit/deployment-automation /deployment/keystone @smartcontractkit/keystone @smartcontractkit/core @smartcontractkit/deployment-automation +/deployment/ccip/changeset/solana @smartcontractkit/solana-tooling # TODO: As more products add their deployment logic here, add the team as an owner # CI/CD diff --git a/deployment/ccip/changeset/cs_deploy_chain.go b/deployment/ccip/changeset/cs_deploy_chain.go index 35684fd102b..782b24145aa 100644 --- a/deployment/ccip/changeset/cs_deploy_chain.go +++ b/deployment/ccip/changeset/cs_deploy_chain.go @@ -8,21 +8,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/gagliardetto/solana-go" "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "golang.org/x/sync/errgroup" chainsel "github.com/smartcontractkit/chain-selectors" - solBinary "github.com/gagliardetto/binary" - solRpc "github.com/gagliardetto/solana-go/rpc" - - solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" - solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" - solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" - solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" - solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" - "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" @@ -166,7 +156,7 @@ func DefaultOffRampParams() OffRampParams { } } -func validateHomeChainState(e deployment.Environment, homeChainSel uint64, existingState CCIPOnChainState) error { +func ValidateHomeChainState(e deployment.Environment, homeChainSel uint64, existingState CCIPOnChainState) error { existingState, err := LoadOnchainState(e) if err != nil { e.Logger.Errorw("Failed to load existing onchain state", "err", err) @@ -220,7 +210,7 @@ func deployChainContractsForChains( return err } - err = validateHomeChainState(e, homeChainSel, existingState) + err = ValidateHomeChainState(e, homeChainSel, existingState) if err != nil { return err } @@ -247,13 +237,6 @@ func deployChainContractsForChains( } chain := e.Chains[chainSel] deployFn = func() error { return deployChainContractsEVM(e, chain, ab, rmnHome, contractParams) } - - case chainsel.FamilySolana: - chain := e.SolChains[chainSel] - if existingState.SolChains[chainSel].LinkToken.IsZero() { - return fmt.Errorf("fee tokens not found for chain %d", chainSel) - } - deployFn = func() error { return deployChainContractsSolana(e, chain, ab) } default: return fmt.Errorf("unsupported chain family for chain %d", chainSel) } @@ -531,349 +514,3 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a e.Logger.Infow("Added nonce manager authorized callers", "chain", chain.String(), "callers", []common.Address{offRampContract.Address(), onRampContract.Address()}) return nil } - -// TODO: move everything below to solana file -func solProgramData(e deployment.Environment, chain deployment.SolChain, programID solana.PublicKey) (struct { - DataType uint32 - Address solana.PublicKey -}, error) { - var programData struct { - DataType uint32 - Address solana.PublicKey - } - data, err := chain.Client.GetAccountInfoWithOpts(e.GetContext(), programID, &solRpc.GetAccountInfoOpts{ - Commitment: solRpc.CommitmentConfirmed, - }) - if err != nil { - return programData, fmt.Errorf("failed to deploy program: %w", err) - } - - err = solBinary.UnmarshalBorsh(&programData, data.Bytes()) - if err != nil { - return programData, fmt.Errorf("failed to unmarshal program data: %w", err) - } - return programData, nil -} - -func initializeRouter( - e deployment.Environment, - chain deployment.SolChain, - ccipRouterProgram solana.PublicKey, - linkTokenAddress solana.PublicKey, - feeQuoterAddress solana.PublicKey, -) error { - programData, err := solProgramData(e, chain, ccipRouterProgram) - if err != nil { - return fmt.Errorf("failed to get solana router program data: %w", err) - } - // addressing errcheck in the next PR - routerConfigPDA, _, _ := solState.FindConfigPDA(ccipRouterProgram) - externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) - - instruction, err := solRouter.NewInitializeInstruction( - chain.Selector, // chain selector - solana.PublicKey{}, // fee aggregator (TODO: changeset to set the fee aggregator) - feeQuoterAddress, - linkTokenAddress, // link token mint - routerConfigPDA, - chain.DeployerKey.PublicKey(), - solana.SystemProgramID, - ccipRouterProgram, - programData.Address, - externalTokenPoolsSignerPDA, - ).ValidateAndBuild() - - if err != nil { - return fmt.Errorf("failed to build instruction: %w", err) - } - if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) - } - e.Logger.Infow("Initialized router", "chain", chain.String()) - return nil -} - -func initializeFeeQuoter( - e deployment.Environment, - chain deployment.SolChain, - ccipRouterProgram solana.PublicKey, - linkTokenAddress solana.PublicKey, - feeQuoterAddress solana.PublicKey, - offRampAddress solana.PublicKey, -) error { - programData, err := solProgramData(e, chain, feeQuoterAddress) - if err != nil { - return fmt.Errorf("failed to get solana router program data: %w", err) - } - offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) - feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) - - instruction, err := solFeeQuoter.NewInitializeInstruction( - linkTokenAddress, - deployment.SolDefaultMaxFeeJuelsPerMsg, - ccipRouterProgram, - offRampBillingSignerPDA, - feeQuoterConfigPDA, - chain.DeployerKey.PublicKey(), - solana.SystemProgramID, - feeQuoterAddress, - programData.Address, - ).ValidateAndBuild() - - if err != nil { - return fmt.Errorf("failed to build instruction: %w", err) - } - if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) - } - e.Logger.Infow("Initialized fee quoter", "chain", chain.String()) - return nil -} - -func intializeOffRamp( - e deployment.Environment, - chain deployment.SolChain, - ccipRouterProgram solana.PublicKey, - feeQuoterAddress solana.PublicKey, - offRampAddress solana.PublicKey, - addressLookupTable solana.PublicKey, -) error { - programData, err := solProgramData(e, chain, offRampAddress) - if err != nil { - return fmt.Errorf("failed to get solana router program data: %w", err) - } - offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(offRampAddress) - offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) - offRampStatePDA, _, _ := solState.FindOfframpStatePDA(offRampAddress) - offRampExternalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(offRampAddress) - offRampTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(offRampAddress) - - instruction, err := solOffRamp.NewInitializeInstruction( - chain.Selector, - deployment.EnableExecutionAfter, - offRampConfigPDA, - offRampReferenceAddressesPDA, - ccipRouterProgram, - feeQuoterAddress, - addressLookupTable, - offRampStatePDA, - offRampExternalExecutionConfigPDA, - offRampTokenPoolsSignerPDA, - chain.DeployerKey.PublicKey(), - solana.SystemProgramID, - offRampAddress, - programData.Address, - ).ValidateAndBuild() - - if err != nil { - return fmt.Errorf("failed to build instruction: %w", err) - } - if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { - return fmt.Errorf("failed to confirm instructions: %w", err) - } - e.Logger.Infow("Initialized offRamp", "chain", chain.String()) - return nil -} - -func deployChainContractsSolana( - e deployment.Environment, - chain deployment.SolChain, - ab deployment.AddressBook, -) error { - state, err := LoadOnchainStateSolana(e) - if err != nil { - e.Logger.Errorw("Failed to load existing onchain state", "err", err) - return err - } - chainState, chainExists := state.SolChains[chain.Selector] - if !chainExists { - return fmt.Errorf("chain %s not found in existing state, deploy the link token first", chain.String()) - } - if chainState.LinkToken.IsZero() { - return fmt.Errorf("failed to get link token address for chain %s", chain.String()) - } - - // initialize this last with every address we need - var addressLookupTable solana.PublicKey - if chainState.OfframpAddressLookupTable.IsZero() { - addressLookupTable, err = solCommonUtil.SetupLookupTable( - e.GetContext(), - chain.Client, - *chain.DeployerKey, - []solana.PublicKey{ - // system - solana.SystemProgramID, - solana.ComputeBudget, - solana.SysVarInstructionsPubkey, - // token - solana.Token2022ProgramID, - solana.TokenProgramID, - solana.SPLAssociatedTokenAccountProgramID, - }) - - if err != nil { - return fmt.Errorf("failed to create lookup table: %w", err) - } - err = ab.Save(chain.Selector, addressLookupTable.String(), deployment.NewTypeAndVersion(OfframpAddressLookupTable, deployment.Version1_0_0)) - if err != nil { - return fmt.Errorf("failed to save address: %w", err) - } - } - - // FEE QUOTER DEPLOY - var feeQuoterAddress solana.PublicKey - if chainState.FeeQuoter.IsZero() { - // deploy fee quoter - programID, err := chain.DeployProgram(e.Logger, "fee_quoter") - if err != nil { - return fmt.Errorf("failed to deploy program: %w", err) - } - - tv := deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_0_0) - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) - - feeQuoterAddress = solana.MustPublicKeyFromBase58(programID) - err = ab.Save(chain.Selector, programID, tv) - if err != nil { - return fmt.Errorf("failed to save address: %w", err) - } - } else { - e.Logger.Infow("Using existing fee quoter", "addr", chainState.FeeQuoter.String()) - feeQuoterAddress = chainState.FeeQuoter - } - solFeeQuoter.SetProgramID(feeQuoterAddress) - - // ROUTER DEPLOY - var ccipRouterProgram solana.PublicKey - if chainState.Router.IsZero() { - // deploy router - programID, err := chain.DeployProgram(e.Logger, "ccip_router") - if err != nil { - return fmt.Errorf("failed to deploy program: %w", err) - } - - tv := deployment.NewTypeAndVersion(Router, deployment.Version1_0_0) - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) - - ccipRouterProgram = solana.MustPublicKeyFromBase58(programID) - err = ab.Save(chain.Selector, programID, tv) - if err != nil { - return fmt.Errorf("failed to save address: %w", err) - } - } else { - e.Logger.Infow("Using existing router", "addr", chainState.Router.String()) - ccipRouterProgram = chainState.Router - } - solRouter.SetProgramID(ccipRouterProgram) - - // OFFRAMP DEPLOY - var offRampAddress solana.PublicKey - if chainState.OffRamp.IsZero() { - // deploy offramp - programID, err := chain.DeployProgram(e.Logger, "ccip_offramp") - if err != nil { - return fmt.Errorf("failed to deploy program: %w", err) - } - tv := deployment.NewTypeAndVersion(OffRamp, deployment.Version1_0_0) - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) - offRampAddress = solana.MustPublicKeyFromBase58(programID) - err = ab.Save(chain.Selector, programID, tv) - if err != nil { - return fmt.Errorf("failed to save address: %w", err) - } - } else { - e.Logger.Infow("Using existing offramp", "addr", chainState.OffRamp.String()) - offRampAddress = chainState.OffRamp - } - solOffRamp.SetProgramID(offRampAddress) - - // FEE QUOTER INITIALIZE - var fqConfig solFeeQuoter.Config - feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) - err = chain.GetAccountDataBorshInto(e.GetContext(), feeQuoterConfigPDA, &fqConfig) - if err != nil { - if err2 := initializeFeeQuoter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress, offRampAddress); err2 != nil { - return err2 - } - } else { - e.Logger.Infow("Fee quoter already initialized, skipping initialization", "chain", chain.String()) - } - - // ROUTER INITIALIZE - var routerConfigAccount solRouter.Config - // addressing errcheck in the next PR - routerConfigPDA, _, _ := solState.FindConfigPDA(ccipRouterProgram) - err = chain.GetAccountDataBorshInto(e.GetContext(), routerConfigPDA, &routerConfigAccount) - if err != nil { - if err2 := initializeRouter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress); err2 != nil { - return err2 - } - } else { - e.Logger.Infow("Router already initialized, skipping initialization", "chain", chain.String()) - } - - // OFFRAMP INITIALIZE - var offRampConfigAccount solOffRamp.Config - offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(offRampAddress) - err = chain.GetAccountDataBorshInto(e.GetContext(), offRampConfigPDA, &offRampConfigAccount) - if err != nil { - if err2 := intializeOffRamp(e, chain, ccipRouterProgram, feeQuoterAddress, offRampAddress, addressLookupTable); err2 != nil { - return err2 - } - } else { - e.Logger.Infow("Offramp already initialized, skipping initialization", "chain", chain.String()) - } - - // TOKEN POOL DEPLOY - var tokenPoolProgram solana.PublicKey - if chainState.TokenPool.IsZero() { - // TODO: there should be two token pools deployed one of each type (lock/burn) - // separate token pools are not ready yet - programID, err := chain.DeployProgram(e.Logger, "token_pool") - if err != nil { - return fmt.Errorf("failed to deploy program: %w", err) - } - tv := deployment.NewTypeAndVersion(TokenPool, deployment.Version1_0_0) - e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) - tokenPoolProgram = solana.MustPublicKeyFromBase58(programID) - err = ab.Save(chain.Selector, programID, tv) - if err != nil { - return fmt.Errorf("failed to save address: %w", err) - } - } else { - e.Logger.Infow("Using existing token pool", "addr", chainState.TokenPool.String()) - tokenPoolProgram = chainState.TokenPool - } - - externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(ccipRouterProgram) - externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) - feeBillingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(ccipRouterProgram) - linkFqBillingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(chainState.LinkToken, feeQuoterAddress) - offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) - offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) - - if err := solCommonUtil.ExtendLookupTable(e.GetContext(), chain.Client, addressLookupTable, *chain.DeployerKey, - []solana.PublicKey{ - // token pools - tokenPoolProgram, - // offramp - offRampAddress, - offRampConfigPDA, - offRampReferenceAddressesPDA, - offRampBillingSignerPDA, - // router - ccipRouterProgram, - routerConfigPDA, - externalExecutionConfigPDA, - externalTokenPoolsSignerPDA, - // fee quoter - feeBillingSignerPDA, - feeQuoterConfigPDA, - feeQuoterAddress, - linkFqBillingConfigPDA, - }); err != nil { - return fmt.Errorf("failed to extend lookup table: %w", err) - } - - return nil -} diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain.go b/deployment/ccip/changeset/solana/cs_deploy_chain.go new file mode 100644 index 00000000000..44393c03ec4 --- /dev/null +++ b/deployment/ccip/changeset/solana/cs_deploy_chain.go @@ -0,0 +1,410 @@ +package solana + +import ( + "fmt" + + "github.com/gagliardetto/solana-go" + "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" + chainsel "github.com/smartcontractkit/chain-selectors" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + + solBinary "github.com/gagliardetto/binary" + solRpc "github.com/gagliardetto/solana-go/rpc" + + solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" + solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" + solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" + solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" + solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" +) + +var _ deployment.ChangeSet[changeset.DeployChainContractsConfig] = DeployChainContractsChangesetSolana + +func DeployChainContractsChangesetSolana(e deployment.Environment, c changeset.DeployChainContractsConfig) (deployment.ChangesetOutput, error) { + if err := c.Validate(); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("invalid DeployChainContractsConfig: %w", err) + } + newAddresses := deployment.NewMemoryAddressBook() + existingState, err := changeset.LoadOnchainState(e) + if err != nil { + e.Logger.Errorw("Failed to load existing onchain state", "err", err) + return deployment.ChangesetOutput{}, err + } + + err = changeset.ValidateHomeChainState(e, c.HomeChainSelector, existingState) + if err != nil { + return deployment.ChangesetOutput{}, err + } + + for chainSel := range c.ContractParamsPerChain { + if _, exists := existingState.SupportedChains()[chainSel]; !exists { + return deployment.ChangesetOutput{}, fmt.Errorf("chain %d not supported", chainSel) + } + // already validated family + family, _ := chainsel.GetSelectorFamily(chainSel) + if family != chainsel.FamilySolana { + return deployment.ChangesetOutput{}, fmt.Errorf("chain %d is not a solana chain", chainSel) + } + chain := e.SolChains[chainSel] + if existingState.SolChains[chainSel].LinkToken.IsZero() { + return deployment.ChangesetOutput{}, fmt.Errorf("fee tokens not found for chain %d", chainSel) + } + err = deployChainContractsSolana(e, chain, newAddresses) + if err != nil { + e.Logger.Errorw("Failed to deploy CCIP contracts", "err", err, "newAddresses", newAddresses) + return deployment.ChangesetOutput{}, err + } + } + + return deployment.ChangesetOutput{ + Proposals: []timelock.MCMSWithTimelockProposal{}, + AddressBook: newAddresses, + }, nil +} + +func solProgramData(e deployment.Environment, chain deployment.SolChain, programID solana.PublicKey) (struct { + DataType uint32 + Address solana.PublicKey +}, error) { + var programData struct { + DataType uint32 + Address solana.PublicKey + } + data, err := chain.Client.GetAccountInfoWithOpts(e.GetContext(), programID, &solRpc.GetAccountInfoOpts{ + Commitment: solRpc.CommitmentConfirmed, + }) + if err != nil { + return programData, fmt.Errorf("failed to deploy program: %w", err) + } + + err = solBinary.UnmarshalBorsh(&programData, data.Bytes()) + if err != nil { + return programData, fmt.Errorf("failed to unmarshal program data: %w", err) + } + return programData, nil +} + +func initializeRouter( + e deployment.Environment, + chain deployment.SolChain, + ccipRouterProgram solana.PublicKey, + linkTokenAddress solana.PublicKey, + feeQuoterAddress solana.PublicKey, +) error { + programData, err := solProgramData(e, chain, ccipRouterProgram) + if err != nil { + return fmt.Errorf("failed to get solana router program data: %w", err) + } + // addressing errcheck in the next PR + routerConfigPDA, _, _ := solState.FindConfigPDA(ccipRouterProgram) + externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) + + instruction, err := solRouter.NewInitializeInstruction( + chain.Selector, // chain selector + solana.PublicKey{}, // fee aggregator (TODO: changeset to set the fee aggregator) + feeQuoterAddress, + linkTokenAddress, // link token mint + routerConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ccipRouterProgram, + programData.Address, + externalTokenPoolsSignerPDA, + ).ValidateAndBuild() + + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { + return fmt.Errorf("failed to confirm instructions: %w", err) + } + e.Logger.Infow("Initialized router", "chain", chain.String()) + return nil +} + +func initializeFeeQuoter( + e deployment.Environment, + chain deployment.SolChain, + ccipRouterProgram solana.PublicKey, + linkTokenAddress solana.PublicKey, + feeQuoterAddress solana.PublicKey, + offRampAddress solana.PublicKey, +) error { + programData, err := solProgramData(e, chain, feeQuoterAddress) + if err != nil { + return fmt.Errorf("failed to get solana router program data: %w", err) + } + offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) + feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) + + instruction, err := solFeeQuoter.NewInitializeInstruction( + linkTokenAddress, + deployment.SolDefaultMaxFeeJuelsPerMsg, + ccipRouterProgram, + offRampBillingSignerPDA, + feeQuoterConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + feeQuoterAddress, + programData.Address, + ).ValidateAndBuild() + + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { + return fmt.Errorf("failed to confirm instructions: %w", err) + } + e.Logger.Infow("Initialized fee quoter", "chain", chain.String()) + return nil +} + +func intializeOffRamp( + e deployment.Environment, + chain deployment.SolChain, + ccipRouterProgram solana.PublicKey, + feeQuoterAddress solana.PublicKey, + offRampAddress solana.PublicKey, + addressLookupTable solana.PublicKey, +) error { + programData, err := solProgramData(e, chain, offRampAddress) + if err != nil { + return fmt.Errorf("failed to get solana router program data: %w", err) + } + offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(offRampAddress) + offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) + offRampStatePDA, _, _ := solState.FindOfframpStatePDA(offRampAddress) + offRampExternalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(offRampAddress) + offRampTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(offRampAddress) + + instruction, err := solOffRamp.NewInitializeInstruction( + chain.Selector, + deployment.EnableExecutionAfter, + offRampConfigPDA, + offRampReferenceAddressesPDA, + ccipRouterProgram, + feeQuoterAddress, + addressLookupTable, + offRampStatePDA, + offRampExternalExecutionConfigPDA, + offRampTokenPoolsSignerPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + offRampAddress, + programData.Address, + ).ValidateAndBuild() + + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { + return fmt.Errorf("failed to confirm instructions: %w", err) + } + e.Logger.Infow("Initialized offRamp", "chain", chain.String()) + return nil +} + +func deployChainContractsSolana( + e deployment.Environment, + chain deployment.SolChain, + ab deployment.AddressBook, +) error { + state, err := changeset.LoadOnchainStateSolana(e) + if err != nil { + e.Logger.Errorw("Failed to load existing onchain state", "err", err) + return err + } + chainState, chainExists := state.SolChains[chain.Selector] + if !chainExists { + return fmt.Errorf("chain %s not found in existing state, deploy the link token first", chain.String()) + } + if chainState.LinkToken.IsZero() { + return fmt.Errorf("failed to get link token address for chain %s", chain.String()) + } + + // initialize this last with every address we need + var addressLookupTable solana.PublicKey + if chainState.OfframpAddressLookupTable.IsZero() { + addressLookupTable, err = solCommonUtil.SetupLookupTable( + e.GetContext(), + chain.Client, + *chain.DeployerKey, + []solana.PublicKey{ + // system + solana.SystemProgramID, + solana.ComputeBudget, + solana.SysVarInstructionsPubkey, + // token + solana.Token2022ProgramID, + solana.TokenProgramID, + solana.SPLAssociatedTokenAccountProgramID, + }) + + if err != nil { + return fmt.Errorf("failed to create lookup table: %w", err) + } + err = ab.Save(chain.Selector, addressLookupTable.String(), deployment.NewTypeAndVersion(changeset.OfframpAddressLookupTable, deployment.Version1_0_0)) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + } + + // FEE QUOTER DEPLOY + var feeQuoterAddress solana.PublicKey + if chainState.FeeQuoter.IsZero() { + // deploy fee quoter + programID, err := chain.DeployProgram(e.Logger, "fee_quoter") + if err != nil { + return fmt.Errorf("failed to deploy program: %w", err) + } + + tv := deployment.NewTypeAndVersion(changeset.FeeQuoter, deployment.Version1_0_0) + e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) + + feeQuoterAddress = solana.MustPublicKeyFromBase58(programID) + err = ab.Save(chain.Selector, programID, tv) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + } else { + e.Logger.Infow("Using existing fee quoter", "addr", chainState.FeeQuoter.String()) + feeQuoterAddress = chainState.FeeQuoter + } + solFeeQuoter.SetProgramID(feeQuoterAddress) + + // ROUTER DEPLOY + var ccipRouterProgram solana.PublicKey + if chainState.Router.IsZero() { + // deploy router + programID, err := chain.DeployProgram(e.Logger, "ccip_router") + if err != nil { + return fmt.Errorf("failed to deploy program: %w", err) + } + + tv := deployment.NewTypeAndVersion(changeset.Router, deployment.Version1_0_0) + e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) + + ccipRouterProgram = solana.MustPublicKeyFromBase58(programID) + err = ab.Save(chain.Selector, programID, tv) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + } else { + e.Logger.Infow("Using existing router", "addr", chainState.Router.String()) + ccipRouterProgram = chainState.Router + } + solRouter.SetProgramID(ccipRouterProgram) + + // OFFRAMP DEPLOY + var offRampAddress solana.PublicKey + if chainState.OffRamp.IsZero() { + // deploy offramp + programID, err := chain.DeployProgram(e.Logger, "ccip_offramp") + if err != nil { + return fmt.Errorf("failed to deploy program: %w", err) + } + tv := deployment.NewTypeAndVersion(changeset.OffRamp, deployment.Version1_0_0) + e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) + offRampAddress = solana.MustPublicKeyFromBase58(programID) + err = ab.Save(chain.Selector, programID, tv) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + } else { + e.Logger.Infow("Using existing offramp", "addr", chainState.OffRamp.String()) + offRampAddress = chainState.OffRamp + } + solOffRamp.SetProgramID(offRampAddress) + + // FEE QUOTER INITIALIZE + var fqConfig solFeeQuoter.Config + feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) + err = chain.GetAccountDataBorshInto(e.GetContext(), feeQuoterConfigPDA, &fqConfig) + if err != nil { + if err2 := initializeFeeQuoter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress, offRampAddress); err2 != nil { + return err2 + } + } else { + e.Logger.Infow("Fee quoter already initialized, skipping initialization", "chain", chain.String()) + } + + // ROUTER INITIALIZE + var routerConfigAccount solRouter.Config + // addressing errcheck in the next PR + routerConfigPDA, _, _ := solState.FindConfigPDA(ccipRouterProgram) + err = chain.GetAccountDataBorshInto(e.GetContext(), routerConfigPDA, &routerConfigAccount) + if err != nil { + if err2 := initializeRouter(e, chain, ccipRouterProgram, chainState.LinkToken, feeQuoterAddress); err2 != nil { + return err2 + } + } else { + e.Logger.Infow("Router already initialized, skipping initialization", "chain", chain.String()) + } + + // OFFRAMP INITIALIZE + var offRampConfigAccount solOffRamp.Config + offRampConfigPDA, _, _ := solState.FindOfframpConfigPDA(offRampAddress) + err = chain.GetAccountDataBorshInto(e.GetContext(), offRampConfigPDA, &offRampConfigAccount) + if err != nil { + if err2 := intializeOffRamp(e, chain, ccipRouterProgram, feeQuoterAddress, offRampAddress, addressLookupTable); err2 != nil { + return err2 + } + } else { + e.Logger.Infow("Offramp already initialized, skipping initialization", "chain", chain.String()) + } + + // TOKEN POOL DEPLOY + var tokenPoolProgram solana.PublicKey + if chainState.TokenPool.IsZero() { + // TODO: there should be two token pools deployed one of each type (lock/burn) + // separate token pools are not ready yet + programID, err := chain.DeployProgram(e.Logger, "token_pool") + if err != nil { + return fmt.Errorf("failed to deploy program: %w", err) + } + tv := deployment.NewTypeAndVersion(changeset.TokenPool, deployment.Version1_0_0) + e.Logger.Infow("Deployed contract", "Contract", tv.String(), "addr", programID, "chain", chain.String()) + tokenPoolProgram = solana.MustPublicKeyFromBase58(programID) + err = ab.Save(chain.Selector, programID, tv) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + } else { + e.Logger.Infow("Using existing token pool", "addr", chainState.TokenPool.String()) + tokenPoolProgram = chainState.TokenPool + } + + externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(ccipRouterProgram) + externalTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(ccipRouterProgram) + feeBillingSignerPDA, _, _ := solState.FindFeeBillingSignerPDA(ccipRouterProgram) + linkFqBillingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(chainState.LinkToken, feeQuoterAddress) + offRampReferenceAddressesPDA, _, _ := solState.FindOfframpReferenceAddressesPDA(offRampAddress) + offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) + + if err := solCommonUtil.ExtendLookupTable(e.GetContext(), chain.Client, addressLookupTable, *chain.DeployerKey, + []solana.PublicKey{ + // token pools + tokenPoolProgram, + // offramp + offRampAddress, + offRampConfigPDA, + offRampReferenceAddressesPDA, + offRampBillingSignerPDA, + // router + ccipRouterProgram, + routerConfigPDA, + externalExecutionConfigPDA, + externalTokenPoolsSignerPDA, + // fee quoter + feeBillingSignerPDA, + feeQuoterConfigPDA, + feeQuoterAddress, + linkFqBillingConfigPDA, + }); err != nil { + return fmt.Errorf("failed to extend lookup table: %w", err) + } + + return nil +} diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index cb720e3129e..6669775accc 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -8,6 +8,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/environment/memory" @@ -29,9 +30,6 @@ func TestDeployChainContractsChangeset(t *testing.T) { evmSelectors := e.AllChainSelectors() homeChainSel := evmSelectors[0] solChainSelectors := e.AllChainSelectorsSolana() - selectors := make([]uint64, 0, len(evmSelectors)+len(solChainSelectors)) - selectors = append(selectors, evmSelectors...) - selectors = append(selectors, solChainSelectors...) nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) require.NoError(t, err) cfg := make(map[uint64]commontypes.MCMSWithTimelockConfig) @@ -43,12 +41,6 @@ func TestDeployChainContractsChangeset(t *testing.T) { OffRampParams: changeset.DefaultOffRampParams(), } } - for _, chain := range solChainSelectors { - contractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), - } - } prereqCfg := make([]changeset.DeployPrerequisiteConfigPerChain, 0) for _, chain := range e.AllChainSelectors() { prereqCfg = append(prereqCfg, changeset.DeployPrerequisiteConfigPerChain{ @@ -72,7 +64,11 @@ func TestDeployChainContractsChangeset(t *testing.T) { }, { Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), - Config: selectors, + Config: e.AllChainSelectors(), + }, + { + Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), + Config: e.AllChainSelectorsSolana(), }, { Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), @@ -91,6 +87,18 @@ func TestDeployChainContractsChangeset(t *testing.T) { ContractParamsPerChain: contractParams, }, }, + { + Changeset: commonchangeset.WrapChangeSet(solana.DeployChainContractsChangesetSolana), + Config: changeset.DeployChainContractsConfig{ + HomeChainSelector: homeChainSel, + ContractParamsPerChain: map[uint64]changeset.ChainContractParams{ + solChainSelectors[0]: changeset.ChainContractParams{ + FeeQuoterParams: changeset.DefaultFeeQuoterParams(), + OffRampParams: changeset.DefaultOffRampParams(), + }, + }, + }, + }, }) require.NoError(t, err) // solana verification diff --git a/deployment/ccip/changeset/testhelpers/test_environment.go b/deployment/ccip/changeset/testhelpers/test_environment.go index 5a89c10f954..b0be4312afd 100644 --- a/deployment/ccip/changeset/testhelpers/test_environment.go +++ b/deployment/ccip/changeset/testhelpers/test_environment.go @@ -25,6 +25,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -514,15 +515,8 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn // Need to deploy prerequisites first so that we can form the USDC config // no proposals to be made, timelock can be passed as nil here var apps []commonchangeset.ChangesetApplication - allContractParams := make(map[uint64]changeset.ChainContractParams) - - for _, chain := range allChains { - allContractParams[chain] = changeset.ChainContractParams{ - FeeQuoterParams: changeset.DefaultFeeQuoterParams(), - OffRampParams: changeset.DefaultOffRampParams(), - } - } - + evmContractParams := make(map[uint64]changeset.ChainContractParams) + solContractParams := make(map[uint64]changeset.ChainContractParams) evmChains := []uint64{} for _, chain := range allChains { if _, ok := e.Env.Chains[chain]; ok { @@ -537,6 +531,20 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn } } + for _, chain := range evmChains { + evmContractParams[chain] = changeset.ChainContractParams{ + FeeQuoterParams: changeset.DefaultFeeQuoterParams(), + OffRampParams: changeset.DefaultOffRampParams(), + } + } + + for _, chain := range solChains { + solContractParams[chain] = changeset.ChainContractParams{ + FeeQuoterParams: changeset.DefaultFeeQuoterParams(), + OffRampParams: changeset.DefaultOffRampParams(), + } + } + apps = append(apps, []commonchangeset.ChangesetApplication{ { Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChainChangeset), @@ -554,7 +562,14 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn Changeset: commonchangeset.WrapChangeSet(changeset.DeployChainContractsChangeset), Config: changeset.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, - ContractParamsPerChain: allContractParams, + ContractParamsPerChain: evmContractParams, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(solana.DeployChainContractsChangesetSolana), + Config: changeset.DeployChainContractsConfig{ + HomeChainSelector: e.HomeChainSel, + ContractParamsPerChain: solContractParams, }, }, }...) From 8ab88c2d9d5e5df4f8496763e74b0bb9c4c183a9 Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Tue, 11 Feb 2025 15:23:58 +0100 Subject: [PATCH 14/83] CCIP-5140 Split commit report on bless status (#16201) * split report * move config * handle both root types * fix formatting * upgrade cl-ccip * fix commitCodec * fix * update changeset * adjust changeset * fix changeset * fix integ tests * fix laod tests * upgrade cl-ccip * split report * move config * handle both root types * fix formatting * add tests + changeset * rm old RMN depends on X tags * [Bot] Update changeset file with jira issues * disable rmn everywhere * upgrade cl-ccip * skip a test * re-enable tests and fix issue * upgrade cl-ccip * upgrade cl-ccip * enable rmn on rmn tests and upgrade cl-ccip * fix tests * fix test cfg * dedup commit codec * integ tests * upgrade cl-ccip * undo rmn test changes * rm simulated_3 * add integ test * upgrade cl-ccip * Update gethwrappers * refactor merkelroot in solana plugin * Revert "refactor merkelroot in solana plugin" This reverts commit 5f3806eafd8348ba2526b84ea382673598bfcb3b. * refactor solana plugin for merkleroot split * fix snap * combine blessed and unblessed merkleroots checks * Additional checks on rmn signatures and roots * minor fixes * lint fixes * fix comment * fix linting/tests add more cases (#16317) * fix some stuff * fix tests * skip flakey migration test * fix lint --------- Co-authored-by: dimkouv Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Co-authored-by: Joe Huang Co-authored-by: Prashant Yadav Co-authored-by: Will Winder Co-authored-by: Makram --- contracts/.changeset/curly-seahorses-eat.md | 10 + contracts/gas-snapshots/ccip.gas-snapshot | 152 +++++++------- contracts/src/v0.8/ccip/offRamp/OffRamp.sol | 119 ++++++----- .../NonceManager.getInboundNonce.t.sol | 9 +- .../src/v0.8/ccip/test/e2e/End2End.t.sol | 14 +- .../ccip/test/helpers/CCIPReaderTester.sol | 2 +- ...ffRamp.applySourceChainConfigUpdates.t.sol | 74 +++++-- .../test/offRamp/OffRamp/OffRamp.commit.t.sol | 191 ++++++++++++++---- .../offRamp/OffRamp/OffRamp.constructor.t.sol | 18 +- .../OffRamp/OffRamp.executeSingleReport.t.sol | 3 +- .../test/offRamp/OffRamp/OffRampSetup.t.sol | 10 +- ...ssageTransformer.executeSingleReport.t.sol | 3 +- core/capabilities/ccip/ccipevm/commitcodec.go | 48 +++-- .../ccip/ccipevm/commitcodec_test.go | 25 ++- .../ccip/ccipsolana/commitcodec.go | 62 +++++- .../ccip/ccipsolana/commitcodec_test.go | 61 +++++- .../ccip_encoding_utils.go | 9 +- .../ccip_reader_tester/ccip_reader_tester.go | 29 +-- .../ccip/generated/offramp/offramp.go | 36 ++-- .../offramp_with_message_transformer.go | 36 ++-- .../generated/report_codec/report_codec.go | 13 +- ...rapper-dependency-versions-do-not-edit.txt | 10 +- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- .../changeset/cs_active_candidate_test.go | 3 +- .../ccip/changeset/cs_chain_contracts.go | 4 +- .../ccip/changeset/cs_chain_contracts_test.go | 12 +- deployment/ccip/changeset/cs_deploy_chain.go | 3 - .../changeset/testhelpers/test_assertions.go | 30 ++- .../changeset/testhelpers/test_environment.go | 14 +- .../changeset/testhelpers/test_helpers.go | 5 +- deployment/environment/crib/ccip_deployer.go | 6 +- deployment/go.mod | 2 +- deployment/go.sum | 4 +- go.mod | 2 +- go.sum | 4 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/ccip/helpers.go | 10 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- .../smoke/ccip/ccip_add_chain_test.go | 5 +- .../smoke/ccip/ccip_messaging_test.go | 10 +- .../ccip/ccip_migration_to_v_1_6_test.go | 8 +- .../smoke/ccip/ccip_reader_test.go | 187 +++++++++++++---- integration-tests/smoke/ccip/ccip_rmn_test.go | 19 +- 46 files changed, 877 insertions(+), 403 deletions(-) create mode 100644 contracts/.changeset/curly-seahorses-eat.md diff --git a/contracts/.changeset/curly-seahorses-eat.md b/contracts/.changeset/curly-seahorses-eat.md new file mode 100644 index 00000000000..9af314106eb --- /dev/null +++ b/contracts/.changeset/curly-seahorses-eat.md @@ -0,0 +1,10 @@ +--- +'@chainlink/contracts': patch +--- + +#internal enable both blessed and unblessed roots in a single commit report + + +PR issue: CCIP-5140 + +Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 9e1a10668e0..138d7f563dd 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -25,7 +25,7 @@ CCIPHome_setCandidate:test_setCandidate() (gas: 1365392) CCIPHome_supportsInterface:test_supportsInterface() (gas: 9885) DefensiveExampleTest:test_HappyPath() (gas: 200535) DefensiveExampleTest:test_Recovery() (gas: 424996) -E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1519953) +E2E:test_E2E_3MessagesMMultiOffRampSuccess_gas() (gas: 1519925) ERC165CheckerReverting_supportsInterfaceReverting:test__supportsInterfaceReverting() (gas: 10517) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96964) EtherSenderReceiverTest_ccipReceive:test_ccipReceive_happyPath() (gas: 49797) @@ -201,12 +201,12 @@ NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 123617) NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySet_overrideAllowed() (gas: 45935) NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66937) NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12123) -NonceManager_getInboundNonce:test_getInboundNonce_NoPrevOffRampForChain() (gas: 183777) -NonceManager_getInboundNonce:test_getInboundNonce_Upgraded() (gas: 150965) -NonceManager_getInboundNonce:test_getInboundNonce_UpgradedNonceNewSenderStartsAtZero() (gas: 187248) -NonceManager_getInboundNonce:test_getInboundNonce_UpgradedNonceStartsAtV1Nonce() (gas: 254856) -NonceManager_getInboundNonce:test_getInboundNonce_UpgradedOffRampNonceSkipsIfMsgInFlight() (gas: 218870) -NonceManager_getInboundNonce:test_getInboundNonce_UpgradedSenderNoncesReadsPreviousRamp() (gas: 60418) +NonceManager_getInboundNonce:test_getInboundNonce_NoPrevOffRampForChain() (gas: 183800) +NonceManager_getInboundNonce:test_getInboundNonce_Upgraded() (gas: 150988) +NonceManager_getInboundNonce:test_getInboundNonce_UpgradedNonceNewSenderStartsAtZero() (gas: 187293) +NonceManager_getInboundNonce:test_getInboundNonce_UpgradedNonceStartsAtV1Nonce() (gas: 254946) +NonceManager_getInboundNonce:test_getInboundNonce_UpgradedOffRampNonceSkipsIfMsgInFlight() (gas: 218982) +NonceManager_getInboundNonce:test_getInboundNonce_UpgradedSenderNoncesReadsPreviousRamp() (gas: 60396) NonceManager_getIncrementedOutboundNonce:test_getIncrementedOutboundNonce() (gas: 37974) NonceManager_getIncrementedOutboundNonce:test_incrementInboundNonce() (gas: 38746) NonceManager_getIncrementedOutboundNonce:test_incrementInboundNonce_SkippedIncorrectNonce() (gas: 23739) @@ -215,75 +215,75 @@ NonceManager_getOutboundNonce:test_getOutboundNonce_Upgrade() (gas: 113920) NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceNewSenderStartsAtZero() (gas: 178639) NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeNonceStartsAtV1Nonce() (gas: 217197) NonceManager_getOutboundNonce:test_getOutboundNonce_UpgradeSenderNoncesReadsPreviousRamp() (gas: 153937) -OffRampWithMessageTransformer_executeSingleReport:test_executeSingleReport() (gas: 307118) -OffRampWithMessageTransformer_setMessageTransformer:test_setMessageTransformer() (gas: 701222) -OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains() (gas: 626140) -OffRamp_applySourceChainConfigUpdates:test_AddNewChain() (gas: 166441) -OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates() (gas: 16671) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain() (gas: 180998) -OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp() (gas: 168513) -OffRamp_applySourceChainConfigUpdates:test_allowNonOnRampUpdateAfterLaneIsUsed() (gas: 284861) -OffRamp_batchExecute:test_MultipleReportsDifferentChains() (gas: 340742) -OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain() (gas: 175741) +OffRampWithMessageTransformer_executeSingleReport:test_executeSingleReport() (gas: 307163) +OffRampWithMessageTransformer_setMessageTransformer:test_setMessageTransformer() (gas: 701156) +OffRamp_applySourceChainConfigUpdates:test_AddMultipleChains() (gas: 629252) +OffRamp_applySourceChainConfigUpdates:test_AddNewChain() (gas: 167412) +OffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates() (gas: 16647) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain() (gas: 182429) +OffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRamp() (gas: 169667) +OffRamp_applySourceChainConfigUpdates:test_allowNonOnRampUpdateAfterLaneIsUsed() (gas: 285940) +OffRamp_batchExecute:test_MultipleReportsDifferentChains() (gas: 340753) +OffRamp_batchExecute:test_MultipleReportsDifferentChainsSkipCursedChain() (gas: 175818) OffRamp_batchExecute:test_MultipleReportsSameChain() (gas: 284041) -OffRamp_batchExecute:test_MultipleReportsSkipDuplicate() (gas: 166949) -OffRamp_batchExecute:test_SingleReport() (gas: 154488) -OffRamp_batchExecute:test_Unhealthy() (gas: 546735) -OffRamp_commit:test_OnlyGasPriceUpdates() (gas: 112907) -OffRamp_commit:test_OnlyTokenPriceUpdates() (gas: 112861) -OffRamp_commit:test_PriceSequenceNumberCleared() (gas: 355229) -OffRamp_commit:test_ReportAndPriceUpdate() (gas: 164143) -OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 141051) -OffRamp_commit:test_RootWithRMNDisabled() (gas: 153873) -OffRamp_commit:test_StaleReportWithRoot() (gas: 232057) -OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot() (gas: 206634) -OffRamp_constructor:test_Constructor() (gas: 6340113) -OffRamp_execute:test_LargeBatch() (gas: 3537781) -OffRamp_execute:test_MultipleReports() (gas: 306193) -OffRamp_execute:test_MultipleReportsWithPartialValidationFailures() (gas: 370270) -OffRamp_execute:test_SingleReport() (gas: 173724) -OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens() (gas: 55443) -OffRamp_executeSingleMessage:test_executeSingleMessage_NonContract() (gas: 20514) -OffRamp_executeSingleMessage:test_executeSingleMessage_NonContractWithTokens() (gas: 230418) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithMessageInterceptor() (gas: 91298) -OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens() (gas: 265210) -OffRamp_executeSingleReport:test_InvalidSourcePoolAddress() (gas: 462329) -OffRamp_executeSingleReport:test_ReceiverError() (gas: 181094) -OffRamp_executeSingleReport:test_SingleMessageNoTokens() (gas: 215033) -OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain() (gas: 249545) -OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered() (gas: 195030) -OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver() (gas: 244181) -OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 139526) -OffRamp_executeSingleReport:test_SkippedIncorrectNonce() (gas: 58558) -OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes() (gas: 399284) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE() (gas: 575811) -OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 524188) -OffRamp_executeSingleReport:test_Unhealthy() (gas: 542355) -OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain() (gas: 450383) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage() (gas: 163171) -OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered() (gas: 133556) -OffRamp_getExecutionState:test_FillExecutionState() (gas: 3955662) -OffRamp_getExecutionState:test_GetDifferentChainExecutionState() (gas: 121311) -OffRamp_getExecutionState:test_GetExecutionState() (gas: 90102) -OffRamp_manuallyExecute:test_manuallyExecute() (gas: 212742) -OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched() (gas: 166042) -OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit() (gas: 479692) -OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2230185) -OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride() (gas: 213292) -OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride() (gas: 753781) -OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages() (gas: 347264) +OffRamp_batchExecute:test_MultipleReportsSkipDuplicate() (gas: 166960) +OffRamp_batchExecute:test_SingleReport() (gas: 154466) +OffRamp_batchExecute:test_Unhealthy() (gas: 546691) +OffRamp_commit:test_OnlyGasPriceUpdates() (gas: 114706) +OffRamp_commit:test_OnlyTokenPriceUpdates() (gas: 114638) +OffRamp_commit:test_PriceSequenceNumberCleared() (gas: 358677) +OffRamp_commit:test_ReportAndPriceUpdate() (gas: 166998) +OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 141950) +OffRamp_commit:test_RootWithRMNDisabled() (gas: 159871) +OffRamp_commit:test_StaleReportWithRoot() (gas: 237218) +OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot() (gas: 211061) +OffRamp_constructor:test_Constructor() (gas: 6393595) +OffRamp_execute:test_LargeBatch() (gas: 3537164) +OffRamp_execute:test_MultipleReports() (gas: 306127) +OffRamp_execute:test_MultipleReportsWithPartialValidationFailures() (gas: 369525) +OffRamp_execute:test_SingleReport() (gas: 173680) +OffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens() (gas: 55466) +OffRamp_executeSingleMessage:test_executeSingleMessage_NonContract() (gas: 20470) +OffRamp_executeSingleMessage:test_executeSingleMessage_NonContractWithTokens() (gas: 230396) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithMessageInterceptor() (gas: 90556) +OffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens() (gas: 265188) +OffRamp_executeSingleReport:test_InvalidSourcePoolAddress() (gas: 462330) +OffRamp_executeSingleReport:test_ReceiverError() (gas: 181139) +OffRamp_executeSingleReport:test_SingleMessageNoTokens() (gas: 215123) +OffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain() (gas: 249635) +OffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered() (gas: 195098) +OffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver() (gas: 244226) +OffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 139549) +OffRamp_executeSingleReport:test_SkippedIncorrectNonce() (gas: 58625) +OffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes() (gas: 399329) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE() (gas: 575812) +OffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 524300) +OffRamp_executeSingleReport:test_Unhealthy() (gas: 542445) +OffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain() (gas: 450406) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage() (gas: 163261) +OffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered() (gas: 133646) +OffRamp_getExecutionState:test_FillExecutionState() (gas: 3938744) +OffRamp_getExecutionState:test_GetDifferentChainExecutionState() (gas: 121157) +OffRamp_getExecutionState:test_GetExecutionState() (gas: 89992) +OffRamp_manuallyExecute:test_manuallyExecute() (gas: 212654) +OffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched() (gas: 165998) +OffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit() (gas: 479604) +OffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2230097) +OffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride() (gas: 213226) +OffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride() (gas: 753517) +OffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages() (gas: 347154) OffRamp_releaseOrMintSingleToken:test__releaseOrMintSingleToken() (gas: 94629) OffRamp_releaseOrMintTokens:test_releaseOrMintTokens() (gas: 161157) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride() (gas: 163023) -OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals() (gas: 174276) -OffRamp_setDynamicConfig:test_SetDynamicConfig() (gas: 25442) -OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor() (gas: 47493) -OffRamp_trialExecute:test_trialExecute() (gas: 268955) -OffRamp_trialExecute:test_trialExecute_RateLimitError() (gas: 120710) -OffRamp_trialExecute:test_trialExecute_RevertsWhen_SenderIsGasEstimator_InsufficientGasForToCompleteTx() (gas: 67132) -OffRamp_trialExecute:test_trialExecute_SenderIsNotGasEstimator_CallWithExactGasReverts() (gas: 24573) -OffRamp_trialExecute:test_trialExecute_TokenHandlingErrorIsCaught() (gas: 131998) -OffRamp_trialExecute:test_trialExecute_TokenPoolIsNotAContract() (gas: 286580) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_WithGasOverride() (gas: 163001) +OffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals() (gas: 174254) +OffRamp_setDynamicConfig:test_SetDynamicConfig() (gas: 24372) +OffRamp_setDynamicConfig:test_SetDynamicConfigWithInterceptor() (gas: 46421) +OffRamp_trialExecute:test_trialExecute() (gas: 268978) +OffRamp_trialExecute:test_trialExecute_RateLimitError() (gas: 120733) +OffRamp_trialExecute:test_trialExecute_RevertsWhen_SenderIsGasEstimator_InsufficientGasForToCompleteTx() (gas: 67421) +OffRamp_trialExecute:test_trialExecute_SenderIsNotGasEstimator_CallWithExactGasReverts() (gas: 24640) +OffRamp_trialExecute:test_trialExecute_TokenHandlingErrorIsCaught() (gas: 132021) +OffRamp_trialExecute:test_trialExecute_TokenPoolIsNotAContract() (gas: 286715) OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy() (gas: 251676) OnRampWithMessageTransformer_executeSingleMessage:test_forwardFromRouter() (gas: 130456) OnRampWithMessageTransformer_setMessageTransformer:test_setMessageTransformer() (gas: 701204) @@ -359,9 +359,9 @@ Router_constructor:test_Constructor() (gas: 13170) Router_getArmProxy:test_getArmProxy() (gas: 10573) Router_getFee:test_GetFeeSupportedChain() (gas: 52367) Router_recoverTokens:test_RecoverTokens() (gas: 52686) -Router_routeMessage:test_routeMessage_AutoExec() (gas: 41832) -Router_routeMessage:test_routeMessage_ExecutionEvent() (gas: 157232) -Router_routeMessage:test_routeMessage_ManualExec() (gas: 34881) +Router_routeMessage:test_routeMessage_AutoExec() (gas: 41838) +Router_routeMessage:test_routeMessage_ExecutionEvent() (gas: 157241) +Router_routeMessage:test_routeMessage_ManualExec() (gas: 34884) SiloedLockReleaseTokenPool_lockOrBurn:test_lockOrBurn_SiloedFunds() (gas: 76874) SiloedLockReleaseTokenPool_lockOrBurn:test_lockOrBurn_UnsiloedFunds() (gas: 76104) SiloedLockReleaseTokenPool_provideLiquidity:test_provideLiquidity() (gas: 89627) diff --git a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol index 4e0d87d48ce..8b7a8444e68 100644 --- a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol @@ -65,11 +65,11 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { error SignatureVerificationNotAllowedInExecutionPlugin(); error CommitOnRampMismatch(bytes reportOnRamp, bytes configOnRamp); error InvalidOnRampUpdate(uint64 sourceChainSelector); + error RootBlessingMismatch(uint64 sourceChainSelector, bytes32 merkleRoot, bool isBlessed); - /// @dev Atlas depends on this event, if changing, please notify Atlas. + /// @dev Atlas depends on various events, if changing, please notify Atlas. event StaticConfigSet(StaticConfig staticConfig); event DynamicConfigSet(DynamicConfig dynamicConfig); - /// @dev RMN depends on this event, if changing, please notify the RMN maintainers. event ExecutionStateChanged( uint64 indexed sourceChainSelector, uint64 indexed sequenceNumber, @@ -83,13 +83,15 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { event SourceChainConfigSet(uint64 indexed sourceChainSelector, SourceChainConfig sourceConfig); event SkippedAlreadyExecutedMessage(uint64 sourceChainSelector, uint64 sequenceNumber); event AlreadyAttempted(uint64 sourceChainSelector, uint64 sequenceNumber); - /// @dev RMN depends on this event, if changing, please notify the RMN maintainers. - event CommitReportAccepted(Internal.MerkleRoot[] merkleRoots, Internal.PriceUpdates priceUpdates); + event CommitReportAccepted( + Internal.MerkleRoot[] blessedMerkleRoots, + Internal.MerkleRoot[] unblessedMerkleRoots, + Internal.PriceUpdates priceUpdates + ); event RootRemoved(bytes32 root); event SkippedReportExecution(uint64 sourceChainSelector); /// @dev Struct that contains the static configuration. The individual components are stored as immutable variables. - /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers. // solhint-disable-next-line gas-struct-packing struct StaticConfig { uint64 chainSelector; // ───────╮ Destination chainSelector @@ -101,35 +103,36 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @dev Per-chain source config (defining a lane from a Source Chain -> Dest OffRamp). struct SourceChainConfig { - IRouter router; // ───╮ Local router to use for messages coming from this source chain. - bool isEnabled; // │ Flag whether the source chain is enabled or not. - uint64 minSeqNr; // ──╯ The min sequence number expected for future messages. + IRouter router; // ─────────────────╮ Local router to use for messages coming from this source chain. + bool isEnabled; // │ Flag whether the source chain is enabled or not. + uint64 minSeqNr; // │ The min sequence number expected for future messages. + bool isRMNVerificationDisabled; // ─╯ Flag whether the RMN verification is disabled or not. bytes onRamp; // OnRamp address on the source chain. } /// @dev Same as SourceChainConfig but with source chain selector so that an array of these /// can be passed in the constructor and the applySourceChainConfigUpdates function. struct SourceChainConfigArgs { - IRouter router; // ────────────╮ Local router to use for messages coming from this source chain. - uint64 sourceChainSelector; // │ Source chain selector of the config to update. - bool isEnabled; // ────────────╯ Flag whether the source chain is enabled or not. + IRouter router; // ─────────────────╮ Local router to use for messages coming from this source chain. + uint64 sourceChainSelector; // │ Source chain selector of the config to update. + bool isEnabled; // │ Flag whether the source chain is enabled or not. + bool isRMNVerificationDisabled; // ─╯ Flag whether the RMN verification is disabled or not. bytes onRamp; // OnRamp address on the source chain. } /// @dev Dynamic offRamp config. /// @dev Since DynamicConfig is part of DynamicConfigSet event, if changing it, we should update the ABI on Atlas. struct DynamicConfig { - address feeQuoter; // ─────────────────────────────╮ FeeQuoter address on the local chain. - uint32 permissionLessExecutionThresholdSeconds; // │ Waiting time before manual execution is enabled. - bool isRMNVerificationDisabled; // ────────────────╯ Flag whether the RMN verification is disabled or not. + address feeQuoter; // ──────────────────────────────╮ FeeQuoter address on the local chain. + uint32 permissionLessExecutionThresholdSeconds; // ─╯ Waiting time before manual execution is enabled. address messageInterceptor; // Optional, validates incoming messages (zero address = no interceptor). } /// @dev Report that is committed by the observing DON at the committing phase. - /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers. struct CommitReport { - Internal.PriceUpdates priceUpdates; // Collection of gas and price updates to commit. - Internal.MerkleRoot[] merkleRoots; // Collection of merkle roots per source chain to commit. + Internal.PriceUpdates priceUpdates; // List of gas and price updates to commit. + Internal.MerkleRoot[] blessedMerkleRoots; // List of merkle roots from source chains for which RMN is enabled. + Internal.MerkleRoot[] unblessedMerkleRoots; // List of merkle roots from source chains for which RMN is disabled. IRMNRemote.Signature[] rmnSignatures; // RMN signatures on the merkle roots. } @@ -153,7 +156,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @dev The address of the nonce manager. address internal immutable i_nonceManager; /// @dev The minimum amount of gas to perform the call with exact gas. - /// We include this in the offramp so that we can redeploy to adjust it should a hardfork change the gas costs of + /// We include this in the offRamp so that we can redeploy to adjust it should a hardfork change the gas costs of /// relevant opcodes in callWithExactGas. uint16 internal immutable i_gasForCallExactCheck; @@ -812,10 +815,8 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { DynamicConfig storage dynamicConfig = s_dynamicConfig; // Verify RMN signatures - if (!dynamicConfig.isRMNVerificationDisabled) { - if (commitReport.merkleRoots.length > 0) { - i_rmnRemote.verify(address(this), commitReport.merkleRoots, commitReport.rmnSignatures); - } + if (commitReport.blessedMerkleRoots.length > 0) { + i_rmnRemote.verify(address(this), commitReport.blessedMerkleRoots, commitReport.rmnSignatures); } // Check if the report contains price updates. @@ -832,43 +833,65 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } else { // If prices are stale and the report doesn't contain a root, this report does not have any valid information // and we revert. If it does contain a merkle root, continue to the root checking section. - if (commitReport.merkleRoots.length == 0) revert StaleCommitReport(); + if (commitReport.blessedMerkleRoots.length + commitReport.unblessedMerkleRoots.length == 0) { + revert StaleCommitReport(); + } } } - for (uint256 i = 0; i < commitReport.merkleRoots.length; ++i) { - Internal.MerkleRoot memory root = commitReport.merkleRoots[i]; - uint64 sourceChainSelector = root.sourceChainSelector; + for (uint256 i = 0; i < commitReport.blessedMerkleRoots.length; ++i) { + _commitRoot(commitReport.blessedMerkleRoots[i], true); + } - if (i_rmnRemote.isCursed(bytes16(uint128(sourceChainSelector)))) { - revert CursedByRMN(sourceChainSelector); - } + for (uint256 i = 0; i < commitReport.unblessedMerkleRoots.length; ++i) { + _commitRoot(commitReport.unblessedMerkleRoots[i], false); + } - SourceChainConfig storage sourceChainConfig = _getEnabledSourceChainConfig(sourceChainSelector); + emit CommitReportAccepted( + commitReport.blessedMerkleRoots, commitReport.unblessedMerkleRoots, commitReport.priceUpdates + ); - if (keccak256(root.onRampAddress) != keccak256(sourceChainConfig.onRamp)) { - revert CommitOnRampMismatch(root.onRampAddress, sourceChainConfig.onRamp); - } + _transmit(uint8(Internal.OCRPluginType.Commit), reportContext, report, rs, ss, rawVs); + } - if (sourceChainConfig.minSeqNr != root.minSeqNr || root.minSeqNr > root.maxSeqNr) { - revert InvalidInterval(root.sourceChainSelector, root.minSeqNr, root.maxSeqNr); - } + /// @notice Commits a single merkle root. The blessing status has to match the source chain config. + /// @dev An unblessed root means that RMN verification is disabled for the source chain. It does not mean there is + /// some future point where the root will be blessed. + /// @param root The merkle root to commit. + /// @param isBlessed The blessing status of the root. + function _commitRoot(Internal.MerkleRoot memory root, bool isBlessed) internal { + uint64 sourceChainSelector = root.sourceChainSelector; - bytes32 merkleRoot = root.merkleRoot; - if (merkleRoot == bytes32(0)) revert InvalidRoot(); - // If we reached this section, the report should contain a valid root. - // We disallow duplicate roots as that would reset the timestamp and delay potential manual execution. - if (s_roots[root.sourceChainSelector][merkleRoot] != 0) { - revert RootAlreadyCommitted(root.sourceChainSelector, merkleRoot); - } + if (i_rmnRemote.isCursed(bytes16(uint128(sourceChainSelector)))) { + revert CursedByRMN(sourceChainSelector); + } + + SourceChainConfig storage sourceChainConfig = _getEnabledSourceChainConfig(sourceChainSelector); - sourceChainConfig.minSeqNr = root.maxSeqNr + 1; - s_roots[root.sourceChainSelector][merkleRoot] = block.timestamp; + // If the root is blessed but RMN blessing is disabled for the source chain, or if the root is not blessed but RMN + // blessing is enabled, we revert. + if (isBlessed == sourceChainConfig.isRMNVerificationDisabled) { + revert RootBlessingMismatch(sourceChainSelector, root.merkleRoot, isBlessed); } - emit CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); + if (keccak256(root.onRampAddress) != keccak256(sourceChainConfig.onRamp)) { + revert CommitOnRampMismatch(root.onRampAddress, sourceChainConfig.onRamp); + } - _transmit(uint8(Internal.OCRPluginType.Commit), reportContext, report, rs, ss, rawVs); + if (sourceChainConfig.minSeqNr != root.minSeqNr || root.minSeqNr > root.maxSeqNr) { + revert InvalidInterval(sourceChainSelector, root.minSeqNr, root.maxSeqNr); + } + + bytes32 merkleRoot = root.merkleRoot; + if (merkleRoot == bytes32(0)) revert InvalidRoot(); + // If we reached this section, the report should contain a valid root. + // We disallow duplicate roots as that would reset the timestamp and delay potential manual execution. + if (s_roots[sourceChainSelector][merkleRoot] != 0) { + revert RootAlreadyCommitted(sourceChainSelector, merkleRoot); + } + + sourceChainConfig.minSeqNr = root.maxSeqNr + 1; + s_roots[sourceChainSelector][merkleRoot] = block.timestamp; } /// @notice Returns the sequence number of the last price update. @@ -930,7 +953,6 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { /// @notice Returns the static config. /// @dev This function will always return the same struct as the contents is static and can never change. - /// RMN depends on this function, if changing, please notify the RMN maintainers. /// @return staticConfig The static config. function getStaticConfig() external view returns (StaticConfig memory) { return StaticConfig({ @@ -1017,6 +1039,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { currentConfig.onRamp = newOnRamp; currentConfig.isEnabled = sourceConfigUpdate.isEnabled; currentConfig.router = sourceConfigUpdate.router; + currentConfig.isRMNVerificationDisabled = sourceConfigUpdate.isRMNVerificationDisabled; // We don't need to check the return value, as inserting the item twice has no effect. s_sourceChainSelectors.add(sourceChainSelector); diff --git a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getInboundNonce.t.sol b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getInboundNonce.t.sol index d70382bab5a..9affab621c8 100644 --- a/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getInboundNonce.t.sol +++ b/contracts/src/v0.8/ccip/test/NonceManager/NonceManager.getInboundNonce.t.sol @@ -33,19 +33,22 @@ contract NonceManager_getInboundNonce is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, isEnabled: true, - onRamp: ON_RAMP_ADDRESS_1 + onRamp: ON_RAMP_ADDRESS_1, + isRMNVerificationDisabled: false }); sourceChainConfigs[1] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_2, isEnabled: true, - onRamp: ON_RAMP_ADDRESS_2 + onRamp: ON_RAMP_ADDRESS_2, + isRMNVerificationDisabled: false }); sourceChainConfigs[2] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_3, isEnabled: true, - onRamp: ON_RAMP_ADDRESS_3 + onRamp: ON_RAMP_ADDRESS_3, + isRMNVerificationDisabled: false }); _setupMultipleOffRampsFromConfigs(sourceChainConfigs); diff --git a/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol b/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol index 057aaa9e01d..b2c9aee4ad0 100644 --- a/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol +++ b/contracts/src/v0.8/ccip/test/e2e/End2End.t.sol @@ -111,13 +111,15 @@ contract E2E is OnRampSetup, OffRampSetup { sourceChainSelector: SOURCE_CHAIN_SELECTOR, isEnabled: true, // Must match OnRamp address - onRamp: abi.encode(address(s_onRamp)) + onRamp: abi.encode(address(s_onRamp)), + isRMNVerificationDisabled: false }); sourceChainConfigs[1] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR + 1, isEnabled: true, - onRamp: abi.encode(address(s_onRamp2)) + onRamp: abi.encode(address(s_onRamp2)), + isRMNVerificationDisabled: false }); _setupMultipleOffRampsFromConfigs(sourceChainConfigs); @@ -185,8 +187,12 @@ contract E2E is OnRampSetup, OffRampSetup { merkleRoot: merkleRoots[1] }); - OffRamp.CommitReport memory report = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: rmnSignatures}); + OffRamp.CommitReport memory report = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: rmnSignatures + }); vm.resumeGasMetering(); _commit(report, ++s_latestSequenceNumber); diff --git a/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol b/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol index 236797f87f0..1e8f0850cc6 100644 --- a/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol +++ b/contracts/src/v0.8/ccip/test/helpers/CCIPReaderTester.sol @@ -87,6 +87,6 @@ contract CCIPReaderTester { function emitCommitReportAccepted( OffRamp.CommitReport memory report ) external { - emit OffRamp.CommitReportAccepted(report.merkleRoots, report.priceUpdates); + emit OffRamp.CommitReportAccepted(report.blessedMerkleRoots, report.unblessedMerkleRoots, report.priceUpdates); } } diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.applySourceChainConfigUpdates.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.applySourceChainConfigUpdates.t.sol index c2e1ddbce3f..6ab791bf6fd 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.applySourceChainConfigUpdates.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.applySourceChainConfigUpdates.t.sol @@ -29,11 +29,17 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); - OffRamp.SourceChainConfig memory expectedSourceChainConfig = - OffRamp.SourceChainConfig({router: s_destRouter, isEnabled: true, minSeqNr: 1, onRamp: ON_RAMP_ADDRESS_1}); + OffRamp.SourceChainConfig memory expectedSourceChainConfig = OffRamp.SourceChainConfig({ + router: s_destRouter, + isEnabled: true, + minSeqNr: 1, + onRamp: ON_RAMP_ADDRESS_1, + isRMNVerificationDisabled: false + }); vm.expectEmit(); emit OffRamp.SourceChainSelectorAdded(SOURCE_CHAIN_SELECTOR_1); @@ -52,14 +58,20 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); sourceChainConfigs[0].isEnabled = false; - OffRamp.SourceChainConfig memory expectedSourceChainConfig = - OffRamp.SourceChainConfig({router: s_destRouter, isEnabled: false, minSeqNr: 1, onRamp: ON_RAMP_ADDRESS_1}); + OffRamp.SourceChainConfig memory expectedSourceChainConfig = OffRamp.SourceChainConfig({ + router: s_destRouter, + isEnabled: false, + minSeqNr: 1, + onRamp: ON_RAMP_ADDRESS_1, + isRMNVerificationDisabled: false + }); vm.expectEmit(); emit OffRamp.SourceChainConfigSet(SOURCE_CHAIN_SELECTOR_1, expectedSourceChainConfig); @@ -83,19 +95,22 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: abi.encode(ON_RAMP_ADDRESS_1, 0), - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); sourceChainConfigs[1] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 1, onRamp: abi.encode(ON_RAMP_ADDRESS_1, 1), - isEnabled: false + isEnabled: false, + isRMNVerificationDisabled: false }); sourceChainConfigs[2] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 2, onRamp: abi.encode(ON_RAMP_ADDRESS_1, 2), - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); OffRamp.SourceChainConfig[] memory expectedSourceChainConfigs = new OffRamp.SourceChainConfig[](3); @@ -104,7 +119,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, isEnabled: sourceChainConfigs[i].isEnabled, minSeqNr: 1, - onRamp: abi.encode(ON_RAMP_ADDRESS_1, i) + onRamp: abi.encode(ON_RAMP_ADDRESS_1, i), + isRMNVerificationDisabled: false }); vm.expectEmit(); @@ -139,7 +155,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); sourceChainConfigs[1] = sourceChainConfigArgs; @@ -153,7 +170,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: sourceChainConfigArgs.router, isEnabled: sourceChainConfigArgs.isEnabled, minSeqNr: 1, - onRamp: sourceChainConfigArgs.onRamp + onRamp: sourceChainConfigArgs.onRamp, + isRMNVerificationDisabled: sourceChainConfigArgs.isRMNVerificationDisabled }); if (isNewChain) { @@ -177,7 +195,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); @@ -187,7 +206,13 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { vm.expectEmit(); emit OffRamp.SourceChainConfigSet( SOURCE_CHAIN_SELECTOR_1, - OffRamp.SourceChainConfig({router: s_destRouter, isEnabled: true, minSeqNr: 1, onRamp: ON_RAMP_ADDRESS_2}) + OffRamp.SourceChainConfig({ + router: s_destRouter, + isEnabled: true, + minSeqNr: 1, + onRamp: ON_RAMP_ADDRESS_2, + isRMNVerificationDisabled: false + }) ); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); } @@ -198,7 +223,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); @@ -215,7 +241,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { _commit( OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }), s_latestSequenceNumber @@ -239,7 +266,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: new bytes(0), - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); vm.expectRevert(OffRamp.ZeroAddressNotAllowed.selector); @@ -256,7 +284,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: IRouter(address(0)), sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); vm.expectRevert(OffRamp.ZeroAddressNotAllowed.selector); @@ -269,7 +298,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: 0, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); vm.expectRevert(OffRamp.ZeroChainSelectorNotAllowed.selector); @@ -282,7 +312,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); s_offRamp.applySourceChainConfigUpdates(sourceChainConfigs); @@ -299,7 +330,8 @@ contract OffRamp_applySourceChainConfigUpdates is OffRampSetup { _commit( OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }), s_latestSequenceNumber diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.commit.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.commit.t.sol index f0611f8c5fc..7b13422ca9a 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.commit.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.commit.t.sol @@ -24,7 +24,9 @@ contract OffRamp_commit is OffRampSetup { OffRamp.CommitReport memory commitReport = _constructCommitReport(); vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); + emit OffRamp.CommitReportAccepted( + commitReport.blessedMerkleRoots, commitReport.unblessedMerkleRoots, commitReport.priceUpdates + ); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -48,11 +50,17 @@ contract OffRamp_commit is OffRampSetup { merkleRoot: root }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: s_rmnSignatures + }); vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); + emit OffRamp.CommitReportAccepted( + commitReport.blessedMerkleRoots, commitReport.unblessedMerkleRoots, commitReport.priceUpdates + ); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -69,9 +77,18 @@ contract OffRamp_commit is OffRampSetup { vm.mockCallRevert(address(s_mockRMNRemote), abi.encodeWithSelector(IRMNRemote.verify.selector), bytes("")); // but ☝️ doesn't matter because RMN verification is disabled - OffRamp.DynamicConfig memory dynamicConfig = _generateDynamicOffRampConfig(address(s_feeQuoter)); - dynamicConfig.isRMNVerificationDisabled = true; - s_offRamp.setDynamicConfig(dynamicConfig); + OffRamp.SourceChainConfig memory sourceChainConfig = s_offRamp.getSourceChainConfig(SOURCE_CHAIN_SELECTOR_1); + + OffRamp.SourceChainConfigArgs[] memory sourceChainConfigUpdates = new OffRamp.SourceChainConfigArgs[](1); + sourceChainConfigUpdates[0] = OffRamp.SourceChainConfigArgs({ + router: sourceChainConfig.router, + sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, + isEnabled: sourceChainConfig.isEnabled, + isRMNVerificationDisabled: true, + onRamp: sourceChainConfig.onRamp + }); + + s_offRamp.applySourceChainConfigUpdates(sourceChainConfigUpdates); uint64 max1 = 931; bytes32 root = "Only a single root"; @@ -85,11 +102,17 @@ contract OffRamp_commit is OffRampSetup { merkleRoot: root }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: new Internal.MerkleRoot[](0), + unblessedMerkleRoots: roots, + rmnSignatures: s_rmnSignatures + }); vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); + emit OffRamp.CommitReportAccepted( + commitReport.blessedMerkleRoots, commitReport.unblessedMerkleRoots, commitReport.priceUpdates + ); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -113,11 +136,17 @@ contract OffRamp_commit is OffRampSetup { maxSeqNr: maxSeq, merkleRoot: "stale report 1" }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: s_rmnSignatures + }); vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); + emit OffRamp.CommitReportAccepted( + commitReport.blessedMerkleRoots, commitReport.unblessedMerkleRoots, commitReport.priceUpdates + ); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -127,12 +156,14 @@ contract OffRamp_commit is OffRampSetup { assertEq(maxSeq + 1, s_offRamp.getSourceChainConfig(SOURCE_CHAIN_SELECTOR).minSeqNr); assertEq(0, s_offRamp.getLatestPriceSequenceNumber()); - commitReport.merkleRoots[0].minSeqNr = maxSeq + 1; - commitReport.merkleRoots[0].maxSeqNr = maxSeq * 2; - commitReport.merkleRoots[0].merkleRoot = "stale report 2"; + commitReport.blessedMerkleRoots[0].minSeqNr = maxSeq + 1; + commitReport.blessedMerkleRoots[0].maxSeqNr = maxSeq * 2; + commitReport.blessedMerkleRoots[0].merkleRoot = "stale report 2"; vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); + emit OffRamp.CommitReportAccepted( + commitReport.blessedMerkleRoots, commitReport.unblessedMerkleRoots, commitReport.priceUpdates + ); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -151,7 +182,8 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0); OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }); @@ -173,7 +205,8 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0); OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }); @@ -191,7 +224,8 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0); OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }); @@ -243,7 +277,8 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0); OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, tokenPrice1), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }); @@ -265,10 +300,12 @@ contract OffRamp_commit is OffRampSetup { merkleRoot: "stale report" }); commitReport.priceUpdates = _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, tokenPrice2); - commitReport.merkleRoots = roots; + commitReport.blessedMerkleRoots = roots; vm.expectEmit(); - emit OffRamp.CommitReportAccepted(commitReport.merkleRoots, commitReport.priceUpdates); + emit OffRamp.CommitReportAccepted( + commitReport.blessedMerkleRoots, commitReport.unblessedMerkleRoots, commitReport.priceUpdates + ); vm.expectEmit(); emit MultiOCR3Base.Transmitted(uint8(Internal.OCRPluginType.Commit), s_configDigestCommit, s_latestSequenceNumber); @@ -353,8 +390,12 @@ contract OffRamp_commit is OffRampSetup { onRampAddress: abi.encode(ON_RAMP_ADDRESS_1) }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: s_rmnSignatures + }); vm.expectRevert(abi.encodeWithSelector(OffRamp.CursedByRMN.selector, roots[0].sourceChainSelector)); _commit(commitReport, s_latestSequenceNumber); @@ -369,8 +410,12 @@ contract OffRamp_commit is OffRampSetup { maxSeqNr: 4, merkleRoot: bytes32(0) }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: s_rmnSignatures + }); vm.expectRevert(OffRamp.InvalidRoot.selector); _commit(commitReport, s_latestSequenceNumber); @@ -385,8 +430,12 @@ contract OffRamp_commit is OffRampSetup { maxSeqNr: 2, merkleRoot: bytes32(0) }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: s_rmnSignatures + }); vm.expectRevert( abi.encodeWithSelector( @@ -406,8 +455,12 @@ contract OffRamp_commit is OffRampSetup { maxSeqNr: 0, merkleRoot: bytes32(0) }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: s_rmnSignatures + }); vm.expectRevert( abi.encodeWithSelector( @@ -421,7 +474,8 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0); OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }); @@ -433,7 +487,8 @@ contract OffRamp_commit is OffRampSetup { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](0); OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }); @@ -455,8 +510,12 @@ contract OffRamp_commit is OffRampSetup { merkleRoot: "Only a single root" }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: s_rmnSignatures + }); vm.expectRevert(abi.encodeWithSelector(OffRamp.SourceChainNotEnabled.selector, 0)); _commit(commitReport, s_latestSequenceNumber); @@ -471,12 +530,16 @@ contract OffRamp_commit is OffRampSetup { maxSeqNr: 2, merkleRoot: "Only a single root" }); - OffRamp.CommitReport memory commitReport = - OffRamp.CommitReport({priceUpdates: _getEmptyPriceUpdates(), merkleRoots: roots, rmnSignatures: s_rmnSignatures}); + OffRamp.CommitReport memory commitReport = OffRamp.CommitReport({ + priceUpdates: _getEmptyPriceUpdates(), + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), + rmnSignatures: s_rmnSignatures + }); _commit(commitReport, s_latestSequenceNumber); - commitReport.merkleRoots[0].minSeqNr = 3; - commitReport.merkleRoots[0].maxSeqNr = 3; + commitReport.blessedMerkleRoots[0].minSeqNr = 3; + commitReport.blessedMerkleRoots[0].maxSeqNr = 3; vm.expectRevert( abi.encodeWithSelector(OffRamp.RootAlreadyCommitted.selector, roots[0].sourceChainSelector, roots[0].merkleRoot) @@ -487,12 +550,57 @@ contract OffRamp_commit is OffRampSetup { function test_RevertWhen_CommitOnRampMismatch() public { OffRamp.CommitReport memory commitReport = _constructCommitReport(); - commitReport.merkleRoots[0].onRampAddress = ON_RAMP_ADDRESS_2; + commitReport.blessedMerkleRoots[0].onRampAddress = ON_RAMP_ADDRESS_2; vm.expectRevert(abi.encodeWithSelector(OffRamp.CommitOnRampMismatch.selector, ON_RAMP_ADDRESS_2, ON_RAMP_ADDRESS_1)); _commit(commitReport, s_latestSequenceNumber); } + function test_RevertWhen_RootBlessingMismatch_blessedButShouldNot() public { + OffRamp.CommitReport memory commitReport = _constructCommitReport(); + uint64 sourceChainSelector = commitReport.blessedMerkleRoots[0].sourceChainSelector; + + OffRamp.SourceChainConfig memory sourceChainConfig = s_offRamp.getSourceChainConfig(sourceChainSelector); + + OffRamp.SourceChainConfigArgs[] memory sourceChainConfigUpdates = new OffRamp.SourceChainConfigArgs[](1); + sourceChainConfigUpdates[0] = OffRamp.SourceChainConfigArgs({ + router: sourceChainConfig.router, + sourceChainSelector: sourceChainSelector, + isEnabled: sourceChainConfig.isEnabled, + isRMNVerificationDisabled: true, + onRamp: sourceChainConfig.onRamp + }); + + s_offRamp.applySourceChainConfigUpdates(sourceChainConfigUpdates); + + vm.expectRevert( + abi.encodeWithSelector( + OffRamp.RootBlessingMismatch.selector, + commitReport.blessedMerkleRoots[0].sourceChainSelector, + commitReport.blessedMerkleRoots[0].merkleRoot, + true + ) + ); + _commit(commitReport, s_latestSequenceNumber); + } + + function test_RevertWhen_RootBlessingMismatch_unblessedButShouldBeBlessed() public { + OffRamp.CommitReport memory commitReport = _constructCommitReport(); + + commitReport.unblessedMerkleRoots = commitReport.blessedMerkleRoots; + commitReport.blessedMerkleRoots = new Internal.MerkleRoot[](0); + + vm.expectRevert( + abi.encodeWithSelector( + OffRamp.RootBlessingMismatch.selector, + commitReport.unblessedMerkleRoots[0].sourceChainSelector, + commitReport.unblessedMerkleRoots[0].merkleRoot, + false + ) + ); + _commit(commitReport, s_latestSequenceNumber); + } + function _constructCommitReport() internal view returns (OffRamp.CommitReport memory) { Internal.MerkleRoot[] memory roots = new Internal.MerkleRoot[](1); roots[0] = Internal.MerkleRoot({ @@ -505,7 +613,8 @@ contract OffRamp_commit is OffRampSetup { return OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }); } diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol index 49ba54dab7e..2ed0def646a 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol @@ -25,27 +25,31 @@ contract OffRamp_constructor is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); sourceChainConfigs[1] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1 + 1, onRamp: ON_RAMP_ADDRESS_2, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); OffRamp.SourceChainConfig memory expectedSourceChainConfig1 = OffRamp.SourceChainConfig({ router: s_destRouter, isEnabled: true, minSeqNr: 1, - onRamp: sourceChainConfigs[0].onRamp + onRamp: sourceChainConfigs[0].onRamp, + isRMNVerificationDisabled: false }); OffRamp.SourceChainConfig memory expectedSourceChainConfig2 = OffRamp.SourceChainConfig({ router: s_destRouter, isEnabled: true, minSeqNr: 1, - onRamp: sourceChainConfigs[1].onRamp + onRamp: sourceChainConfigs[1].onRamp, + isRMNVerificationDisabled: false }); uint64[] memory expectedSourceChainSelectors = new uint64[](2); @@ -135,7 +139,8 @@ contract OffRamp_constructor is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: new bytes(0), - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); vm.expectRevert(OffRamp.ZeroAddressNotAllowed.selector); @@ -162,7 +167,8 @@ contract OffRamp_constructor is OffRampSetup { router: s_destRouter, sourceChainSelector: 0, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); vm.expectRevert(OffRamp.ZeroChainSelectorNotAllowed.selector); diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleReport.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleReport.t.sol index d5bb32a8a12..78a32eb84e0 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleReport.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.executeSingleReport.t.sol @@ -687,7 +687,8 @@ contract OffRamp_executeSingleReport is OffRampSetup { return OffRamp.CommitReport({ priceUpdates: _getSingleTokenPriceUpdateStruct(s_sourceFeeToken, 4e18), - merkleRoots: roots, + blessedMerkleRoots: roots, + unblessedMerkleRoots: new Internal.MerkleRoot[](0), rmnSignatures: s_rmnSignatures }); } diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampSetup.t.sol index daf496c9d75..055fd196260 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampSetup.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampSetup.t.sol @@ -125,19 +125,22 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); sourceChainConfigs[1] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_2, onRamp: ON_RAMP_ADDRESS_2, - isEnabled: false + isEnabled: false, + isRMNVerificationDisabled: false }); sourceChainConfigs[2] = OffRamp.SourceChainConfigArgs({ router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_3, onRamp: ON_RAMP_ADDRESS_3, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); _setupMultipleOffRampsFromConfigs(sourceChainConfigs); } @@ -169,7 +172,6 @@ contract OffRampSetup is FeeQuoterSetup, MultiOCR3BaseSetup { return OffRamp.DynamicConfig({ feeQuoter: feeQuoter, permissionLessExecutionThresholdSeconds: 60 * 60, - isRMNVerificationDisabled: false, messageInterceptor: address(0) }); } diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampWithMessageTransformer.executeSingleReport.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampWithMessageTransformer.executeSingleReport.t.sol index 6fb8fdf0bdf..04a8cbf70a4 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampWithMessageTransformer.executeSingleReport.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRampWithMessageTransformer.executeSingleReport.t.sol @@ -31,7 +31,8 @@ contract OffRampWithMessageTransformer_executeSingleReport is OffRampSetup { router: s_destRouter, sourceChainSelector: SOURCE_CHAIN_SELECTOR_1, onRamp: ON_RAMP_ADDRESS_1, - isEnabled: true + isEnabled: true, + isRMNVerificationDisabled: false }); // set up off ramp with message transformer from configs diff --git a/core/capabilities/ccip/ccipevm/commitcodec.go b/core/capabilities/ccip/ccipevm/commitcodec.go index 31501ea96c4..bbd6fe9f1e1 100644 --- a/core/capabilities/ccip/ccipevm/commitcodec.go +++ b/core/capabilities/ccip/ccipevm/commitcodec.go @@ -28,16 +28,27 @@ func NewCommitPluginCodecV1() *CommitPluginCodecV1 { } func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.CommitPluginReport) ([]byte, error) { - merkleRoots := make([]ccip_encoding_utils.InternalMerkleRoot, 0, len(report.MerkleRoots)) - for _, root := range report.MerkleRoots { - merkleRoots = append(merkleRoots, ccip_encoding_utils.InternalMerkleRoot{ + isBlessed := make(map[cciptypes.ChainSelector]bool) + for _, root := range report.BlessedMerkleRoots { + isBlessed[root.ChainSel] = true + } + + blessedMerkleRoots := make([]ccip_encoding_utils.InternalMerkleRoot, 0, len(report.BlessedMerkleRoots)) + unblessedMerkleRoots := make([]ccip_encoding_utils.InternalMerkleRoot, 0, len(report.UnblessedMerkleRoots)) + for _, root := range append(report.BlessedMerkleRoots, report.UnblessedMerkleRoots...) { + imr := ccip_encoding_utils.InternalMerkleRoot{ SourceChainSelector: uint64(root.ChainSel), // TODO: abi-encoded address for EVM source, figure out what to do for non-EVM. OnRampAddress: common.LeftPadBytes(root.OnRampAddress, 32), MinSeqNr: uint64(root.SeqNumsRange.Start()), MaxSeqNr: uint64(root.SeqNumsRange.End()), MerkleRoot: root.MerkleRoot, - }) + } + if isBl, ok := isBlessed[root.ChainSel]; ok && isBl { + blessedMerkleRoots = append(blessedMerkleRoots, imr) + } else { + unblessedMerkleRoots = append(unblessedMerkleRoots, imr) + } } rmnSignatures := make([]ccip_encoding_utils.IRMNRemoteSignature, 0, len(report.RMNSignatures)) @@ -80,9 +91,10 @@ func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.Commi } commitReport := &ccip_encoding_utils.OffRampCommitReport{ - PriceUpdates: priceUpdates, - MerkleRoots: merkleRoots, - RmnSignatures: rmnSignatures, + PriceUpdates: priceUpdates, + BlessedMerkleRoots: blessedMerkleRoots, + UnblessedMerkleRoots: unblessedMerkleRoots, + RmnSignatures: rmnSignatures, } packed, err := ccipEncodingUtilsABI.Pack("exposeCommitReport", commitReport) @@ -109,9 +121,15 @@ func (c *CommitPluginCodecV1) Decode(ctx context.Context, bytes []byte) (cciptyp commitReport := *abi.ConvertType(unpacked[0], new(ccip_encoding_utils.OffRampCommitReport)).(*ccip_encoding_utils.OffRampCommitReport) - merkleRoots := make([]cciptypes.MerkleRootChain, 0, len(commitReport.MerkleRoots)) - for _, root := range commitReport.MerkleRoots { - merkleRoots = append(merkleRoots, cciptypes.MerkleRootChain{ + isBlessed := make(map[uint64]bool) + for _, root := range commitReport.BlessedMerkleRoots { + isBlessed[root.SourceChainSelector] = true + } + + blessedMerkleRoots := make([]cciptypes.MerkleRootChain, 0, len(commitReport.BlessedMerkleRoots)) + unblessedMerkleRoots := make([]cciptypes.MerkleRootChain, 0, len(commitReport.UnblessedMerkleRoots)) + for _, root := range append(commitReport.BlessedMerkleRoots, commitReport.UnblessedMerkleRoots...) { + mrc := cciptypes.MerkleRootChain{ ChainSel: cciptypes.ChainSelector(root.SourceChainSelector), OnRampAddress: root.OnRampAddress, SeqNumsRange: cciptypes.NewSeqNumRange( @@ -119,7 +137,12 @@ func (c *CommitPluginCodecV1) Decode(ctx context.Context, bytes []byte) (cciptyp cciptypes.SeqNum(root.MaxSeqNr), ), MerkleRoot: root.MerkleRoot, - }) + } + if isBlessed[root.SourceChainSelector] { + blessedMerkleRoots = append(blessedMerkleRoots, mrc) + } else { + unblessedMerkleRoots = append(unblessedMerkleRoots, mrc) + } } tokenPriceUpdates := make([]cciptypes.TokenPrice, 0, len(commitReport.PriceUpdates.TokenPriceUpdates)) @@ -147,7 +170,8 @@ func (c *CommitPluginCodecV1) Decode(ctx context.Context, bytes []byte) (cciptyp } return cciptypes.CommitPluginReport{ - MerkleRoots: merkleRoots, + BlessedMerkleRoots: blessedMerkleRoots, + UnblessedMerkleRoots: unblessedMerkleRoots, PriceUpdates: cciptypes.PriceUpdates{ TokenPriceUpdates: tokenPriceUpdates, GasPriceUpdates: gasPriceUpdates, diff --git a/core/capabilities/ccip/ccipevm/commitcodec_test.go b/core/capabilities/ccip/ccipevm/commitcodec_test.go index 10b0c47112c..32da5dcca81 100644 --- a/core/capabilities/ccip/ccipevm/commitcodec_test.go +++ b/core/capabilities/ccip/ccipevm/commitcodec_test.go @@ -17,7 +17,27 @@ import ( var randomCommitReport = func() cciptypes.CommitPluginReport { return cciptypes.CommitPluginReport{ - MerkleRoots: []cciptypes.MerkleRootChain{ + BlessedMerkleRoots: []cciptypes.MerkleRootChain{ + { + OnRampAddress: common.LeftPadBytes(utils.RandomAddress().Bytes(), 32), + ChainSel: cciptypes.ChainSelector(rand.Uint64()), + SeqNumsRange: cciptypes.NewSeqNumRange( + cciptypes.SeqNum(rand.Uint64()), + cciptypes.SeqNum(rand.Uint64()), + ), + MerkleRoot: utils.RandomBytes32(), + }, + { + OnRampAddress: common.LeftPadBytes(utils.RandomAddress().Bytes(), 32), + ChainSel: cciptypes.ChainSelector(rand.Uint64()), + SeqNumsRange: cciptypes.NewSeqNumRange( + cciptypes.SeqNum(rand.Uint64()), + cciptypes.SeqNum(rand.Uint64()), + ), + MerkleRoot: utils.RandomBytes32(), + }, + }, + UnblessedMerkleRoots: []cciptypes.MerkleRootChain{ { OnRampAddress: common.LeftPadBytes(utils.RandomAddress().Bytes(), 32), ChainSel: cciptypes.ChainSelector(rand.Uint64()), @@ -80,7 +100,8 @@ func TestCommitPluginCodecV1(t *testing.T) { { name: "empty merkle root", report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { - report.MerkleRoots[0].MerkleRoot = cciptypes.Bytes32{} + report.BlessedMerkleRoots[0].MerkleRoot = cciptypes.Bytes32{} + report.UnblessedMerkleRoots[0].MerkleRoot = cciptypes.Bytes32{} return report }, }, diff --git a/core/capabilities/ccip/ccipsolana/commitcodec.go b/core/capabilities/ccip/ccipsolana/commitcodec.go index fec5c62b949..a380b0524fc 100644 --- a/core/capabilities/ccip/ccipsolana/commitcodec.go +++ b/core/capabilities/ccip/ccipsolana/commitcodec.go @@ -3,6 +3,7 @@ package ccipsolana import ( "bytes" "context" + "errors" "fmt" "math/big" @@ -25,16 +26,19 @@ func NewCommitPluginCodecV1() *CommitPluginCodecV1 { func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.CommitPluginReport) ([]byte, error) { var buf bytes.Buffer encoder := agbinary.NewBorshEncoder(&buf) - if len(report.MerkleRoots) != 1 { - return nil, fmt.Errorf("unexpected merkle root length in report: %d", len(report.MerkleRoots)) + combinedRoots := report.BlessedMerkleRoots + combinedRoots = append(combinedRoots, report.UnblessedMerkleRoots...) + if len(combinedRoots) != 1 { + return nil, fmt.Errorf("unexpected merkle root length in report: %d", len(combinedRoots)) } + merkleRoot := combinedRoots[0] mr := ccip_offramp.MerkleRoot{ - SourceChainSelector: uint64(report.MerkleRoots[0].ChainSel), - OnRampAddress: report.MerkleRoots[0].OnRampAddress, - MinSeqNr: uint64(report.MerkleRoots[0].SeqNumsRange.Start()), - MaxSeqNr: uint64(report.MerkleRoots[0].SeqNumsRange.End()), - MerkleRoot: report.MerkleRoots[0].MerkleRoot, + SourceChainSelector: uint64(merkleRoot.ChainSel), + OnRampAddress: merkleRoot.OnRampAddress, + MinSeqNr: uint64(merkleRoot.SeqNumsRange.Start()), + MaxSeqNr: uint64(merkleRoot.SeqNumsRange.End()), + MerkleRoot: merkleRoot.MerkleRoot, } tpu := make([]ccip_offramp.TokenPriceUpdate, 0, len(report.PriceUpdates.TokenPriceUpdates)) @@ -72,6 +76,24 @@ func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.Commi }, } + switch len(report.RMNSignatures) { + case 0: + if report.UnblessedMerkleRoots == nil { + return nil, errors.New("No RMN signature included for the blessed root") + } + case 1: + if report.BlessedMerkleRoots == nil { + return nil, errors.New("RMN signature included without a blessed root") + } + // R part goes into leading 32 bytes, and S part goes into the trailing 32 bytes. + var rmnSig64Array [64]uint8 + copy(rmnSig64Array[:32], report.RMNSignatures[0].R[:]) + copy(rmnSig64Array[32:], report.RMNSignatures[0].S[:]) + commit.RmnSignatures = [][64]uint8{rmnSig64Array} + default: + return nil, fmt.Errorf("Multiple RMNSignatures in report: %d", len(report.RMNSignatures)) + } + err := commit.MarshalWithEncoder(encoder) if err != nil { return nil, err @@ -116,13 +138,33 @@ func (c *CommitPluginCodecV1) Decode(ctx context.Context, bytes []byte) (cciptyp }) } - return cciptypes.CommitPluginReport{ - MerkleRoots: merkleRoots, + commitPluginReport := cciptypes.CommitPluginReport{ PriceUpdates: cciptypes.PriceUpdates{ TokenPriceUpdates: tokenPriceUpdates, GasPriceUpdates: gasPriceUpdates, }, - }, nil + } + + if len(commitReport.RmnSignatures) == 0 { + commitPluginReport.UnblessedMerkleRoots = merkleRoots + } else { + commitPluginReport.BlessedMerkleRoots = merkleRoots + rmnSigs := make([]cciptypes.RMNECDSASignature, 0, len(commitReport.RmnSignatures)) + for _, sig := range commitReport.RmnSignatures { + // Leading 32 bytes are the R part, and trailing 32 bytes are the S part + var r [32]byte + copy(r[:], sig[:32]) + var s [32]byte + copy(s[:], sig[32:]) + rmnSigs = append(rmnSigs, cciptypes.RMNECDSASignature{ + R: r, + S: s, + }) + } + commitPluginReport.RMNSignatures = rmnSigs + } + + return commitPluginReport, nil } func encodeBigIntToFixedLengthLE(bi *big.Int, length int) []byte { diff --git a/core/capabilities/ccip/ccipsolana/commitcodec_test.go b/core/capabilities/ccip/ccipsolana/commitcodec_test.go index 18b2756efa3..56255862a53 100644 --- a/core/capabilities/ccip/ccipsolana/commitcodec_test.go +++ b/core/capabilities/ccip/ccipsolana/commitcodec_test.go @@ -16,17 +16,18 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) -var randomCommitReport = func() cciptypes.CommitPluginReport { +var randomBlessedCommitReport = func() cciptypes.CommitPluginReport { pubkey, err := solanago.NewRandomPrivateKey() if err != nil { panic(err) } return cciptypes.CommitPluginReport{ - MerkleRoots: []cciptypes.MerkleRootChain{ + BlessedMerkleRoots: []cciptypes.MerkleRootChain{ { OnRampAddress: cciptypes.UnknownAddress(pubkey.PublicKey().String()), ChainSel: cciptypes.ChainSelector(rand.Uint64()), @@ -50,6 +51,9 @@ var randomCommitReport = func() cciptypes.CommitPluginReport { {GasPrice: cciptypes.NewBigInt(big.NewInt(rand.Int63())), ChainSel: cciptypes.ChainSelector(rand.Uint64())}, }, }, + RMNSignatures: []cciptypes.RMNECDSASignature{ + {R: utils.RandomBytes32(), S: utils.RandomBytes32()}, + }, } } @@ -60,11 +64,37 @@ func TestCommitPluginCodecV1(t *testing.T) { expErr bool }{ { - name: "base report", + name: "base report blessed", + report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { + return report + }, + }, + { + name: "base report unblessed", report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { + report.RMNSignatures = nil + report.UnblessedMerkleRoots = report.BlessedMerkleRoots + report.BlessedMerkleRoots = nil return report }, }, + { + name: "blessed report with no rmn signatures", + report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { + report.RMNSignatures = nil + return report + }, + expErr: true, + }, + { + name: "rmn signature included without any blessed root", + report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { + report.UnblessedMerkleRoots = report.BlessedMerkleRoots + report.BlessedMerkleRoots = nil + return report + }, + expErr: true, + }, { name: "empty token address", report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { @@ -76,10 +106,19 @@ func TestCommitPluginCodecV1(t *testing.T) { { name: "empty merkle root", report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { - report.MerkleRoots[0].MerkleRoot = cciptypes.Bytes32{} + report.BlessedMerkleRoots[0].MerkleRoot = cciptypes.Bytes32{} return report }, }, + { + name: "both blessed and unblessed merkle roots", + report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { + report.UnblessedMerkleRoots = []cciptypes.MerkleRootChain{ + report.BlessedMerkleRoots[0]} + return report + }, + expErr: true, + }, { name: "zero token price", report: func(report cciptypes.CommitPluginReport) cciptypes.CommitPluginReport { @@ -106,7 +145,7 @@ func TestCommitPluginCodecV1(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - report := tc.report(randomCommitReport()) + report := tc.report(randomBlessedCommitReport()) commitCodec := NewCommitPluginCodecV1() ctx := testutils.Context(t) encodedReport, err := commitCodec.Encode(ctx, report) @@ -126,7 +165,7 @@ func BenchmarkCommitPluginCodecV1_Encode(b *testing.B) { commitCodec := NewCommitPluginCodecV1() ctx := testutils.Context(b) - rep := randomCommitReport() + rep := randomBlessedCommitReport() for i := 0; i < b.N; i++ { _, err := commitCodec.Encode(ctx, rep) require.NoError(b, err) @@ -136,7 +175,7 @@ func BenchmarkCommitPluginCodecV1_Encode(b *testing.B) { func BenchmarkCommitPluginCodecV1_Decode(b *testing.B) { commitCodec := NewCommitPluginCodecV1() ctx := testutils.Context(b) - encodedReport, err := commitCodec.Encode(ctx, randomCommitReport()) + encodedReport, err := commitCodec.Encode(ctx, randomBlessedCommitReport()) require.NoError(b, err) for i := 0; i < b.N; i++ { @@ -149,7 +188,7 @@ func BenchmarkCommitPluginCodecV1_Encode_Decode(b *testing.B) { commitCodec := NewCommitPluginCodecV1() ctx := testutils.Context(b) - rep := randomCommitReport() + rep := randomBlessedCommitReport() for i := 0; i < b.N; i++ { encodedReport, err := commitCodec.Encode(ctx, rep) require.NoError(b, err) @@ -207,7 +246,7 @@ func Test_DecodingCommitReport(t *testing.T) { commitCodec := NewCommitPluginCodecV1() decode, err := commitCodec.Decode(testutils.Context(t), buf.Bytes()) require.NoError(t, err) - mr := decode.MerkleRoots[0] + mr := decode.UnblessedMerkleRoots[0] // check decoded ocr report merkle root matches with on-chain report require.Equal(t, strconv.FormatUint(minSeqNr, 10), mr.SeqNumsRange.Start().String()) @@ -227,7 +266,7 @@ func Test_DecodingCommitReport(t *testing.T) { }) t.Run("decode Borsh encoded commit report", func(t *testing.T) { - rep := randomCommitReport() + rep := randomBlessedCommitReport() commitCodec := NewCommitPluginCodecV1() decode, err := commitCodec.Encode(testutils.Context(t), rep) require.NoError(t, err) @@ -237,7 +276,7 @@ func Test_DecodingCommitReport(t *testing.T) { err = decodedReport.UnmarshalWithDecoder(decoder) require.NoError(t, err) - reportMerkleRoot := rep.MerkleRoots[0] + reportMerkleRoot := rep.BlessedMerkleRoots[0] require.Equal(t, reportMerkleRoot.MerkleRoot, cciptypes.Bytes32(decodedReport.MerkleRoot.MerkleRoot)) tu := rep.PriceUpdates.TokenPriceUpdates[0] diff --git a/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go b/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go index 4e34b55cfcf..2b4d589656f 100644 --- a/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go +++ b/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go @@ -74,9 +74,10 @@ type InternalTokenPriceUpdate struct { } type OffRampCommitReport struct { - PriceUpdates InternalPriceUpdates - MerkleRoots []InternalMerkleRoot - RmnSignatures []IRMNRemoteSignature + PriceUpdates InternalPriceUpdates + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + RmnSignatures []IRMNRemoteSignature } type RMNRemoteReport struct { @@ -89,7 +90,7 @@ type RMNRemoteReport struct { } var EncodingUtilsMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"exposeCommitReport\",\"inputs\":[{\"name\":\"commitReport\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exposeOCR3Config\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Config[]\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exposeRmnReport\",\"inputs\":[{\"name\":\"rmnReportVersion\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rmnReport\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Report\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemoteContractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"offrampAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", + ABI: "[{\"type\":\"function\",\"name\":\"exposeCommitReport\",\"inputs\":[{\"name\":\"commitReport\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exposeOCR3Config\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Config[]\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exposeRmnReport\",\"inputs\":[{\"name\":\"rmnReportVersion\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rmnReport\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Report\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemoteContractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"offrampAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", } var EncodingUtilsABI = EncodingUtilsMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go b/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go index c711c654ca5..550e680e81e 100644 --- a/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go +++ b/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go @@ -87,21 +87,23 @@ type InternalTokenPriceUpdate struct { } type OffRampCommitReport struct { - PriceUpdates InternalPriceUpdates - MerkleRoots []InternalMerkleRoot - RmnSignatures []IRMNRemoteSignature + PriceUpdates InternalPriceUpdates + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + RmnSignatures []IRMNRemoteSignature } type OffRampSourceChainConfig struct { - Router common.Address - IsEnabled bool - MinSeqNr uint64 - OnRamp []byte + Router common.Address + IsEnabled bool + MinSeqNr uint64 + IsRMNVerificationDisabled bool + OnRamp []byte } var CCIPReaderTesterMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"emitCCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"emitCommitReportAccepted\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"emitExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getExpectedNextSequenceNumber\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDestChainSeqNr\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"testNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setLatestPriceSequenceNumber\",\"inputs\":[{\"name\":\"seqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sourceChainConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x608080604052346015576117e2908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081633f4b04aa14611503575080634bf7869714610f7457806369600bca14610f055780639041be3d14610e5657806393df286714610d97578063bfc9b789146107b9578063c1a5a3551461072b578063c7c1cba11461065b578063c9223625146105ca578063e83eabba1461029c5763e9d68a8e1461009857600080fd5b346102975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975767ffffffffffffffff6100d8611546565b6060806040516100e7816115c1565b60008152600060208201526000604082015201521660005260006020526040600020604051610115816115c1565b815473ffffffffffffffffffffffffffffffffffffffff811682526001602083019360ff8360a01c161515855267ffffffffffffffff604085019360a81c16835201926040519360009080549061016b82611782565b808852916001811690811561024057506001146101f0575b73ffffffffffffffffffffffffffffffffffffffff866101ec8967ffffffffffffffff89896101b4848b03856115dd565b6060860193845260405196879660208852511660208701525115156040860152511660608401525160808084015260a0830190611723565b0390f35b6000908152602081209092505b81831061022657505084016020018273ffffffffffffffffffffffffffffffffffffffff610183565b6001816020929493945483858b01015201910191906101fd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166020808a019190915292151560051b8801909201925084915073ffffffffffffffffffffffffffffffffffffffff9050610183565b600080fd5b346102975760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610297576102d3611546565b60243567ffffffffffffffff81116102975760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126102975760405161031d816115c1565b816004013573ffffffffffffffffffffffffffffffffffffffff8116810361029757815260248201358015158103610297576020820190815261036260448401611574565b6040830190815260648401359367ffffffffffffffff85116102975761039967ffffffffffffffff9160046001973692010161163f565b956060850196875216600052600060205273ffffffffffffffffffffffffffffffffffffffff60406000209351167fffffff00000000000000000000000000000000000000000000000000000000007cffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000086549551151560a01b16935160a81b169316171717815501905190815167ffffffffffffffff811161059b576104528254611782565b601f8111610553575b50602092601f82116001146104b757928192936000926104ac575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b015190508380610476565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169383600052806000209160005b86811061053b5750836001959610610504575b505050811b019055005b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558380806104fa565b919260206001819286850151815501940192016104e7565b826000526020600020601f830160051c81019160208410610591575b601f0160051c01905b818110610585575061045b565b60008155600101610578565b909150819061056f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102975760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610601611546565b60243567ffffffffffffffff81116102975767ffffffffffffffff6020809361062f839436906004016116cc565b939091166000526002825260406000208360405194859384378201908152030190205416604051908152f35b346102975760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610692611546565b61069a61155d565b9060843560048110156102975760a43567ffffffffffffffff81116102975761070a6106eb7f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b92369060040161163f565b6040519360643585526020850152608060408501526080840190611723565b9160c43560608201528067ffffffffffffffff8060443597169516930390a4005b346102975760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610762611546565b67ffffffffffffffff61077361155d565b9116600052600160205267ffffffffffffffff604060002091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600080f35b346102975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975760043567ffffffffffffffff81116102975760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261029757604051906060820182811067ffffffffffffffff82111761059b57604052806004013567ffffffffffffffff811161029757810160407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126102975760405190610893826115a5565b600481013567ffffffffffffffff81116102975760049082010136601f820112156102975780356108c3816116b4565b916108d160405193846115dd565b81835260208084019260061b8201019036821161029757602001915b818310610d58575050508252602481013567ffffffffffffffff811161029757600491010136601f82011215610297578035610928816116b4565b9161093660405193846115dd565b81835260208084019260061b8201019036821161029757602001915b818310610d195750505060208201528252602481013567ffffffffffffffff81116102975781019036602383011215610297576004820135610993816116b4565b926109a160405194856115dd565b818452602060048186019360051b83010101903682116102975760248101925b828410610c5857505050506020830191825260448101359067ffffffffffffffff8211610297570136602382011215610297576004810135610a02816116b4565b91610a1060405193846115dd565b818352602060048185019360061b830101019036821161029757602401915b818310610c2757505050604083015251905160405190604082016040835283518091526060830190602060608260051b8601019501916000905b828210610b8f57505050508183036020830152604083019080519160408552825180915260206060860193019060005b818110610b3957505050602001519260208183039101526020808451928381520193019060005b818110610aef577f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e484860385a1005b8251805167ffffffffffffffff1686526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168187015260409095019490920191600101610ac0565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168187015260409095019490920191600101610a99565b90919295602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0896001950301855289519067ffffffffffffffff8251168152608080610beb8585015160a08786015260a0850190611723565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff60608201511660608501520151910152980192019201909291610a69565b6040833603126102975760206040918251610c41816115a5565b853581528286013583820152815201920191610a2f565b833567ffffffffffffffff81116102975760049083010160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082360301126102975760405191610ca883611589565b610cb460208301611574565b835260408201359267ffffffffffffffff84116102975760a060209493610ce1869586369184010161163f565b85840152610cf160608201611574565b6040840152610d0260808201611574565b6060840152013560808201528152019301926109c1565b6040833603126102975760206040918251610d33816115a5565b610d3c86611574565b8152610d498387016116fa565b83820152815201920191610952565b6040833603126102975760206040918251610d72816115a5565b610d7b8661161e565b8152610d888387016116fa565b838201528152019201916108ed565b346102975760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610dce611546565b610dd661155d565b906044359067ffffffffffffffff821161029757602067ffffffffffffffff9291610e06849336906004016116cc565b9390911660005260028252604060002083604051948593843782019081520301902091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600080f35b346102975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975767ffffffffffffffff610e96611546565b166000526001602052600167ffffffffffffffff604060002054160167ffffffffffffffff8111610ed65760209067ffffffffffffffff60405191168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b346102975760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975767ffffffffffffffff610f45611546565b167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355600080f35b346102975760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029757610fab611546565b60243567ffffffffffffffff8111610297577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc813603016101a08112610297576040519061012082019082821067ffffffffffffffff83111761059b5760a091604052126102975760405161101f81611589565b8260040135815261103260248401611574565b602082015261104360448401611574565b604082015261105460648401611574565b606082015261106560848401611574565b6080820152815261107860a4830161161e565b926020820193845260c483013567ffffffffffffffff8111610297576110a4906004369186010161163f565b6040830190815260e484013567ffffffffffffffff8111610297576110cf906004369187010161163f565b936060840194855261010481013567ffffffffffffffff8111610297576110fc906004369184010161163f565b9460808501958652611111610124830161161e565b9560a0860196875260c0860191610144840135835260e087019361016481013585526101848101359067ffffffffffffffff821161029757019436602387011215610297576004860135611164816116b4565b9661117260405198896115dd565b81885260206004818a019360051b83010101903682116102975760248101925b8284106114115750505050610100880195865287516060015167ffffffffffffffff16996040519860208a5251805160208b0152602081015167ffffffffffffffff1660408b0152604081015167ffffffffffffffff1660608b0152606081015167ffffffffffffffff1660808b01526080015167ffffffffffffffff1660a08a01525173ffffffffffffffffffffffffffffffffffffffff1660c08901525160e088016101a090526101c0880161124991611723565b9051908781037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00161010089015261128091611723565b9051908681037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016101208801526112b791611723565b955173ffffffffffffffffffffffffffffffffffffffff16610140860152516101608501525161018084015251928281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016101a0840152835180825260208201918160051b810160200195602001926000915b838310611367578867ffffffffffffffff87167f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32898b038aa3005b9091929396602080611402837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528b519073ffffffffffffffffffffffffffffffffffffffff825116815260806113e76113d58685015160a08886015260a0850190611723565b60408501518482036040860152611723565b92606081015160608401520151906080818403910152611723565b9901930193019193929061132c565b833567ffffffffffffffff81116102975760049083010160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08236030112610297576040519161146183611589565b61146d6020830161161e565b8352604082013567ffffffffffffffff811161029757611493906020369185010161163f565b6020840152606082013567ffffffffffffffff8111610297576114bc906020369185010161163f565b60408401526080820135606084015260a08201359267ffffffffffffffff8411610297576114f3602094938580953692010161163f565b6080820152815201930192611192565b346102975760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102975760209067ffffffffffffffff600354168152f35b6004359067ffffffffffffffff8216820361029757565b6024359067ffffffffffffffff8216820361029757565b359067ffffffffffffffff8216820361029757565b60a0810190811067ffffffffffffffff82111761059b57604052565b6040810190811067ffffffffffffffff82111761059b57604052565b6080810190811067ffffffffffffffff82111761059b57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761059b57604052565b359073ffffffffffffffffffffffffffffffffffffffff8216820361029757565b81601f820112156102975780359067ffffffffffffffff821161059b576040519261169260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601856115dd565b8284526020838301011161029757816000926020809301838601378301015290565b67ffffffffffffffff811161059b5760051b60200190565b9181601f840112156102975782359167ffffffffffffffff8311610297576020838186019501011161029757565b35907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361029757565b919082519283825260005b84811061176d5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161172e565b90600182811c921680156117cb575b602083101461179c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161179156fea164736f6c634300081a000a", + ABI: "[{\"type\":\"function\",\"name\":\"emitCCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"emitCommitReportAccepted\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"emitExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getExpectedNextSequenceNumber\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDestChainSeqNr\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"testNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setLatestPriceSequenceNumber\",\"inputs\":[{\"name\":\"seqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sourceChainConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60808060405234601557611883908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816319c979a414610fc3575080633f4b04aa14610f7d5780634bf78697146109ee57806369600bca1461097f5780639041be3d146108d057806393df286714610811578063b4cb273b14610487578063c1a5a355146103f9578063c7c1cba114610329578063c9223625146102985763e9d68a8e1461009857600080fd5b346102935760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102935767ffffffffffffffff6100d86114ff565b606060806040516100e881611440565b6000815260006020820152600060408201526000838201520152166000526000602052604060002060405161011c81611440565b815473ffffffffffffffffffffffffffffffffffffffff81168252602082019260ff8260a01c16151584526001604084019167ffffffffffffffff8460a81c16835260ff606086019460e81c161515845201936040519460009080549061018282611823565b808952916001811690811561024e5750600114610210575b73ffffffffffffffffffffffffffffffffffffffff8761020c8a8967ffffffffffffffff8a8a6101cc858c038661145c565b60808701948552604051978897602089525116602088015251151560408701525116606085015251151560808401525160a08084015260c08301906116fe565b0390f35b6000908152602081209092505b81831061023457505085016020018261020c61019a565b6001816020929493945483858c010152019101919061021d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166020808b019190915292151560051b8901909201925084915061020c905061019a565b600080fd5b346102935760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576102cf6114ff565b60243567ffffffffffffffff81116102935767ffffffffffffffff602080936102fd839436906004016116c3565b939091166000526002825260406000208360405194859384378201908152030190205416604051908152f35b346102935760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576103606114ff565b610368611516565b9060843560048110156102935760a43567ffffffffffffffff8111610293576103d86103b97f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b923690600401611542565b60405193606435855260208501526080604085015260808401906116fe565b9160c43560608201528067ffffffffffffffff8060443597169516930390a4005b346102935760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576104306114ff565b67ffffffffffffffff610441611516565b9116600052600160205267ffffffffffffffff604060002091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600080f35b346102935760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576104be6114ff565b60243567ffffffffffffffff81116102935760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126102935760405161050881611440565b816004013573ffffffffffffffffffffffffffffffffffffffff81168103610293578152610538602483016116f1565b6020820190815261054b6044840161152d565b6040830190815261055e606485016116f1565b906060840191825260848501359467ffffffffffffffff86116102935761059667ffffffffffffffff91600460019836920101611542565b96608086019788521660005260006020527fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff60406000209551167fffffff00000000000000000000000000000000000000000000000000000000007dff00000000000000000000000000000000000000000000000000000000007cffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000089549851151560a01b16955160a81b169551151560e81b1695161716171717815501905190815167ffffffffffffffff81116107e2576106998254611823565b601f811161079a575b50602092601f82116001146106fe57928192936000926106f3575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0151905083806106bd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169383600052806000209160005b868110610782575083600195961061074b575b505050811b019055005b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055838080610741565b9192602060018192868501518155019401920161072e565b826000526020600020601f830160051c810191602084106107d8575b601f0160051c01905b8181106107cc57506106a2565b600081556001016107bf565b90915081906107b6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102935760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576108486114ff565b610850611516565b906044359067ffffffffffffffff821161029357602067ffffffffffffffff9291610880849336906004016116c3565b9390911660005260028252604060002083604051948593843782019081520301902091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600080f35b346102935760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102935767ffffffffffffffff6109106114ff565b166000526001602052600167ffffffffffffffff604060002054160167ffffffffffffffff81116109505760209067ffffffffffffffff60405191168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b346102935760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102935767ffffffffffffffff6109bf6114ff565b167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355600080f35b346102935760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029357610a256114ff565b60243567ffffffffffffffff8111610293577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc813603016101a08112610293576040519061012082019082821067ffffffffffffffff8311176107e25760a0916040521261029357604051610a9981611440565b82600401358152610aac6024840161152d565b6020820152610abd6044840161152d565b6040820152610ace6064840161152d565b6060820152610adf6084840161152d565b60808201528152610af260a483016114b5565b926020820193845260c483013567ffffffffffffffff811161029357610b1e9060043691860101611542565b6040830190815260e484013567ffffffffffffffff811161029357610b499060043691870101611542565b936060840194855261010481013567ffffffffffffffff811161029357610b769060043691840101611542565b9460808501958652610b8b61012483016114b5565b9560a0860196875260c0860191610144840135835260e087019361016481013585526101848101359067ffffffffffffffff821161029357019436602387011215610293576004860135610bde8161149d565b96610bec604051988961145c565b81885260206004818a019360051b83010101903682116102935760248101925b828410610e8b5750505050610100880195865287516060015167ffffffffffffffff16996040519860208a5251805160208b0152602081015167ffffffffffffffff1660408b0152604081015167ffffffffffffffff1660608b0152606081015167ffffffffffffffff1660808b01526080015167ffffffffffffffff1660a08a01525173ffffffffffffffffffffffffffffffffffffffff1660c08901525160e088016101a090526101c08801610cc3916116fe565b9051908781037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610100890152610cfa916116fe565b9051908681037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610120880152610d31916116fe565b955173ffffffffffffffffffffffffffffffffffffffff16610140860152516101608501525161018084015251928281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016101a0840152835180825260208201918160051b810160200195602001926000915b838310610de1578867ffffffffffffffff87167f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32898b038aa3005b9091929396602080610e7c837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528b519073ffffffffffffffffffffffffffffffffffffffff82511681526080610e61610e4f8685015160a08886015260a08501906116fe565b604085015184820360408601526116fe565b926060810151606084015201519060808184039101526116fe565b99019301930191939290610da6565b833567ffffffffffffffff81116102935760049083010160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082360301126102935760405191610edb83611440565b610ee7602083016114b5565b8352604082013567ffffffffffffffff811161029357610f0d9060203691850101611542565b6020840152606082013567ffffffffffffffff811161029357610f369060203691850101611542565b60408401526080820135606084015260a08201359267ffffffffffffffff841161029357610f6d6020949385809536920101611542565b6080820152815201930192610c0c565b346102935760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029357602067ffffffffffffffff60035416604051908152f35b346102935760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102935760043567ffffffffffffffff81116102935760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610293576080820182811067ffffffffffffffff8211176107e257604052806004013567ffffffffffffffff811161029357810160407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610293576040519061109982611424565b600481013567ffffffffffffffff81116102935760049082010136601f820112156102935780356110c98161149d565b916110d7604051938461145c565b81835260208084019260061b8201019036821161029357602001915b8183106113e5575050508252602481013567ffffffffffffffff811161029357600491010136601f8201121561029357803561112e8161149d565b9161113c604051938461145c565b81835260208084019260061b8201019036821161029357602001915b8183106113a65750505060208201528252602481013567ffffffffffffffff81116102935761118d90600436918401016115b7565b60208301908152604482013567ffffffffffffffff8111610293576111b890600436918501016115b7565b916040840192835260648101359067ffffffffffffffff82116102935701366023820112156102935760048101356111ef8161149d565b916111fd604051938461145c565b818352602060048185019360061b830101019036821161029357602401915b818310611375575050509061125991606085015251915192519261124b6040519360608552606085019061175d565b90838203602085015261175d565b918183036040830152604083019080519160408552825180915260206060860193019060005b81811061131f57505050602001519260208183039101526020808451928381520193019060005b8181106112d5577fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e4784860385a1005b8251805167ffffffffffffffff1686526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681870152604090950194909201916001016112a6565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16818701526040909501949092019160010161127f565b604083360312610293576020604091825161138f81611424565b85358152828601358382015281520192019161121c565b60408336031261029357602060409182516113c081611424565b6113c98661152d565b81526113d68387016114d6565b83820152815201920191611158565b60408336031261029357602060409182516113ff81611424565b611408866114b5565b81526114158387016114d6565b838201528152019201916110f3565b6040810190811067ffffffffffffffff8211176107e257604052565b60a0810190811067ffffffffffffffff8211176107e257604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176107e257604052565b67ffffffffffffffff81116107e25760051b60200190565b359073ffffffffffffffffffffffffffffffffffffffff8216820361029357565b35907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361029357565b6004359067ffffffffffffffff8216820361029357565b6024359067ffffffffffffffff8216820361029357565b359067ffffffffffffffff8216820361029357565b81601f820112156102935780359067ffffffffffffffff82116107e2576040519261159560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116018561145c565b8284526020838301011161029357816000926020809301838601378301015290565b81601f82011215610293578035906115ce8261149d565b926115dc604051948561145c565b82845260208085019360051b830101918183116102935760208101935b83851061160857505050505090565b843567ffffffffffffffff811161029357820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08286030112610293576040519161165483611440565b6116606020830161152d565b835260408201359267ffffffffffffffff84116102935760a08361168b886020809881980101611542565b8584015261169b6060820161152d565b60408401526116ac6080820161152d565b6060840152013560808201528152019401936115f9565b9181601f840112156102935782359167ffffffffffffffff8311610293576020838186019501011161029357565b3590811515820361029357565b919082519283825260005b8481106117485750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611709565b9080602083519182815201916020808360051b8301019401926000915b83831061178957505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865288519067ffffffffffffffff82511681526080806117e68585015160a08786015260a08501906116fe565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff606082015116606085015201519101529701930193019193929061177a565b90600182811c9216801561186c575b602083101461183d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161183256fea164736f6c634300081a000a", } var CCIPReaderTesterABI = CCIPReaderTesterMetaData.ABI @@ -610,9 +612,10 @@ func (it *CCIPReaderTesterCommitReportAcceptedIterator) Close() error { } type CCIPReaderTesterCommitReportAccepted struct { - MerkleRoots []InternalMerkleRoot - PriceUpdates InternalPriceUpdates - Raw types.Log + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + PriceUpdates InternalPriceUpdates + Raw types.Log } func (_CCIPReaderTester *CCIPReaderTesterFilterer) FilterCommitReportAccepted(opts *bind.FilterOpts) (*CCIPReaderTesterCommitReportAcceptedIterator, error) { @@ -835,7 +838,7 @@ func (CCIPReaderTesterCCIPMessageSent) Topic() common.Hash { } func (CCIPReaderTesterCommitReportAccepted) Topic() common.Hash { - return common.HexToHash("0x35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e4") + return common.HexToHash("0xb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47") } func (CCIPReaderTesterExecutionStateChanged) Topic() common.Hash { diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go index ce962f71ede..d6a6119fa7d 100644 --- a/core/gethwrappers/ccip/generated/offramp/offramp.go +++ b/core/gethwrappers/ccip/generated/offramp/offramp.go @@ -124,7 +124,6 @@ type MultiOCR3BaseOCRConfigArgs struct { type OffRampDynamicConfig struct { FeeQuoter common.Address PermissionLessExecutionThresholdSeconds uint32 - IsRMNVerificationDisabled bool MessageInterceptor common.Address } @@ -134,17 +133,19 @@ type OffRampGasLimitOverride struct { } type OffRampSourceChainConfig struct { - Router common.Address - IsEnabled bool - MinSeqNr uint64 - OnRamp []byte + Router common.Address + IsEnabled bool + MinSeqNr uint64 + IsRMNVerificationDisabled bool + OnRamp []byte } type OffRampSourceChainConfigArgs struct { - Router common.Address - SourceChainSelector uint64 - IsEnabled bool - OnRamp []byte + Router common.Address + SourceChainSelector uint64 + IsEnabled bool + IsRMNVerificationDisabled bool + OnRamp []byte } type OffRampStaticConfig struct { @@ -156,8 +157,8 @@ type OffRampStaticConfig struct { } var OffRampMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applySourceChainConfigUpdates\",\"inputs\":[{\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"commit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"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\":\"execute\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeSingleMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllSourceChainConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExecutionState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMerkleRoot\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyExecute\",\"inputs\":[{\"name\":\"reports\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\",\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"components\":[{\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AlreadyAttempted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RootRemoved\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedAlreadyExecutedMessage\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedReportExecution\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainConfigSet\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sourceConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainSelectorAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaticConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CommitOnRampMismatch\",\"inputs\":[{\"name\":\"reportOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"configOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"EmptyBatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyReport\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientGasToCompleteTx\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"InvalidDataLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInterval\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"min\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"max\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionGasLimit\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"newLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionTokenGasOverride\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"oldLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverride\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageDestChainSelector\",\"inputs\":[{\"name\":\"messageDestChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNewState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newState\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}]},{\"type\":\"error\",\"name\":\"InvalidOnRampUpdate\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionGasAmountCountMismatch\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ManualExecutionGasLimitMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionNotYetEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotACompatiblePool\",\"inputs\":[{\"name\":\"notPool\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReceiverError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReleaseOrMintBalanceMismatch\",\"inputs\":[{\"name\":\"amountReleased\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePre\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePost\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RootAlreadyCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"RootNotCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SourceChainNotEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SourceChainSelectorMismatch\",\"inputs\":[{\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"StaleCommitReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"TokenDataMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"TokenHandlingError\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedTokenData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", - Bin: "0x610140806040523461084857616483803803809161001d828561087e565b833981019080820361014081126108485760a08112610848576040519060a082016001600160401b0381118382101761084d5760405261005c836108a1565b825260208301519261ffff84168403610848576020830193845260408101516001600160a01b0381168103610848576040840190815261009e606083016108b5565b946060850195865260806100b38185016108b5565b86820190815294609f19011261084857604051946100d086610863565b6100dc60a085016108b5565b865260c08401519463ffffffff86168603610848576020870195865261010460e086016108c9565b976040880198895261011961010087016108b5565b6060890190815261012087015190966001600160401b03821161084857018a601f820112156108485780519a6001600160401b038c1161084d578b60051b916020806040519e8f9061016d8388018361087e565b81520193820101908282116108485760208101935b828510610748575050505050331561073757600180546001600160a01b031916331790554660805284516001600160a01b0316158015610725575b8015610713575b6106f15782516001600160401b0316156107025782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a182516001600160a01b0316156106f1579151600480548351865160ff60c01b90151560c01b1663ffffffff60a01b60a09290921b919091166001600160a01b039485166001600160c81b0319909316831717179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff166020820152935115159184019190915290511660608201527fcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee90608090a160005b815181101561066b576020600582901b8301810151908101516001600160401b031690600090821561065c5780516001600160a01b03161561064d57828252600860205260408220906060810151600183019361038585546108d6565b6105ee578354600160a81b600160e81b031916600160a81b1784556040518681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b815180159081156105c3575b506105b4578151916001600160401b0383116105a0576103f986546108d6565b601f811161055b575b50602091601f84116001146104e257926001989796949281926000805160206164638339815191529795926104d7575b5050600019600383901b1c191690881b1783555b60408101518254915160a089811b8a9003801960ff60a01b1990951693151590911b60ff60a01b169290921792909216911617815561048484610993565b506104ce6040519283926020845254888060a01b038116602085015260ff8160a01c1615156040850152888060401b039060a81c16606084015260808084015260a0830190610910565b0390a201610328565b015190503880610432565b9190601f198416878452828420935b8181106105435750926001999897959392859260008051602061646383398151915298968c951061052a575b505050811b018355610446565b015160001960f88460031b161c1916905538808061051d565b929360206001819287860151815501950193016104f1565b86835260208320601f850160051c81019160208610610596575b601f0160051c01905b81811061058b5750610402565b83815560010161057e565b9091508190610575565b634e487b7160e01b82526041600452602482fd5b6342bcdf7f60e11b8152600490fd5b905060208301206040516020810190838252602081526105e460408261087e565b51902014386103d9565b835460a81c6001600160401b0316600114158061061f575b156103cd57632105803760e11b81526004869052602490fd5b50604051610638816106318189610910565b038261087e565b60208151910120825160208401201415610606565b6342bcdf7f60e11b8252600482fd5b63c656089560e01b8252600482fd5b604051615a3c9081610a27823960805181613699015260a05181818161047001526141f7015260c0518181816104c601528181612cc70152818161311b0152614191015260e0518181816104f501526149dc01526101005181818161052401526145c20152610120518181816104970152818161244101528181614acf01526157710152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101c4565b5080516001600160a01b0316156101bd565b639b15e16f60e01b60005260046000fd5b84516001600160401b0381116108485782016080818603601f190112610848576040519061077582610863565b60208101516001600160a01b0381168103610848578252610798604082016108a1565b60208301526107a9606082016108c9565b604083015260808101516001600160401b03811161084857602091010185601f820112156108485780516001600160401b03811161084d57604051916107f9601f8301601f19166020018461087e565b81835287602083830101116108485760005b8281106108335750509181600060208096949581960101526060820152815201940193610182565b8060208092840101518282870101520161080b565b600080fd5b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b0382111761084d57604052565b601f909101601f19168101906001600160401b0382119082101761084d57604052565b51906001600160401b038216820361084857565b51906001600160a01b038216820361084857565b5190811515820361084857565b90600182811c92168015610906575b60208310146108f057565b634e487b7160e01b600052602260045260246000fd5b91607f16916108e5565b60009291815491610920836108d6565b8083529260018116908115610976575060011461093c57505050565b60009081526020812093945091925b83831061095c575060209250010190565b60018160209294939454838587010152019101919061094b565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a20576006546801000000000000000081101561084d576001810180600655811015610a0a577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806304666f9c1461015757806306285c6914610152578063181f5a771461014d5780633f4b04aa146101485780635215505b146101435780635e36480c1461013e5780635e7bb0081461013957806360987c20146101345780637437ff9f1461012f57806379ba50971461012a5780637edf52f41461012557806385572ffb146101205780638da5cb5b1461011b578063c673e58414610116578063ccd37ba314610111578063de5e0b9a1461010c578063e9d68a8e14610107578063f2fde38b14610102578063f58e03fc146100fd5763f716f99f146100f857600080fd5b6118b6565b611799565b61170e565b611673565b6115d7565b611553565b6114a8565b6113c0565b61138a565b6111c4565b611144565b61109b565b611020565b610e1b565b6108b0565b61076b565b61065e565b6105ff565b61043d565b61031f565b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b0382111761018d57604052565b61015c565b60a081019081106001600160401b0382111761018d57604052565b604081019081106001600160401b0382111761018d57604052565b606081019081106001600160401b0382111761018d57604052565b90601f801991011681019081106001600160401b0382111761018d57604052565b6040519061021360c0836101e3565b565b6040519061021360a0836101e3565b60405190610213610100836101e3565b604051906102136040836101e3565b6001600160401b03811161018d5760051b60200190565b6001600160a01b0381160361026b57565b600080fd5b600435906001600160401b038216820361026b57565b35906001600160401b038216820361026b57565b8015150361026b57565b35906102138261029a565b6001600160401b03811161018d57601f01601f191660200190565b9291926102d6826102af565b916102e460405193846101e3565b82948184528183011161026b578281602093846000960137010152565b9080601f8301121561026b5781602061031c933591016102ca565b90565b3461026b57602036600319011261026b576004356001600160401b03811161026b573660238201121561026b5780600401359061035b82610243565b9061036960405192836101e3565b8282526024602083019360051b8201019036821161026b5760248101935b82851061039957610397846119f1565b005b84356001600160401b03811161026b5782016080602319823603011261026b57604051916103c683610172565b60248201356103d48161025a565b83526103e260448301610286565b602084015260648201356103f58161029a565b60408401526084820135926001600160401b03841161026b57610422602094936024869536920101610301565b6060820152815201940193610387565b600091031261026b57565b3461026b57600036600319011261026b57610456611c9d565b5061059e60405161046681610192565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b604051906105b16020836101e3565b60008252565b60005b8381106105ca5750506000910152565b81810151838201526020016105ba565b906020916105f3815180928185528580860191016105b7565b601f01601f1916010190565b3461026b57600036600319011261026b5761059e604080519061062281836101e3565b601182527f4f666652616d7020312e362e302d6465760000000000000000000000000000006020830152519182916020835260208301906105da565b3461026b57600036600319011261026b5760206001600160401b03600b5416604051908152f35b906080606061031c936001600160a01b0381511684526020810151151560208501526001600160401b03604082015116604085015201519181606082015201906105da565b6040810160408252825180915260206060830193019060005b81811061074c575050506020818303910152815180825260208201916020808360051b8301019401926000915b83831061071f57505050505090565b909192939460208061073d600193601f198682030187528951610685565b97019301930191939290610710565b82516001600160401b03168552602094850194909201916001016106e3565b3461026b57600036600319011261026b5760065461078881610243565b9061079660405192836101e3565b808252601f196107a582610243565b0160005b8181106108675750506107bb81611cef565b9060005b8181106107d757505061059e604051928392836106ca565b8061080d6107f56107e9600194614078565b6001600160401b031690565b6107ff8387611d49565b906001600160401b03169052565b61084b61084661082d6108208488611d49565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611e35565b6108558287611d49565b526108608186611d49565b50016107bf565b602090610872611cc8565b828287010152016107a9565b634e487b7160e01b600052602160045260246000fd5b6004111561089e57565b61087e565b90600482101561089e5752565b3461026b57604036600319011261026b576108c9610270565b602435906001600160401b038216820361026b576020916108e991611ed1565b6108f660405180926108a3565bf35b91908260a091031261026b5760405161091081610192565b60806109558183958035855261092860208201610286565b602086015261093960408201610286565b604086015261094a60608201610286565b606086015201610286565b910152565b35906102138261025a565b63ffffffff81160361026b57565b359061021382610965565b81601f8201121561026b5780359061099582610243565b926109a360405194856101e3565b82845260208085019360051b8301019181831161026b5760208101935b8385106109cf57505050505090565b84356001600160401b03811161026b57820160a0818503601f19011261026b57604051916109fc83610192565b60208201356001600160401b03811161026b57856020610a1e92850101610301565b83526040820135610a2e8161025a565b6020840152610a3f60608301610973565b60408401526080820135926001600160401b03841161026b5760a083610a6c886020809881980101610301565b6060840152013560808201528152019401936109c0565b9190916101408184031261026b57610a99610204565b92610aa481836108f8565b845260a08201356001600160401b03811161026b5781610ac5918401610301565b602085015260c08201356001600160401b03811161026b5781610ae9918401610301565b6040850152610afa60e0830161095a565b606085015261010082013560808501526101208201356001600160401b03811161026b57610b28920161097e565b60a0830152565b9080601f8301121561026b578135610b4681610243565b92610b5460405194856101e3565b81845260208085019260051b8201019183831161026b5760208201905b838210610b8057505050505090565b81356001600160401b03811161026b57602091610ba287848094880101610a83565b815201910190610b71565b81601f8201121561026b57803590610bc482610243565b92610bd260405194856101e3565b82845260208085019360051b8301019181831161026b5760208101935b838510610bfe57505050505090565b84356001600160401b03811161026b57820183603f8201121561026b576020810135610c2981610243565b91610c3760405193846101e3565b8183526020808085019360051b830101019186831161026b5760408201905b838210610c70575050509082525060209485019401610bef565b81356001600160401b03811161026b57602091610c948a8480809589010101610301565b815201910190610c56565b929190610cab81610243565b93610cb960405195866101e3565b602085838152019160051b810192831161026b57905b828210610cdb57505050565b8135815260209182019101610ccf565b9080601f8301121561026b5781602061031c93359101610c9f565b81601f8201121561026b57803590610d1d82610243565b92610d2b60405194856101e3565b82845260208085019360051b8301019181831161026b5760208101935b838510610d5757505050505090565b84356001600160401b03811161026b57820160a0818503601f19011261026b57610d7f610215565b91610d8c60208301610286565b835260408201356001600160401b03811161026b57856020610db092850101610b2f565b602084015260608201356001600160401b03811161026b57856020610dd792850101610bad565b60408401526080820135926001600160401b03841161026b5760a083610e04886020809881980101610ceb565b606084015201356080820152815201940193610d48565b3461026b57604036600319011261026b576004356001600160401b03811161026b57610e4b903690600401610d06565b6024356001600160401b03811161026b573660238201121561026b57806004013591610e7683610243565b91610e8460405193846101e3565b8383526024602084019460051b8201019036821161026b5760248101945b828610610eb3576103978585611f19565b85356001600160401b03811161026b5782013660438201121561026b576024810135610ede81610243565b91610eec60405193846101e3565b818352602060248185019360051b830101019036821161026b5760448101925b828410610f26575050509082525060209586019501610ea2565b83356001600160401b03811161026b576024908301016040601f19823603011261026b5760405190610f57826101ad565b6020810135825260408101356001600160401b03811161026b57602091010136601f8201121561026b57803590610f8d82610243565b91610f9b60405193846101e3565b80835260208084019160051b8301019136831161026b57602001905b828210610fd65750505091816020938480940152815201930192610f0c565b602080918335610fe581610965565b815201910190610fb7565b9181601f8401121561026b578235916001600160401b03831161026b576020808501948460051b01011161026b57565b3461026b57606036600319011261026b576004356001600160401b03811161026b57611050903690600401610a83565b6024356001600160401b03811161026b5761106f903690600401610ff0565b91604435926001600160401b03841161026b57611093610397943690600401610ff0565b939092612325565b3461026b57600036600319011261026b576110b46125f2565b5061059e6040516110c481610172565b60ff6004546001600160a01b038116835263ffffffff8160a01c16602084015260c01c16151560408201526001600160a01b036005541660608201526040519182918291909160606001600160a01b0381608084019582815116855263ffffffff6020820151166020860152604081015115156040860152015116910152565b3461026b57600036600319011261026b576000546001600160a01b03811633036111b3576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b3461026b57608036600319011261026b5760006040516111e381610172565b6004356111ef8161025a565b81526024356111fd81610965565b602082015260443561120e8161029a565b604082015260643561121f8161025a565b606082015261122c613496565b6001600160a01b038151161561137b576113758161128b6001600160a01b037fcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee9451166001600160a01b03166001600160a01b03196004541617600455565b60208101516004547fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff77ffffffff000000000000000000000000000000000000000078ff0000000000000000000000000000000000000000000000006040860151151560c01b169360a01b169116171760045561133161131560608301516001600160a01b031690565b6001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160606001600160a01b0381608084019582815116855263ffffffff6020820151166020860152604081015115156040860152015116910152565b0390a180f35b6342bcdf7f60e11b8252600482fd5b3461026b57602036600319011261026b576004356001600160401b03811161026b5760a090600319903603011261026b57600080fd5b3461026b57600036600319011261026b5760206001600160a01b0360015416604051908152f35b6004359060ff8216820361026b57565b359060ff8216820361026b57565b906020808351928381520192019060005b8181106114235750505090565b82516001600160a01b0316845260209384019390920191600101611416565b9061031c9160208152606082518051602084015260ff602082015116604084015260ff604082015116828401520151151560808201526040611493602084015160c060a085015260e0840190611405565b9201519060c0601f1982850301910152611405565b3461026b57602036600319011261026b5760ff6114c36113e7565b6060604080516114d2816101c8565b6114da6125f2565b8152826020820152015216600052600260205261059e6040600020600361154260405192611507846101c8565b61151081612617565b845260405161152d816115268160028601612650565b03826101e3565b60208501526115266040518094819301612650565b604082015260405191829182611442565b3461026b57604036600319011261026b5761156c610270565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b9060049160441161026b57565b9181601f8401121561026b578235916001600160401b03831161026b576020838186019501011161026b57565b3461026b5760c036600319011261026b576115f13661159d565b6044356001600160401b03811161026b576116109036906004016115aa565b6064929192356001600160401b03811161026b57611632903690600401610ff0565b60843594916001600160401b03861161026b57611656610397963690600401610ff0565b94909360a43596612c82565b90602061031c928181520190610685565b3461026b57602036600319011261026b576001600160401b03611694610270565b61169c611cc8565b5016600052600860205261059e604060002060016116fd604051926116c084610172565b6001600160401b0381546001600160a01b038116865260ff8160a01c161515602087015260a81c1660408501526115266040518094819301611d97565b606082015260405191829182611662565b3461026b57602036600319011261026b576001600160a01b036004356117338161025a565b61173b613496565b1633811461178857806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b3461026b57606036600319011261026b576117b33661159d565b6044356001600160401b03811161026b576117d29036906004016115aa565b9182820160208382031261026b578235906001600160401b03821161026b576117fc918401610d06565b60405190602061180c81846101e3565b60008352601f19810160005b818110611840575050506103979491611830916136da565b611838613191565b928392613a40565b60608582018401528201611818565b9080601f8301121561026b57813561186681610243565b9261187460405194856101e3565b81845260208085019260051b82010192831161026b57602001905b82821061189c5750505090565b6020809183356118ab8161025a565b81520191019061188f565b3461026b57602036600319011261026b576004356001600160401b03811161026b573660238201121561026b578060040135906118f282610243565b9061190060405192836101e3565b8282526024602083019360051b8201019036821161026b5760248101935b82851061192e57610397846131ad565b84356001600160401b03811161026b57820160c0602319823603011261026b57611956610204565b916024820135835261196a604483016113f7565b602084015261197b606483016113f7565b604084015261198c608483016102a4565b606084015260a48201356001600160401b03811161026b576119b4906024369185010161184f565b608084015260c4820135926001600160401b03841161026b576119e160209493602486953692010161184f565b60a082015281520194019361191e565b6119f9613496565b60005b8151811015611c9957611a0f8183611d49565b5190611a2560208301516001600160401b031690565b916001600160401b038316908115611c8857611a5a611a4e611a4e83516001600160a01b031690565b6001600160a01b031690565b15611bef57611a7c846001600160401b03166000526008602052604060002090565b906060810151916001810195611a928754611d5d565b611c1657611b057ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb991611aeb84750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b82518015908115611c00575b50611bef57611bd0611bb4611be693611b517f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b9660019a613538565b611ba7611b616040830151151590565b85547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178555565b516001600160a01b031690565b82906001600160a01b03166001600160a01b0319825416179055565b611bd9846150a8565b5060405191829182613609565b0390a2016119fc565b6342bcdf7f60e11b60005260046000fd5b90506020840120611c0f6134bb565b1438611b15565b60016001600160401b03611c3584546001600160401b039060a81c1690565b16141580611c69575b611c485750611b09565b632105803760e11b6000526001600160401b031660045260246000fd5b6000fd5b50611c7387611e1a565b60208151910120845160208601201415611c3e565b63c656089560e01b60005260046000fd5b5050565b60405190611caa82610192565b60006080838281528260208201528260408201528260608201520152565b60405190611cd582610172565b606080836000815260006020820152600060408201520152565b90611cf982610243565b611d0660405191826101e3565b8281528092611d17601f1991610243565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611d445760200190565b611d21565b8051821015611d445760209160051b010190565b90600182811c92168015611d8d575b6020831014611d7757565b634e487b7160e01b600052602260045260246000fd5b91607f1691611d6c565b60009291815491611da783611d5d565b8083529260018116908115611dfd5750600114611dc357505050565b60009081526020812093945091925b838310611de3575060209250010190565b600181602092949394548385870101520191019190611dd2565b915050602093945060ff929192191683830152151560051b010190565b90610213611e2e9260405193848092611d97565b03836101e3565b9060016060604051611e4681610172565b611e8f81956001600160401b0381546001600160a01b038116855260ff8160a01c161515602086015260a81c166040840152611e886040518096819301611d97565b03846101e3565b0152565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611ebf57565b611e93565b91908203918211611ebf57565b611edd82607f92613653565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611ebf576003911c16600481101561089e5790565b611f21613697565b8051825181036121185760005b818110611f4157505090610213916136da565b611f4b8184611d49565b516020810190815151611f5e8488611d49565b5192835182036121185790916000925b808410611f82575050505050600101611f2e565b91949398611f94848b98939598611d49565b515198611fa2888851611d49565b5199806120cf575b5060a08a01988b6020611fc08b8d515193611d49565b51015151036120925760005b8a515181101561207d57612008611fff611ff58f6020611fed8f8793611d49565b510151611d49565b5163ffffffff1690565b63ffffffff1690565b8b81612019575b5050600101611fcc565b611fff604061202c856120389451611d49565b51015163ffffffff1690565b9081811061204757508b61200f565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611f6e565b611c658b516120ad606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b60808b0151811015611faa57611c65908b6120f188516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190612136826101ad565b60006020838281520152565b604051906121516020836101e3565b600080835282815b82811061216557505050565b602090612170612129565b82828501015201612159565b805182526001600160401b03602082015116602083015260806121c36121b1604084015160a0604087015260a08601906105da565b606084015185820360608701526105da565b9101519160808183039101526020808351928381520192019060005b8181106121ec5750505090565b825180516001600160a01b0316855260209081015181860152604090940193909201916001016121df565b90602061031c92818152019061217c565b6040513d6000823e3d90fd5b3d1561225f573d90612245826102af565b9161225360405193846101e3565b82523d6000602084013e565b606090565b90602061031c9281815201906105da565b909160608284031261026b57815161228c8161029a565b9260208301516001600160401b03811161026b5783019080601f8301121561026b578151916122ba836102af565b916122c860405193846101e3565b8383526020848301011161026b576040926122e991602080850191016105b7565b92015190565b9293606092959461ffff6123136001600160a01b039460808852608088019061217c565b97166020860152604085015216910152565b929093913033036125e157612338612142565b9460a0850151805161259a575b5050505050805191612363602084519401516001600160401b031690565b90602083015191604084019261239084519261237d610215565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b036123b96005546001600160a01b031690565b168061251d575b5051511580612511575b80156124fb575b80156124d2575b611c995761246a918161240f611a4e61240261082d602060009751016001600160401b0390511690565b546001600160a01b031690565b908361242a606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f000000000000000000000000000000000000000000000000000000000000000090600486016122ef565b03925af19081156124cd576000906000926124a6575b50156124895750565b6040516302a35ba360e21b81529081906120799060048301612264565b90506124c591503d806000833e6124bd81836101e3565b810190612275565b509038612480565b612228565b506124f66124f26124ed60608401516001600160a01b031690565b613901565b1590565b6123d8565b5060608101516001600160a01b03163b156123d1565b506080810151156123ca565b803b1561026b57600060405180926308d450a160e01b82528183816125458a60048301612217565b03925af1908161257f575b5061257957612079612560612234565b6040516309c2532560e01b815291829160048301612264565b386123c0565b8061258e6000612594936101e3565b80610432565b38612550565b85965060206125d69601516125b960608901516001600160a01b031690565b906125d060208a51016001600160401b0390511690565b926137e8565b903880808080612345565b6306e34e6560e31b60005260046000fd5b604051906125ff82610172565b60006060838281528260208201528260408201520152565b9060405161262481610172565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106126745750505090565b82546001600160a01b0316845260209093019260019283019201612667565b90610213611e2e9260405193848092612650565b35906001600160e01b038216820361026b57565b81601f8201121561026b578035906126d282610243565b926126e060405194856101e3565b82845260208085019360061b8301019181831161026b57602001925b82841061270a575050505090565b60408483031261026b5760206040918251612724816101ad565b61272d87610286565b815261273a8388016126a7565b838201528152019301926126fc565b81601f8201121561026b5780359061276082610243565b9261276e60405194856101e3565b82845260208085019360051b8301019181831161026b5760208101935b83851061279a57505050505090565b84356001600160401b03811161026b57820160a0818503601f19011261026b57604051916127c783610192565b6127d360208301610286565b83526040820135926001600160401b03841161026b5760a0836127fd886020809881980101610301565b8584015261280d60608201610286565b604084015261281e60808201610286565b60608401520135608082015281520194019361278b565b81601f8201121561026b5780359061284c82610243565b9261285a60405194856101e3565b82845260208085019360061b8301019181831161026b57602001925b828410612884575050505090565b60408483031261026b576020604091825161289e816101ad565b863581528287013583820152815201930192612876565b60208183031261026b578035906001600160401b03821161026b570160608183031261026b57604051916128e8836101c8565b81356001600160401b03811161026b57820160408183031261026b5760405190612911826101ad565b80356001600160401b03811161026b57810183601f8201121561026b57803561293981610243565b9161294760405193846101e3565b81835260208084019260061b8201019086821161026b57602001915b8183106129df5750505082526020810135906001600160401b03821161026b5761298f918491016126bb565b6020820152835260208201356001600160401b03811161026b57816129b5918401612749565b602084015260408201356001600160401b03811161026b576129d79201612835565b604082015290565b60408388031261026b57602060409182516129f9816101ad565b8535612a048161025a565b8152612a118387016126a7565b83820152815201920191612963565b9080602083519182815201916020808360051b8301019401926000915b838310612a4c57505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612a8a8585015160a08786015260a08501906105da565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612a3d565b916001600160a01b03612ae692168352606060208401526060830190612a20565b9060408183039101526020808351928381520192019060005b818110612b0c5750505090565b8251805185526020908101518186015260409094019390920191600101612aff565b906020808351928381520192019060005b818110612b4c5750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612b3f565b9190604081019083519160408252825180915260206060830193019060005b818110612bc057505050602061031c93940151906020818403910152612b2e565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612b9f565b90602061031c928181520190612b80565b9081602091031261026b575161031c8161029a565b9091612c3161031c936040845260408401906105da565b916020818403910152611d97565b6001600160401b036001911601906001600160401b038211611ebf57565b9091612c7461031c93604084526040840190612a20565b916020818403910152612b80565b929693959190979497612c97828201826128b5565b98612cab6124f260045460ff9060c01c1690565b6130ff575b895180515115908115916130f0575b50613017575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316999860208a019860005b8a518051821015612fb55781612d0e91611d49565b518d612d2182516001600160401b031690565b604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201529091602090829060249082905afa9081156124cd57600091612f87575b50612f6a57612d709061394f565b60208201805160208151910120906001830191612d8c83611e1a565b6020815191012003612f4d575050805460408301516001600160401b039081169160a81c168114801590612f25575b612ed357506080820151908115612ec257612e0c82612dfd612de486516001600160401b031690565b6001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b54612e8e578291612e72612e8792612e39612e3460606001999801516001600160401b031690565b612c3f565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b612dfd612de44294516001600160401b031690565b5501612cf9565b50612ea3611c6592516001600160401b031690565b6332cf0cbf60e01b6000526001600160401b0316600452602452604490565b63504570e360e01b60005260046000fd5b82611c6591612efd6060612eee84516001600160401b031690565b9301516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b50612f3d6107e960608501516001600160401b031690565b6001600160401b03821611612dbb565b5161207960405192839263b80d8fa960e01b845260048401612c1a565b637edeb53960e11b6000526001600160401b031660045260246000fd5b612fa8915060203d8111612fae575b612fa081836101e3565b810190612c05565b38612d62565b503d612f96565b50506130119496989b507f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e46102139b613009949597999b51905190612fff60405192839283612c5d565b0390a13691610c9f565b943691610c9f565b93613d3a565b61302c602086015b356001600160401b031690565b600b546001600160401b03828116911610156130d457613062906001600160401b03166001600160401b0319600b541617600b55565b61307a611a4e611a4e6004546001600160a01b031690565b8a5190803b1561026b57604051633937306f60e01b81529160009183918290849082906130aa9060048301612bf4565b03925af180156124cd576130bf575b50612cc5565b8061258e60006130ce936101e3565b386130b9565b5060208a015151612cc557632261116760e01b60005260046000fd5b60209150015151151538612cbf565b60208a01518051613111575b50612cb0565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060408c0151823b1561026b57604051633854844f60e11b81529260009284928391829161316d913060048501612ac5565b03915afa80156124cd571561310b578061258e600061318b936101e3565b3861310b565b604051906131a06020836101e3565b6000808352366020840137565b6131b5613496565b60005b8151811015611c99576131cb8183611d49565b51906040820160ff6131de825160ff1690565b161561348057602083015160ff16926132048460ff166000526002602052604060002090565b916001830191825461321f6132198260ff1690565b60ff1690565b613445575061324c6132346060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a081019182516101008151116133ed5780511561342f576003860161327a61327482612693565b8a614e56565b606084015161330a575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946002946132e66132d66133049a966132cf8760019f9c6132ca6132fc9a8f614fb7565b613f7b565b5160ff1690565b845460ff191660ff821617909455565b5190818555519060405195869501908886614001565b0390a1615039565b016131b8565b9794600287939597019661332661332089612693565b88614e56565b60808501519461010086511161341957855161334e6132196133498a5160ff1690565b613f67565b10156134035785518451116133ed576132e66132d67fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547986132cf8760019f6132ca6133049f9a8f6133d560029f6133cf6132fc9f8f906132ca84926133b4845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b82614eea565b505050979c9f50975050969a50505094509450613284565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff1661346061345b6060840151151590565b151590565b9015151461324c576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b6001600160a01b036001541633036134aa57565b6315ae3a6f60e11b60005260046000fd5b604051602081019060008252602081526134d66040826101e3565b51902090565b8181106134e7575050565b600081556001016134dc565b9190601f811161350257505050565b610213926000526020600020906020601f840160051c8301931061352e575b601f0160051c01906134dc565b9091508190613521565b91909182516001600160401b03811161018d5761355f816135598454611d5d565b846134f3565b6020601f82116001146135a0578190613591939495600092613595575b50508160011b916000199060031b1c19161790565b9055565b01519050388061357c565b601f198216906135b584600052602060002090565b9160005b8181106135f1575095836001959697106135d8575b505050811b019055565b015160001960f88460031b161c191690553880806135ce565b9192602060018192868b0151815501940192016135b9565b90600160a061031c93602081526001600160401b0384546001600160a01b038116602084015260ff81851c161515604084015260a81c166060820152608080820152019101611d97565b906001600160401b03613693921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036136c25750565b630f01ce8560e01b6000526004524660245260446000fd5b91909180511561377c5782511592602091604051926136f981856101e3565b60008452601f19810160005b8181106137585750505060005b8151811015613750578061373961372b60019385611d49565b51881561373f578690614140565b01613712565b6137498387611d49565b5190614140565b505050509050565b8290604051613766816101ad565b6000815260608382015282828901015201613705565b63c2e5347d60e01b60005260046000fd5b9190811015611d445760051b0190565b3561031c81610965565b9190811015611d445760051b81013590601e198136030182121561026b5701908135916001600160401b03831161026b57602001823603811361026b579190565b909294919397968151966137fb88610243565b97613809604051998a6101e3565b808952613818601f1991610243565b0160005b8181106138ea57505060005b83518110156138dd578061386f8c8a8a8a613869613862878d61385b828f8f9d8f9e60019f8161388b575b505050611d49565b51976137a7565b36916102ca565b9361498d565b613879828c611d49565b52613884818b611d49565b5001613828565b63ffffffff6138a361389e85858561378d565b61379d565b1615613853576138d3926138ba9261389e9261378d565b60406138c68585611d49565b51019063ffffffff169052565b8f8f908391613853565b5096985050505050505050565b6020906138f5612129565b82828d0101520161381c565b6139126385572ffb60e01b82614cf0565b908161392c575b81613922575090565b61031c9150614cc2565b905061393781614c47565b1590613919565b61391263aff2afbf60e01b82614cf0565b6001600160401b031680600052600860205260406000209060ff825460a01c1615613978575090565b63ed053c5960e01b60005260045260246000fd5b6084019081608411611ebf57565b60a001908160a011611ebf57565b91908201809211611ebf57565b6003111561089e57565b600382101561089e5752565b906102136040516139db816101ad565b602060ff829554818116845260081c1691016139bf565b8054821015611d445760005260206000200190600090565b60ff60019116019060ff8211611ebf57565b60ff601b9116019060ff8211611ebf57565b90606092604091835260208301370190565b6001600052600260205293613a747fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612617565b93853594613a818561398c565b6060820190613a908251151590565b613d0c575b803603613cf457508151878103613cdb5750613aaf613697565b60016000526003602052613afe613af97fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b6139cb565b60026020820151613b0e816139b5565b613b17816139b5565b149081613c73575b5015613c47575b51613b7e575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613b6261301f60019460200190565b604080519283526001600160401b0391909116602083015290a2565b613b9f613219613b9a602085969799989a955194015160ff1690565b613a0a565b03613c36578151835103613c2557613c1d6000613b629461301f94613be97f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b36916102ca565b60208151910120604051613c1481613c0689602083019586613a2e565b03601f1981018352826101e3565b5190208a614d20565b948394613b2c565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613b2657631b41e11d60e31b60005260046000fd5b60016000526002602052613cd39150611a4e90613cc090613cba60037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b906139f2565b90546001600160a01b039160031b1c1690565b331438613b1f565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613d3590613d2f613d25613d208751611ea9565b61399a565b613d2f8851611ea9565b906139a8565b613a95565b60008052600260205294909390929091613d737fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612617565b94863595613d808361398c565b6060820190613d8f8251151590565b613f44575b803603613cf457508151888103613f2b5750613dae613697565b600080526003602052613de3613af97f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613ae1565b60026020820151613df3816139b5565b613dfc816139b5565b149081613ee2575b5015613eb6575b51613e48575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613b6261301f60009460200190565b613e64613219613b9a602087989a999b96975194015160ff1690565b03613c36578351865103613c25576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613b6295613be9613ead9461301f9736916102ca565b94839438613e11565b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613e0b57631b41e11d60e31b60005260046000fd5b600080526002602052613f239150611a4e90613cc090613cba60037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613cb1565b331438613e04565b6324f7d61360e21b600052600452602488905260446000fd5b613f6290613d2f613f58613d208951611ea9565b613d2f8a51611ea9565b613d94565b60ff166003029060ff8216918203611ebf57565b8151916001600160401b03831161018d5768010000000000000000831161018d576020908254848455808510613fe4575b500190600052602060002060005b838110613fc75750505050565b60019060206001600160a01b038551169401938184015501613fba565b613ffb9084600052858460002091820191016134dc565b38613fac565b95949392909160ff61402693168752602087015260a0604087015260a0860190612650565b84810360608601526020808351928381520192019060005b818110614059575050509060806102139294019060ff169052565b82516001600160a01b031684526020938401939092019160010161403e565b600654811015611d445760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b0361031c94938160609416835216602082015281604082015201906105da565b60409061031c9392815281602082015201906105da565b9291906001600160401b0390816064951660045216602452600481101561089e57604452565b94939261412a60609361413b93885260208801906108a3565b6080604087015260808601906105da565b930152565b9061415282516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156124cd57600091614876575b50614834576020830191825151948515614804576040850180515187036147f3576141f487611cef565b957f000000000000000000000000000000000000000000000000000000000000000061422a60016142248761394f565b01611e1a565b6020815191012060405161428a81613c066020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a811061475b5750505080608060606142ba9301519101519088866152e9565b97881561473d5760005b8881106142d75750505050505050505050565b5a6142ec6142e6838a51611d49565b5161531b565b805160600151614305906001600160401b031688611ed1565b61430e81610894565b8015908d828315938461472a575b156146e7576060881561466a57506143436020614339898d611d49565b5101519242611ec4565b6004546143589060a01c63ffffffff16611fff565b108015614657575b156146395761436f878b611d49565b5151614623575b84516080015161438e906001600160401b03166107e9565b61456b575b5061439f868951611d49565b5160a08501515181510361452f57936144049695938c938f966143e48e958c926143de6143d860608951016001600160401b0390511690565b89615365565b86615620565b9a9080966143fe60608851016001600160401b0390511690565b906153ed565b6144dd575b505061441482610894565b60028203614495575b60019661448b7f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b0393519261447c6144738b61446b60608801516001600160401b031690565b96519b611d49565b51985a90611ec4565b91604051958695169885614111565b0390a45b016142c4565b915091939492506144a582610894565b600382036144b9578b929493918a9161441d565b51606001516349362d1f60e11b600052611c6591906001600160401b0316896140eb565b6144e684610894565b600384036144095790929495506144fe919350610894565b61450e578b92918a913880614409565b5151604051632b11b8d960e01b8152908190612079908790600484016140d4565b611c658b61454960608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b61457483610894565b61457f575b38614393565b8351608001516001600160401b0316602080860151918c6145b460405194859384936370701e5760e11b8552600485016140ad565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156124cd57600091614605575b5061457957505050505060019061448f565b61461d915060203d8111612fae57612fa081836101e3565b386145f3565b61462d878b611d49565b51516080860152614376565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b5061466183610894565b60038314614360565b91508361467684610894565b15614376575060019594506146df92506146bd91507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a161448f565b5050505060019291506146df6146bd60607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b5061473483610894565b6003831461431c565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b614766818a51611d49565b518051604001516001600160401b03168381036147d657508051602001516001600160401b03168981036147b35750906147a2846001936151e1565b6147ac828d611d49565b520161429a565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611c6561481886516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b5092915050612f6a576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b61488f915060203d602011612fae57612fa081836101e3565b386141ca565b9081602091031261026b575161031c8161025a565b9061031c916020815260e06149486149336148d3855161010060208701526101208601906105da565b60208601516001600160401b0316604086015260408601516001600160a01b031660608601526060860151608086015261491d608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c08701526105da565b60c0850151848203601f1901848601526105da565b92015190610100601f19828503019101526105da565b6040906001600160a01b0361031c949316815281602082015201906105da565b9081602091031261026b575190565b91939293614999612129565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9384156124cd57600094614c16575b506001600160a01b0384169586158015614c04575b614be657614acb614af492613c0692614a4f614a48611fff60408c015163ffffffff1690565b8c89615739565b9690996080810151614a7d6060835193015193614a6a610224565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b6020820152928391602483016148aa565b82857f0000000000000000000000000000000000000000000000000000000000000000926157c7565b94909115614bca5750805160208103614bb1575090614b1d826020808a9551830101910161497e565b956001600160a01b03841603614b55575b5050505050614b4d614b3e610234565b6001600160a01b039093168352565b602082015290565b614b6893614b6291611ec4565b91615739565b50908082108015614b9e575b614b8057808481614b2e565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614baa8284611ec4565b1415614b74565b631e3be00960e21b600052602060045260245260446000fd5b612079604051928392634ff17cad60e11b84526004840161495e565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614c116124f28661393e565b614a22565b614c3991945060203d602011614c40575b614c3181836101e3565b810190614895565b9238614a0d565b503d614c27565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614c756044836101e3565b6179185a10614cb1576020926000925191617530fa6000513d82614ca5575b5081614c9e575090565b9050151590565b60201115915038614c94565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614c756044836101e3565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614c756044836101e3565b919390926000948051946000965b868810614d3f575050505050505050565b6020881015611d445760206000614d57878b1a613a1c565b614d618b87611d49565b5190614d98614d708d8a611d49565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156124cd57614dde613af9600051614dc68960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b9060016020830151614def816139b5565b614df8816139b5565b03614e4557614e15614e0b835160ff1690565b60ff600191161b90565b8116614e3457614e2b614e0b6001935160ff1690565b17970196614d2e565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b8351811015614eaf5760019060ff831660005260036020526000614ea8604082206001600160a01b03614e8f858a611d49565b51166001600160a01b0316600052602052604060002090565b5501614e5c565b50509050565b8151815460ff191660ff919091161781559060200151600381101561089e57815461ff00191660089190911b61ff0016179055565b919060005b8151811015614eaf57614f05611ba78284611d49565b90614f2e614f2483614dc68860ff166000526003602052604060002090565b5460081c60ff1690565b614f37816139b5565b614fa2576001600160a01b03821615614f9157614f8b600192614f86614f5b610234565b60ff8516815291614f6f86602085016139bf565b614dc68960ff166000526003602052604060002090565b614eb5565b01614eef565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015614eaf57614fd2611ba78284611d49565b90614ff1614f2483614dc68860ff166000526003602052604060002090565b614ffa816139b5565b614fa2576001600160a01b03821615614f9157615033600192614f8661501e610234565b60ff8516815291614f6f6002602085016139bf565b01614fbc565b60ff1680600052600260205260ff60016040600020015460101c16908015600014615087575015615076576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146150915750565b61509757565b6307b8c74d60e51b60005260046000fd5b80600052600760205260406000205415600014615126576006546801000000000000000081101561018d57600181016006556000600654821015611d4457600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b9080602083519182815201916020808360051b8301019401926000915b83831061515857505050505090565b9091929394602080600192601f198582030186528851906080806151bb615188855160a0865260a08601906105da565b6001600160a01b0387870151168786015263ffffffff6040870151166040860152606086015185820360608701526105da565b93015191015297019301930191939290615149565b90602061031c92818152019061512c565b6134d6815180519061527561520060608601516001600160a01b031690565b613c0661521760608501516001600160401b031690565b936152306080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613c066020840151602081519101209360a06040820151602081519101209101516040516152ae81613c066020820194856151d0565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b03926152fc92615884565b9116600052600a60205260406000209060005260205260406000205490565b60405160c081018181106001600160401b0382111761018d5760609160a091604052615345611c9d565b815282602082015282604082015260008382015260006080820152015290565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611ebf576153ea916001600160401b036153a88584613653565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b55565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611ebf576154258484613653565b600483101561089e576001600160401b036153ea9416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b9080602083519182815201916020808360051b8301019401926000915b8383106154a557505050505090565b90919293946020806154c3600193601f1986820301875289516105da565b97019301930191939290615496565b906020808351928381520192019060005b8181106154f05750505090565b825163ffffffff168452602093840193909201916001016154e3565b916155d5906155c761031c9593606086526001600160401b0360808251805160608a015282602082015116828a01528260408201511660a08a01528260608201511660c08a015201511660e087015260a061559361557c60208401516101406101008b01526101a08a01906105da565b6040840151898203605f19016101208b01526105da565b60608301516001600160a01b03166101408901529160808101516101608901520151868203605f190161018088015261512c565b908482036020860152615479565b9160408184039101526154d2565b80516020909101516001600160e01b0319811692919060048210615605575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b1561026b576000916156496040519485938493630304c3e160e51b85526004850161550c565b038183305af19081615724575b5061571957615663612234565b9072c11c11c11c11c11c11c11c11c11c11c11c11c13314615685575b60039190565b61569e615691836155e3565b6001600160e01b03191690565b6337c3be2960e01b1480156156fe575b80156156e3575b1561567f57611c656156c6836155e3565b632882569d60e01b6000526001600160e01b031916600452602490565b506156f0615691836155e3565b63753fa58960e11b146156b5565b5061570b615691836155e3565b632be8ca8b60e21b146156ae565b60029061031c6105a2565b8061258e6000615733936101e3565b38615656565b6040516370a0823160e01b60208201526001600160a01b0390911660248201529192916157969061576d8160448101613c06565b84837f0000000000000000000000000000000000000000000000000000000000000000926157c7565b92909115614bca5750805160208103614bb15750906157c18260208061031c9551830101910161497e565b93611ec4565b9391936157d460846102af565b946157e260405196876101e3565b608486526157f060846102af565b602087019590601f1901368737833b15615873575a90808210615862578291038060061c90031115615851576000918291825a9560208451940192f1905a9003923d9060848211615848575b6000908287523e929190565b6084915061583c565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b80519282519084156159e057610101851115806159d4575b15615903578185019460001986019561010087116159035786156159c4576158c387611cef565b9660009586978795885b84811061592857505050505060011901809514938461591e575b505082615914575b505015615903576158ff91611d49565b5190565b6309bde33960e01b60005260046000fd5b14905038806158ef565b14925038806158e7565b6001811b828116036159b657868a10156159a15761594a60018b019a85611d49565b51905b8c888c101561598d575061596560018c019b86611d49565b515b818d1161590357615986828f92615980906001966159f1565b92611d49565b52016158cd565b60018d019c61599b91611d49565b51615967565b6159af60018c019b8d611d49565b519061594d565b6159af600189019884611d49565b5050505090506158ff9150611d37565b5061010182111561589c565b630469ac9960e21b60005260046000fd5b81811015615a03579061031c91615a08565b61031c915b906040519060208201926001845260408301526060820152606081526134d66080826101e356fea164736f6c634300081a000a49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applySourceChainConfigUpdates\",\"inputs\":[{\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"commit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"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\":\"execute\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeSingleMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllSourceChainConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExecutionState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMerkleRoot\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyExecute\",\"inputs\":[{\"name\":\"reports\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\",\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"components\":[{\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AlreadyAttempted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RootRemoved\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedAlreadyExecutedMessage\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedReportExecution\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainConfigSet\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sourceConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainSelectorAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaticConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CommitOnRampMismatch\",\"inputs\":[{\"name\":\"reportOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"configOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"EmptyBatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyReport\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientGasToCompleteTx\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"InvalidDataLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInterval\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"min\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"max\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionGasLimit\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"newLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionTokenGasOverride\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"oldLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverride\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageDestChainSelector\",\"inputs\":[{\"name\":\"messageDestChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNewState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newState\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}]},{\"type\":\"error\",\"name\":\"InvalidOnRampUpdate\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionGasAmountCountMismatch\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ManualExecutionGasLimitMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionNotYetEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotACompatiblePool\",\"inputs\":[{\"name\":\"notPool\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReceiverError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReleaseOrMintBalanceMismatch\",\"inputs\":[{\"name\":\"amountReleased\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePre\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePost\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RootAlreadyCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"RootBlessingMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"isBlessed\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"RootNotCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SourceChainNotEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SourceChainSelectorMismatch\",\"inputs\":[{\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"StaleCommitReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"TokenDataMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"TokenHandlingError\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedTokenData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", + Bin: "0x610140806040523461084b57616654803803809161001d8285610881565b8339810190808203610120811261084b5760a0811261084b5760405161004281610866565b61004b836108a4565b8152602083015161ffff8116810361084b57602082019081526040840151906001600160a01b038216820361084b576040830191825261008d606086016108b8565b926060810193845260606100a3608088016108b8565b6080830190815295609f19011261084b5760405194606086016001600160401b03811187821017610850576040526100dd60a088016108b8565b865260c08701519463ffffffff8616860361084b576020870195865261010560e089016108b8565b6040880190815261010089015190986001600160401b03821161084b570189601f8201121561084b578051996001600160401b038b11610850578a60051b916040519b6101568d6020860190610881565b8c526020808d01938201019082821161084b5760208101935b82851061073a575050505050331561072957600180546001600160a01b031916331790554660805284516001600160a01b0316158015610717575b8015610705575b6106e35782516001600160401b0316156106f45782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a181516001600160a01b0316156106e357905160048054835163ffffffff60a01b60a09190911b166001600160a01b039384166001600160c01b03199092168217179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff166020820152925116908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d90606090a160005b8151811015610656576020600582901b8301810151908101516001600160401b031690600082156106475781516001600160a01b0316156105ae57828152600860205260408120916080810151600184019261035384546108d9565b6105e8578454600160a81b600160e81b031916600160a81b1785556040518681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b815180159081156105bd575b506105ae578151916001600160401b03831161059a576103c785546108d9565b601f8111610555575b50602091601f84116001146104d65760ff948460019a9998956104c2956000805160206166348339815191529995606095926104cb575b5050600019600383901b1c1916908b1b1783555b604081015115158554908760a01b9060a01b16908760a01b1916178555898060a01b038151168a8060a01b0319865416178555015115158354908560e81b9060e81b16908560e81b191617835561047186610996565b506040519384936020855254898060a01b0381166020860152818160a01c1615156040860152898060401b038160a81c16606086015260e81c161515608084015260a08084015260c0830190610913565b0390a2016102f7565b015190503880610407565b9190601f198416868452828420935b81811061053d5750946001856104c2956000805160206166348339815191529995606095849e9d9c9960ff9b10610524575b505050811b01835561041b565b015160001960f88460031b161c19169055388080610517565b929360206001819287860151815501950193016104e5565b85835260208320601f850160051c81019160208610610590575b601f0160051c01905b81811061058557506103d0565b838155600101610578565b909150819061056f565b634e487b7160e01b82526041600452602482fd5b6342bcdf7f60e11b8152600490fd5b905060208301206040516020810190838252602081526105de604082610881565b51902014386103a7565b845460a81c6001600160401b03166001141580610619575b1561039b57632105803760e11b81526004869052602490fd5b506040516106328161062b8188610913565b0382610881565b60208151910120825160208401201415610600565b63c656089560e01b8152600490fd5b604051615c0a9081610a2a82396080518161327e015260a05181818161019f0152614367015260c0518181816101f501528181612ebd0152818161379201528181613a660152614301015260e0518181816102240152614b63015261010051818181610253015261472c0152610120518181816101c6015281816121b101528181614c5601526158bb0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101b1565b5080516001600160a01b0316156101aa565b639b15e16f60e01b60005260046000fd5b84516001600160401b03811161084b57820160a0818603601f19011261084b576040519061076782610866565b60208101516001600160a01b038116810361084b57825261078a604082016108a4565b602083015261079b606082016108cc565b60408301526107ac608082016108cc565b606083015260a08101516001600160401b03811161084b57602091010185601f8201121561084b5780516001600160401b03811161085057604051916107fc601f8301601f191660200184610881565b818352876020838301011161084b5760005b828110610836575050918160006020809694958196010152608082015281520194019361016f565b8060208092840101518282870101520161080e565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761085057604052565b601f909101601f19168101906001600160401b0382119082101761085057604052565b51906001600160401b038216820361084b57565b51906001600160a01b038216820361084b57565b5190811515820361084b57565b90600182811c92168015610909575b60208310146108f357565b634e487b7160e01b600052602260045260246000fd5b91607f16916108e8565b60009291815491610923836108d9565b8083529260018116908115610979575060011461093f57505050565b60009081526020812093945091925b83831061095f575060209250010190565b60018160209294939454838587010152019101919061094e565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a235760065468010000000000000000811015610850576001810180600655811015610a0d577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806306285c6914610157578063181f5a77146101525780633f4b04aa1461014d5780635215505b146101485780635e36480c146101435780635e7bb0081461013e57806360987c20146101395780636f9e320f146101345780637437ff9f1461012f57806379ba50971461012a57806385572ffb146101255780638da5cb5b14610120578063c673e5841461011b578063ccd37ba314610116578063cd19723714610111578063de5e0b9a1461010c578063e9d68a8e14610107578063f2fde38b14610102578063f58e03fc146100fd5763f716f99f146100f857600080fd5b6118ae565b611791565b611706565b611661565b6115c5565b611467565b611408565b611343565b61125b565b611225565b6111a5565b611105565b610f90565b610f15565b610d0e565b610729565b6105ba565b61049e565b61043f565b61016c565b600091031261016757565b600080fd5b34610167576000366003190112610167576101856119e9565b506102cd604051610195816102e7565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761030257604052565b6102d1565b604081019081106001600160401b0382111761030257604052565b606081019081106001600160401b0382111761030257604052565b608081019081106001600160401b0382111761030257604052565b90601f801991011681019081106001600160401b0382111761030257604052565b6040519061038860c083610358565b565b6040519061038860a083610358565b60405190610388608083610358565b6040519061038861010083610358565b60405190610388604083610358565b6001600160401b03811161030257601f01601f191660200190565b604051906103f1602083610358565b60008252565b60005b83811061040a5750506000910152565b81810151838201526020016103fa565b90602091610433815180928185528580860191016103f7565b601f01601f1916010190565b34610167576000366003190112610167576102cd60408051906104628183610358565b601182527f4f666652616d7020312e362e302d64657600000000000000000000000000000060208301525191829160208352602083019061041a565b346101675760003660031901126101675760206001600160401b03600b5416604051908152f35b9060a06080610516936001600160a01b0381511684526020810151151560208501526001600160401b036040820151166040850152606081015115156060850152015191816080820152019061041a565b90565b6040810160408252825180915260206060830193019060005b81811061059b575050506020818303910152815180825260208201916020808360051b8301019401926000915b83831061056e57505050505090565b909192939460208061058c600193601f1986820301875289516104c5565b9701930193019193929061055f565b82516001600160401b0316855260209485019490920191600101610532565b34610167576000366003190112610167576006546105d781610771565b906105e56040519283610358565b808252601f196105f482610771565b0160005b8181106106b657505061060a81611a42565b9060005b8181106106265750506102cd60405192839283610519565b8061065c6106446106386001946141e8565b6001600160401b031690565b61064e8387611a9c565b906001600160401b03169052565b61069a61069561067c61066f8488611a9c565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611b88565b6106a48287611a9c565b526106af8186611a9c565b500161060e565b6020906106c1611a14565b828287010152016105f8565b600435906001600160401b038216820361016757565b35906001600160401b038216820361016757565b634e487b7160e01b600052602160045260246000fd5b6004111561071757565b6106f7565b9060048210156107175752565b34610167576040366003190112610167576107426106cd565b602435906001600160401b03821682036101675760209161076291611c31565b61076f604051809261071c565bf35b6001600160401b0381116103025760051b60200190565b91908260a0910312610167576040516107a0816102e7565b60806107e5818395803585526107b8602082016106e3565b60208601526107c9604082016106e3565b60408601526107da606082016106e3565b6060860152016106e3565b910152565b9291926107f6826103c7565b916108046040519384610358565b829481845281830111610167578281602093846000960137010152565b9080601f8301121561016757816020610516933591016107ea565b6001600160a01b0381160361016757565b35906103888261083c565b63ffffffff81160361016757565b359061038882610858565b81601f820112156101675780359061088882610771565b926108966040519485610358565b82845260208085019360051b830101918183116101675760208101935b8385106108c257505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757604051916108ef836102e7565b60208201356001600160401b0381116101675785602061091192850101610821565b835260408201356109218161083c565b602084015261093260608301610866565b60408401526080820135926001600160401b0384116101675760a08361095f886020809881980101610821565b6060840152013560808201528152019401936108b3565b919091610140818403126101675761098c610379565b926109978183610788565b845260a08201356001600160401b03811161016757816109b8918401610821565b602085015260c08201356001600160401b03811161016757816109dc918401610821565b60408501526109ed60e0830161084d565b606085015261010082013560808501526101208201356001600160401b03811161016757610a1b9201610871565b60a0830152565b9080601f83011215610167578135610a3981610771565b92610a476040519485610358565b81845260208085019260051b820101918383116101675760208201905b838210610a7357505050505090565b81356001600160401b03811161016757602091610a9587848094880101610976565b815201910190610a64565b81601f8201121561016757803590610ab782610771565b92610ac56040519485610358565b82845260208085019360051b830101918183116101675760208101935b838510610af157505050505090565b84356001600160401b03811161016757820183603f82011215610167576020810135610b1c81610771565b91610b2a6040519384610358565b8183526020808085019360051b83010101918683116101675760408201905b838210610b63575050509082525060209485019401610ae2565b81356001600160401b03811161016757602091610b878a8480809589010101610821565b815201910190610b49565b929190610b9e81610771565b93610bac6040519586610358565b602085838152019160051b810192831161016757905b828210610bce57505050565b8135815260209182019101610bc2565b9080601f830112156101675781602061051693359101610b92565b81601f8201121561016757803590610c1082610771565b92610c1e6040519485610358565b82845260208085019360051b830101918183116101675760208101935b838510610c4a57505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757610c7261038a565b91610c7f602083016106e3565b835260408201356001600160401b03811161016757856020610ca392850101610a22565b602084015260608201356001600160401b03811161016757856020610cca92850101610aa0565b60408401526080820135926001600160401b0384116101675760a083610cf7886020809881980101610bde565b606084015201356080820152815201940193610c3b565b34610167576040366003190112610167576004356001600160401b03811161016757610d3e903690600401610bf9565b6024356001600160401b038111610167573660238201121561016757806004013591610d6983610771565b91610d776040519384610358565b8383526024602084019460051b820101903682116101675760248101945b828610610da857610da68585611c79565b005b85356001600160401b03811161016757820136604382011215610167576024810135610dd381610771565b91610de16040519384610358565b818352602060248185019360051b83010101903682116101675760448101925b828410610e1b575050509082525060209586019501610d95565b83356001600160401b038111610167576024908301016040601f1982360301126101675760405190610e4c82610307565b6020810135825260408101356001600160401b03811161016757602091010136601f8201121561016757803590610e8282610771565b91610e906040519384610358565b80835260208084019160051b8301019136831161016757602001905b828210610ecb5750505091816020938480940152815201930192610e01565b602080918335610eda81610858565b815201910190610eac565b9181601f84011215610167578235916001600160401b038311610167576020808501948460051b01011161016757565b34610167576060366003190112610167576004356001600160401b03811161016757610f45903690600401610976565b6024356001600160401b03811161016757610f64903690600401610ee5565b91604435926001600160401b03841161016757610f88610da6943690600401610ee5565b939092612089565b34610167576060366003190112610167576000604051610faf81610322565b600435610fbb8161083c565b8152602435610fc981610858565b6020820190815260443590610fdd8261083c565b60408301918252610fec613534565b6001600160a01b03835116156110f657916110b86001600160a01b036110f0937fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d95611051838651166001600160a01b03166001600160a01b03196004541617600455565b517fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006004549260a01b1691161760045551166001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b0390a180f35b6342bcdf7f60e11b8452600484fd5b346101675760003660031901126101675760006040805161112581610322565b82815282602082015201526102cd60405161113f81610322565b63ffffffff6004546001600160a01b038116835260a01c1660208201526001600160a01b036005541660408201526040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b34610167576000366003190112610167576000546001600160a01b0381163303611214576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b34610167576020366003190112610167576004356001600160401b0381116101675760a090600319903603011261016757600080fd5b346101675760003660031901126101675760206001600160a01b0360015416604051908152f35b6004359060ff8216820361016757565b359060ff8216820361016757565b906020808351928381520192019060005b8181106112be5750505090565b82516001600160a01b03168452602093840193909201916001016112b1565b906105169160208152606082518051602084015260ff602082015116604084015260ff60408201511682840152015115156080820152604061132e602084015160c060a085015260e08401906112a0565b9201519060c0601f19828503019101526112a0565b346101675760203660031901126101675760ff61135e611282565b60606040805161136d81610322565b81516113788161033d565b6000815260006020820152600083820152600084820152815282602082015201521660005260026020526102cd604060002060036113f7604051926113bc84610322565b6113c581612366565b84526040516113e2816113db816002860161239f565b0382610358565b60208501526113db604051809481930161239f565b6040820152604051918291826112dd565b34610167576040366003190112610167576114216106cd565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b8015150361016757565b359061038882611452565b34610167576020366003190112610167576004356001600160401b0381116101675736602382011215610167578060040135906114a382610771565b906114b16040519283610358565b8282526024602083019360051b820101903682116101675760248101935b8285106114df57610da6846123f6565b84356001600160401b03811161016757820160a06023198236030112610167576040519161150c836102e7565b602482013561151a8161083c565b8352611528604483016106e3565b6020840152606482013561153b81611452565b6040840152608482013561154e81611452565b606084015260a4820135926001600160401b0384116101675761157b602094936024869536920101610821565b60808201528152019401936114cf565b9060049160441161016757565b9181601f84011215610167578235916001600160401b038311610167576020838186019501011161016757565b346101675760c0366003190112610167576115df3661158b565b6044356001600160401b038111610167576115fe903690600401611598565b6064929192356001600160401b03811161016757611620903690600401610ee5565b60843594916001600160401b03861161016757611644610da6963690600401610ee5565b94909360a43596612cb9565b9060206105169281815201906104c5565b34610167576020366003190112610167576001600160401b036116826106cd565b61168a611a14565b501660005260086020526102cd60406000206116f56001604051926116ae846102e7565b6116ef60ff82546001600160a01b0381168752818160a01c16151560208801526001600160401b038160a81c16604088015260e81c16606086019015159052565b01611b6d565b608082015260405191829182611650565b34610167576020366003190112610167576001600160a01b0360043561172b8161083c565b611733613534565b1633811461178057806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b34610167576060366003190112610167576117ab3661158b565b6044356001600160401b038111610167576117ca903690600401611598565b91828201602083820312610167578235906001600160401b038211610167576117f4918401610bf9565b6040519060206118048184610358565b60008352601f19810160005b81811061183857505050610da69491611828916132bf565b611830612f33565b928392613bb0565b60608582018401528201611810565b9080601f8301121561016757813561185e81610771565b9261186c6040519485610358565b81845260208085019260051b82010192831161016757602001905b8282106118945750505090565b6020809183356118a38161083c565b815201910190611887565b34610167576020366003190112610167576004356001600160401b0381116101675736602382011215610167578060040135906118ea82610771565b906118f86040519283610358565b8282526024602083019360051b820101903682116101675760248101935b82851061192657610da684612f4f565b84356001600160401b03811161016757820160c060231982360301126101675761194e610379565b916024820135835261196260448301611292565b602084015261197360648301611292565b60408401526119846084830161145c565b606084015260a48201356001600160401b038111610167576119ac9060243691850101611847565b608084015260c4820135926001600160401b038411610167576119d9602094936024869536920101611847565b60a0820152815201940193611916565b604051906119f6826102e7565b60006080838281528260208201528260408201528260608201520152565b60405190611a21826102e7565b60606080836000815260006020820152600060408201526000838201520152565b90611a4c82610771565b611a596040519182610358565b8281528092611a6a601f1991610771565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611a975760200190565b611a74565b8051821015611a975760209160051b010190565b90600182811c92168015611ae0575b6020831014611aca57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611abf565b60009291815491611afa83611ab0565b8083529260018116908115611b505750600114611b1657505050565b60009081526020812093945091925b838310611b36575060209250010190565b600181602092949394548385870101520191019190611b25565b915050602093945060ff929192191683830152151560051b010190565b90610388611b819260405193848092611aea565b0383610358565b9060016080604051611b99816102e7565b611bef819560ff81546001600160a01b0381168552818160a01c16151560208601526001600160401b038160a81c16604086015260e81c1615156060840152611be86040518096819301611aea565b0384610358565b0152565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611c1f57565b611bf3565b91908203918211611c1f57565b611c3d82607f92613238565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611c1f576003911c1660048110156107175790565b611c8161327c565b805182518103611e7c5760005b818110611ca157505090610388916132bf565b611cab8184611a9c565b516020810190815151611cbe8488611a9c565b519283518203611e7c5790916000925b808410611ce2575050505050600101611c8e565b91949398611cf4848b98939598611a9c565b515198611d02888851611a9c565b519980611e33575b5060a08a01988b6020611d208b8d515193611a9c565b5101515103611df25760005b8a5151811015611ddd57611d68611d5f611d558f6020611d4d8f8793611a9c565b510151611a9c565b5163ffffffff1690565b63ffffffff1690565b8b81611d79575b5050600101611d2c565b611d5f6040611d8c85611d989451611a9c565b51015163ffffffff1690565b90818110611da757508b611d6f565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611cce565b611e2f8b51611e0d606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b6000fd5b60808b0151811015611d0a57611e2f908b611e5588516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190611e9a82610307565b60006020838281520152565b60405190611eb5602083610358565b600080835282815b828110611ec957505050565b602090611ed4611e8d565b82828501015201611ebd565b805182526001600160401b0360208201511660208301526080611f27611f15604084015160a0604087015260a086019061041a565b6060840151858203606087015261041a565b9101519160808183039101526020808351928381520192019060005b818110611f505750505090565b825180516001600160a01b031685526020908101518186015260409094019390920191600101611f43565b906020610516928181520190611ee0565b6040513d6000823e3d90fd5b3d15611fc3573d90611fa9826103c7565b91611fb76040519384610358565b82523d6000602084013e565b606090565b90602061051692818152019061041a565b9091606082840312610167578151611ff081611452565b9260208301516001600160401b0381116101675783019080601f830112156101675781519161201e836103c7565b9161202c6040519384610358565b838352602084830101116101675760409261204d91602080850191016103f7565b92015190565b9293606092959461ffff6120776001600160a01b0394608088526080880190611ee0565b97166020860152604085015216910152565b929093913033036123555761209c611ea6565b9460a0850151805161230e575b50505050508051916120c7602084519401516001600160401b031690565b9060208301519160408401926120f48451926120e161038a565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b0361211d6005546001600160a01b031690565b1680612291575b5051511580612285575b801561226f575b8015612246575b612242576121da918161217f61217361216661067c602060009751016001600160401b0390511690565b546001600160a01b031690565b6001600160a01b031690565b908361219a606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f00000000000000000000000000000000000000000000000000000000000000009060048601612053565b03925af190811561223d57600090600092612216575b50156121f95750565b6040516302a35ba360e21b8152908190611dd99060048301611fc8565b905061223591503d806000833e61222d8183610358565b810190611fd9565b5090386121f0565b611f8c565b5050565b5061226a61226661226160608401516001600160a01b031690565b6134e6565b1590565b61213c565b5060608101516001600160a01b03163b15612135565b5060808101511561212e565b803b1561016757600060405180926308d450a160e01b82528183816122b98a60048301611f7b565b03925af190816122f3575b506122ed57611dd96122d4611f98565b6040516309c2532560e01b815291829160048301611fc8565b38612124565b80612302600061230893610358565b8061015c565b386122c4565b859650602061234a96015161232d60608901516001600160a01b031690565b9061234460208a51016001600160401b0390511690565b926133cd565b9038808080806120a9565b6306e34e6560e31b60005260046000fd5b906040516123738161033d565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106123c35750505090565b82546001600160a01b03168452602090930192600192830192016123b6565b90610388611b81926040519384809261239f565b6123fe613534565b60005b8151811015612242576124148183611a9c565b519061242a60208301516001600160401b031690565b6001600160401b0381169081156126c05761245261217361217386516001600160a01b031690565b1561262b57612474816001600160401b03166000526008602052604060002090565b60808501519060018101926124898454611ab0565b612652576124fc7ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb9916124e284750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b8151801590811561263c575b5061262b5761260c6125d7606060019861254a612622967fbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c986135d6565b6125a061255a6040830151151590565b86547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178655565b6125d06125b482516001600160a01b031690565b86906001600160a01b03166001600160a01b0319825416179055565b0151151590565b82547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560e81b60ff60e81b16178255565b612615846159ce565b50604051918291826136a7565b0390a201612401565b6342bcdf7f60e11b60005260046000fd5b9050602083012061264b613559565b143861250c565b60016001600160401b0361267184546001600160401b039060a81c1690565b161415806126a1575b6126845750612500565b632105803760e11b6000526001600160401b031660045260246000fd5b506126ab84611b6d565b6020815191012083516020850120141561267a565b63c656089560e01b60005260046000fd5b35906001600160e01b038216820361016757565b81601f82011215610167578035906126fc82610771565b9261270a6040519485610358565b82845260208085019360061b8301019181831161016757602001925b828410612734575050505090565b604084830312610167576020604091825161274e81610307565b612757876106e3565b81526127648388016126d1565b83820152815201930192612726565b9190604083820312610167576040519061278c82610307565b819380356001600160401b03811161016757810182601f820112156101675780356127b681610771565b916127c46040519384610358565b81835260208084019260061b8201019085821161016757602001915b81831061280d5750505083526020810135916001600160401b038311610167576020926107e592016126e5565b604083870312610167576020604091825161282781610307565b85356128328161083c565b815261283f8387016126d1565b838201528152019201916127e0565b81601f820112156101675780359061286582610771565b926128736040519485610358565b82845260208085019360051b830101918183116101675760208101935b83851061289f57505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757604051916128cc836102e7565b6128d8602083016106e3565b83526040820135926001600160401b0384116101675760a083612902886020809881980101610821565b85840152612912606082016106e3565b6040840152612923608082016106e3565b606084015201356080820152815201940193612890565b81601f820112156101675780359061295182610771565b9261295f6040519485610358565b82845260208085019360061b8301019181831161016757602001925b828410612989575050505090565b60408483031261016757602060409182516129a381610307565b86358152828701358382015281520193019261297b565b602081830312610167578035906001600160401b0382116101675701608081830312610167576129e8610399565b9181356001600160401b0381116101675781612a05918401612773565b835260208201356001600160401b0381116101675781612a2691840161284e565b602084015260408201356001600160401b0381116101675781612a4a91840161284e565b604084015260608201356001600160401b03811161016757612a6c920161293a565b606082015290565b9080602083519182815201916020808360051b8301019401926000915b838310612aa057505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612ade8585015160a08786015260a085019061041a565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612a91565b916001600160a01b03612b3a92168352606060208401526060830190612a74565b9060408183039101526020808351928381520192019060005b818110612b605750505090565b8251805185526020908101518186015260409094019390920191600101612b53565b6084019081608411611c1f57565b60a001908160a011611c1f57565b91908201809211611c1f57565b906020808351928381520192019060005b818110612bc95750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612bbc565b9190604081019083519160408252825180915260206060830193019060005b818110612c3d57505050602061051693940151906020818403910152612bab565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612c1c565b906020610516928181520190612bfd565b91612cab90612c9d6105169593606086526060860190612a74565b908482036020860152612a74565b916040818403910152612bfd565b9197939796929695909495612cd0818701876129ba565b95602087019788518051612eb3575b5087518051511590811591612ea4575b50612dbf575b60005b89518051821015612d1f5790612d19612d1382600194611a9c565b51613757565b01612cf8565b50509193959799989092949698600099604081019a5b8b518051821015612d5c5790612d56612d5082600194611a9c565b51613a2b565b01612d35565b5050907fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47612db193926103889c612da7612db998999a9b9c9d9f519151925160405193849384612c82565b0390a13691610b92565b943691610b92565b93613eaa565b612dd4602086015b356001600160401b031690565b600b546001600160401b0382811691161015612e7c57612e0a906001600160401b03166001600160401b0319600b541617600b55565b612e226121736121736004546001600160a01b031690565b885190803b1561016757604051633937306f60e01b8152916000918391829084908290612e529060048301612c71565b03925af1801561223d57612e67575b50612cf5565b806123026000612e7693610358565b38612e61565b50612e8f89515160408a01515190612b9e565b612cf557632261116760e01b60005260046000fd5b60209150015151151538612cef565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060608a0151823b1561016757604051633854844f60e11b815292600092849283918291612f0f913060048501612b19565b03915afa801561223d5715612cdf57806123026000612f2d93610358565b38612cdf565b60405190612f42602083610358565b6000808352366020840137565b612f57613534565b60005b815181101561224257612f6d8183611a9c565b51906040820160ff612f80825160ff1690565b161561322257602083015160ff1692612fa68460ff166000526002602052604060002090565b9160018301918254612fc1612fbb8260ff1690565b60ff1690565b6131e75750612fee612fd66060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a0810191825161010081511161318f578051156131d1576003860161301c613016826123e2565b8a61501a565b60608401516130ac575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946002946130886130786130a69a966130718760019f9c61306c61309e9a8f615188565b6140eb565b5160ff1690565b845460ff191660ff821617909455565b5190818555519060405195869501908886614171565b0390a161520a565b01612f5a565b979460028793959701966130c86130c2896123e2565b8861501a565b6080850151946101008651116131bb5785516130f0612fbb6130eb8a5160ff1690565b6140d7565b10156131a557855184511161318f576130886130787fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547986130718760019f61306c6130a69f9a8f61317760029f61317161309e9f8f9061306c8492613156845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b826150ae565b505050979c9f50975050969a50505094509450613026565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff166132026131fd6060840151151590565b151590565b90151514612fee576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b906001600160401b03613278921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036132a75750565b630f01ce8560e01b6000526004524660245260446000fd5b9190918051156133615782511592602091604051926132de8185610358565b60008452601f19810160005b81811061333d5750505060005b8151811015613335578061331e61331060019385611a9c565b5188156133245786906142b0565b016132f7565b61332e8387611a9c565b51906142b0565b505050509050565b829060405161334b81610307565b60008152606083820152828289010152016132ea565b63c2e5347d60e01b60005260046000fd5b9190811015611a975760051b0190565b3561051681610858565b9190811015611a975760051b81013590601e19813603018212156101675701908135916001600160401b038311610167576020018236038113610167579190565b909294919397968151966133e088610771565b976133ee604051998a610358565b8089526133fd601f1991610771565b0160005b8181106134cf57505060005b83518110156134c257806134548c8a8a8a61344e613447878d613440828f8f9d8f9e60019f81613470575b505050611a9c565b519761338c565b36916107ea565b93614b14565b61345e828c611a9c565b52613469818b611a9c565b500161340d565b63ffffffff613488613483858585613372565b613382565b1615613438576134b89261349f9261348392613372565b60406134ab8585611a9c565b51019063ffffffff169052565b8f8f908391613438565b5096985050505050505050565b6020906134da611e8d565b82828d01015201613401565b6134f76385572ffb60e01b82614e77565b9081613511575b81613507575090565b6105169150614e49565b905061351c81614dce565b15906134fe565b6134f763aff2afbf60e01b82614e77565b6001600160a01b0360015416330361354857565b6315ae3a6f60e11b60005260046000fd5b60405160208101906000825260208152613574604082610358565b51902090565b818110613585575050565b6000815560010161357a565b9190601f81116135a057505050565b610388926000526020600020906020601f840160051c830193106135cc575b601f0160051c019061357a565b90915081906135bf565b91909182516001600160401b038111610302576135fd816135f78454611ab0565b84613591565b6020601f821160011461363e57819061362f939495600092613633575b50508160011b916000199060031b1c19161790565b9055565b01519050388061361a565b601f1982169061365384600052602060002090565b9160005b81811061368f57509583600195969710613676575b505050811b019055565b015160001960f88460031b161c1916905538808061366c565b9192602060018192868b015181550194019201613657565b90600160c0610516936020815260ff84546001600160a01b0381166020840152818160a01c16151560408401526001600160401b038160a81c16606084015260e81c161515608082015260a080820152019101611aea565b90816020910312610167575161051681611452565b909161372b6105169360408452604084019061041a565b916020818403910152611aea565b6001600160401b036001911601906001600160401b038211611c1f57565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d576000916139fc575b506139de576137d982614ea7565b805460ff60e882901c1615156001146139b3576020830180516020815191012090600184019161380883611b6d565b602081519101200361399657505060408301516001600160401b039081169160a81c16811480159061396e575b61392d5750608082015191821561391c5761387683613867866001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b546138f9576138f6929161389f61389a60606138d89401516001600160401b031690565b613739565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b61386742936001600160401b0316600052600a602052604060002090565b55565b6332cf0cbf60e01b6000526001600160401b038416600452602483905260446000fd5b63504570e360e01b60005260046000fd5b83611e2f9161394660608601516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b5061398661063860608501516001600160401b031690565b6001600160401b03821611613835565b51611dd960405192839263b80d8fa960e01b845260048401613714565b60808301516348e2b93360e11b6000526001600160401b038516600452602452600160445260646000fd5b637edeb53960e11b6000526001600160401b03821660045260246000fd5b613a1e915060203d602011613a24575b613a168183610358565b8101906136ff565b386137cb565b503d613a0c565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d57600091613b06575b506139de57613aad82614ea7565b805460ff60e882901c1615613ad8576020830180516020815191012090600184019161380883611b6d565b60808301516348e2b93360e11b60009081526001600160401b03861660045260249190915260445260646000fd5b613b1f915060203d602011613a2457613a168183610358565b38613a9f565b6003111561071757565b60038210156107175752565b90610388604051613b4b81610307565b602060ff829554818116845260081c169101613b2f565b8054821015611a975760005260206000200190600090565b60ff60019116019060ff8211611c1f57565b60ff601b9116019060ff8211611c1f57565b90606092604091835260208301370190565b6001600052600260205293613be47fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612366565b93853594613bf185612b82565b6060820190613c008251151590565b613e7c575b803603613e6457508151878103613e4b5750613c1f61327c565b60016000526003602052613c6e613c697fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b613b3b565b60026020820151613c7e81613b25565b613c8781613b25565b149081613de3575b5015613db7575b51613cee575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613cd2612dc760019460200190565b604080519283526001600160401b0391909116602083015290a2565b613d0f612fbb613d0a602085969799989a955194015160ff1690565b613b7a565b03613da6578151835103613d9557613d8d6000613cd294612dc794613d597f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b36916107ea565b60208151910120604051613d8481613d7689602083019586613b9e565b03601f198101835282610358565b5190208a614ee4565b948394613c9c565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613c9657631b41e11d60e31b60005260046000fd5b60016000526002602052613e43915061217390613e3090613e2a60037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b90613b62565b90546001600160a01b039160031b1c1690565b331438613c8f565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613ea590613e9f613e95613e908751611c09565b612b90565b613e9f8851611c09565b90612b9e565b613c05565b60008052600260205294909390929091613ee37fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612366565b94863595613ef083612b82565b6060820190613eff8251151590565b6140b4575b803603613e645750815188810361409b5750613f1e61327c565b600080526003602052613f53613c697f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613c51565b60026020820151613f6381613b25565b613f6c81613b25565b149081614052575b5015614026575b51613fb8575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613cd2612dc760009460200190565b613fd4612fbb613d0a602087989a999b96975194015160ff1690565b03613da6578351865103613d95576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613cd295613d5961401d94612dc79736916107ea565b94839438613f81565b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613f7b57631b41e11d60e31b60005260046000fd5b600080526002602052614093915061217390613e3090613e2a60037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613e21565b331438613f74565b6324f7d61360e21b600052600452602488905260446000fd5b6140d290613e9f6140c8613e908951611c09565b613e9f8a51611c09565b613f04565b60ff166003029060ff8216918203611c1f57565b8151916001600160401b03831161030257680100000000000000008311610302576020908254848455808510614154575b500190600052602060002060005b8381106141375750505050565b60019060206001600160a01b03855116940193818401550161412a565b61416b90846000528584600020918201910161357a565b3861411c565b95949392909160ff61419693168752602087015260a0604087015260a086019061239f565b84810360608601526020808351928381520192019060005b8181106141c9575050509060806103889294019060ff169052565b82516001600160a01b03168452602093840193909201916001016141ae565b600654811015611a975760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b03610516949381606094168352166020820152816040820152019061041a565b60409061051693928152816020820152019061041a565b9291906001600160401b0390816064951660045216602452600481101561071757604452565b94939261429a6060936142ab938852602088019061071c565b60806040870152608086019061041a565b930152565b906142c282516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d576000916149fd575b5061499e57602083019182515194851561496e5760408501805151870361495d5761436487611a42565b957f000000000000000000000000000000000000000000000000000000000000000061439460016116ef87614ea7565b602081519101206040516143f481613d766020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a81106148c5575050508060806060614424930151910151908886615436565b9788156148a75760005b8881106144415750505050505050505050565b5a614456614450838a51611a9c565b51615468565b80516060015161446f906001600160401b031688611c31565b6144788161070d565b8015908d8283159384614894575b1561485157606088156147d457506144ad60206144a3898d611a9c565b5101519242611c24565b6004546144c29060a01c63ffffffff16611d5f565b1080156147c1575b156147a3576144d9878b611a9c565b515161478d575b8451608001516144f8906001600160401b0316610638565b6146d5575b50614509868951611a9c565b5160a085015151815103614699579361456e9695938c938f9661454e8e958c9261454861454260608951016001600160401b0390511690565b896154b2565b8661576a565b9a90809661456860608851016001600160401b0390511690565b90615537565b614647575b505061457e8261070d565b600282036145ff575b6001966145f57f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b039351926145e66145dd8b6145d560608801516001600160401b031690565b96519b611a9c565b51985a90611c24565b91604051958695169885614281565b0390a45b0161442e565b9150919394925061460f8261070d565b60038203614623578b929493918a91614587565b51606001516349362d1f60e11b600052611e2f91906001600160401b03168961425b565b6146508461070d565b6003840361457357909294955061466891935061070d565b614678578b92918a913880614573565b5151604051632b11b8d960e01b8152908190611dd990879060048401614244565b611e2f8b6146b360608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b6146de8361070d565b6146e9575b386144fd565b8351608001516001600160401b0316602080860151918c61471e60405194859384936370701e5760e11b85526004850161421d565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561223d5760009161476f575b506146e35750505050506001906145f9565b614787915060203d8111613a2457613a168183610358565b3861475d565b614797878b611a9c565b515160808601526144e0565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b506147cb8361070d565b600383146144ca565b9150836147e08461070d565b156144e057506001959450614849925061482791507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a16145f9565b50505050600192915061484961482760607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b5061489e8361070d565b60038314614486565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b6148d0818a51611a9c565b518051604001516001600160401b031683810361494057508051602001516001600160401b031689810361491d57509061490c8460019361532e565b614916828d611a9c565b5201614404565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611e2f61498286516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b50929150506149e0576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b637edeb53960e11b6000526001600160401b031660045260246000fd5b614a16915060203d602011613a2457613a168183610358565b3861433a565b9081602091031261016757516105168161083c565b90610516916020815260e0614acf614aba614a5a8551610100602087015261012086019061041a565b60208601516001600160401b0316604086015260408601516001600160a01b0316606086015260608601516080860152614aa4608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c087015261041a565b60c0850151848203601f19018486015261041a565b92015190610100601f198285030191015261041a565b6040906001600160a01b036105169493168152816020820152019061041a565b90816020910312610167575190565b91939293614b20611e8d565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa93841561223d57600094614d9d575b506001600160a01b0384169586158015614d8b575b614d6d57614c52614c7b92613d7692614bd6614bcf611d5f60408c015163ffffffff1690565b8c89615883565b9690996080810151614c046060835193015193614bf16103a8565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b602082015292839160248301614a31565b82857f000000000000000000000000000000000000000000000000000000000000000092615911565b94909115614d515750805160208103614d38575090614ca4826020808a95518301019101614b05565b956001600160a01b03841603614cdc575b5050505050614cd4614cc56103b8565b6001600160a01b039093168352565b602082015290565b614cef93614ce991611c24565b91615883565b50908082108015614d25575b614d0757808481614cb5565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614d318284611c24565b1415614cfb565b631e3be00960e21b600052602060045260245260446000fd5b611dd9604051928392634ff17cad60e11b845260048401614ae5565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614d9861226686613523565b614ba9565b614dc091945060203d602011614dc7575b614db88183610358565b810190614a1c565b9238614b94565b503d614dae565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614dfc604483610358565b6179185a10614e38576020926000925191617530fa6000513d82614e2c575b5081614e25575090565b9050151590565b60201115915038614e1b565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614dfc604483610358565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614dfc604483610358565b6001600160401b031680600052600860205260406000209060ff825460a01c1615614ed0575090565b63ed053c5960e01b60005260045260246000fd5b919390926000948051946000965b868810614f03575050505050505050565b6020881015611a975760206000614f1b878b1a613b8c565b614f258b87611a9c565b5190614f5c614f348d8a611a9c565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561223d57614fa2613c69600051614f8a8960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b9060016020830151614fb381613b25565b614fbc81613b25565b0361500957614fd9614fcf835160ff1690565b60ff600191161b90565b8116614ff857614fef614fcf6001935160ff1690565b17970196614ef2565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b83518110156150735760019060ff83166000526003602052600061506c604082206001600160a01b03615053858a611a9c565b51166001600160a01b0316600052602052604060002090565b5501615020565b50509050565b8151815460ff191660ff919091161781559060200151600381101561071757815461ff00191660089190911b61ff0016179055565b919060005b8151811015615073576150d66150c98284611a9c565b516001600160a01b031690565b906150ff6150f583614f8a8860ff166000526003602052604060002090565b5460081c60ff1690565b61510881613b25565b615173576001600160a01b038216156151625761515c60019261515761512c6103b8565b60ff85168152916151408660208501613b2f565b614f8a8960ff166000526003602052604060002090565b615079565b016150b3565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015615073576151a36150c98284611a9c565b906151c26150f583614f8a8860ff166000526003602052604060002090565b6151cb81613b25565b615173576001600160a01b03821615615162576152046001926151576151ef6103b8565b60ff8516815291615140600260208501613b2f565b0161518d565b60ff1680600052600260205260ff60016040600020015460101c16908015600014615258575015615247576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146152625750565b61526857565b6307b8c74d60e51b60005260046000fd5b9080602083519182815201916020808360051b8301019401926000915b8383106152a557505050505090565b9091929394602080600192601f198582030186528851906080806153086152d5855160a0865260a086019061041a565b6001600160a01b0387870151168786015263ffffffff60408701511660408601526060860151858203606087015261041a565b93015191015297019301930191939290615296565b906020610516928181520190615279565b61357481518051906153c261534d60608601516001600160a01b031690565b613d7661536460608501516001600160401b031690565b9361537d6080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613d766020840151602081519101209360a06040820151602081519101209101516040516153fb81613d7660208201948561531d565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b039261544992615a52565b9116600052600a60205260406000209060005260205260406000205490565b60405160c081018181106001600160401b038211176103025760609160a0916040526154926119e9565b815282602082015282604082015260008382015260006080820152015290565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611c1f576138f6916001600160401b036154f58584613238565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611c1f5761556f8484613238565b6004831015610717576001600160401b036138f69416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b9080602083519182815201916020808360051b8301019401926000915b8383106155ef57505050505090565b909192939460208061560d600193601f19868203018752895161041a565b970193019301919392906155e0565b906020808351928381520192019060005b81811061563a5750505090565b825163ffffffff1684526020938401939092019160010161562d565b9161571f906157116105169593606086526001600160401b0360808251805160608a015282602082015116828a01528260408201511660a08a01528260608201511660c08a015201511660e087015260a06156dd6156c660208401516101406101008b01526101a08a019061041a565b6040840151898203605f19016101208b015261041a565b60608301516001600160a01b03166101408901529160808101516101608901520151868203605f1901610180880152615279565b9084820360208601526155c3565b91604081840391015261561c565b80516020909101516001600160e01b031981169291906004821061574f575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b15610167576000916157936040519485938493630304c3e160e51b855260048501615656565b038183305af1908161586e575b50615863576157ad611f98565b9072c11c11c11c11c11c11c11c11c11c11c11c11c133146157cf575b60039190565b6157e86157db8361572d565b6001600160e01b03191690565b6337c3be2960e01b148015615848575b801561582d575b156157c957611e2f6158108361572d565b632882569d60e01b6000526001600160e01b031916600452602490565b5061583a6157db8361572d565b63753fa58960e11b146157ff565b506158556157db8361572d565b632be8ca8b60e21b146157f8565b6002906105166103e2565b80612302600061587d93610358565b386157a0565b6040516370a0823160e01b60208201526001600160a01b0390911660248201529192916158e0906158b78160448101613d76565b84837f000000000000000000000000000000000000000000000000000000000000000092615911565b92909115614d515750805160208103614d3857509061590b8260208061051695518301019101614b05565b93611c24565b93919361591e60846103c7565b9461592c6040519687610358565b6084865261593a60846103c7565b602087019590601f1901368737833b156159bd575a908082106159ac578291038060061c9003111561599b576000918291825a9560208451940192f1905a9003923d9060848211615992575b6000908287523e929190565b60849150615986565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b80600052600760205260406000205415600014615a4c576006546801000000000000000081101561030257600181016006556000600654821015611a9757600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b8051928251908415615bae5761010185111580615ba2575b15615ad157818501946000198601956101008711615ad1578615615b9257615a9187611a42565b9660009586978795885b848110615af6575050505050600119018095149384615aec575b505082615ae2575b505015615ad157615acd91611a9c565b5190565b6309bde33960e01b60005260046000fd5b1490503880615abd565b1492503880615ab5565b6001811b82811603615b8457868a1015615b6f57615b1860018b019a85611a9c565b51905b8c888c1015615b5b5750615b3360018c019b86611a9c565b515b818d11615ad157615b54828f92615b4e90600196615bbf565b92611a9c565b5201615a9b565b60018d019c615b6991611a9c565b51615b35565b615b7d60018c019b8d611a9c565b5190615b1b565b615b7d600189019884611a9c565b505050509050615acd9150611a8a565b50610101821115615a6a565b630469ac9960e21b60005260046000fd5b81811015615bd1579061051691615bd6565b610516915b9060405190602082019260018452604083015260608201526060815261357460808261035856fea164736f6c634300081a000abd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c", } var OffRampABI = OffRampMetaData.ABI @@ -824,9 +825,10 @@ func (it *OffRampCommitReportAcceptedIterator) Close() error { } type OffRampCommitReportAccepted struct { - MerkleRoots []InternalMerkleRoot - PriceUpdates InternalPriceUpdates - Raw types.Log + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + PriceUpdates InternalPriceUpdates + Raw types.Log } func (_OffRamp *OffRampFilterer) FilterCommitReportAccepted(opts *bind.FilterOpts) (*OffRampCommitReportAcceptedIterator, error) { @@ -2424,7 +2426,7 @@ func (OffRampAlreadyAttempted) Topic() common.Hash { } func (OffRampCommitReportAccepted) Topic() common.Hash { - return common.HexToHash("0x35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e4") + return common.HexToHash("0xb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47") } func (OffRampConfigSet) Topic() common.Hash { @@ -2432,7 +2434,7 @@ func (OffRampConfigSet) Topic() common.Hash { } func (OffRampDynamicConfigSet) Topic() common.Hash { - return common.HexToHash("0xcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee") + return common.HexToHash("0xa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d") } func (OffRampExecutionStateChanged) Topic() common.Hash { @@ -2460,7 +2462,7 @@ func (OffRampSkippedReportExecution) Topic() common.Hash { } func (OffRampSourceChainConfigSet) Topic() common.Hash { - return common.HexToHash("0x49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b") + return common.HexToHash("0xbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c") } func (OffRampSourceChainSelectorAdded) Topic() common.Hash { diff --git a/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go b/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go index 5bfdf463df3..3103c3889d0 100644 --- a/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go +++ b/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go @@ -124,7 +124,6 @@ type MultiOCR3BaseOCRConfigArgs struct { type OffRampDynamicConfig struct { FeeQuoter common.Address PermissionLessExecutionThresholdSeconds uint32 - IsRMNVerificationDisabled bool MessageInterceptor common.Address } @@ -134,17 +133,19 @@ type OffRampGasLimitOverride struct { } type OffRampSourceChainConfig struct { - Router common.Address - IsEnabled bool - MinSeqNr uint64 - OnRamp []byte + Router common.Address + IsEnabled bool + MinSeqNr uint64 + IsRMNVerificationDisabled bool + OnRamp []byte } type OffRampSourceChainConfigArgs struct { - Router common.Address - SourceChainSelector uint64 - IsEnabled bool - OnRamp []byte + Router common.Address + SourceChainSelector uint64 + IsEnabled bool + IsRMNVerificationDisabled bool + OnRamp []byte } type OffRampStaticConfig struct { @@ -156,8 +157,8 @@ type OffRampStaticConfig struct { } var OffRampWithMessageTransformerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"messageTransformerAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applySourceChainConfigUpdates\",\"inputs\":[{\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"commit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"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\":\"execute\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeSingleMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllSourceChainConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExecutionState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMerkleRoot\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMessageTransformer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyExecute\",\"inputs\":[{\"name\":\"reports\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\",\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"components\":[{\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMessageTransformer\",\"inputs\":[{\"name\":\"messageTransformerAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AlreadyAttempted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RootRemoved\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedAlreadyExecutedMessage\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedReportExecution\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainConfigSet\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sourceConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainSelectorAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaticConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CommitOnRampMismatch\",\"inputs\":[{\"name\":\"reportOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"configOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"EmptyBatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyReport\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientGasToCompleteTx\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"InvalidDataLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInterval\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"min\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"max\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionGasLimit\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"newLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionTokenGasOverride\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"oldLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverride\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageDestChainSelector\",\"inputs\":[{\"name\":\"messageDestChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNewState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newState\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}]},{\"type\":\"error\",\"name\":\"InvalidOnRampUpdate\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionGasAmountCountMismatch\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ManualExecutionGasLimitMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionNotYetEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageTransformError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotACompatiblePool\",\"inputs\":[{\"name\":\"notPool\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReceiverError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReleaseOrMintBalanceMismatch\",\"inputs\":[{\"name\":\"amountReleased\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePre\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePost\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RootAlreadyCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"RootNotCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SourceChainNotEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SourceChainSelectorMismatch\",\"inputs\":[{\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"StaleCommitReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"TokenDataMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"TokenHandlingError\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedTokenData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", - Bin: "0x610140806040523461088f57616886803803809161001d82856108c5565b8339810190808203610160811261088f5760a0811261088f5760405160a081016001600160401b038111828210176108945760405261005b836108e8565b815260208301519061ffff8216820361088f57602081019182526040840151936001600160a01b038516850361088f576040820194855261009e606082016108fc565b946060830195865260806100b38184016108fc565b84820190815295609f19011261088f57604051936100d0856108aa565b6100dc60a084016108fc565b855260c08301519363ffffffff8516850361088f576020860194855261010460e08501610910565b966040870197885261011961010086016108fc565b606088019081526101208601519095906001600160401b03811161088f5781018b601f8201121561088f5780519b6001600160401b038d11610894578c60051b91604051809e6020850161016d90836108c5565b81526020019281016020019082821161088f5760208101935b82851061078f57505050505061014061019f91016108fc565b98331561077e57600180546001600160a01b031916331790554660805284516001600160a01b031615801561076c575b801561075a575b6107385782516001600160401b0316156107495782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a182516001600160a01b031615610738579151600480548351865160ff60c01b90151560c01b1663ffffffff60a01b60a09290921b919091166001600160a01b039485166001600160c81b0319909316831717179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff166020820152935115159184019190915290511660608201529091907fcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee90608090a16000915b81518310156106805760009260208160051b8401015160018060401b036020820151169081156106715780516001600160a01b031615610662578186526008602052604086206060820151916001820192610399845461091d565b610603578254600160a81b600160e81b031916600160a81b1783556040518581527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b805180159081156105d8575b506105c9578051906001600160401b0382116105b55761040d855461091d565b601f8111610570575b50602090601f83116001146104f8579180916000805160206168668339815191529695949360019a9b9c926104ed575b5050600019600383901b1c191690881b1783555b60408101518254915160a089811b8a9003801960ff60a01b1990951693151590911b60ff60a01b1692909217929092169116178155610498846109da565b506104e26040519283926020845254888060a01b038116602085015260ff8160a01c1615156040850152888060401b039060a81c16606084015260808084015260a0830190610957565b0390a201919061033e565b015190503880610446565b858b52818b20919a601f198416905b8181106105585750916001999a9b8492600080516020616866833981519152989796958c951061053f575b505050811b01835561045a565b015160001960f88460031b161c19169055388080610532565b828d0151845560209c8d019c60019094019301610507565b858b5260208b20601f840160051c810191602085106105ab575b601f0160051c01905b8181106105a05750610416565b8b8155600101610593565b909150819061058a565b634e487b7160e01b8a52604160045260248afd5b6342bcdf7f60e11b8952600489fd5b9050602082012060405160208101908b8252602081526105f96040826108c5565b51902014386103ed565b825460a81c6001600160401b03166001141580610634575b156103e157632105803760e11b89526004859052602489fd5b5060405161064d816106468188610957565b03826108c5565b6020815191012081516020830120141561061b565b6342bcdf7f60e11b8652600486fd5b63c656089560e01b8652600486fd5b6001600160a01b0381161561073857600b8054600160401b600160e01b031916604092831b600160401b600160e01b031617905551615df89081610a6e82396080518161378d015260a05181818161049f01526142eb015260c0518181816104f501528181612dbb0152818161320f0152614285015260e0518181816105240152614adb01526101005181818161055301526146b60152610120518181816104c60152818161252d01528181614bce0152615b2d0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101d6565b5080516001600160a01b0316156101cf565b639b15e16f60e01b60005260046000fd5b84516001600160401b03811161088f5782016080818603601f19011261088f57604051906107bc826108aa565b60208101516001600160a01b038116810361088f5782526107df604082016108e8565b60208301526107f060608201610910565b604083015260808101516001600160401b03811161088f57602091010185601f8201121561088f5780516001600160401b0381116108945760405191610840601f8301601f1916602001846108c5565b818352876020838301011161088f5760005b82811061087a5750509181600060208096949581960101526060820152815201940193610186565b80602080928401015182828701015201610852565b600080fd5b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b0382111761089457604052565b601f909101601f19168101906001600160401b0382119082101761089457604052565b51906001600160401b038216820361088f57565b51906001600160a01b038216820361088f57565b5190811515820361088f57565b90600182811c9216801561094d575b602083101461093757565b634e487b7160e01b600052602260045260246000fd5b91607f169161092c565b600092918154916109678361091d565b80835292600181169081156109bd575060011461098357505050565b60009081526020812093945091925b8383106109a3575060209250010190565b600181602092949394548385870101520191019190610992565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a675760065468010000000000000000811015610894576001810180600655811015610a51577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806304666f9c1461017757806306285c691461017257806315777ab21461016d578063181f5a77146101685780633f4b04aa146101635780635215505b1461015e5780635e36480c146101595780635e7bb0081461015457806360987c201461014f57806365b81aab1461014a5780637437ff9f1461014557806379ba5097146101405780637edf52f41461013b57806385572ffb146101365780638da5cb5b14610131578063c673e5841461012c578063ccd37ba314610127578063de5e0b9a14610122578063e9d68a8e1461011d578063f2fde38b14610118578063f58e03fc146101135763f716f99f1461010e57600080fd5b6119b0565b611893565b611808565b611769565b6116cd565b611645565b61159a565b6114b2565b61147c565b6112b6565b611236565b61118d565b6110f7565b61107c565b610e77565b610909565b6107c4565b6106b7565b610658565b6105d1565b61046c565b61034c565b634e487b7160e01b600052604160045260246000fd5b608081019081106001600160401b038211176101ad57604052565b61017c565b60a081019081106001600160401b038211176101ad57604052565b604081019081106001600160401b038211176101ad57604052565b606081019081106001600160401b038211176101ad57604052565b60c081019081106001600160401b038211176101ad57604052565b90601f801991011681019081106001600160401b038211176101ad57604052565b6040519061024e60c08361021e565b565b6040519061024e60a08361021e565b6040519061024e6101008361021e565b6040519061024e60408361021e565b6001600160401b0381116101ad5760051b60200190565b6001600160a01b038116036102a657565b600080fd5b6001600160401b038116036102a657565b359061024e826102ab565b801515036102a657565b359061024e826102c7565b6001600160401b0381116101ad57601f01601f191660200190565b929192610303826102dc565b91610311604051938461021e565b8294818452818301116102a6578281602093846000960137010152565b9080601f830112156102a657816020610349933591016102f7565b90565b346102a65760203660031901126102a6576004356001600160401b0381116102a657366023820112156102a6578060040135906103888261027e565b90610396604051928361021e565b8282526024602083019360051b820101903682116102a65760248101935b8285106103c6576103c484611aeb565b005b84356001600160401b0381116102a6578201608060231982360301126102a657604051916103f383610192565b602482013561040181610295565b83526044820135610411816102ab565b60208401526064820135610424816102c7565b60408401526084820135926001600160401b0384116102a65761045160209493602486953692010161032e565b60608201528152019401936103b4565b60009103126102a657565b346102a65760003660031901126102a657610485611d86565b506105cd604051610495816101b2565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b346102a65760003660031901126102a65760206001600160a01b03600b5460401c16604051908152f35b6040519061060a60208361021e565b60008252565b60005b8381106106235750506000910152565b8181015183820152602001610613565b9060209161064c81518092818552858086019101610610565b601f01601f1916010190565b346102a65760003660031901126102a6576105cd604080519061067b818361021e565b601182527f4f666652616d7020312e362e302d646576000000000000000000000000000000602083015251918291602083526020830190610633565b346102a65760003660031901126102a65760206001600160401b03600b5416604051908152f35b9060806060610349936001600160a01b0381511684526020810151151560208501526001600160401b0360408201511660408501520151918160608201520190610633565b6040810160408252825180915260206060830193019060005b8181106107a5575050506020818303910152815180825260208201916020808360051b8301019401926000915b83831061077857505050505090565b9091929394602080610796600193601f1986820301875289516106de565b97019301930191939290610769565b82516001600160401b031685526020948501949092019160010161073c565b346102a65760003660031901126102a6576006546107e18161027e565b906107ef604051928361021e565b808252601f196107fe8261027e565b0160005b8181106108c057505061081481611dd8565b9060005b8181106108305750506105cd60405192839283610723565b8061086661084e61084260019461416c565b6001600160401b031690565b6108588387611e32565b906001600160401b03169052565b6108a461089f6108866108798488611e32565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611f1e565b6108ae8287611e32565b526108b98186611e32565b5001610818565b6020906108cb611db1565b82828701015201610802565b634e487b7160e01b600052602160045260246000fd5b600411156108f757565b6108d7565b9060048210156108f75752565b346102a65760403660031901126102a657602061093d60043561092b816102ab565b60243590610938826102ab565b611fb6565b61094a60405180926108fc565bf35b91908260a09103126102a657604051610964816101b2565b608080829480358452602081013561097b816102ab565b6020850152604081013561098e816102ab565b604085015260608101356109a1816102ab565b60608501520135916109b2836102ab565b0152565b359061024e82610295565b63ffffffff8116036102a657565b359061024e826109c1565b81601f820112156102a6578035906109f18261027e565b926109ff604051948561021e565b82845260208085019360051b830101918183116102a65760208101935b838510610a2b57505050505090565b84356001600160401b0381116102a657820160a0818503601f1901126102a65760405191610a58836101b2565b60208201356001600160401b0381116102a657856020610a7a9285010161032e565b83526040820135610a8a81610295565b6020840152610a9b606083016109cf565b60408401526080820135926001600160401b0384116102a65760a083610ac888602080988198010161032e565b606084015201356080820152815201940193610a1c565b919091610140818403126102a657610af561023f565b92610b00818361094c565b845260a08201356001600160401b0381116102a65781610b2191840161032e565b602085015260c08201356001600160401b0381116102a65781610b4591840161032e565b6040850152610b5660e083016109b6565b606085015261010082013560808501526101208201356001600160401b0381116102a657610b8492016109da565b60a0830152565b9080601f830112156102a6578135610ba28161027e565b92610bb0604051948561021e565b81845260208085019260051b820101918383116102a65760208201905b838210610bdc57505050505090565b81356001600160401b0381116102a657602091610bfe87848094880101610adf565b815201910190610bcd565b81601f820112156102a657803590610c208261027e565b92610c2e604051948561021e565b82845260208085019360051b830101918183116102a65760208101935b838510610c5a57505050505090565b84356001600160401b0381116102a657820183603f820112156102a6576020810135610c858161027e565b91610c93604051938461021e565b8183526020808085019360051b83010101918683116102a65760408201905b838210610ccc575050509082525060209485019401610c4b565b81356001600160401b0381116102a657602091610cf08a848080958901010161032e565b815201910190610cb2565b929190610d078161027e565b93610d15604051958661021e565b602085838152019160051b81019283116102a657905b828210610d3757505050565b8135815260209182019101610d2b565b9080601f830112156102a65781602061034993359101610cfb565b81601f820112156102a657803590610d798261027e565b92610d87604051948561021e565b82845260208085019360051b830101918183116102a65760208101935b838510610db357505050505090565b84356001600160401b0381116102a657820160a0818503601f1901126102a657610ddb610250565b91610de8602083016102bc565b835260408201356001600160401b0381116102a657856020610e0c92850101610b8b565b602084015260608201356001600160401b0381116102a657856020610e3392850101610c09565b60408401526080820135926001600160401b0384116102a65760a083610e60886020809881980101610d47565b606084015201356080820152815201940193610da4565b346102a65760403660031901126102a6576004356001600160401b0381116102a657610ea7903690600401610d62565b6024356001600160401b0381116102a657366023820112156102a657806004013591610ed28361027e565b91610ee0604051938461021e565b8383526024602084019460051b820101903682116102a65760248101945b828610610f0f576103c48585611ffe565b85356001600160401b0381116102a6578201366043820112156102a6576024810135610f3a8161027e565b91610f48604051938461021e565b818352602060248185019360051b83010101903682116102a65760448101925b828410610f82575050509082525060209586019501610efe565b83356001600160401b0381116102a6576024908301016040601f1982360301126102a65760405190610fb3826101cd565b6020810135825260408101356001600160401b0381116102a657602091010136601f820112156102a657803590610fe98261027e565b91610ff7604051938461021e565b80835260208084019160051b830101913683116102a657602001905b8282106110325750505091816020938480940152815201930192610f68565b602080918335611041816109c1565b815201910190611013565b9181601f840112156102a6578235916001600160401b0383116102a6576020808501948460051b0101116102a657565b346102a65760603660031901126102a6576004356001600160401b0381116102a6576110ac903690600401610adf565b6024356001600160401b0381116102a6576110cb90369060040161104c565b91604435926001600160401b0384116102a6576110ef6103c494369060040161104c565b939092612411565b346102a65760203660031901126102a65760043561111481610295565b61111c61358a565b6001600160a01b0381161561117c577fffffffff0000000000000000000000000000000000000000ffffffffffffffff7bffffffffffffffffffffffffffffffffffffffff0000000000000000600b549260401b16911617600b55600080f35b6342bcdf7f60e11b60005260046000fd5b346102a65760003660031901126102a6576111a66126de565b506105cd6040516111b681610192565b60ff6004546001600160a01b038116835263ffffffff8160a01c16602084015260c01c16151560408201526001600160a01b036005541660608201526040519182918291909160606001600160a01b0381608084019582815116855263ffffffff6020820151166020860152604081015115156040860152015116910152565b346102a65760003660031901126102a6576000546001600160a01b03811633036112a5576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b346102a65760803660031901126102a65760006040516112d581610192565b6004356112e181610295565b81526024356112ef816109c1565b6020820152604435611300816102c7565b604082015260643561131181610295565b606082015261131e61358a565b6001600160a01b038151161561146d576114678161137d6001600160a01b037fcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee9451166001600160a01b03166001600160a01b03196004541617600455565b60208101516004547fffffffffffffff0000000000ffffffffffffffffffffffffffffffffffffffff77ffffffff000000000000000000000000000000000000000078ff0000000000000000000000000000000000000000000000006040860151151560c01b169360a01b169116171760045561142361140760608301516001600160a01b031690565b6001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160606001600160a01b0381608084019582815116855263ffffffff6020820151166020860152604081015115156040860152015116910152565b0390a180f35b6342bcdf7f60e11b8252600482fd5b346102a65760203660031901126102a6576004356001600160401b0381116102a65760a09060031990360301126102a657600080fd5b346102a65760003660031901126102a65760206001600160a01b0360015416604051908152f35b6004359060ff821682036102a657565b359060ff821682036102a657565b906020808351928381520192019060005b8181106115155750505090565b82516001600160a01b0316845260209384019390920191600101611508565b906103499160208152606082518051602084015260ff602082015116604084015260ff604082015116828401520151151560808201526040611585602084015160c060a085015260e08401906114f7565b9201519060c0601f19828503019101526114f7565b346102a65760203660031901126102a65760ff6115b56114d9565b6060604080516115c4816101e8565b6115cc6126de565b815282602082015201521660005260026020526105cd60406000206003611634604051926115f9846101e8565b61160281612703565b845260405161161f81611618816002860161273c565b038261021e565b6020850152611618604051809481930161273c565b604082015260405191829182611534565b346102a65760403660031901126102a657600435611662816102ab565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b906004916044116102a657565b9181601f840112156102a6578235916001600160401b0383116102a657602083818601950101116102a657565b346102a65760c03660031901126102a6576116e736611693565b6044356001600160401b0381116102a6576117069036906004016116a0565b6064929192356001600160401b0381116102a65761172890369060040161104c565b60843594916001600160401b0386116102a65761174c6103c496369060040161104c565b94909360a43596612d76565b9060206103499281815201906106de565b346102a65760203660031901126102a6576001600160401b0360043561178e816102ab565b611796611db1565b501660005260086020526105cd604060002060016117f7604051926117ba84610192565b6001600160401b0381546001600160a01b038116865260ff8160a01c161515602087015260a81c1660408501526116186040518094819301611e80565b606082015260405191829182611758565b346102a65760203660031901126102a6576001600160a01b0360043561182d81610295565b61183561358a565b1633811461188257806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b346102a65760603660031901126102a6576118ad36611693565b6044356001600160401b0381116102a6576118cc9036906004016116a0565b918282016020838203126102a6578235906001600160401b0382116102a6576118f6918401610d62565b604051906020611906818461021e565b60008352601f19810160005b81811061193a575050506103c4949161192a916137ce565b611932613285565b928392613b34565b60608582018401528201611912565b9080601f830112156102a65781356119608161027e565b9261196e604051948561021e565b81845260208085019260051b8201019283116102a657602001905b8282106119965750505090565b6020809183356119a581610295565b815201910190611989565b346102a65760203660031901126102a6576004356001600160401b0381116102a657366023820112156102a6578060040135906119ec8261027e565b906119fa604051928361021e565b8282526024602083019360051b820101903682116102a65760248101935b828510611a28576103c4846132a1565b84356001600160401b0381116102a657820160c060231982360301126102a657611a5061023f565b9160248201358352611a64604483016114e9565b6020840152611a75606483016114e9565b6040840152611a86608483016102d1565b606084015260a48201356001600160401b0381116102a657611aae9060243691850101611949565b608084015260c4820135926001600160401b0384116102a657611adb602094936024869536920101611949565b60a0820152815201940193611a18565b611af361358a565b60005b8151811015611d8257611b098183611e32565b5190611b1f60208301516001600160401b031690565b916001600160401b038316908115611d7157611b54611b48611b4883516001600160a01b031690565b6001600160a01b031690565b1561117c57611b76846001600160401b03166000526008602052604060002090565b906060810151916001810195611b8c8754611e46565b611cff57611bff7ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb991611be584750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b82518015908115611ce9575b5061117c57611cca611cae611ce093611c4b7f49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b9660019a61362c565b611ca1611c5b6040830151151590565b85547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178555565b516001600160a01b031690565b82906001600160a01b03166001600160a01b0319825416179055565b611cd3846151a7565b50604051918291826136fd565b0390a201611af6565b90506020840120611cf86135af565b1438611c0f565b60016001600160401b03611d1e84546001600160401b039060a81c1690565b16141580611d52575b611d315750611c03565b632105803760e11b6000526001600160401b031660045260246000fd5b6000fd5b50611d5c87611f03565b60208151910120845160208601201415611d27565b63c656089560e01b60005260046000fd5b5050565b60405190611d93826101b2565b60006080838281528260208201528260408201528260608201520152565b60405190611dbe82610192565b606080836000815260006020820152600060408201520152565b90611de28261027e565b611def604051918261021e565b8281528092611e00601f199161027e565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611e2d5760200190565b611e0a565b8051821015611e2d5760209160051b010190565b90600182811c92168015611e76575b6020831014611e6057565b634e487b7160e01b600052602260045260246000fd5b91607f1691611e55565b60009291815491611e9083611e46565b8083529260018116908115611ee65750600114611eac57505050565b60009081526020812093945091925b838310611ecc575060209250010190565b600181602092949394548385870101520191019190611ebb565b915050602093945060ff929192191683830152151560051b010190565b9061024e611f179260405193848092611e80565b038361021e565b9060016060604051611f2f81610192565b6109b281956001600160401b0381546001600160a01b038116855260ff8160a01c161515602086015260a81c166040840152611f716040518096819301611e80565b038461021e565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611fa457565b611f78565b91908203918211611fa457565b611fc282607f92613747565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611fa4576003911c1660048110156108f75790565b61200661378b565b8051825181036121fd5760005b8181106120265750509061024e916137ce565b6120308184611e32565b5160208101908151516120438488611e32565b5192835182036121fd5790916000925b808410612067575050505050600101612013565b91949398612079848b98939598611e32565b515198612087888851611e32565b5199806121b4575b5060a08a01988b60206120a58b8d515193611e32565b51015151036121775760005b8a5151811015612162576120ed6120e46120da8f60206120d28f8793611e32565b510151611e32565b5163ffffffff1690565b63ffffffff1690565b8b816120fe575b50506001016120b1565b6120e460406121118561211d9451611e32565b51015163ffffffff1690565b9081811061212c57508b6120f4565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091612053565b611d4e8b51612192606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b60808b015181101561208f57611d4e908b6121d688516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b6040519061221b826101cd565b60006020838281520152565b6040519061223660208361021e565b600080835282815b82811061224a57505050565b60209061225561220e565b8282850101520161223e565b805182526001600160401b03602082015116602083015260806122a8612296604084015160a0604087015260a0860190610633565b60608401518582036060870152610633565b9101519160808183039101526020808351928381520192019060005b8181106122d15750505090565b825180516001600160a01b0316855260209081015181860152604090940193909201916001016122c4565b906020610349928181520190612261565b6040513d6000823e3d90fd5b3d15612344573d9061232a826102dc565b91612338604051938461021e565b82523d6000602084013e565b606090565b906020610349928181520190610633565b81601f820112156102a6578051612370816102dc565b9261237e604051948561021e565b818452602082840101116102a6576103499160208085019101610610565b90916060828403126102a65781516123b3816102c7565b9260208301516001600160401b0381116102a6576040916123d591850161235a565b92015190565b9293606092959461ffff6123ff6001600160a01b0394608088526080880190612261565b97166020860152604085015216910152565b929093913033036126cd57612424612227565b9460a08501518051612686575b505050505080519161244f602084519401516001600160401b031690565b90602083015191604084019261247c845192612469610250565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b036124a56005546001600160a01b031690565b1680612609575b50515115806125fd575b80156125e7575b80156125be575b611d825761255691816124fb611b486124ee610886602060009751016001600160401b0390511690565b546001600160a01b031690565b9083612516606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f000000000000000000000000000000000000000000000000000000000000000090600486016123db565b03925af19081156125b957600090600092612592575b50156125755750565b6040516302a35ba360e21b815290819061215e9060048301612349565b90506125b191503d806000833e6125a9818361021e565b81019061239c565b50903861256c565b61230d565b506125e26125de6125d960608401516001600160a01b031690565b6139f5565b1590565b6124c4565b5060608101516001600160a01b03163b156124bd565b506080810151156124b6565b803b156102a657600060405180926308d450a160e01b82528183816126318a600483016122fc565b03925af1908161266b575b506126655761215e61264c612319565b6040516309c2532560e01b815291829160048301612349565b386124ac565b8061267a60006126809361021e565b80610461565b3861263c565b85965060206126c29601516126a560608901516001600160a01b031690565b906126bc60208a51016001600160401b0390511690565b926138dc565b903880808080612431565b6306e34e6560e31b60005260046000fd5b604051906126eb82610192565b60006060838281528260208201528260408201520152565b9060405161271081610192565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106127605750505090565b82546001600160a01b0316845260209093019260019283019201612753565b9061024e611f17926040519384809261273c565b35906001600160e01b03821682036102a657565b81601f820112156102a6578035906127be8261027e565b926127cc604051948561021e565b82845260208085019360061b830101918183116102a657602001925b8284106127f6575050505090565b6040848303126102a65760206040918251612810816101cd565b863561281b816102ab565b8152612828838801612793565b838201528152019301926127e8565b81601f820112156102a65780359061284e8261027e565b9261285c604051948561021e565b82845260208085019360051b830101918183116102a65760208101935b83851061288857505050505090565b84356001600160401b0381116102a657820160a0818503601f1901126102a657604051916128b5836101b2565b60208201356128c3816102ab565b83526040820135926001600160401b0384116102a65760a0836128ed88602080988198010161032e565b8584015260608101356128ff816102ab565b60408401526080810135612912816102ab565b606084015201356080820152815201940193612879565b81601f820112156102a6578035906129408261027e565b9261294e604051948561021e565b82845260208085019360061b830101918183116102a657602001925b828410612978575050505090565b6040848303126102a65760206040918251612992816101cd565b86358152828701358382015281520193019261296a565b6020818303126102a6578035906001600160401b0382116102a657016060818303126102a657604051916129dc836101e8565b81356001600160401b0381116102a65782016040818303126102a65760405190612a05826101cd565b80356001600160401b0381116102a657810183601f820112156102a6578035612a2d8161027e565b91612a3b604051938461021e565b81835260208084019260061b820101908682116102a657602001915b818310612ad35750505082526020810135906001600160401b0382116102a657612a83918491016127a7565b6020820152835260208201356001600160401b0381116102a65781612aa9918401612837565b602084015260408201356001600160401b0381116102a657612acb9201612929565b604082015290565b6040838803126102a65760206040918251612aed816101cd565b8535612af881610295565b8152612b05838701612793565b83820152815201920191612a57565b9080602083519182815201916020808360051b8301019401926000915b838310612b4057505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612b7e8585015160a08786015260a0850190610633565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612b31565b916001600160a01b03612bda92168352606060208401526060830190612b14565b9060408183039101526020808351928381520192019060005b818110612c005750505090565b8251805185526020908101518186015260409094019390920191600101612bf3565b906020808351928381520192019060005b818110612c405750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612c33565b9190604081019083519160408252825180915260206060830193019060005b818110612cb457505050602061034993940151906020818403910152612c22565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612c93565b906020610349928181520190612c74565b908160209103126102a65751610349816102c7565b9091612d2561034993604084526040840190610633565b916020818403910152611e80565b6001600160401b036001911601906001600160401b038211611fa457565b9091612d6861034993604084526040840190612b14565b916020818403910152612c74565b929693959190979497612d8b828201826129a9565b98612d9f6125de60045460ff9060c01c1690565b6131f3575b895180515115908115916131e4575b5061310b575b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316999860208a019860005b8a5180518210156130a95781612e0291611e32565b518d612e1582516001600160401b031690565b604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201529091602090829060249082905afa9081156125b95760009161307b575b5061305e57612e6490613a43565b60208201805160208151910120906001830191612e8083611f03565b6020815191012003613041575050805460408301516001600160401b039081169160a81c168114801590613019575b612fc757506080820151908115612fb657612f0082612ef1612ed886516001600160401b031690565b6001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b54612f82578291612f66612f7b92612f2d612f2860606001999801516001600160401b031690565b612d33565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b612ef1612ed84294516001600160401b031690565b5501612ded565b50612f97611d4e92516001600160401b031690565b6332cf0cbf60e01b6000526001600160401b0316600452602452604490565b63504570e360e01b60005260046000fd5b82611d4e91612ff16060612fe284516001600160401b031690565b9301516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b5061303161084260608501516001600160401b031690565b6001600160401b03821611612eaf565b5161215e60405192839263b80d8fa960e01b845260048401612d0e565b637edeb53960e11b6000526001600160401b031660045260246000fd5b61309c915060203d81116130a2575b613094818361021e565b810190612cf9565b38612e56565b503d61308a565b50506131059496989b507f35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e461024e9b6130fd949597999b519051906130f360405192839283612d51565b0390a13691610cfb565b943691610cfb565b93613e2e565b613120602086015b356001600160401b031690565b600b546001600160401b03828116911610156131c857613156906001600160401b03166001600160401b0319600b541617600b55565b61316e611b48611b486004546001600160a01b031690565b8a5190803b156102a657604051633937306f60e01b815291600091839182908490829061319e9060048301612ce8565b03925af180156125b9576131b3575b50612db9565b8061267a60006131c29361021e565b386131ad565b5060208a015151612db957632261116760e01b60005260046000fd5b60209150015151151538612db3565b60208a01518051613205575b50612da4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060408c0151823b156102a657604051633854844f60e11b815292600092849283918291613261913060048501612bb9565b03915afa80156125b957156131ff578061267a600061327f9361021e565b386131ff565b6040519061329460208361021e565b6000808352366020840137565b6132a961358a565b60005b8151811015611d82576132bf8183611e32565b51906040820160ff6132d2825160ff1690565b161561357457602083015160ff16926132f88460ff166000526002602052604060002090565b916001830191825461331361330d8260ff1690565b60ff1690565b61353957506133406133286060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a081019182516101008151116134e157805115613523576003860161336e6133688261277f565b8a614f55565b60608401516133fe575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946002946133da6133ca6133f89a966133c38760019f9c6133be6133f09a8f6150b6565b61406f565b5160ff1690565b845460ff191660ff821617909455565b51908185555190604051958695019088866140f5565b0390a1615138565b016132ac565b9794600287939597019661341a6134148961277f565b88614f55565b60808501519461010086511161350d57855161344261330d61343d8a5160ff1690565b61405b565b10156134f75785518451116134e1576133da6133ca7fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547986133c38760019f6133be6133f89f9a8f6134c960029f6134c36133f09f8f906133be84926134a8845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b82614fe9565b505050979c9f50975050969a50505094509450613378565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff1661355461354f6060840151151590565b151590565b90151514613340576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b6001600160a01b0360015416330361359e57565b6315ae3a6f60e11b60005260046000fd5b604051602081019060008252602081526135ca60408261021e565b51902090565b8181106135db575050565b600081556001016135d0565b9190601f81116135f657505050565b61024e926000526020600020906020601f840160051c83019310613622575b601f0160051c01906135d0565b9091508190613615565b91909182516001600160401b0381116101ad576136538161364d8454611e46565b846135e7565b6020601f8211600114613694578190613685939495600092613689575b50508160011b916000199060031b1c19161790565b9055565b015190503880613670565b601f198216906136a984600052602060002090565b9160005b8181106136e5575095836001959697106136cc575b505050811b019055565b015160001960f88460031b161c191690553880806136c2565b9192602060018192868b0151815501940192016136ad565b90600160a061034993602081526001600160401b0384546001600160a01b038116602084015260ff81851c161515604084015260a81c166060820152608080820152019101611e80565b906001600160401b03613787921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036137b65750565b630f01ce8560e01b6000526004524660245260446000fd5b9190918051156138705782511592602091604051926137ed818561021e565b60008452601f19810160005b81811061384c5750505060005b8151811015613844578061382d61381f60019385611e32565b518815613833578690614234565b01613806565b61383d8387611e32565b5190614234565b505050509050565b829060405161385a816101cd565b60008152606083820152828289010152016137f9565b63c2e5347d60e01b60005260046000fd5b9190811015611e2d5760051b0190565b35610349816109c1565b9190811015611e2d5760051b81013590601e19813603018212156102a65701908135916001600160401b0383116102a65760200182360381136102a6579190565b909294919397968151966138ef8861027e565b976138fd604051998a61021e565b80895261390c601f199161027e565b0160005b8181106139de57505060005b83518110156139d157806139638c8a8a8a61395d613956878d61394f828f8f9d8f9e60019f8161397f575b505050611e32565b519761389b565b36916102f7565b93614a8c565b61396d828c611e32565b52613978818b611e32565b500161391c565b63ffffffff613997613992858585613881565b613891565b1615613947576139c7926139ae9261399292613881565b60406139ba8585611e32565b51019063ffffffff169052565b8f8f908391613947565b5096985050505050505050565b6020906139e961220e565b82828d01015201613910565b613a066385572ffb60e01b82614def565b9081613a20575b81613a16575090565b6103499150614dc1565b9050613a2b81614d46565b1590613a0d565b613a0663aff2afbf60e01b82614def565b6001600160401b031680600052600860205260406000209060ff825460a01c1615613a6c575090565b63ed053c5960e01b60005260045260246000fd5b6084019081608411611fa457565b60a001908160a011611fa457565b91908201809211611fa457565b600311156108f757565b60038210156108f75752565b9061024e604051613acf816101cd565b602060ff829554818116845260081c169101613ab3565b8054821015611e2d5760005260206000200190600090565b60ff60019116019060ff8211611fa457565b60ff601b9116019060ff8211611fa457565b90606092604091835260208301370190565b6001600052600260205293613b687fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612703565b93853594613b7585613a80565b6060820190613b848251151590565b613e00575b803603613de857508151878103613dcf5750613ba361378b565b60016000526003602052613bf2613bed7fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b613abf565b60026020820151613c0281613aa9565b613c0b81613aa9565b149081613d67575b5015613d3b575b51613c72575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613c5661311360019460200190565b604080519283526001600160401b0391909116602083015290a2565b613c9361330d613c8e602085969799989a955194015160ff1690565b613afe565b03613d2a578151835103613d1957613d116000613c569461311394613cdd7f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b36916102f7565b60208151910120604051613d0881613cfa89602083019586613b22565b03601f19810183528261021e565b5190208a614e1f565b948394613c20565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613c1a57631b41e11d60e31b60005260046000fd5b60016000526002602052613dc79150611b4890613db490613dae60037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b90613ae6565b90546001600160a01b039160031b1c1690565b331438613c13565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613e2990613e23613e19613e148751611f8e565b613a8e565b613e238851611f8e565b90613a9c565b613b89565b60008052600260205294909390929091613e677fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612703565b94863595613e7483613a80565b6060820190613e838251151590565b614038575b803603613de85750815188810361401f5750613ea261378b565b600080526003602052613ed7613bed7f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613bd5565b60026020820151613ee781613aa9565b613ef081613aa9565b149081613fd6575b5015613faa575b51613f3c575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613c5661311360009460200190565b613f5861330d613c8e602087989a999b96975194015160ff1690565b03613d2a578351865103613d19576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613c5695613cdd613fa1946131139736916102f7565b94839438613f05565b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613eff57631b41e11d60e31b60005260046000fd5b6000805260026020526140179150611b4890613db490613dae60037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613da5565b331438613ef8565b6324f7d61360e21b600052600452602488905260446000fd5b61405690613e2361404c613e148951611f8e565b613e238a51611f8e565b613e88565b60ff166003029060ff8216918203611fa457565b8151916001600160401b0383116101ad576801000000000000000083116101ad5760209082548484558085106140d8575b500190600052602060002060005b8381106140bb5750505050565b60019060206001600160a01b0385511694019381840155016140ae565b6140ef9084600052858460002091820191016135d0565b386140a0565b95949392909160ff61411a93168752602087015260a0604087015260a086019061273c565b84810360608601526020808351928381520192019060005b81811061414d5750505090608061024e9294019060ff169052565b82516001600160a01b0316845260209384019390920191600101614132565b600654811015611e2d5760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b036103499493816060941683521660208201528160408201520190610633565b604090610349939281528160208201520190610633565b9291906001600160401b039081606495166004521660245260048110156108f757604452565b94939261421e60609361422f93885260208801906108fc565b608060408701526080860190610633565b930152565b9061424682516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156125b95760009161496a575b506149285760208301918251519485156148f8576040850180515187036148e7576142e887611dd8565b957f000000000000000000000000000000000000000000000000000000000000000061431e600161431887613a43565b01611f03565b6020815191012060405161437e81613cfa6020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a811061484f5750505080608060606143ae9301519101519088866153e8565b9788156148315760005b8881106143cb5750505050505050505050565b5a6143e06143da838a51611e32565b51615708565b8051606001516143f9906001600160401b031688611fb6565b614402816108ed565b8015908d828315938461481e575b156147db576060881561475e5750614437602061442d898d611e32565b5101519242611fa9565b60045461444c9060a01c63ffffffff166120e4565b10801561474b575b1561472d57614463878b611e32565b5151614717575b845160800151614482906001600160401b0316610842565b61465f575b50614493868951611e32565b5160a08501515181510361462357936144f89695938c938f966144d88e958c926144d26144cc60608951016001600160401b0390511690565b896157db565b866159dc565b9a9080966144f260608851016001600160401b0390511690565b90615863565b6145d1575b5050614508826108ed565b60028203614589575b60019661457f7f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b039351926145706145678b61455f60608801516001600160401b031690565b96519b611e32565b51985a90611fa9565b91604051958695169885614205565b0390a45b016143b8565b91509193949250614599826108ed565b600382036145ad578b929493918a91614511565b51606001516349362d1f60e11b600052611d4e91906001600160401b0316896141df565b6145da846108ed565b600384036144fd5790929495506145f29193506108ed565b614602578b92918a9138806144fd565b5151604051632b11b8d960e01b815290819061215e908790600484016141c8565b611d4e8b61463d60608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b614668836108ed565b614673575b38614487565b8351608001516001600160401b0316602080860151918c6146a860405194859384936370701e5760e11b8552600485016141a1565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af19081156125b9576000916146f9575b5061466d575050505050600190614583565b614711915060203d81116130a257613094818361021e565b386146e7565b614721878b611e32565b5151608086015261446a565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b50614755836108ed565b60038314614454565b91508361476a846108ed565b1561446a575060019594506147d392506147b191507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a1614583565b5050505060019291506147d36147b160607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b50614828836108ed565b60038314614410565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b61485a818a51611e32565b518051604001516001600160401b03168381036148ca57508051602001516001600160401b03168981036148a7575090614896846001936152e0565b6148a0828d611e32565b520161438e565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611d4e61490c86516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b509291505061305e576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b614983915060203d6020116130a257613094818361021e565b386142be565b519061024e82610295565b908160209103126102a6575161034981610295565b90610349916020815260e0614a47614a326149d285516101006020870152610120860190610633565b60208601516001600160401b0316604086015260408601516001600160a01b0316606086015260608601516080860152614a1c608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c0870152610633565b60c0850151848203601f190184860152610633565b92015190610100601f1982850301910152610633565b6040906001600160a01b0361034994931681528160208201520190610633565b908160209103126102a6575190565b91939293614a9861220e565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9384156125b957600094614d15575b506001600160a01b0384169586158015614d03575b614ce557614bca614bf392613cfa92614b4e614b476120e460408c015163ffffffff1690565b8c89615af5565b9690996080810151614b7c6060835193015193614b6961025f565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b6020820152928391602483016149a9565b82857f000000000000000000000000000000000000000000000000000000000000000092615b83565b94909115614cc95750805160208103614cb0575090614c1c826020808a95518301019101614a7d565b956001600160a01b03841603614c54575b5050505050614c4c614c3d61026f565b6001600160a01b039093168352565b602082015290565b614c6793614c6191611fa9565b91615af5565b50908082108015614c9d575b614c7f57808481614c2d565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614ca98284611fa9565b1415614c73565b631e3be00960e21b600052602060045260245260446000fd5b61215e604051928392634ff17cad60e11b845260048401614a5d565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614d106125de86613a32565b614b21565b614d3891945060203d602011614d3f575b614d30818361021e565b810190614994565b9238614b0c565b503d614d26565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614d7460448361021e565b6179185a10614db0576020926000925191617530fa6000513d82614da4575b5081614d9d575090565b9050151590565b60201115915038614d93565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614d7460448361021e565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614d7460448361021e565b919390926000948051946000965b868810614e3e575050505050505050565b6020881015611e2d5760206000614e56878b1a613b10565b614e608b87611e32565b5190614e97614e6f8d8a611e32565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa156125b957614edd613bed600051614ec58960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b9060016020830151614eee81613aa9565b614ef781613aa9565b03614f4457614f14614f0a835160ff1690565b60ff600191161b90565b8116614f3357614f2a614f0a6001935160ff1690565b17970196614e2d565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b8351811015614fae5760019060ff831660005260036020526000614fa7604082206001600160a01b03614f8e858a611e32565b51166001600160a01b0316600052602052604060002090565b5501614f5b565b50509050565b8151815460ff191660ff91909116178155906020015160038110156108f757815461ff00191660089190911b61ff0016179055565b919060005b8151811015614fae57615004611ca18284611e32565b9061502d61502383614ec58860ff166000526003602052604060002090565b5460081c60ff1690565b61503681613aa9565b6150a1576001600160a01b038216156150905761508a60019261508561505a61026f565b60ff851681529161506e8660208501613ab3565b614ec58960ff166000526003602052604060002090565b614fb4565b01614fee565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015614fae576150d1611ca18284611e32565b906150f061502383614ec58860ff166000526003602052604060002090565b6150f981613aa9565b6150a1576001600160a01b038216156150905761513260019261508561511d61026f565b60ff851681529161506e600260208501613ab3565b016150bb565b60ff1680600052600260205260ff60016040600020015460101c16908015600014615186575015615175576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146151905750565b61519657565b6307b8c74d60e51b60005260046000fd5b8060005260076020526040600020541560001461522557600654680100000000000000008110156101ad57600181016006556000600654821015611e2d57600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b9080602083519182815201916020808360051b8301019401926000915b83831061525757505050505090565b9091929394602080600192601f198582030186528851906080806152ba615287855160a0865260a0860190610633565b6001600160a01b0387870151168786015263ffffffff604087015116604086015260608601518582036060870152610633565b93015191015297019301930191939290615248565b90602061034992818152019061522b565b6135ca81518051906153746152ff60608601516001600160a01b031690565b613cfa61531660608501516001600160401b031690565b9361532f6080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613cfa6020840151602081519101209360a06040820151602081519101209101516040516153ad81613cfa6020820194856152cf565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b03926153fb92615c40565b9116600052600a60205260406000209060005260205260406000205490565b91908260a09103126102a657604051615432816101b2565b6080808294805184526020810151615449816102ab565b6020850152604081015161545c816102ab565b6040850152606081015161546f816102ab565b60608501520151916109b2836102ab565b519061024e826109c1565b81601f820112156102a6578051906154a28261027e565b926154b0604051948561021e565b82845260208085019360051b830101918183116102a65760208101935b8385106154dc57505050505090565b84516001600160401b0381116102a657820160a0818503601f1901126102a65760405191615509836101b2565b60208201516001600160401b0381116102a65785602061552b9285010161235a565b8352604082015161553b81610295565b602084015261554c60608301615480565b60408401526080820151926001600160401b0384116102a65760a08361557988602080988198010161235a565b6060840152015160808201528152019401936154cd565b6020818303126102a6578051906001600160401b0382116102a65701610140818303126102a6576155bf61023f565b916155ca818361541a565b835260a08201516001600160401b0381116102a657816155eb91840161235a565b602084015260c08201516001600160401b0381116102a6578161560f91840161235a565b604084015261562060e08301614989565b606084015261010082015160808401526101208201516001600160401b0381116102a65761564e920161548b565b60a082015290565b610349916001600160401b036080835180518452826020820151166020850152826040820151166040850152826060820151166060850152015116608082015260a06156c76156b5602085015161014084860152610140850190610633565b604085015184820360c0860152610633565b60608401516001600160a01b031660e084015292608081015161010084015201519061012081840391015261522b565b906020610349928181520190615656565b6000615780819260405161571b81610203565b615723611d86565b81526060602082015260606040820152836060820152836080820152606060a082015250615763611b48611b48600b546001600160a01b039060401c1690565b90604051948580948193634546c6e560e01b8352600483016156f7565b03925af1600091816157b6575b506103495761215e61579d612319565b60405163828ebdfb60e01b815291829160048301612349565b6157d49192503d806000833e6157cc818361021e565b810190615590565b903861578d565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611fa457615860916001600160401b0361581e8584613747565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b55565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611fa45761589b8484613747565b60048310156108f7576001600160401b036158609416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b9061590290606083526060830190615656565b8181036020830152825180825260208201916020808360051b8301019501926000915b83831061597257505050505060408183039101526020808351928381520192019060005b8181106159565750505090565b825163ffffffff16845260209384019390920191600101615949565b9091929395602080615990600193601f198682030187528a51610633565b98019301930191939290615925565b80516020909101516001600160e01b03198116929190600482106159c1575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b156102a657600091615a056040519485938493630304c3e160e51b8552600485016158ef565b038183305af19081615ae0575b50615ad557615a1f612319565b9072c11c11c11c11c11c11c11c11c11c11c11c11c13314615a41575b60039190565b615a5a615a4d8361599f565b6001600160e01b03191690565b6337c3be2960e01b148015615aba575b8015615a9f575b15615a3b57611d4e615a828361599f565b632882569d60e01b6000526001600160e01b031916600452602490565b50615aac615a4d8361599f565b63753fa58960e11b14615a71565b50615ac7615a4d8361599f565b632be8ca8b60e21b14615a6a565b6002906103496105fb565b8061267a6000615aef9361021e565b38615a12565b6040516370a0823160e01b60208201526001600160a01b039091166024820152919291615b5290615b298160448101613cfa565b84837f000000000000000000000000000000000000000000000000000000000000000092615b83565b92909115614cc95750805160208103614cb0575090615b7d8260208061034995518301019101614a7d565b93611fa9565b939193615b9060846102dc565b94615b9e604051968761021e565b60848652615bac60846102dc565b602087019590601f1901368737833b15615c2f575a90808210615c1e578291038060061c90031115615c0d576000918291825a9560208451940192f1905a9003923d9060848211615c04575b6000908287523e929190565b60849150615bf8565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b8051928251908415615d9c5761010185111580615d90575b15615cbf57818501946000198601956101008711615cbf578615615d8057615c7f87611dd8565b9660009586978795885b848110615ce4575050505050600119018095149384615cda575b505082615cd0575b505015615cbf57615cbb91611e32565b5190565b6309bde33960e01b60005260046000fd5b1490503880615cab565b1492503880615ca3565b6001811b82811603615d7257868a1015615d5d57615d0660018b019a85611e32565b51905b8c888c1015615d495750615d2160018c019b86611e32565b515b818d11615cbf57615d42828f92615d3c90600196615dad565b92611e32565b5201615c89565b60018d019c615d5791611e32565b51615d23565b615d6b60018c019b8d611e32565b5190615d09565b615d6b600189019884611e32565b505050509050615cbb9150611e20565b50610101821115615c58565b630469ac9960e21b60005260046000fd5b81811015615dbf579061034991615dc4565b610349915b906040519060208201926001845260408301526060820152606081526135ca60808261021e56fea164736f6c634300081a000a49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"messageTransformerAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applySourceChainConfigUpdates\",\"inputs\":[{\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"commit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"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\":\"execute\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeSingleMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllSourceChainConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExecutionState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMerkleRoot\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMessageTransformer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyExecute\",\"inputs\":[{\"name\":\"reports\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\",\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"components\":[{\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMessageTransformer\",\"inputs\":[{\"name\":\"messageTransformerAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AlreadyAttempted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RootRemoved\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedAlreadyExecutedMessage\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedReportExecution\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainConfigSet\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sourceConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainSelectorAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaticConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CommitOnRampMismatch\",\"inputs\":[{\"name\":\"reportOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"configOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"EmptyBatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyReport\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientGasToCompleteTx\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"InvalidDataLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInterval\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"min\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"max\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionGasLimit\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"newLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionTokenGasOverride\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"oldLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverride\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageDestChainSelector\",\"inputs\":[{\"name\":\"messageDestChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNewState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newState\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}]},{\"type\":\"error\",\"name\":\"InvalidOnRampUpdate\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionGasAmountCountMismatch\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ManualExecutionGasLimitMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionNotYetEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageTransformError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotACompatiblePool\",\"inputs\":[{\"name\":\"notPool\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReceiverError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReleaseOrMintBalanceMismatch\",\"inputs\":[{\"name\":\"amountReleased\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePre\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePost\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RootAlreadyCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"RootBlessingMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"isBlessed\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"RootNotCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SourceChainNotEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SourceChainSelectorMismatch\",\"inputs\":[{\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"StaleCommitReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"TokenDataMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"TokenHandlingError\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedTokenData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", + Bin: "0x61014080604052346108a157616a6b803803809161001d82856108d7565b83398101908082039061014082126108a15760a082126108a157604051610043816108bc565b61004c826108fa565b815260208201519261ffff841684036108a1576020820193845260408301516001600160a01b03811681036108a1576040830190815261008e6060850161090e565b946060840195865260606100a46080870161090e565b6080860190815293609f1901126108a15760405193606085016001600160401b038111868210176108a6576040526100de60a0870161090e565b855260c08601519363ffffffff851685036108a1576020860194855261010660e0880161090e565b604087019081526101008801519097906001600160401b0381116108a15781018a601f820112156108a15780519a6001600160401b038c116108a6578b60051b916020806040519e8f9061015c838801836108d7565b81520193820101908282116108a15760208101935b82851061079057505050505061012061018a910161090e565b97331561077f57600180546001600160a01b031916331790554660805284516001600160a01b031615801561076d575b801561075b575b6107395782516001600160401b03161561074a5782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a181516001600160a01b03161561073957905160048054835163ffffffff60a01b60a09190911b166001600160a01b039384166001600160c01b03199092168217179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff1660208201529251169082015282907fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d90606090a16000915b815183101561067a5760009260208160051b8401015160018060401b0360208201511690811561066b5780516001600160a01b03161561065c57818652600860205260408620906080810151906001830191610366835461092f565b6105fd578354600160a81b600160e81b031916600160a81b1784556040518581527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b805180159081156105d2575b506105c3578051906001600160401b0382116105af576103da845461092f565b601f811161056a575b50602090601f83116001146104eb57600080516020616a4b8339815191529593836104d59460ff979460609460019d9e9f926104e0575b5050600019600383901b1c1916908b1b1783555b604081015115158554908760a01b9060a01b16908760a01b1916178555898060a01b038151168a8060a01b0319865416178555015115158354908560e81b9060e81b16908560e81b1916178355610484866109ec565b506040519384936020855254898060a01b0381166020860152818160a01c1615156040860152898060401b038160a81c16606086015260e81c161515608084015260a08084015260c0830190610969565b0390a201919061030a565b015190508e8061041a565b848b52818b20919a601f198416905b81811061055257509360018460ff9794829c9d9e6060956104d598600080516020616a4b8339815191529c9a10610539575b505050811b01835561042e565b015160001960f88460031b161c191690558e808061052c565b828d0151845560209c8d019c600190940193016104fa565b848b5260208b20601f840160051c810191602085106105a5575b601f0160051c01905b81811061059a57506103e3565b8b815560010161058d565b9091508190610584565b634e487b7160e01b8a52604160045260248afd5b6342bcdf7f60e11b8952600489fd5b9050602082012060405160208101908b8252602081526105f36040826108d7565b519020148a6103ba565b835460a81c6001600160401b0316600114158061062e575b156103ae57632105803760e11b89526004859052602489fd5b50604051610647816106408187610969565b03826108d7565b60208151910120815160208301201415610615565b6342bcdf7f60e11b8652600486fd5b63c656089560e01b8652600486fd5b6001600160a01b0381161561073957600b8054600160401b600160e01b031916604092831b600160401b600160e01b031617905551615fcb9081610a80823960805181613377015260a0518181816101bf0152614460015260c05181818161021501528181612fb60152818161388b01528181613b5f01526143fa015260e0518181816102440152614c6701526101005181818161027301526148250152610120518181816101e6015281816122ae01528181614d5a0152615c7c0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101c1565b5080516001600160a01b0316156101ba565b639b15e16f60e01b60005260046000fd5b84516001600160401b0381116108a157820160a0818603601f1901126108a157604051906107bd826108bc565b60208101516001600160a01b03811681036108a15782526107e0604082016108fa565b60208301526107f160608201610922565b604083015261080260808201610922565b606083015260a08101516001600160401b0381116108a157602091010185601f820112156108a15780516001600160401b0381116108a65760405191610852601f8301601f1916602001846108d7565b81835287602083830101116108a15760005b82811061088c5750509181600060208096949581960101526080820152815201940193610171565b80602080928401015182828701015201610864565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b038211176108a657604052565b601f909101601f19168101906001600160401b038211908210176108a657604052565b51906001600160401b03821682036108a157565b51906001600160a01b03821682036108a157565b519081151582036108a157565b90600182811c9216801561095f575b602083101461094957565b634e487b7160e01b600052602260045260246000fd5b91607f169161093e565b600092918154916109798361092f565b80835292600181169081156109cf575060011461099557505050565b60009081526020812093945091925b8383106109b5575060209250010190565b6001816020929493945483858701015201910191906109a4565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a7957600654680100000000000000008110156108a6576001810180600655811015610a63577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806306285c691461017757806315777ab214610172578063181f5a771461016d5780633f4b04aa146101685780635215505b146101635780635e36480c1461015e5780635e7bb0081461015957806360987c201461015457806365b81aab1461014f5780636f9e320f1461014a5780637437ff9f1461014557806379ba50971461014057806385572ffb1461013b5780638da5cb5b14610136578063c673e58414610131578063ccd37ba31461012c578063cd19723714610127578063de5e0b9a14610122578063e9d68a8e1461011d578063f2fde38b14610118578063f58e03fc146101135763f716f99f1461010e57600080fd5b6119a8565b61188b565b611800565b611757565b6116bb565b61155b565b6114f8565b611433565b61134b565b611315565b611295565b6111f5565b611080565b610fea565b610f6f565b610d68565b610780565b61061f565b610503565b6104a4565b6102f1565b61018c565b600091031261018757565b600080fd5b34610187576000366003190112610187576101a5611ae3565b506102ed6040516101b581610331565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b346101875760003660031901126101875760206001600160a01b03600b5460401c16604051908152f35b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761034c57604052565b61031b565b604081019081106001600160401b0382111761034c57604052565b606081019081106001600160401b0382111761034c57604052565b608081019081106001600160401b0382111761034c57604052565b60c081019081106001600160401b0382111761034c57604052565b90601f801991011681019081106001600160401b0382111761034c57604052565b604051906103ed60c0836103bd565b565b604051906103ed60a0836103bd565b604051906103ed6080836103bd565b604051906103ed610100836103bd565b604051906103ed6040836103bd565b6001600160401b03811161034c57601f01601f191660200190565b604051906104566020836103bd565b60008252565b60005b83811061046f5750506000910152565b818101518382015260200161045f565b906020916104988151809281855285808601910161045c565b601f01601f1916010190565b34610187576000366003190112610187576102ed60408051906104c781836103bd565b601182527f4f666652616d7020312e362e302d64657600000000000000000000000000000060208301525191829160208352602083019061047f565b346101875760003660031901126101875760206001600160401b03600b5416604051908152f35b9060a0608061057b936001600160a01b0381511684526020810151151560208501526001600160401b036040820151166040850152606081015115156060850152015191816080820152019061047f565b90565b6040810160408252825180915260206060830193019060005b818110610600575050506020818303910152815180825260208201916020808360051b8301019401926000915b8383106105d357505050505090565b90919293946020806105f1600193601f19868203018752895161052a565b970193019301919392906105c4565b82516001600160401b0316855260209485019490920191600101610597565b346101875760003660031901126101875760065461063c816107c3565b9061064a60405192836103bd565b808252601f19610659826107c3565b0160005b81811061071b57505061066f81611b3c565b9060005b81811061068b5750506102ed6040519283928361057e565b806106c16106a961069d6001946142e1565b6001600160401b031690565b6106b38387611b96565b906001600160401b03169052565b6106ff6106fa6106e16106d48488611b96565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611c82565b6107098287611b96565b526107148186611b96565b5001610673565b602090610726611b0e565b8282870101520161065d565b6001600160401b0381160361018757565b35906103ed82610732565b634e487b7160e01b600052602160045260246000fd5b6004111561076e57565b61074e565b90600482101561076e5752565b346101875760403660031901126101875760206107b46004356107a281610732565b602435906107af82610732565b611d27565b6107c16040518092610773565bf35b6001600160401b03811161034c5760051b60200190565b91908260a0910312610187576040516107f281610331565b608080829480358452602081013561080981610732565b6020850152604081013561081c81610732565b6040850152606081013561082f81610732565b606085015201359161084083610732565b0152565b9291926108508261042c565b9161085e60405193846103bd565b829481845281830111610187578281602093846000960137010152565b9080601f830112156101875781602061057b93359101610844565b6001600160a01b0381160361018757565b35906103ed82610896565b63ffffffff81160361018757565b35906103ed826108b2565b81601f82011215610187578035906108e2826107c3565b926108f060405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061091c57505050505090565b84356001600160401b03811161018757820160a0818503601f190112610187576040519161094983610331565b60208201356001600160401b0381116101875785602061096b9285010161087b565b8352604082013561097b81610896565b602084015261098c606083016108c0565b60408401526080820135926001600160401b0384116101875760a0836109b988602080988198010161087b565b60608401520135608082015281520194019361090d565b91909161014081840312610187576109e66103de565b926109f181836107da565b845260a08201356001600160401b0381116101875781610a1291840161087b565b602085015260c08201356001600160401b0381116101875781610a3691840161087b565b6040850152610a4760e083016108a7565b606085015261010082013560808501526101208201356001600160401b03811161018757610a7592016108cb565b60a0830152565b9080601f83011215610187578135610a93816107c3565b92610aa160405194856103bd565b81845260208085019260051b820101918383116101875760208201905b838210610acd57505050505090565b81356001600160401b03811161018757602091610aef878480948801016109d0565b815201910190610abe565b81601f8201121561018757803590610b11826107c3565b92610b1f60405194856103bd565b82845260208085019360051b830101918183116101875760208101935b838510610b4b57505050505090565b84356001600160401b03811161018757820183603f82011215610187576020810135610b76816107c3565b91610b8460405193846103bd565b8183526020808085019360051b83010101918683116101875760408201905b838210610bbd575050509082525060209485019401610b3c565b81356001600160401b03811161018757602091610be18a848080958901010161087b565b815201910190610ba3565b929190610bf8816107c3565b93610c0660405195866103bd565b602085838152019160051b810192831161018757905b828210610c2857505050565b8135815260209182019101610c1c565b9080601f830112156101875781602061057b93359101610bec565b81601f8201121561018757803590610c6a826107c3565b92610c7860405194856103bd565b82845260208085019360051b830101918183116101875760208101935b838510610ca457505050505090565b84356001600160401b03811161018757820160a0818503601f19011261018757610ccc6103ef565b91610cd960208301610743565b835260408201356001600160401b03811161018757856020610cfd92850101610a7c565b602084015260608201356001600160401b03811161018757856020610d2492850101610afa565b60408401526080820135926001600160401b0384116101875760a083610d51886020809881980101610c38565b606084015201356080820152815201940193610c95565b34610187576040366003190112610187576004356001600160401b03811161018757610d98903690600401610c53565b6024356001600160401b038111610187573660238201121561018757806004013591610dc3836107c3565b91610dd160405193846103bd565b8383526024602084019460051b820101903682116101875760248101945b828610610e0257610e008585611d6f565b005b85356001600160401b03811161018757820136604382011215610187576024810135610e2d816107c3565b91610e3b60405193846103bd565b818352602060248185019360051b83010101903682116101875760448101925b828410610e75575050509082525060209586019501610def565b83356001600160401b038111610187576024908301016040601f1982360301126101875760405190610ea682610351565b6020810135825260408101356001600160401b03811161018757602091010136601f8201121561018757803590610edc826107c3565b91610eea60405193846103bd565b80835260208084019160051b8301019136831161018757602001905b828210610f255750505091816020938480940152815201930192610e5b565b602080918335610f34816108b2565b815201910190610f06565b9181601f84011215610187578235916001600160401b038311610187576020808501948460051b01011161018757565b34610187576060366003190112610187576004356001600160401b03811161018757610f9f9036906004016109d0565b6024356001600160401b03811161018757610fbe903690600401610f3f565b91604435926001600160401b03841161018757610fe2610e00943690600401610f3f565b939092612186565b346101875760203660031901126101875760043561100781610896565b61100f61362d565b6001600160a01b0381161561106f577fffffffff0000000000000000000000000000000000000000ffffffffffffffff7bffffffffffffffffffffffffffffffffffffffff0000000000000000600b549260401b16911617600b55600080f35b6342bcdf7f60e11b60005260046000fd5b3461018757606036600319011261018757600060405161109f8161036c565b6004356110ab81610896565b81526024356110b9816108b2565b60208201908152604435906110cd82610896565b604083019182526110dc61362d565b6001600160a01b03835116156111e657916111a86001600160a01b036111e0937fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d95611141838651166001600160a01b03166001600160a01b03196004541617600455565b517fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006004549260a01b1691161760045551166001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b0390a180f35b6342bcdf7f60e11b8452600484fd5b34610187576000366003190112610187576000604080516112158161036c565b82815282602082015201526102ed60405161122f8161036c565b63ffffffff6004546001600160a01b038116835260a01c1660208201526001600160a01b036005541660408201526040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b34610187576000366003190112610187576000546001600160a01b0381163303611304576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b34610187576020366003190112610187576004356001600160401b0381116101875760a090600319903603011261018757600080fd5b346101875760003660031901126101875760206001600160a01b0360015416604051908152f35b6004359060ff8216820361018757565b359060ff8216820361018757565b906020808351928381520192019060005b8181106113ae5750505090565b82516001600160a01b03168452602093840193909201916001016113a1565b9061057b9160208152606082518051602084015260ff602082015116604084015260ff60408201511682840152015115156080820152604061141e602084015160c060a085015260e0840190611390565b9201519060c0601f1982850301910152611390565b346101875760203660031901126101875760ff61144e611372565b60606040805161145d8161036c565b815161146881610387565b6000815260006020820152600083820152600084820152815282602082015201521660005260026020526102ed604060002060036114e7604051926114ac8461036c565b6114b581612463565b84526040516114d2816114cb816002860161249c565b03826103bd565b60208501526114cb604051809481930161249c565b6040820152604051918291826113cd565b346101875760403660031901126101875760043561151581610732565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b8015150361018757565b35906103ed82611546565b34610187576020366003190112610187576004356001600160401b038111610187573660238201121561018757806004013590611597826107c3565b906115a560405192836103bd565b8282526024602083019360051b820101903682116101875760248101935b8285106115d357610e00846124f3565b84356001600160401b03811161018757820160a06023198236030112610187576040519161160083610331565b602482013561160e81610896565b8352604482013561161e81610732565b6020840152606482013561163181611546565b6040840152608482013561164481611546565b606084015260a4820135926001600160401b0384116101875761167160209493602486953692010161087b565b60808201528152019401936115c3565b9060049160441161018757565b9181601f84011215610187578235916001600160401b038311610187576020838186019501011161018757565b346101875760c0366003190112610187576116d536611681565b6044356001600160401b038111610187576116f490369060040161168e565b6064929192356001600160401b03811161018757611716903690600401610f3f565b60843594916001600160401b0386116101875761173a610e00963690600401610f3f565b94909360a43596612db2565b90602061057b92818152019061052a565b34610187576020366003190112610187576001600160401b0360043561177c81610732565b611784611b0e565b501660005260086020526102ed60406000206117ef6001604051926117a884610331565b6117e960ff82546001600160a01b0381168752818160a01c16151560208801526001600160401b038160a81c16604088015260e81c16606086019015159052565b01611c67565b608082015260405191829182611746565b34610187576020366003190112610187576001600160a01b0360043561182581610896565b61182d61362d565b1633811461187a57806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b34610187576060366003190112610187576118a536611681565b6044356001600160401b038111610187576118c490369060040161168e565b91828201602083820312610187578235906001600160401b038211610187576118ee918401610c53565b6040519060206118fe81846103bd565b60008352601f19810160005b81811061193257505050610e009491611922916133b8565b61192a61302c565b928392613ca9565b6060858201840152820161190a565b9080601f83011215610187578135611958816107c3565b9261196660405194856103bd565b81845260208085019260051b82010192831161018757602001905b82821061198e5750505090565b60208091833561199d81610896565b815201910190611981565b34610187576020366003190112610187576004356001600160401b0381116101875736602382011215610187578060040135906119e4826107c3565b906119f260405192836103bd565b8282526024602083019360051b820101903682116101875760248101935b828510611a2057610e0084613048565b84356001600160401b03811161018757820160c0602319823603011261018757611a486103de565b9160248201358352611a5c60448301611382565b6020840152611a6d60648301611382565b6040840152611a7e60848301611550565b606084015260a48201356001600160401b03811161018757611aa69060243691850101611941565b608084015260c4820135926001600160401b03841161018757611ad3602094936024869536920101611941565b60a0820152815201940193611a10565b60405190611af082610331565b60006080838281528260208201528260408201528260608201520152565b60405190611b1b82610331565b60606080836000815260006020820152600060408201526000838201520152565b90611b46826107c3565b611b5360405191826103bd565b8281528092611b64601f19916107c3565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611b915760200190565b611b6e565b8051821015611b915760209160051b010190565b90600182811c92168015611bda575b6020831014611bc457565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bb9565b60009291815491611bf483611baa565b8083529260018116908115611c4a5750600114611c1057505050565b60009081526020812093945091925b838310611c30575060209250010190565b600181602092949394548385870101520191019190611c1f565b915050602093945060ff929192191683830152151560051b010190565b906103ed611c7b9260405193848092611be4565b03836103bd565b9060016080604051611c9381610331565b610840819560ff81546001600160a01b0381168552818160a01c16151560208601526001600160401b038160a81c16604086015260e81c1615156060840152611ce26040518096819301611be4565b03846103bd565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611d1557565b611ce9565b91908203918211611d1557565b611d3382607f92613331565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611d15576003911c16600481101561076e5790565b611d77613375565b805182518103611f725760005b818110611d97575050906103ed916133b8565b611da18184611b96565b516020810190815151611db48488611b96565b519283518203611f725790916000925b808410611dd8575050505050600101611d84565b91949398611dea848b98939598611b96565b515198611df8888851611b96565b519980611f29575b5060a08a01988b6020611e168b8d515193611b96565b5101515103611ee85760005b8a5151811015611ed357611e5e611e55611e4b8f6020611e438f8793611b96565b510151611b96565b5163ffffffff1690565b63ffffffff1690565b8b81611e6f575b5050600101611e22565b611e556040611e8285611e8e9451611b96565b51015163ffffffff1690565b90818110611e9d57508b611e65565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611dc4565b611f258b51611f03606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b6000fd5b60808b0151811015611e0057611f25908b611f4b88516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190611f9082610351565b60006020838281520152565b60405190611fab6020836103bd565b600080835282815b828110611fbf57505050565b602090611fca611f83565b82828501015201611fb3565b805182526001600160401b036020820151166020830152608061201d61200b604084015160a0604087015260a086019061047f565b6060840151858203606087015261047f565b9101519160808183039101526020808351928381520192019060005b8181106120465750505090565b825180516001600160a01b031685526020908101518186015260409094019390920191600101612039565b90602061057b928181520190611fd6565b6040513d6000823e3d90fd5b3d156120b9573d9061209f8261042c565b916120ad60405193846103bd565b82523d6000602084013e565b606090565b90602061057b92818152019061047f565b81601f820112156101875780516120e58161042c565b926120f360405194856103bd565b818452602082840101116101875761057b916020808501910161045c565b909160608284031261018757815161212881611546565b9260208301516001600160401b0381116101875760409161214a9185016120cf565b92015190565b9293606092959461ffff6121746001600160a01b0394608088526080880190611fd6565b97166020860152604085015216910152565b9290939130330361245257612199611f9c565b9460a0850151805161240b575b50505050508051916121c4602084519401516001600160401b031690565b9060208301519160408401926121f18451926121de6103ef565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b0361221a6005546001600160a01b031690565b168061238e575b5051511580612382575b801561236c575b8015612343575b61233f576122d7918161227c6122706122636106e1602060009751016001600160401b0390511690565b546001600160a01b031690565b6001600160a01b031690565b9083612297606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f00000000000000000000000000000000000000000000000000000000000000009060048601612150565b03925af190811561233a57600090600092612313575b50156122f65750565b6040516302a35ba360e21b8152908190611ecf90600483016120be565b905061233291503d806000833e61232a81836103bd565b810190612111565b5090386122ed565b612082565b5050565b5061236761236361235e60608401516001600160a01b031690565b6135df565b1590565b612239565b5060608101516001600160a01b03163b15612232565b5060808101511561222b565b803b1561018757600060405180926308d450a160e01b82528183816123b68a60048301612071565b03925af190816123f0575b506123ea57611ecf6123d161208e565b6040516309c2532560e01b8152918291600483016120be565b38612221565b806123ff6000612405936103bd565b8061017c565b386123c1565b859650602061244796015161242a60608901516001600160a01b031690565b9061244160208a51016001600160401b0390511690565b926134c6565b9038808080806121a6565b6306e34e6560e31b60005260046000fd5b9060405161247081610387565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106124c05750505090565b82546001600160a01b03168452602090930192600192830192016124b3565b906103ed611c7b926040519384809261249c565b6124fb61362d565b60005b815181101561233f576125118183611b96565b519061252760208301516001600160401b031690565b6001600160401b0381169081156127ac5761254f61227061227086516001600160a01b031690565b1561106f57612571816001600160401b03166000526008602052604060002090565b60808501519060018101926125868454611baa565b61273e576125f97ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb9916125df84750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b81518015908115612728575b5061106f576127096126d4606060019861264761271f967fbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c986136cf565b61269d6126576040830151151590565b86547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178655565b6126cd6126b182516001600160a01b031690565b86906001600160a01b03166001600160a01b0319825416179055565b0151151590565b82547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560e81b60ff60e81b16178255565b61271284615d8f565b50604051918291826137a0565b0390a2016124fe565b90506020830120612737613652565b1438612609565b60016001600160401b0361275d84546001600160401b039060a81c1690565b1614158061278d575b61277057506125fd565b632105803760e11b6000526001600160401b031660045260246000fd5b5061279784611c67565b60208151910120835160208501201415612766565b63c656089560e01b60005260046000fd5b35906001600160e01b038216820361018757565b81601f82011215610187578035906127e8826107c3565b926127f660405194856103bd565b82845260208085019360061b8301019181831161018757602001925b828410612820575050505090565b604084830312610187576020604091825161283a81610351565b863561284581610732565b81526128528388016127bd565b83820152815201930192612812565b9190604083820312610187576040519061287a82610351565b819380356001600160401b03811161018757810182601f820112156101875780356128a4816107c3565b916128b260405193846103bd565b81835260208084019260061b8201019085821161018757602001915b8183106129005750505083526020810135916001600160401b038311610187576020926128fb92016127d1565b910152565b604083870312610187576020604091825161291a81610351565b853561292581610896565b81526129328387016127bd565b838201528152019201916128ce565b81601f8201121561018757803590612958826107c3565b9261296660405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061299257505050505090565b84356001600160401b03811161018757820160a0818503601f19011261018757604051916129bf83610331565b60208201356129cd81610732565b83526040820135926001600160401b0384116101875760a0836129f788602080988198010161087b565b858401526060810135612a0981610732565b60408401526080810135612a1c81610732565b606084015201356080820152815201940193612983565b81601f8201121561018757803590612a4a826107c3565b92612a5860405194856103bd565b82845260208085019360061b8301019181831161018757602001925b828410612a82575050505090565b6040848303126101875760206040918251612a9c81610351565b863581528287013583820152815201930192612a74565b602081830312610187578035906001600160401b038211610187570160808183031261018757612ae16103fe565b9181356001600160401b0381116101875781612afe918401612861565b835260208201356001600160401b0381116101875781612b1f918401612941565b602084015260408201356001600160401b0381116101875781612b43918401612941565b604084015260608201356001600160401b03811161018757612b659201612a33565b606082015290565b9080602083519182815201916020808360051b8301019401926000915b838310612b9957505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612bd78585015160a08786015260a085019061047f565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612b8a565b916001600160a01b03612c3392168352606060208401526060830190612b6d565b9060408183039101526020808351928381520192019060005b818110612c595750505090565b8251805185526020908101518186015260409094019390920191600101612c4c565b6084019081608411611d1557565b60a001908160a011611d1557565b91908201809211611d1557565b906020808351928381520192019060005b818110612cc25750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612cb5565b9190604081019083519160408252825180915260206060830193019060005b818110612d3657505050602061057b93940151906020818403910152612ca4565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612d15565b90602061057b928181520190612cf6565b91612da490612d9661057b9593606086526060860190612b6d565b908482036020860152612b6d565b916040818403910152612cf6565b9197939796929695909495612dc981870187612ab3565b95602087019788518051612fac575b5087518051511590811591612f9d575b50612eb8575b60005b89518051821015612e185790612e12612e0c82600194611b96565b51613850565b01612df1565b50509193959799989092949698600099604081019a5b8b518051821015612e555790612e4f612e4982600194611b96565b51613b24565b01612e2e565b5050907fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47612eaa93926103ed9c612ea0612eb298999a9b9c9d9f519151925160405193849384612d7b565b0390a13691610bec565b943691610bec565b93613fa3565b612ecd602086015b356001600160401b031690565b600b546001600160401b0382811691161015612f7557612f03906001600160401b03166001600160401b0319600b541617600b55565b612f1b6122706122706004546001600160a01b031690565b885190803b1561018757604051633937306f60e01b8152916000918391829084908290612f4b9060048301612d6a565b03925af1801561233a57612f60575b50612dee565b806123ff6000612f6f936103bd565b38612f5a565b50612f8889515160408a01515190612c97565b612dee57632261116760e01b60005260046000fd5b60209150015151151538612de8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060608a0151823b1561018757604051633854844f60e11b815292600092849283918291613008913060048501612c12565b03915afa801561233a5715612dd857806123ff6000613026936103bd565b38612dd8565b6040519061303b6020836103bd565b6000808352366020840137565b61305061362d565b60005b815181101561233f576130668183611b96565b51906040820160ff613079825160ff1690565b161561331b57602083015160ff169261309f8460ff166000526002602052604060002090565b91600183019182546130ba6130b48260ff1690565b60ff1690565b6132e057506130e76130cf6060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a08101918251610100815111613288578051156132ca576003860161311561310f826124df565b8a61511e565b60608401516131a5575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479460029461318161317161319f9a9661316a8760019f9c6131656131979a8f61528c565b6141e4565b5160ff1690565b845460ff191660ff821617909455565b519081855551906040519586950190888661426a565b0390a161530e565b01613053565b979460028793959701966131c16131bb896124df565b8861511e565b6080850151946101008651116132b45785516131e96130b46131e48a5160ff1690565b6141d0565b101561329e578551845111613288576131816131717fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479861316a8760019f61316561319f9f9a8f61327060029f61326a6131979f8f90613165849261324f845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b826151b2565b505050979c9f50975050969a5050509450945061311f565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff166132fb6132f66060840151151590565b151590565b901515146130e7576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b906001600160401b03613371921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036133a05750565b630f01ce8560e01b6000526004524660245260446000fd5b91909180511561345a5782511592602091604051926133d781856103bd565b60008452601f19810160005b8181106134365750505060005b815181101561342e578061341761340960019385611b96565b51881561341d5786906143a9565b016133f0565b6134278387611b96565b51906143a9565b505050509050565b829060405161344481610351565b60008152606083820152828289010152016133e3565b63c2e5347d60e01b60005260046000fd5b9190811015611b915760051b0190565b3561057b816108b2565b9190811015611b915760051b81013590601e19813603018212156101875701908135916001600160401b038311610187576020018236038113610187579190565b909294919397968151966134d9886107c3565b976134e7604051998a6103bd565b8089526134f6601f19916107c3565b0160005b8181106135c857505060005b83518110156135bb578061354d8c8a8a8a613547613540878d613539828f8f9d8f9e60019f81613569575b505050611b96565b5197613485565b3691610844565b93614c18565b613557828c611b96565b52613562818b611b96565b5001613506565b63ffffffff61358161357c85858561346b565b61347b565b1615613531576135b1926135989261357c9261346b565b60406135a48585611b96565b51019063ffffffff169052565b8f8f908391613531565b5096985050505050505050565b6020906135d3611f83565b82828d010152016134fa565b6135f06385572ffb60e01b82614f7b565b908161360a575b81613600575090565b61057b9150614f4d565b905061361581614ed2565b15906135f7565b6135f063aff2afbf60e01b82614f7b565b6001600160a01b0360015416330361364157565b6315ae3a6f60e11b60005260046000fd5b6040516020810190600082526020815261366d6040826103bd565b51902090565b81811061367e575050565b60008155600101613673565b9190601f811161369957505050565b6103ed926000526020600020906020601f840160051c830193106136c5575b601f0160051c0190613673565b90915081906136b8565b91909182516001600160401b03811161034c576136f6816136f08454611baa565b8461368a565b6020601f821160011461373757819061372893949560009261372c575b50508160011b916000199060031b1c19161790565b9055565b015190503880613713565b601f1982169061374c84600052602060002090565b9160005b8181106137885750958360019596971061376f575b505050811b019055565b015160001960f88460031b161c19169055388080613765565b9192602060018192868b015181550194019201613750565b90600160c061057b936020815260ff84546001600160a01b0381166020840152818160a01c16151560408401526001600160401b038160a81c16606084015260e81c161515608082015260a080820152019101611be4565b90816020910312610187575161057b81611546565b909161382461057b9360408452604084019061047f565b916020818403910152611be4565b6001600160401b036001911601906001600160401b038211611d1557565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091613af5575b50613ad7576138d282614fab565b805460ff60e882901c161515600114613aac576020830180516020815191012090600184019161390183611c67565b6020815191012003613a8f57505060408301516001600160401b039081169160a81c168114801590613a67575b613a2657506080820151918215613a155761396f83613960866001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b546139f2576139ef929161399861399360606139d19401516001600160401b031690565b613832565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b61396042936001600160401b0316600052600a602052604060002090565b55565b6332cf0cbf60e01b6000526001600160401b038416600452602483905260446000fd5b63504570e360e01b60005260046000fd5b83611f2591613a3f60608601516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b50613a7f61069d60608501516001600160401b031690565b6001600160401b0382161161392e565b51611ecf60405192839263b80d8fa960e01b84526004840161380d565b60808301516348e2b93360e11b6000526001600160401b038516600452602452600160445260646000fd5b637edeb53960e11b6000526001600160401b03821660045260246000fd5b613b17915060203d602011613b1d575b613b0f81836103bd565b8101906137f8565b386138c4565b503d613b05565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091613bff575b50613ad757613ba682614fab565b805460ff60e882901c1615613bd1576020830180516020815191012090600184019161390183611c67565b60808301516348e2b93360e11b60009081526001600160401b03861660045260249190915260445260646000fd5b613c18915060203d602011613b1d57613b0f81836103bd565b38613b98565b6003111561076e57565b600382101561076e5752565b906103ed604051613c4481610351565b602060ff829554818116845260081c169101613c28565b8054821015611b915760005260206000200190600090565b60ff60019116019060ff8211611d1557565b60ff601b9116019060ff8211611d1557565b90606092604091835260208301370190565b6001600052600260205293613cdd7fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612463565b93853594613cea85612c7b565b6060820190613cf98251151590565b613f75575b803603613f5d57508151878103613f445750613d18613375565b60016000526003602052613d67613d627fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b613c34565b60026020820151613d7781613c1e565b613d8081613c1e565b149081613edc575b5015613eb0575b51613de7575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613dcb612ec060019460200190565b604080519283526001600160401b0391909116602083015290a2565b613e086130b4613e03602085969799989a955194015160ff1690565b613c73565b03613e9f578151835103613e8e57613e866000613dcb94612ec094613e527f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b3691610844565b60208151910120604051613e7d81613e6f89602083019586613c97565b03601f1981018352826103bd565b5190208a614fe8565b948394613d95565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613d8f57631b41e11d60e31b60005260046000fd5b60016000526002602052613f3c915061227090613f2990613f2360037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b90613c5b565b90546001600160a01b039160031b1c1690565b331438613d88565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613f9e90613f98613f8e613f898751611cff565b612c89565b613f988851611cff565b90612c97565b613cfe565b60008052600260205294909390929091613fdc7fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612463565b94863595613fe983612c7b565b6060820190613ff88251151590565b6141ad575b803603613f5d575081518881036141945750614017613375565b60008052600360205261404c613d627f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613d4a565b6002602082015161405c81613c1e565b61406581613c1e565b14908161414b575b501561411f575b516140b1575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613dcb612ec060009460200190565b6140cd6130b4613e03602087989a999b96975194015160ff1690565b03613e9f578351865103613e8e576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613dcb95613e5261411694612ec0973691610844565b9483943861407a565b72c11c11c11c11c11c11c11c11c11c11c11c11c133031561407457631b41e11d60e31b60005260046000fd5b60008052600260205261418c915061227090613f2990613f2360037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613f1a565b33143861406d565b6324f7d61360e21b600052600452602488905260446000fd5b6141cb90613f986141c1613f898951611cff565b613f988a51611cff565b613ffd565b60ff166003029060ff8216918203611d1557565b8151916001600160401b03831161034c5768010000000000000000831161034c57602090825484845580851061424d575b500190600052602060002060005b8381106142305750505050565b60019060206001600160a01b038551169401938184015501614223565b614264908460005285846000209182019101613673565b38614215565b95949392909160ff61428f93168752602087015260a0604087015260a086019061249c565b84810360608601526020808351928381520192019060005b8181106142c2575050509060806103ed9294019060ff169052565b82516001600160a01b03168452602093840193909201916001016142a7565b600654811015611b915760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b0361057b949381606094168352166020820152816040820152019061047f565b60409061057b93928152816020820152019061047f565b9291906001600160401b0390816064951660045216602452600481101561076e57604452565b9493926143936060936143a49388526020880190610773565b60806040870152608086019061047f565b930152565b906143bb82516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091614af6575b50614a97576020830191825151948515614a6757604085018051518703614a565761445d87611b3c565b957f000000000000000000000000000000000000000000000000000000000000000061448d60016117e987614fab565b602081519101206040516144ed81613e6f6020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a81106149be57505050806080606061451d93015191015190888661553a565b9788156149a05760005b88811061453a5750505050505050505050565b5a61454f614549838a51611b96565b5161585a565b805160600151614568906001600160401b031688611d27565b61457181610764565b8015908d828315938461498d575b1561494a57606088156148cd57506145a6602061459c898d611b96565b5101519242611d1a565b6004546145bb9060a01c63ffffffff16611e55565b1080156148ba575b1561489c576145d2878b611b96565b5151614886575b8451608001516145f1906001600160401b031661069d565b6147ce575b50614602868951611b96565b5160a08501515181510361479257936146679695938c938f966146478e958c9261464161463b60608951016001600160401b0390511690565b8961592d565b86615b2b565b9a90809661466160608851016001600160401b0390511690565b906159b2565b614740575b505061467782610764565b600282036146f8575b6001966146ee7f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b039351926146df6146d68b6146ce60608801516001600160401b031690565b96519b611b96565b51985a90611d1a565b9160405195869516988561437a565b0390a45b01614527565b9150919394925061470882610764565b6003820361471c578b929493918a91614680565b51606001516349362d1f60e11b600052611f2591906001600160401b031689614354565b61474984610764565b6003840361466c579092949550614761919350610764565b614771578b92918a91388061466c565b5151604051632b11b8d960e01b8152908190611ecf9087906004840161433d565b611f258b6147ac60608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b6147d783610764565b6147e2575b386145f6565b8351608001516001600160401b0316602080860151918c61481760405194859384936370701e5760e11b855260048501614316565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561233a57600091614868575b506147dc5750505050506001906146f2565b614880915060203d8111613b1d57613b0f81836103bd565b38614856565b614890878b611b96565b515160808601526145d9565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b506148c483610764565b600383146145c3565b9150836148d984610764565b156145d957506001959450614942925061492091507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a16146f2565b50505050600192915061494261492060607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b5061499783610764565b6003831461457f565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b6149c9818a51611b96565b518051604001516001600160401b0316838103614a3957508051602001516001600160401b0316898103614a16575090614a0584600193615432565b614a0f828d611b96565b52016144fd565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611f25614a7b86516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b5092915050614ad9576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b637edeb53960e11b6000526001600160401b031660045260246000fd5b614b0f915060203d602011613b1d57613b0f81836103bd565b38614433565b51906103ed82610896565b90816020910312610187575161057b81610896565b9061057b916020815260e0614bd3614bbe614b5e8551610100602087015261012086019061047f565b60208601516001600160401b0316604086015260408601516001600160a01b0316606086015260608601516080860152614ba8608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c087015261047f565b60c0850151848203601f19018486015261047f565b92015190610100601f198285030191015261047f565b6040906001600160a01b0361057b9493168152816020820152019061047f565b90816020910312610187575190565b91939293614c24611f83565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa93841561233a57600094614ea1575b506001600160a01b0384169586158015614e8f575b614e7157614d56614d7f92613e6f92614cda614cd3611e5560408c015163ffffffff1690565b8c89615c44565b9690996080810151614d086060835193015193614cf561040d565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b602082015292839160248301614b35565b82857f000000000000000000000000000000000000000000000000000000000000000092615cd2565b94909115614e555750805160208103614e3c575090614da8826020808a95518301019101614c09565b956001600160a01b03841603614de0575b5050505050614dd8614dc961041d565b6001600160a01b039093168352565b602082015290565b614df393614ded91611d1a565b91615c44565b50908082108015614e29575b614e0b57808481614db9565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614e358284611d1a565b1415614dff565b631e3be00960e21b600052602060045260245260446000fd5b611ecf604051928392634ff17cad60e11b845260048401614be9565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614e9c6123638661361c565b614cad565b614ec491945060203d602011614ecb575b614ebc81836103bd565b810190614b20565b9238614c98565b503d614eb2565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614f006044836103bd565b6179185a10614f3c576020926000925191617530fa6000513d82614f30575b5081614f29575090565b9050151590565b60201115915038614f1f565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614f006044836103bd565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614f006044836103bd565b6001600160401b031680600052600860205260406000209060ff825460a01c1615614fd4575090565b63ed053c5960e01b60005260045260246000fd5b919390926000948051946000965b868810615007575050505050505050565b6020881015611b91576020600061501f878b1a613c85565b6150298b87611b96565b51906150606150388d8a611b96565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561233a576150a6613d6260005161508e8960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b90600160208301516150b781613c1e565b6150c081613c1e565b0361510d576150dd6150d3835160ff1690565b60ff600191161b90565b81166150fc576150f36150d36001935160ff1690565b17970196614ff6565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b83518110156151775760019060ff831660005260036020526000615170604082206001600160a01b03615157858a611b96565b51166001600160a01b0316600052602052604060002090565b5501615124565b50509050565b8151815460ff191660ff919091161781559060200151600381101561076e57815461ff00191660089190911b61ff0016179055565b919060005b8151811015615177576151da6151cd8284611b96565b516001600160a01b031690565b906152036151f98361508e8860ff166000526003602052604060002090565b5460081c60ff1690565b61520c81613c1e565b615277576001600160a01b038216156152665761526060019261525b61523061041d565b60ff85168152916152448660208501613c28565b61508e8960ff166000526003602052604060002090565b61517d565b016151b7565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015615177576152a76151cd8284611b96565b906152c66151f98361508e8860ff166000526003602052604060002090565b6152cf81613c1e565b615277576001600160a01b038216156152665761530860019261525b6152f361041d565b60ff8516815291615244600260208501613c28565b01615291565b60ff1680600052600260205260ff60016040600020015460101c1690801560001461535c57501561534b576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146153665750565b61536c57565b6307b8c74d60e51b60005260046000fd5b9080602083519182815201916020808360051b8301019401926000915b8383106153a957505050505090565b9091929394602080600192601f1985820301865288519060808061540c6153d9855160a0865260a086019061047f565b6001600160a01b0387870151168786015263ffffffff60408701511660408601526060860151858203606087015261047f565b9301519101529701930193019193929061539a565b90602061057b92818152019061537d565b61366d81518051906154c661545160608601516001600160a01b031690565b613e6f61546860608501516001600160401b031690565b936154816080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613e6f6020840151602081519101209360a06040820151602081519101209101516040516154ff81613e6f602082019485615421565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b039261554d92615e13565b9116600052600a60205260406000209060005260205260406000205490565b91908260a09103126101875760405161558481610331565b608080829480518452602081015161559b81610732565b602085015260408101516155ae81610732565b604085015260608101516155c181610732565b606085015201519161084083610732565b51906103ed826108b2565b81601f82011215610187578051906155f4826107c3565b9261560260405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061562e57505050505090565b84516001600160401b03811161018757820160a0818503601f190112610187576040519161565b83610331565b60208201516001600160401b0381116101875785602061567d928501016120cf565b8352604082015161568d81610896565b602084015261569e606083016155d2565b60408401526080820151926001600160401b0384116101875760a0836156cb8860208098819801016120cf565b60608401520151608082015281520194019361561f565b602081830312610187578051906001600160401b038211610187570161014081830312610187576157116103de565b9161571c818361556c565b835260a08201516001600160401b038111610187578161573d9184016120cf565b602084015260c08201516001600160401b03811161018757816157619184016120cf565b604084015261577260e08301614b15565b606084015261010082015160808401526101208201516001600160401b038111610187576157a092016155dd565b60a082015290565b61057b916001600160401b036080835180518452826020820151166020850152826040820151166040850152826060820151166060850152015116608082015260a061581961580760208501516101408486015261014085019061047f565b604085015184820360c086015261047f565b60608401516001600160a01b031660e084015292608081015161010084015201519061012081840391015261537d565b90602061057b9281815201906157a8565b60006158d2819260405161586d816103a2565b615875611ae3565b81526060602082015260606040820152836060820152836080820152606060a0820152506158b5612270612270600b546001600160a01b039060401c1690565b90604051948580948193634546c6e560e01b835260048301615849565b03925af160009181615908575b5061057b57611ecf6158ef61208e565b60405163828ebdfb60e01b8152918291600483016120be565b6159269192503d806000833e61591e81836103bd565b8101906156e2565b90386158df565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611d15576139ef916001600160401b036159708584613331565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611d15576159ea8484613331565b600483101561076e576001600160401b036139ef9416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b90615a51906060835260608301906157a8565b8181036020830152825180825260208201916020808360051b8301019501926000915b838310615ac157505050505060408183039101526020808351928381520192019060005b818110615aa55750505090565b825163ffffffff16845260209384019390920191600101615a98565b9091929395602080615adf600193601f198682030187528a5161047f565b98019301930191939290615a74565b80516020909101516001600160e01b0319811692919060048210615b10575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b1561018757600091615b546040519485938493630304c3e160e51b855260048501615a3e565b038183305af19081615c2f575b50615c2457615b6e61208e565b9072c11c11c11c11c11c11c11c11c11c11c11c11c13314615b90575b60039190565b615ba9615b9c83615aee565b6001600160e01b03191690565b6337c3be2960e01b148015615c09575b8015615bee575b15615b8a57611f25615bd183615aee565b632882569d60e01b6000526001600160e01b031916600452602490565b50615bfb615b9c83615aee565b63753fa58960e11b14615bc0565b50615c16615b9c83615aee565b632be8ca8b60e21b14615bb9565b60029061057b610447565b806123ff6000615c3e936103bd565b38615b61565b6040516370a0823160e01b60208201526001600160a01b039091166024820152919291615ca190615c788160448101613e6f565b84837f000000000000000000000000000000000000000000000000000000000000000092615cd2565b92909115614e555750805160208103614e3c575090615ccc8260208061057b95518301019101614c09565b93611d1a565b939193615cdf608461042c565b94615ced60405196876103bd565b60848652615cfb608461042c565b602087019590601f1901368737833b15615d7e575a90808210615d6d578291038060061c90031115615d5c576000918291825a9560208451940192f1905a9003923d9060848211615d53575b6000908287523e929190565b60849150615d47565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b80600052600760205260406000205415600014615e0d576006546801000000000000000081101561034c57600181016006556000600654821015611b9157600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b8051928251908415615f6f5761010185111580615f63575b15615e9257818501946000198601956101008711615e92578615615f5357615e5287611b3c565b9660009586978795885b848110615eb7575050505050600119018095149384615ead575b505082615ea3575b505015615e9257615e8e91611b96565b5190565b6309bde33960e01b60005260046000fd5b1490503880615e7e565b1492503880615e76565b6001811b82811603615f4557868a1015615f3057615ed960018b019a85611b96565b51905b8c888c1015615f1c5750615ef460018c019b86611b96565b515b818d11615e9257615f15828f92615f0f90600196615f80565b92611b96565b5201615e5c565b60018d019c615f2a91611b96565b51615ef6565b615f3e60018c019b8d611b96565b5190615edc565b615f3e600189019884611b96565b505050509050615e8e9150611b84565b50610101821115615e2b565b630469ac9960e21b60005260046000fd5b81811015615f92579061057b91615f97565b61057b915b9060405190602082019260018452604083015260608201526060815261366d6080826103bd56fea164736f6c634300081a000abd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c", } var OffRampWithMessageTransformerABI = OffRampWithMessageTransformerMetaData.ABI @@ -858,9 +859,10 @@ func (it *OffRampWithMessageTransformerCommitReportAcceptedIterator) Close() err } type OffRampWithMessageTransformerCommitReportAccepted struct { - MerkleRoots []InternalMerkleRoot - PriceUpdates InternalPriceUpdates - Raw types.Log + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + PriceUpdates InternalPriceUpdates + Raw types.Log } func (_OffRampWithMessageTransformer *OffRampWithMessageTransformerFilterer) FilterCommitReportAccepted(opts *bind.FilterOpts) (*OffRampWithMessageTransformerCommitReportAcceptedIterator, error) { @@ -2458,7 +2460,7 @@ func (OffRampWithMessageTransformerAlreadyAttempted) Topic() common.Hash { } func (OffRampWithMessageTransformerCommitReportAccepted) Topic() common.Hash { - return common.HexToHash("0x35c02761bcd3ef995c6a601a1981f4ed3934dcbe5041e24e286c89f5531d17e4") + return common.HexToHash("0xb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47") } func (OffRampWithMessageTransformerConfigSet) Topic() common.Hash { @@ -2466,7 +2468,7 @@ func (OffRampWithMessageTransformerConfigSet) Topic() common.Hash { } func (OffRampWithMessageTransformerDynamicConfigSet) Topic() common.Hash { - return common.HexToHash("0xcbb53bda7106a610de67df506ac86b65c44d5afac0fd2b11070dc2d61a6f2dee") + return common.HexToHash("0xa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d") } func (OffRampWithMessageTransformerExecutionStateChanged) Topic() common.Hash { @@ -2494,7 +2496,7 @@ func (OffRampWithMessageTransformerSkippedReportExecution) Topic() common.Hash { } func (OffRampWithMessageTransformerSourceChainConfigSet) Topic() common.Hash { - return common.HexToHash("0x49f51971edd25182e97182d6ea372a0488ce2ab639f6a3a7ab4df0d2636fe56b") + return common.HexToHash("0xbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c") } func (OffRampWithMessageTransformerSourceChainSelectorAdded) Topic() common.Hash { diff --git a/core/gethwrappers/ccip/generated/report_codec/report_codec.go b/core/gethwrappers/ccip/generated/report_codec/report_codec.go index b3c7dfa61ee..08c3f877570 100644 --- a/core/gethwrappers/ccip/generated/report_codec/report_codec.go +++ b/core/gethwrappers/ccip/generated/report_codec/report_codec.go @@ -92,14 +92,15 @@ type InternalTokenPriceUpdate struct { } type OffRampCommitReport struct { - PriceUpdates InternalPriceUpdates - MerkleRoots []InternalMerkleRoot - RmnSignatures []IRMNRemoteSignature + PriceUpdates InternalPriceUpdates + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + RmnSignatures []IRMNRemoteSignature } var ReportCodecMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"decodeCommitReport\",\"inputs\":[{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"decodeExecuteReport\",\"inputs\":[{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"CommitReportDecoded\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecuteReportDecoded\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false}]", - Bin: "0x60808060405234601557611604908161001b8239f35b600080fdfe6101c0604052600436101561001357600080fd5b60003560e01c80636fb34956146106355763f816ec601461003357600080fd5b3461051d5761004136611462565b6060604061004d6113a4565b6100556113c4565b838152836020820152815282602082015201528051810190602082019060208184031261051d5760208101519067ffffffffffffffff821161051d57019060608284031261051d576100a56113a4565b92602083015167ffffffffffffffff811161051d578301602081019060409083031261051d576100d36113c4565b90805167ffffffffffffffff811161051d57810184601f8201121561051d57805161010561010082611545565b6113e4565b9160208084848152019260061b8201019087821161051d57602001915b8183106105f657505050825260208101519067ffffffffffffffff821161051d570183601f8201121561051d57805161015d61010082611545565b9160208084848152019260061b8201019086821161051d57602001915b8183106105b75750505060208201528452604083015167ffffffffffffffff811161051d576020908401019282601f8501121561051d578351936101c061010086611545565b9460208087838152019160051b8301019185831161051d5760208101915b838310610522575050505060208501938452606081015167ffffffffffffffff811161051d5760209101019180601f8401121561051d5782519161022461010084611545565b9360208086868152019460061b82010192831161051d5793959493602001925b8284106104e45750505050604082019283526040519283926020845251916060602085015260c0840192805193604060808701528451809152602060e0870195019060005b81811061048b5750505060200151927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808582030160a08601526020808551928381520194019060005b81811061043e5750505051917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848203016040850152825180825260208201916020808360051b8301019501926000915b83831061039e57505050505051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08382030160608401526020808351928381520192019060005b818110610379575050500390f35b825180518552602090810151818601528695506040909401939092019160010161036b565b91939650919394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865289519067ffffffffffffffff82511681526080806103fd8585015160a08786015260a0850190611502565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff606082015116606085015201519101529801930193019092879695949293610323565b8251805167ffffffffffffffff1687526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681880152889750604090960195909201916001016102d2565b8251805173ffffffffffffffffffffffffffffffffffffffff1688526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168189015289985060409097019690920191600101610289565b6040602085849997989903011261051d5760206040916105026113c4565b86518152828701518382015281520193019295949395610244565b600080fd5b825167ffffffffffffffff811161051d57820160a08188031261051d57610547611384565b916105546020830161155d565b835260408201519267ffffffffffffffff841161051d5760a08361057f8c6020809881980101611572565b8584015261058f6060820161155d565b60408401526105a06080820161155d565b6060840152015160808201528152019201916101de565b60406020848803011261051d5760206040916105d16113c4565b6105da8661155d565b81526105e78387016115ce565b8382015281520192019161017a565b60406020848903011261051d5760206040916106106113c4565b610619866115ad565b81526106268387016115ce565b83820152815201920191610122565b3461051d5761064336611462565b61010052610100515161010051016101a0526020610100516101a051031261051d5760206101005101516101405267ffffffffffffffff610140511161051d5760206101a05101603f61014051610100510101121561051d5760206101405161010051010151610120526106bc61010061012051611545565b60c05260c051610180526101205160c05152602060c0510160c05260c0516101605260206101a051016020806101205160051b6101405161010051010101011161051d5760406101405161010051010160e0525b6020806101205160051b61014051610100510101010160e05110610adc5760405180602081016020825261018051518091526040820160408260051b8401019161016051916000905b82821061076857505050500390f35b91939092947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc090820301825284519060a081019167ffffffffffffffff815116825260208101519260a06020840152835180915260c08301602060c08360051b86010195019160005b81811061092c57505050506040810151928281036040840152835180825260208201906020808260051b85010196019260005b8281106108715750505050506060810151928281036060840152602080855192838152019401906000905b80821061085957505050600192602092608080859401519101529601920192018594939192610759565b9091946020806001928851815201960192019061082f565b90919293967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083829e9d9e0301855287519081519081815260208101906020808460051b8301019401926000915b8183106108e35750505050506020806001929e9d9e99019501910192919092610804565b909192939460208061091f837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030189528951611502565b97019501930191906108bf565b909192957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40868203018452865167ffffffffffffffff6080825180518552826020820151166020860152826040820151166040860152826060820151166060860152015116608083015260a06109c76109b5602084015161014084870152610140860190611502565b604084015185820360c0870152611502565b9173ffffffffffffffffffffffffffffffffffffffff60608201511660e0850152608081015161010085015201519161012081830391015281519081815260208101906020808460051b8301019401926000915b818310610a3b5750505050506020806001929801940191019190916107d1565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08560019503018852885190608080610ac9610a89855160a0865260a0860190611502565b73ffffffffffffffffffffffffffffffffffffffff87870151168786015263ffffffff604087015116604086015260608601518582036060870152611502565b9301519101529701950193019190610a1b565b60e0515160a05267ffffffffffffffff60a0511161051d5760a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081835161014051610100510101016101a0510301011261051d57610b3b611384565b610b5560208060a05161014051610100510101010161155d565b81526040602060a0516101405161010051010101015160805267ffffffffffffffff6080511161051d5760206101a05101601f60206080518160a0516101405161010051010101010101121561051d5760206080518160a0516101405161010051010101010151610bc861010082611545565b90602082828152019060206101a0510160208260051b816080518160a0516101405161010051010101010101011161051d576020806080518160a0516101405161010051010101010101915b60208260051b816080518160a0516101405161010051010101010101018310610eff5750505060208201526060602060a0516101405161010051010101015167ffffffffffffffff811161051d5760206101a05101601f6020838160a0516101405161010051010101010101121561051d576020818160a051610140516101005101010101015190610ca861010083611545565b91602083828152019160206101a0510160208360051b81848160a0516101405161010051010101010101011161051d5760a051610140516101005101018101606001925b60208360051b81848160a0516101405161010051010101010101018410610dde5750505050604082015260a0805161014051610100510101015167ffffffffffffffff811161051d576020908160a0516101405161010051010101010160206101a05101601f8201121561051d57805190610d6961010083611545565b9160208084838152019160051b8301019160206101a05101831161051d57602001905b828210610dce57505050606082015260a06020815161014051610100510101010151608082015260c05152602060c0510160c052602060e0510160e052610710565b8151815260209182019101610d8c565b835167ffffffffffffffff811161051d5760206101a05101603f826020868160a051610140516101005101010101010101121561051d5760a051610140516101005101018301810160600151610e3661010082611545565b916020838381520160206101a051016020808560051b85828b8160a05161014051610100510101010101010101011161051d5760a0516101405161010051010186018201608001905b60a05161014051610100516080910190910188018401600586901b01018210610eb5575050509082525060209384019301610cec565b815167ffffffffffffffff811161051d576101a05160a051610140516101005160209586959094610ef4949087019360809301018d0189010101611572565b815201910190610e7f565b825167ffffffffffffffff811161051d5760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082826080518160a05161014051610100510101010101016101a05103010190610140821261051d576040519160c083019083821067ffffffffffffffff8311176113555760a0916040521261051d57610f8a611384565b602082816080518160a051610140516101005101010101010101518152610fca60408360206080518160a05161014051610100510101010101010161155d565b6020820152610ff260608360206080518160a05161014051610100510101010101010161155d565b6040820152611019608083602082518160a05161014051610100510101010101010161155d565b606082015261104060a083602060805181845161014051610100510101010101010161155d565b6080820152825260c08160206080518160a0516101405161010051010101010101015167ffffffffffffffff811161051d5761109d906020806101a051019184826080518160a05161014051610100510101010101010101611572565b602083015260e08160206080518160a0516101405161010051010101010101015167ffffffffffffffff811161051d576110f8906020806101a051019184826080518160a05161014051610100510101010101010101611572565b604083015261111f6101008260206080518160a051610140518651010101010101016115ad565b60608301526101208160206080518160a0516101405161010051010101010101015160808301526101408160206080518160a05185516101005101010101010101519067ffffffffffffffff821161051d5760206101a05101601f60208484826080518160a0516101405161010051010101010101010101121561051d5760208282826080518160a05161014051610100510101010101010101516111c661010082611545565b92602084838152019260206101a0510160208460051b818585826080518160a0516101405161010051010101010101010101011161051d576080805160a05161014051610100510101018201830101935b6080805160a051610140516101005101010183018401600586901b0101851061125257505050505060a0820152815260209283019201610c14565b845167ffffffffffffffff811161051d5760208484826080518160a051610140516101005101010101010101010160a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0836101a0510301011261051d576112ba611384565b91602082015167ffffffffffffffff811161051d576112e4906020806101a0510191850101611572565b83526112f2604083016115ad565b6020840152606082015163ffffffff8116810361051d57604084015260808201519267ffffffffffffffff841161051d5760a06020949361133e869586806101a0510191840101611572565b606084015201516080820152815201940193611217565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519060a0820182811067ffffffffffffffff82111761135557604052565b604051906060820182811067ffffffffffffffff82111761135557604052565b604051906040820182811067ffffffffffffffff82111761135557604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761135557604052565b67ffffffffffffffff811161135557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261051d5760043567ffffffffffffffff811161051d578160238201121561051d578060040135906114bb61010083611428565b928284526024838301011161051d5781600092602460209301838601378301015290565b60005b8381106114f25750506000910152565b81810151838201526020016114e2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361153e815180928187528780880191016114df565b0116010190565b67ffffffffffffffff81116113555760051b60200190565b519067ffffffffffffffff8216820361051d57565b81601f8201121561051d57805161158b61010082611428565b928184526020828401011161051d576115aa91602080850191016114df565b90565b519073ffffffffffffffffffffffffffffffffffffffff8216820361051d57565b51907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361051d5756fea164736f6c634300081a000a", + ABI: "[{\"type\":\"function\",\"name\":\"decodeCommitReport\",\"inputs\":[{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"decodeExecuteReport\",\"inputs\":[{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"CommitReportDecoded\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecuteReportDecoded\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false}]", + Bin: "0x6080806040523460155761168f908161001b8239f35b600080fdfe6101c0604052600436101561001357600080fd5b60003560e01c80636fb34956146104fc5763f816ec601461003357600080fd5b346104795761004136611329565b60608061004c61126b565b61005461128b565b82815282602082015281528160208201528160408201520152805181019060208201906020818403126104795760208101519067ffffffffffffffff8211610479570190608082840312610479576100aa61126b565b91602081015167ffffffffffffffff81116104795781016020810190604090860312610479576100d861128b565b90805167ffffffffffffffff811161047957810184601f8201121561047957805161010a610105826114d2565b6112ab565b9160208084848152019260061b8201019087821161047957602001915b8183106104bd57505050825260208101519067ffffffffffffffff8211610479570183601f82011215610479578051610162610105826114d2565b9160208084848152019260061b8201019086821161047957602001915b81831061047e5750505060208201528352604081015167ffffffffffffffff8111610479578260206101b392840101611584565b9360208401948552606082015167ffffffffffffffff8111610479578360206101de92850101611584565b9160408501928352608081015167ffffffffffffffff81116104795760209101019280601f850112156104795783519161021a610105846114d2565b9460208087868152019460061b82010192831161047957602001925b828410610448575050505060608301918252604051926020845251936080602085015260e0840194805195604060a087015286518091526020610100870197019060005b8181106103f25750505060200151947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608582030160c08601526020808751928381520196019060005b8181106103a85750505090610307849561033893517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087830301604088015261140c565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301606086015261140c565b9051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08382030160808401526020808351928381520192019060005b818110610383575050500390f35b8251805185526020908101518186015286955060409094019390920191600101610375565b8251805167ffffffffffffffff1689526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16818a0152604090980197909201916001016102c3565b8251805173ffffffffffffffffffffffffffffffffffffffff168a526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16818b01526040909901989092019160010161027a565b60406020858403011261047957602060409161046261128b565b865181528287015183820152815201930192610236565b600080fd5b60406020848b03011261047957602060409161049861128b565b6104a1866114ea565b81526104ae83870161155b565b8382015281520192019161017f565b60406020848c0301126104795760206040916104d761128b565b6104e08661153a565b81526104ed83870161155b565b83820152815201920191610127565b346104795761050a36611329565b61010052610100515161010051016101a0526020610100516101a05103126104795760206101005101516101405267ffffffffffffffff61014051116104795760206101a05101603f610140516101005101011215610479576020610140516101005101015161012052610583610105610120516114d2565b60c05260c051610180526101205160c05152602060c0510160c05260c0516101605260206101a051016020806101205160051b610140516101005101010101116104795760406101405161010051010160e0525b6020806101205160051b61014051610100510101010160e051106109a35760405180602081016020825261018051518091526040820160408260051b8401019161016051916000905b82821061062f57505050500390f35b91939092947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc090820301825284519060a081019167ffffffffffffffff815116825260208101519260a06020840152835180915260c08301602060c08360051b86010195019160005b8181106107f357505050506040810151928281036040840152835180825260208201906020808260051b85010196019260005b8281106107385750505050506060810151928281036060840152602080855192838152019401906000905b80821061072057505050600192602092608080859401519101529601920192018594939192610620565b909194602080600192885181520196019201906106f6565b90919293967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083829e9d9e0301855287519081519081815260208101906020808460051b8301019401926000915b8183106107aa5750505050506020806001929e9d9e990195019101929190926106cb565b90919293946020806107e6837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301895289516113c9565b9701950193019190610786565b909192957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40868203018452865167ffffffffffffffff6080825180518552826020820151166020860152826040820151166040860152826060820151166060860152015116608083015260a061088e61087c6020840151610140848701526101408601906113c9565b604084015185820360c08701526113c9565b9173ffffffffffffffffffffffffffffffffffffffff60608201511660e0850152608081015161010085015201519161012081830391015281519081815260208101906020808460051b8301019401926000915b818310610902575050505050602080600192980194019101919091610698565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08560019503018852885190608080610990610950855160a0865260a08601906113c9565b73ffffffffffffffffffffffffffffffffffffffff87870151168786015263ffffffff6040870151166040860152606086015185820360608701526113c9565b93015191015297019501930191906108e2565b60e0515160a05267ffffffffffffffff60a051116104795760a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081835161014051610100510101016101a0510301011261047957610a0261124b565b610a1c60208060a0516101405161010051010101016114ea565b81526040602060a0516101405161010051010101015160805267ffffffffffffffff608051116104795760206101a05101601f60206080518160a051610140516101005101010101010112156104795760206080518160a0516101405161010051010101010151610a8f610105826114d2565b90602082828152019060206101a0510160208260051b816080518160a05161014051610100510101010101010111610479576020806080518160a0516101405161010051010101010101915b60208260051b816080518160a0516101405161010051010101010101018310610dc65750505060208201526060602060a0516101405161010051010101015167ffffffffffffffff81116104795760206101a05101601f6020838160a05161014051610100510101010101011215610479576020818160a051610140516101005101010101015190610b6f610105836114d2565b91602083828152019160206101a0510160208360051b81848160a051610140516101005101010101010101116104795760a051610140516101005101018101606001925b60208360051b81848160a0516101405161010051010101010101018410610ca55750505050604082015260a0805161014051610100510101015167ffffffffffffffff8111610479576020908160a0516101405161010051010101010160206101a05101601f8201121561047957805190610c30610105836114d2565b9160208084838152019160051b8301019160206101a05101831161047957602001905b828210610c9557505050606082015260a06020815161014051610100510101010151608082015260c05152602060c0510160c052602060e0510160e0526105d7565b8151815260209182019101610c53565b835167ffffffffffffffff81116104795760206101a05101603f826020868160a05161014051610100510101010101010112156104795760a051610140516101005101018301810160600151610cfd610105826114d2565b916020838381520160206101a051016020808560051b85828b8160a0516101405161010051010101010101010101116104795760a0516101405161010051010186018201608001905b60a05161014051610100516080910190910188018401600586901b01018210610d7c575050509082525060209384019301610bb3565b815167ffffffffffffffff8111610479576101a05160a051610140516101005160209586959094610dbb949087019360809301018d01890101016114ff565b815201910190610d46565b825167ffffffffffffffff81116104795760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082826080518160a05161014051610100510101010101016101a051030101906101408212610479576040519160c083019083821067ffffffffffffffff83111761121c5760a0916040521261047957610e5161124b565b602082816080518160a051610140516101005101010101010101518152610e9160408360206080518160a0516101405161010051010101010101016114ea565b6020820152610eb960608360206080518160a0516101405161010051010101010101016114ea565b6040820152610ee0608083602082518160a0516101405161010051010101010101016114ea565b6060820152610f0760a08360206080518184516101405161010051010101010101016114ea565b6080820152825260c08160206080518160a0516101405161010051010101010101015167ffffffffffffffff811161047957610f64906020806101a051019184826080518160a051610140516101005101010101010101016114ff565b602083015260e08160206080518160a0516101405161010051010101010101015167ffffffffffffffff811161047957610fbf906020806101a051019184826080518160a051610140516101005101010101010101016114ff565b6040830152610fe66101008260206080518160a0516101405186510101010101010161153a565b60608301526101208160206080518160a0516101405161010051010101010101015160808301526101408160206080518160a05185516101005101010101010101519067ffffffffffffffff82116104795760206101a05101601f60208484826080518160a051610140516101005101010101010101010112156104795760208282826080518160a051610140516101005101010101010101015161108d610105826114d2565b92602084838152019260206101a0510160208460051b818585826080518160a05161014051610100510101010101010101010111610479576080805160a05161014051610100510101018201830101935b6080805160a051610140516101005101010183018401600586901b0101851061111957505050505060a0820152815260209283019201610adb565b845167ffffffffffffffff81116104795760208484826080518160a051610140516101005101010101010101010160a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0836101a051030101126104795761118161124b565b91602082015167ffffffffffffffff8111610479576111ab906020806101a05101918501016114ff565b83526111b96040830161153a565b6020840152606082015163ffffffff8116810361047957604084015260808201519267ffffffffffffffff84116104795760a060209493611205869586806101a05101918401016114ff565b6060840152015160808201528152019401936110de565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519060a0820182811067ffffffffffffffff82111761121c57604052565b604051906080820182811067ffffffffffffffff82111761121c57604052565b604051906040820182811067ffffffffffffffff82111761121c57604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761121c57604052565b67ffffffffffffffff811161121c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126104795760043567ffffffffffffffff8111610479578160238201121561047957806004013590611382610105836112ef565b92828452602483830101116104795781600092602460209301838601378301015290565b60005b8381106113b95750506000910152565b81810151838201526020016113a9565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093611405815180928187528780880191016113a6565b0116010190565b9080602083519182815201916020808360051b8301019401926000915b83831061143857505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865288519067ffffffffffffffff82511681526080806114958585015160a08786015260a08501906113c9565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff6060820151166060850152015191015297019301930191939290611429565b67ffffffffffffffff811161121c5760051b60200190565b519067ffffffffffffffff8216820361047957565b81601f82011215610479578051611518610105826112ef565b92818452602082840101116104795761153791602080850191016113a6565b90565b519073ffffffffffffffffffffffffffffffffffffffff8216820361047957565b51907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361047957565b81601f820112156104795780519061159e610105836114d2565b9260208085858152019360051b830101918183116104795760208101935b8385106115cb57505050505090565b845167ffffffffffffffff811161047957820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082860301126104795761161261124b565b9161161f602083016114ea565b835260408201519267ffffffffffffffff84116104795760a08361164a8860208098819801016114ff565b8584015261165a606082016114ea565b604084015261166b608082016114ea565b6060840152015160808201528152019401936115bc56fea164736f6c634300081a000a", } var ReportCodecABI = ReportCodecMetaData.ABI @@ -529,7 +530,7 @@ func (_ReportCodec *ReportCodec) ParseLog(log types.Log) (generated.AbigenLog, e } func (ReportCodecCommitReportDecoded) Topic() common.Hash { - return common.HexToHash("0x31a4e1cb25733cdb9679561cd59cdc238d70a7d486f8bfc1f13242efd60fc29d") + return common.HexToHash("0x58a603662478f1f3f18b8fc8006e127dc1ef28117b04eb2d89cc22849068dcd8") } func (ReportCodecExecuteReportDecoded) Topic() common.Hash { diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index e344de5beee..3ee77361e51 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -3,9 +3,9 @@ burn_from_mint_token_pool: ../../../contracts/solc/ccip/BurnFromMintTokenPool/Bu burn_mint_token_pool: ../../../contracts/solc/ccip/BurnMintTokenPool/BurnMintTokenPool.sol/BurnMintTokenPool.abi.json ../../../contracts/solc/ccip/BurnMintTokenPool/BurnMintTokenPool.sol/BurnMintTokenPool.bin 7360dc05306d51b247abdf9a3aa8704847b1f4fb91fdb822a2dfc54e1d86cda1 burn_to_address_mint_token_pool: ../../../contracts/solc/ccip/BurnToAddressMintTokenPool/BurnToAddressMintTokenPool.sol/BurnToAddressMintTokenPool.abi.json ../../../contracts/solc/ccip/BurnToAddressMintTokenPool/BurnToAddressMintTokenPool.sol/BurnToAddressMintTokenPool.bin ca4d24535b7c8a9cff9ca0ff96a41b8410b0e055059e45152e3e49a7c40a6656 burn_with_from_mint_token_pool: ../../../contracts/solc/ccip/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.sol/BurnWithFromMintTokenPool.abi.json ../../../contracts/solc/ccip/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.sol/BurnWithFromMintTokenPool.bin 66715c303bb2da2b49bba100a788f6471b0f94d255d40f92306e279b909ae33b -ccip_encoding_utils: ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.sol/EncodingUtils.abi.json ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.sol/EncodingUtils.bin abd960015cec3e4d94a5948d2d66ee915770fe4a744c28a5ff46d23e870baaea +ccip_encoding_utils: ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.sol/EncodingUtils.abi.json ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.sol/EncodingUtils.bin 540f6273375ebf1ad6fa4906fbd6b37896141f94b8122f06ddb6d42e2dc49ce9 ccip_home: ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.abi.json ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.bin 39de1fbc907a2b573e9358e716803bf5ac3b0a2e622d5bc0069ab60daf38949b -ccip_reader_tester: ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.abi.json ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.bin b8e597d175ec5ff4990d98b4e3b8a8cf06c6ae22977dd6f0e58c0f4107639e8f +ccip_reader_tester: ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.abi.json ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.bin fcc137fc5a0f322abc37a370eee6b75fda2e26bd7e8859b0c79d0da320a75fa8 ether_sender_receiver: ../../../contracts/solc/ccip/EtherSenderReceiver/EtherSenderReceiver.sol/EtherSenderReceiver.abi.json ../../../contracts/solc/ccip/EtherSenderReceiver/EtherSenderReceiver.sol/EtherSenderReceiver.bin 88973abc1bfbca23a23704e20087ef46f2e20581a13477806308c8f2e664844e fee_quoter: ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.abi.json ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.bin 38101152e412d1560ba8b17c8b57a91af593ea70b556e76bdd693c521101c89c lock_release_token_pool: ../../../contracts/solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.abi.json ../../../contracts/solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.bin 2e73ee0da6f9a9a5722294289b969e4202476706e5d7cdb623e728831c79c28b @@ -17,13 +17,13 @@ mock_usdc_token_transmitter: ../../../contracts/solc/ccip/MockE2EUSDCTransmitter multi_aggregate_rate_limiter: ../../../contracts/solc/ccip/MultiAggregateRateLimiter/MultiAggregateRateLimiter.sol/MultiAggregateRateLimiter.abi.json ../../../contracts/solc/ccip/MultiAggregateRateLimiter/MultiAggregateRateLimiter.sol/MultiAggregateRateLimiter.bin d462b10c87ad74b73502c3c97a7fc53771b915adb9a0fbee781e744f3827d179 multi_ocr3_helper: ../../../contracts/solc/ccip/MultiOCR3Helper/MultiOCR3Helper.sol/MultiOCR3Helper.abi.json ../../../contracts/solc/ccip/MultiOCR3Helper/MultiOCR3Helper.sol/MultiOCR3Helper.bin 05f010e978f8beb0226fd9b8c5413767529a1606b5597c03ee7cdfd857c1647f nonce_manager: ../../../contracts/solc/ccip/NonceManager/NonceManager.sol/NonceManager.abi.json ../../../contracts/solc/ccip/NonceManager/NonceManager.sol/NonceManager.bin ac76c64749ce07dd2ec1b9346d3401dcc5538253e516aecc4767c4308817ea59 -offramp: ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.abi.json ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.bin c6b7f841c773eaaf99ccea2fcb9b9bc27ed557ade975b588d147225be81abb3c -offramp_with_message_transformer: ../../../contracts/solc/ccip/OffRampWithMessageTransformer/OffRampWithMessageTransformer.sol/OffRampWithMessageTransformer.abi.json ../../../contracts/solc/ccip/OffRampWithMessageTransformer/OffRampWithMessageTransformer.sol/OffRampWithMessageTransformer.bin ef3dfc2e4610e34b32a12dbe4c57e72e41c82b0c2fcdc1ea316f1c031bee9b03 +offramp: ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.abi.json ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.bin 0175497da17d3580e24f116448de47bdb4f1efcfddae119ea77cfc31b34142d3 +offramp_with_message_transformer: ../../../contracts/solc/ccip/OffRampWithMessageTransformer/OffRampWithMessageTransformer.sol/OffRampWithMessageTransformer.abi.json ../../../contracts/solc/ccip/OffRampWithMessageTransformer/OffRampWithMessageTransformer.sol/OffRampWithMessageTransformer.bin 3433de99da372f9c2597239d82cd396c6ac6cdf3241f06ef225674b4aae862fd onramp: ../../../contracts/solc/ccip/OnRamp/OnRamp.sol/OnRamp.abi.json ../../../contracts/solc/ccip/OnRamp/OnRamp.sol/OnRamp.bin fd60ff9791af289e0f8bb6ee44c7a8248c2e28ca7d508b1a30fdcb690aec98b8 onramp_with_message_transformer: ../../../contracts/solc/ccip/OnRampWithMessageTransformer/OnRampWithMessageTransformer.sol/OnRampWithMessageTransformer.abi.json ../../../contracts/solc/ccip/OnRampWithMessageTransformer/OnRampWithMessageTransformer.sol/OnRampWithMessageTransformer.bin 63eb65eb3c14f3d3cd421006aff602fd70e53feafc653d469a7e18d64614fbb5 ping_pong_demo: ../../../contracts/solc/ccip/PingPongDemo/PingPongDemo.sol/PingPongDemo.abi.json ../../../contracts/solc/ccip/PingPongDemo/PingPongDemo.sol/PingPongDemo.bin c87b6e1a8961a9dd2fab1eced0df12d0c1ef47bb1b2511f372b7e33443a20683 registry_module_owner_custom: ../../../contracts/solc/ccip/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.sol/RegistryModuleOwnerCustom.abi.json ../../../contracts/solc/ccip/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.sol/RegistryModuleOwnerCustom.bin ce04722cdea2e96d791e48c6a99f64559125d34cd24e19cfd5281892d2ed8ef0 -report_codec: ../../../contracts/solc/ccip/ReportCodec/ReportCodec.sol/ReportCodec.abi.json ../../../contracts/solc/ccip/ReportCodec/ReportCodec.sol/ReportCodec.bin 5e66322fdcd40d601e1a55cfccfb9abe066b90297084d2db4f55dfe3ae7d0af2 +report_codec: ../../../contracts/solc/ccip/ReportCodec/ReportCodec.sol/ReportCodec.abi.json ../../../contracts/solc/ccip/ReportCodec/ReportCodec.sol/ReportCodec.bin 5dbf5d817141fb025a8c5e889b7c4481f1e4339587ed72f046199b3199dfedb6 rmn_home: ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.abi.json ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.bin f13285ef924c4675710e3055b0ecc028a1e0cf4ea3c0e83b31ffe8a76fc6c420 rmn_proxy_contract: ../../../contracts/solc/ccip/RMNProxy/RMNProxy.sol/RMNProxy.abi.json ../../../contracts/solc/ccip/RMNProxy/RMNProxy.sol/RMNProxy.bin 4d06f9e5c6f72daef745e6114faed3bae57ad29758d75de5a4eefcd5f0172328 rmn_remote: ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.abi.json ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.bin 32173df61397fc104bc6bcd9d8e929165ee3911518350dc7f2bb5d1d94875a94 diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 094aafde042..cadbd2e5302 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -302,7 +302,7 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index feca7a133ca..1c3dbf416f7 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1113,8 +1113,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/deployment/ccip/changeset/cs_active_candidate_test.go b/deployment/ccip/changeset/cs_active_candidate_test.go index d0882a078c7..97c8c2ffe90 100644 --- a/deployment/ccip/changeset/cs_active_candidate_test.go +++ b/deployment/ccip/changeset/cs_active_candidate_test.go @@ -87,7 +87,8 @@ func Test_ActiveCandidate(t *testing.T) { UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ dest: { source: { - IsEnabled: true, + IsEnabled: true, + IsRMNVerificationDisabled: true, }, }, }, diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go index a1cf3b4c697..d2c26376635 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/cs_chain_contracts.go @@ -1010,6 +1010,8 @@ func UpdateFeeQuoterDestsChangeset(e deployment.Environment, cfg UpdateFeeQuoter type OffRampSourceUpdate struct { IsEnabled bool // If false, disables the source by setting router to 0x0. TestRouter bool // Flag for safety only allow specifying either router or testRouter. + // IsRMNVerificationDisabled is a flag to disable RMN verification for this source chain. + IsRMNVerificationDisabled bool } type UpdateOffRampSourcesConfig struct { @@ -1093,6 +1095,7 @@ func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSo IsEnabled: update.IsEnabled, // TODO: how would this work when the onRamp is nonEVM? OnRamp: common.LeftPadBytes(onRamp.Address().Bytes(), 32), + IsRMNVerificationDisabled: update.IsRMNVerificationDisabled, }) } tx, err := offRamp.ApplySourceChainConfigUpdates(txOpts, args) @@ -1524,7 +1527,6 @@ func UpdateDynamicConfigOffRampChangeset(e deployment.Environment, cfg UpdateDyn dCfg := offramp.OffRampDynamicConfig{ FeeQuoter: state.Chains[chainSel].FeeQuoter.Address(), PermissionLessExecutionThresholdSeconds: params.PermissionLessExecutionThresholdSeconds, - IsRMNVerificationDisabled: params.IsRMNVerificationDisabled, MessageInterceptor: params.MessageInterceptor, } tx, err := offRamp.SetDynamicConfig(txOpts, dCfg) diff --git a/deployment/ccip/changeset/cs_chain_contracts_test.go b/deployment/ccip/changeset/cs_chain_contracts_test.go index 4d834fca765..37706eef40e 100644 --- a/deployment/ccip/changeset/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/cs_chain_contracts_test.go @@ -397,14 +397,16 @@ func TestUpdateOffRampsSources(t *testing.T) { UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ source: { dest: { - IsEnabled: true, - TestRouter: true, + IsEnabled: true, + TestRouter: true, + IsRMNVerificationDisabled: true, }, }, dest: { source: { - IsEnabled: true, - TestRouter: false, + IsEnabled: true, + TestRouter: false, + IsRMNVerificationDisabled: true, }, }, }, @@ -612,7 +614,6 @@ func TestUpdateDynamicConfigOffRampChangeset(t *testing.T) { Updates: map[uint64]changeset.OffRampParams{ source: { PermissionLessExecutionThresholdSeconds: uint32(2 * 60 * 60), - IsRMNVerificationDisabled: false, MessageInterceptor: msgInterceptor, }, }, @@ -625,7 +626,6 @@ func TestUpdateDynamicConfigOffRampChangeset(t *testing.T) { actualConfig, err := state.Chains[source].OffRamp.GetDynamicConfig(nil) require.NoError(t, err) require.Equal(t, uint32(2*60*60), actualConfig.PermissionLessExecutionThresholdSeconds) - require.False(t, actualConfig.IsRMNVerificationDisabled) require.Equal(t, msgInterceptor, actualConfig.MessageInterceptor) require.Equal(t, state.Chains[source].FeeQuoter.Address(), actualConfig.FeeQuoter) }) diff --git a/deployment/ccip/changeset/cs_deploy_chain.go b/deployment/ccip/changeset/cs_deploy_chain.go index 782b24145aa..1833a5ac011 100644 --- a/deployment/ccip/changeset/cs_deploy_chain.go +++ b/deployment/ccip/changeset/cs_deploy_chain.go @@ -134,7 +134,6 @@ func DefaultFeeQuoterParams() FeeQuoterParams { type OffRampParams struct { GasForCallExactCheck uint16 PermissionLessExecutionThresholdSeconds uint32 - IsRMNVerificationDisabled bool MessageInterceptor common.Address } @@ -152,7 +151,6 @@ func DefaultOffRampParams() OffRampParams { return OffRampParams{ GasForCallExactCheck: uint16(5000), PermissionLessExecutionThresholdSeconds: uint32(24 * 60 * 60), - IsRMNVerificationDisabled: true, } } @@ -476,7 +474,6 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a offramp.OffRampDynamicConfig{ FeeQuoter: feeQuoterContract.Address(), PermissionLessExecutionThresholdSeconds: contractParams.OffRampParams.PermissionLessExecutionThresholdSeconds, - IsRMNVerificationDisabled: contractParams.OffRampParams.IsRMNVerificationDisabled, MessageInterceptor: contractParams.OffRampParams.MessageInterceptor, }, []offramp.OffRampSourceChainConfigArgs{}, diff --git a/deployment/ccip/changeset/testhelpers/test_assertions.go b/deployment/ccip/changeset/testhelpers/test_assertions.go index 39863e9fea7..e7364e79628 100644 --- a/deployment/ccip/changeset/testhelpers/test_assertions.go +++ b/deployment/ccip/changeset/testhelpers/test_assertions.go @@ -15,10 +15,11 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" - "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" commonutils "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -311,29 +312,36 @@ func ConfirmCommitWithExpectedSeqNumRange( seenMessages := NewCommitReportTracker(srcSelector, expectedSeqNumRange) verifyCommitReport := func(report *offramp.OffRampCommitReportAccepted) bool { - if len(report.MerkleRoots) > 0 { - // Check the interval of sequence numbers and make sure it matches - // the expected range. - for _, mr := range report.MerkleRoots { - t.Logf("Received commit report for [%d, %d] on selector %d from source selector %d expected seq nr range %s, token prices: %v", - mr.MinSeqNr, mr.MaxSeqNr, dest.Selector, srcSelector, expectedSeqNumRange.String(), report.PriceUpdates.TokenPriceUpdates) - + processRoots := func(roots []offramp.InternalMerkleRoot) bool { + for _, mr := range roots { + t.Logf( + "Received commit report for [%d, %d] on selector %d from source selector %d expected seq nr range %s, token prices: %v", + mr.MinSeqNr, mr.MaxSeqNr, dest.Selector, srcSelector, expectedSeqNumRange.String(), report.PriceUpdates.TokenPriceUpdates, + ) seenMessages.visitCommitReport(srcSelector, mr.MinSeqNr, mr.MaxSeqNr) if mr.SourceChainSelector == srcSelector && uint64(expectedSeqNumRange.Start()) >= mr.MinSeqNr && uint64(expectedSeqNumRange.End()) <= mr.MaxSeqNr { - t.Logf("All sequence numbers committed in a single report [%d, %d]", expectedSeqNumRange.Start(), expectedSeqNumRange.End()) + t.Logf( + "All sequence numbers committed in a single report [%d, %d]", + expectedSeqNumRange.Start(), expectedSeqNumRange.End(), + ) return true } if !enforceSingleCommit && seenMessages.allCommited(srcSelector) { - t.Logf("All sequence numbers already committed from range [%d, %d]", expectedSeqNumRange.Start(), expectedSeqNumRange.End()) + t.Logf( + "All sequence numbers already committed from range [%d, %d]", + expectedSeqNumRange.Start(), expectedSeqNumRange.End(), + ) return true } } + return false } - return false + + return processRoots(report.BlessedMerkleRoots) || processRoots(report.UnblessedMerkleRoots) } defer subscription.Unsubscribe() diff --git a/deployment/ccip/changeset/testhelpers/test_environment.go b/deployment/ccip/changeset/testhelpers/test_environment.go index b0be4312afd..d474f28f937 100644 --- a/deployment/ccip/changeset/testhelpers/test_environment.go +++ b/deployment/ccip/changeset/testhelpers/test_environment.go @@ -18,10 +18,11 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink-ccip/chainconfig" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/pluginconfig" - commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" @@ -222,11 +223,12 @@ type TestEnvironment interface { } type DeployedEnv struct { - Env deployment.Environment - HomeChainSel uint64 - FeedChainSel uint64 - ReplayBlocks map[uint64]uint64 - Users map[uint64][]*bind.TransactOpts + Env deployment.Environment + HomeChainSel uint64 + FeedChainSel uint64 + ReplayBlocks map[uint64]uint64 + Users map[uint64][]*bind.TransactOpts + RmnEnabledSourceChains map[uint64]bool } func (d *DeployedEnv) TimelockContracts(t *testing.T) map[uint64]*proposalutils.TimelockExecutionContracts { diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 0984721e4b1..63d447a35dd 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -492,8 +492,9 @@ func AddLane( UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ to: { from: { - IsEnabled: true, - TestRouter: isTestRouter, + IsEnabled: true, + TestRouter: isTestRouter, + IsRMNVerificationDisabled: !e.RmnEnabledSourceChains[from], }, }, }, diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 5c4913b799e..c5b401644ff 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -6,9 +6,10 @@ import ( "fmt" "math/big" - "github.com/smartcontractkit/chainlink-ccip/chainconfig" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" + "github.com/smartcontractkit/chainlink-ccip/chainconfig" + "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/ccip-owner-contracts/pkg/config" @@ -289,7 +290,8 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ dst: { src: { - IsEnabled: true, + IsEnabled: true, + IsRMNVerificationDisabled: true, }, }, }, diff --git a/deployment/go.mod b/deployment/go.mod index 93cf1bbcdc1..b4d3becc7c7 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -31,7 +31,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 diff --git a/deployment/go.sum b/deployment/go.sum index a9846aabd49..adb5a4b66de 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1110,8 +1110,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/go.mod b/go.mod index 6add84b60ca..c3ed2eba3fe 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index 490b41fbcf9..ed003670673 100644 --- a/go.sum +++ b/go.sum @@ -1010,8 +1010,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 4a07041d99a..9403c1326c8 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index d7fce2028e2..2d7bf43df02 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1360,8 +1360,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/load/ccip/helpers.go b/integration-tests/load/ccip/helpers.go index 73e88e4c570..a9d98b78795 100644 --- a/integration-tests/load/ccip/helpers.go +++ b/integration-tests/load/ccip/helpers.go @@ -3,6 +3,7 @@ package ccip import ( "context" "errors" + "math/big" "strconv" "sync" "time" @@ -10,13 +11,12 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" chainselectors "github.com/smartcontractkit/chain-selectors" - "math/big" - - "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-testing-framework/wasp" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + + "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" ) const ( @@ -114,8 +114,8 @@ func subscribeDeferredCommitEvents( errChan <- subErr return case report := <-sink: - if len(report.MerkleRoots) > 0 { - for _, mr := range report.MerkleRoots { + if len(report.BlessedMerkleRoots)+len(report.UnblessedMerkleRoots) > 0 { + for _, mr := range append(report.BlessedMerkleRoots, report.UnblessedMerkleRoots...) { lggr.Infow("Received commit report ", "sourceChain", mr.SourceChainSelector, "offRamp", offRamp.Address().String(), diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index cf249cf3064..efeab752f45 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 31a4a2b95e3..ebe5d7cb070 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1343,8 +1343,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7 h1:nBmnVYgOQ3XdQ3W5RDEs0va44QslBPleKokBSwnDNNk= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207140936-540f8266d0c7/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/smoke/ccip/ccip_add_chain_test.go b/integration-tests/smoke/ccip/ccip_add_chain_test.go index 4b634543462..1fd959c7d4d 100644 --- a/integration-tests/smoke/ccip/ccip_add_chain_test.go +++ b/integration-tests/smoke/ccip/ccip_add_chain_test.go @@ -722,8 +722,9 @@ func offRampSourceUpdates(t *testing.T, dests []uint64, sources []uint64, testRo updates[dest] = make(map[uint64]ccipcs.OffRampSourceUpdate) } updates[dest][source] = ccipcs.OffRampSourceUpdate{ - IsEnabled: true, - TestRouter: testRouterEnabled, + IsEnabled: true, + TestRouter: testRouterEnabled, + IsRMNVerificationDisabled: true, } } } diff --git a/integration-tests/smoke/ccip/ccip_messaging_test.go b/integration-tests/smoke/ccip/ccip_messaging_test.go index eb9b4bfd847..7e122c18de7 100644 --- a/integration-tests/smoke/ccip/ccip_messaging_test.go +++ b/integration-tests/smoke/ccip/ccip_messaging_test.go @@ -228,11 +228,19 @@ func getMerkleRoot( }) require.NoError(t, err) for iter.Next() { - for _, mr := range iter.Event.MerkleRoots { + for _, mr := range iter.Event.BlessedMerkleRoots { if mr.MinSeqNr >= seqNr || mr.MaxSeqNr <= seqNr { return mr.MerkleRoot } } + // todo: dedup + // ------------------------------ + for _, mr := range iter.Event.UnblessedMerkleRoots { + if mr.MinSeqNr >= seqNr || mr.MaxSeqNr <= seqNr { + return mr.MerkleRoot + } + } + // ------------------------------ } require.Fail( t, diff --git a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go index 8049d26f6aa..5d193054adb 100644 --- a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go +++ b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go @@ -36,6 +36,7 @@ var ( // TestMigrateFromV1_5ToV1_6 tests the migration from v1.5 to v1.6 func TestMigrateFromV1_5ToV1_6(t *testing.T) { + t.Skip("Skipping since its flakey, need to fix") // Deploy CCIP 1.5 with 3 chains and 4 nodes + 1 bootstrap // Deploy 1.5 contracts (excluding pools to start, but including MCMS) . e, _, tEnv := testsetups.NewIntegrationEnvironment( @@ -301,8 +302,9 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ dest: { src1: { - IsEnabled: true, - TestRouter: false, + IsEnabled: true, + TestRouter: false, + IsRMNVerificationDisabled: true, }, }, }, @@ -380,6 +382,7 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { startBlocks[dest] = &initialBlock testhelpers.ConfirmCommitForAllWithExpectedSeqNums(t, e.Env, state, expectedSeqNums, startBlocks) testhelpers.ConfirmExecWithSeqNrsForAll(t, e.Env, state, expectedSeqNumExec, startBlocks) + // this seems to be flakey, also might be incorrect? require.Equal(t, lastNonce+1, firstNonce, "sender nonce in 1.6 OnRamp event is not plus one to sender nonce in 1.5 OnRamp") } @@ -392,6 +395,7 @@ func sendContinuousMessages( done chan bool, ) (uint64, []*evm_2_evm_onramp.EVM2EVMOnRampCCIPSendRequested, []*onramp.OnRampCCIPMessageSent) { var ( + // TODO: make this shorter than 10 seconds, maybe 2 seconds? ticker = time.NewTicker(10 * time.Second) initialDestBlock uint64 v1_6Msgs []*onramp.OnRampCCIPMessageSent diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index b7f80289eaa..289752a0307 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -10,6 +10,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/ethclient/simulated" @@ -88,6 +89,12 @@ func setupGetCommitGTETimestampTest(ctx context.Context, t testing.TB, finalityD Name: consts.ContractNameOnRamp, }, }, + chainS2: { + { + Address: onRampAddress.Hex(), + Name: consts.ContractNameOnRamp, + }, + }, }, BindTester: true, ContractNameToBind: consts.ContractNameOffRamp, @@ -153,7 +160,7 @@ func emitCommitReports(ctx context.Context, t *testing.T, s *testSetupData, numR }, }, }, - MerkleRoots: []ccip_reader_tester.InternalMerkleRoot{ + BlessedMerkleRoots: []ccip_reader_tester.InternalMerkleRoot{ { SourceChainSelector: uint64(chainS1), MinSeqNr: 10, @@ -162,6 +169,15 @@ func emitCommitReports(ctx context.Context, t *testing.T, s *testSetupData, numR OnRampAddress: common.LeftPadBytes(onRampAddress.Bytes(), 32), }, }, + UnblessedMerkleRoots: []ccip_reader_tester.InternalMerkleRoot{ + { + SourceChainSelector: uint64(chainS2), + MinSeqNr: 20, + MaxSeqNr: 30, + MerkleRoot: [32]byte{i + 2}, + OnRampAddress: common.LeftPadBytes(onRampAddress.Bytes(), 32), + }, + }, RmnSignatures: []ccip_reader_tester.IRMNRemoteSignature{ { R: [32]byte{1}, @@ -312,7 +328,6 @@ func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) { }, offramp.OffRampDynamicConfig{ FeeQuoter: utils.RandomAddress(), PermissionLessExecutionThresholdSeconds: 1, - IsRMNVerificationDisabled: true, MessageInterceptor: utils.RandomAddress(), }, []offramp.OffRampSourceChainConfigArgs{}) require.NoError(t, err) @@ -426,38 +441,117 @@ func TestCCIPReader_CommitReportsGTETimestamp(t *testing.T) { firstReportTs := emitCommitReports(ctx, t, s, numReports, tokenA, onRampAddress) + iter, err := s.contract.FilterCommitReportAccepted(&bind.FilterOpts{ + Start: 0, + }) + require.NoError(t, err) + var onchainEvents []*ccip_reader_tester.CCIPReaderTesterCommitReportAccepted + for iter.Next() { + onchainEvents = append(onchainEvents, iter.Event) + } + require.Len(t, onchainEvents, numReports) + sort.Slice(onchainEvents, func(i, j int) bool { + return onchainEvents[i].Raw.BlockNumber < onchainEvents[j].Raw.BlockNumber + }) + // Need to replay as sometimes the logs are not picked up by the log poller (?) // Maybe another situation where chain reader doesn't register filters as expected. require.NoError(t, s.lp.Replay(ctx, 1)) - var reports []plugintypes.CommitPluginReportWithMeta - var err error + var ccipReaderReports []plugintypes.CommitPluginReportWithMeta require.Eventually(t, func() bool { - reports, err = s.reader.CommitReportsGTETimestamp( + var err2 error + ccipReaderReports, err2 = s.reader.CommitReportsGTETimestamp( ctx, // Skips first report //nolint:gosec // this won't overflow time.Unix(int64(firstReportTs)+1, 0), 10, ) - require.NoError(t, err) - return len(reports) == numReports-1 + require.NoError(t, err2) + return len(ccipReaderReports) == numReports-1 }, 30*time.Second, 50*time.Millisecond) - assert.Len(t, reports, numReports-1) - assert.Len(t, reports[0].Report.MerkleRoots, 1) - assert.Equal(t, chainS1, reports[0].Report.MerkleRoots[0].ChainSel) - assert.Equal(t, onRampAddress.Bytes(), []byte(reports[0].Report.MerkleRoots[0].OnRampAddress)) - assert.Equal(t, cciptypes.SeqNum(10), reports[0].Report.MerkleRoots[0].SeqNumsRange.Start()) - assert.Equal(t, cciptypes.SeqNum(20), reports[0].Report.MerkleRoots[0].SeqNumsRange.End()) - assert.Equal(t, "0x0200000000000000000000000000000000000000000000000000000000000000", - reports[0].Report.MerkleRoots[0].MerkleRoot.String()) - assert.Equal(t, tokenA.String(), string(reports[0].Report.PriceUpdates.TokenPriceUpdates[0].TokenID)) - assert.Equal(t, uint64(1000), reports[0].Report.PriceUpdates.TokenPriceUpdates[0].Price.Uint64()) - assert.Equal(t, chainD, reports[0].Report.PriceUpdates.GasPriceUpdates[0].ChainSel) - assert.Equal(t, uint64(90), reports[0].Report.PriceUpdates.GasPriceUpdates[0].GasPrice.Uint64()) + // trim the first report to simulate the timestamp filter above. + onchainEvents = onchainEvents[1:] + require.Len(t, onchainEvents, numReports-1) + + require.Len(t, ccipReaderReports, numReports-1) + for i := range onchainEvents { + // check blessed roots are deserialized correctly + requireEqualRoots(t, onchainEvents[i].BlessedMerkleRoots, ccipReaderReports[i].Report.BlessedMerkleRoots) + + // check unblessed roots are deserialized correctly + requireEqualRoots(t, onchainEvents[i].UnblessedMerkleRoots, ccipReaderReports[i].Report.UnblessedMerkleRoots) + + // check price updates are deserialized correctly + requireEqualPriceUpdates(t, onchainEvents[i].PriceUpdates, ccipReaderReports[i].Report.PriceUpdates) + } } +func requireEqualPriceUpdates( + t *testing.T, + onchainPriceUpdates ccip_reader_tester.InternalPriceUpdates, + ccipReaderPriceUpdates cciptypes.PriceUpdates, +) { + // token price update equality + require.Equal(t, len(onchainPriceUpdates.TokenPriceUpdates), len(ccipReaderPriceUpdates.TokenPriceUpdates)) + for i := range onchainPriceUpdates.TokenPriceUpdates { + require.Equal(t, + onchainPriceUpdates.TokenPriceUpdates[i].SourceToken.Bytes(), + hexutil.MustDecode(string(ccipReaderPriceUpdates.TokenPriceUpdates[i].TokenID))) + require.Equal(t, + onchainPriceUpdates.TokenPriceUpdates[i].UsdPerToken, + ccipReaderPriceUpdates.TokenPriceUpdates[i].Price.Int) + } + + // gas price update equality + require.Equal(t, len(onchainPriceUpdates.GasPriceUpdates), len(ccipReaderPriceUpdates.GasPriceUpdates)) + for i := range onchainPriceUpdates.GasPriceUpdates { + require.Equal(t, + onchainPriceUpdates.GasPriceUpdates[i].DestChainSelector, + uint64(ccipReaderPriceUpdates.GasPriceUpdates[i].ChainSel)) + require.Equal(t, + onchainPriceUpdates.GasPriceUpdates[i].UsdPerUnitGas, + ccipReaderPriceUpdates.GasPriceUpdates[i].GasPrice.Int) + } +} + +func requireEqualRoots( + t *testing.T, + onchainRoots []ccip_reader_tester.InternalMerkleRoot, + ccipReaderRoots []cciptypes.MerkleRootChain, +) { + require.Equal(t, len(onchainRoots), len(ccipReaderRoots)) + for i := 0; i < len(onchainRoots); i++ { + require.Equal(t, + onchainRoots[i].SourceChainSelector, + uint64(ccipReaderRoots[i].ChainSel), + ) + + // onchain emits the padded address but ccip reader currently sets the unpadded address + // TODO: fix this! + require.Equal(t, + onchainRoots[i].OnRampAddress, + common.LeftPadBytes([]byte(ccipReaderRoots[i].OnRampAddress), 32), + ) + require.Equal(t, + onchainRoots[i].MinSeqNr, + uint64(ccipReaderRoots[i].SeqNumsRange.Start()), + ) + require.Equal(t, + onchainRoots[i].MaxSeqNr, + uint64(ccipReaderRoots[i].SeqNumsRange.End()), + ) + require.Equal(t, + onchainRoots[i].MerkleRoot, + [32]byte(ccipReaderRoots[i].MerkleRoot), + ) + } +} + +// NOTE: this test should eventually be removed when CommitReportsGTETimestamp fetches +// unconfirmed CommitReportAccepted events. func TestCCIPReader_CommitReportsGTETimestamp_RespectsFinality(t *testing.T) { t.Parallel() ctx := tests.Context(t) @@ -469,23 +563,36 @@ func TestCCIPReader_CommitReportsGTETimestamp_RespectsFinality(t *testing.T) { firstReportTs := emitCommitReports(ctx, t, s, numReports, tokenA, onRampAddress) + iter, err := s.contract.FilterCommitReportAccepted(&bind.FilterOpts{ + Start: 0, + }) + require.NoError(t, err) + var onchainEvents []*ccip_reader_tester.CCIPReaderTesterCommitReportAccepted + for iter.Next() { + onchainEvents = append(onchainEvents, iter.Event) + } + require.Len(t, onchainEvents, numReports) + sort.Slice(onchainEvents, func(i, j int) bool { + return onchainEvents[i].Raw.BlockNumber < onchainEvents[j].Raw.BlockNumber + }) + // Need to replay as sometimes the logs are not picked up by the log poller (?) // Maybe another situation where chain reader doesn't register filters as expected. require.NoError(t, s.lp.Replay(ctx, 1)) - var reports []plugintypes.CommitPluginReportWithMeta - var err error + var ccipReaderReports []plugintypes.CommitPluginReportWithMeta // Will not return any reports as the finality depth is not reached. require.Never(t, func() bool { - reports, err = s.reader.CommitReportsGTETimestamp( + var err2 error + ccipReaderReports, err2 = s.reader.CommitReportsGTETimestamp( ctx, // Skips first report //nolint:gosec // this won't overflow time.Unix(int64(firstReportTs)+1, 0), 10, ) - require.NoError(t, err) - return len(reports) == numReports-1 + require.NoError(t, err2) + return len(ccipReaderReports) == numReports-1 }, 20*time.Second, 50*time.Millisecond) // Commit finality depth number of blocks. @@ -494,7 +601,7 @@ func TestCCIPReader_CommitReportsGTETimestamp_RespectsFinality(t *testing.T) { } require.Eventually(t, func() bool { - reports, err = s.reader.CommitReportsGTETimestamp( + ccipReaderReports, err = s.reader.CommitReportsGTETimestamp( ctx, // Skips first report //nolint:gosec // this won't overflow @@ -502,21 +609,25 @@ func TestCCIPReader_CommitReportsGTETimestamp_RespectsFinality(t *testing.T) { 10, ) require.NoError(t, err) - return len(reports) == numReports-1 + return len(ccipReaderReports) == numReports-1 }, 30*time.Second, 50*time.Millisecond) - assert.Len(t, reports, numReports-1) - assert.Len(t, reports[0].Report.MerkleRoots, 1) - assert.Equal(t, chainS1, reports[0].Report.MerkleRoots[0].ChainSel) - assert.Equal(t, onRampAddress.Bytes(), []byte(reports[0].Report.MerkleRoots[0].OnRampAddress)) - assert.Equal(t, cciptypes.SeqNum(10), reports[0].Report.MerkleRoots[0].SeqNumsRange.Start()) - assert.Equal(t, cciptypes.SeqNum(20), reports[0].Report.MerkleRoots[0].SeqNumsRange.End()) - assert.Equal(t, "0x0200000000000000000000000000000000000000000000000000000000000000", - reports[0].Report.MerkleRoots[0].MerkleRoot.String()) - assert.Equal(t, tokenA.String(), string(reports[0].Report.PriceUpdates.TokenPriceUpdates[0].TokenID)) - assert.Equal(t, uint64(1000), reports[0].Report.PriceUpdates.TokenPriceUpdates[0].Price.Uint64()) - assert.Equal(t, chainD, reports[0].Report.PriceUpdates.GasPriceUpdates[0].ChainSel) - assert.Equal(t, uint64(90), reports[0].Report.PriceUpdates.GasPriceUpdates[0].GasPrice.Uint64()) + require.Len(t, ccipReaderReports, numReports-1) + // trim the first report to simulate the finality filter above. + onchainEvents = onchainEvents[1:] + require.Len(t, onchainEvents, numReports-1) + + require.Len(t, ccipReaderReports, numReports-1) + for i := range onchainEvents { + // check blessed roots are deserialized correctly + requireEqualRoots(t, onchainEvents[i].BlessedMerkleRoots, ccipReaderReports[i].Report.BlessedMerkleRoots) + + // check unblessed roots are deserialized correctly + requireEqualRoots(t, onchainEvents[i].UnblessedMerkleRoots, ccipReaderReports[i].Report.UnblessedMerkleRoots) + + // check price updates are deserialized correctly + requireEqualPriceUpdates(t, onchainEvents[i].PriceUpdates, ccipReaderReports[i].Report.PriceUpdates) + } } func TestCCIPReader_ExecutedMessages(t *testing.T) { diff --git a/integration-tests/smoke/ccip/ccip_rmn_test.go b/integration-tests/smoke/ccip/ccip_rmn_test.go index 9a33abc844d..08a297f093a 100644 --- a/integration-tests/smoke/ccip/ccip_rmn_test.go +++ b/integration-tests/smoke/ccip/ccip_rmn_test.go @@ -34,19 +34,22 @@ import ( func TestRMN_TwoMessagesOnTwoLanesIncludingBatching(t *testing.T) { runRmnTestCase(t, rmnTestCase{ - name: "messages on two lanes including batching", + name: "messages on two lanes including batching one lane RMN-enabled the other RMN-disabled", waitForExec: true, homeChainConfig: homeChainConfig{ - f: map[int]int{chain0: 1, chain1: 1}, + f: map[int]int{ + chain0: 1, + //chain1: RMN-Disabled if no f defined + }, }, remoteChainsConfig: []remoteChainConfig{ {chainIdx: chain0, f: 1}, {chainIdx: chain1, f: 1}, }, rmnNodes: []rmnNode{ - {id: 0, isSigner: true, observedChainIdxs: []int{chain0, chain1}}, - {id: 1, isSigner: true, observedChainIdxs: []int{chain0, chain1}}, - {id: 2, isSigner: true, observedChainIdxs: []int{chain0, chain1}}, + {id: 0, isSigner: true, observedChainIdxs: []int{chain0}}, + {id: 1, isSigner: true, observedChainIdxs: []int{chain0}}, + {id: 2, isSigner: true, observedChainIdxs: []int{chain0}}, }, messagesToSend: []messageToSend{ {fromChainIdx: chain0, toChainIdx: chain1, count: 1}, @@ -318,6 +321,12 @@ func runRmnTestCase(t *testing.T, tc rmnTestCase) { tc.killMarkedRmnNodes(t, rmnCluster) + envWithRMN.RmnEnabledSourceChains = make(map[uint64]bool) + for chainIdx := range tc.homeChainConfig.f { + chainSel := tc.pf.chainSelectors[chainIdx] + envWithRMN.RmnEnabledSourceChains[chainSel] = true + } + testhelpers.ReplayLogs(t, envWithRMN.Env.Offchain, envWithRMN.ReplayBlocks) testhelpers.AddLanesForAll(t, &envWithRMN, onChainState) disabledNodes := tc.disableOraclesIfThisIsACursingTestCase(ctx, t, envWithRMN) From 9316232d9d0b4faf7d28eb38de900ce87d98638b Mon Sep 17 00:00:00 2001 From: Dimitris Grigoriou Date: Tue, 11 Feb 2025 16:25:03 +0200 Subject: [PATCH 15/83] Upgrade chainlink-integrations/evm (#16316) --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index cadbd2e5302..c8c59377181 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -36,7 +36,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 github.com/spf13/cobra v1.8.1 diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 1c3dbf416f7..4d91fcb7f49 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1127,8 +1127,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/deployment/go.mod b/deployment/go.mod index b4d3becc7c7..6231c8fd71b 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -35,7 +35,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 diff --git a/deployment/go.sum b/deployment/go.sum index adb5a4b66de..bf937cfd3a3 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1124,8 +1124,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/go.mod b/go.mod index c3ed2eba3fe..5daebb19f1f 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( github.com/smartcontractkit/chainlink-feeds v0.1.1 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 diff --git a/go.sum b/go.sum index ed003670673..7f7e7245571 100644 --- a/go.sum +++ b/go.sum @@ -1024,8 +1024,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 9403c1326c8..fb92ae04b6a 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -51,7 +51,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 2d7bf43df02..59c0ac71ca2 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1374,8 +1374,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index efeab752f45..f0ba3d85429 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -30,7 +30,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index ebe5d7cb070..6cc2ed50940 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1357,8 +1357,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab h1:b39YW3jxiOzUD/zHEWnQhAMhwuxogoW74WsLobyv0so= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250207224751-03d585da84ab/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= From a9264ab9275052dd6a53b9d832753ea34b326a95 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 11 Feb 2025 09:57:56 -0500 Subject: [PATCH 16/83] Don't load stale transmissions on LLO boot (#16264) - Also implement a less aggressive retry on reap/prune, since in case of an error we will come back to it when the timer fires anyway and always fire on exit regardless. --- .gitignore | 1 - core/internal/cltest/cltest.go | 1 + core/services/llo/cleanup.go | 22 +++----- core/services/llo/cleanup_test.go | 8 +-- core/services/llo/delegate.go | 2 +- core/services/llo/mercurytransmitter/orm.go | 19 +++++-- .../llo/mercurytransmitter/orm_test.go | 42 +++++++++++---- .../mercurytransmitter/persistence_manager.go | 51 ++++++++---------- .../persistence_manager_test.go | 53 +++++++++++++------ .../services/llo/mercurytransmitter/server.go | 3 +- .../llo/mercurytransmitter/transmitter.go | 3 +- .../mercurytransmitter/transmitter_test.go | 4 ++ .../ocr2/plugins/llo/integration_test.go | 12 ++--- core/web/testdata/body/health.html | 3 ++ core/web/testdata/body/health.json | 9 ++++ core/web/testdata/body/health.txt | 3 +- 16 files changed, 148 insertions(+), 88 deletions(-) diff --git a/.gitignore b/.gitignore index a15b54a8f9d..b02f7241b32 100644 --- a/.gitignore +++ b/.gitignore @@ -31,7 +31,6 @@ tools/clroot/db.sqlite3-wal .vscode/ *.iml debug.env -*.txt operator_ui/install .devenv diff --git a/core/internal/cltest/cltest.go b/core/internal/cltest/cltest.go index 04a10ae6c6c..28570a73f4f 100644 --- a/core/internal/cltest/cltest.go +++ b/core/internal/cltest/cltest.go @@ -510,6 +510,7 @@ func NewApplicationWithConfig(t testing.TB, cfg chainlink.GeneralConfig, flagsAn FetcherFunc: syncerFetcherFunc, FetcherFactoryFn: computeFetcherFactory, RetirementReportCache: retirementReportCache, + LLOTransmissionReaper: llo.NewTransmissionReaper(ds, lggr, cfg.Mercury().Transmitter().ReaperFrequency().Duration(), cfg.Mercury().Transmitter().ReaperMaxAge().Duration()), }) require.NoError(t, err) diff --git a/core/services/llo/cleanup.go b/core/services/llo/cleanup.go index 9bc594c47c1..be1330297d5 100644 --- a/core/services/llo/cleanup.go +++ b/core/services/llo/cleanup.go @@ -33,9 +33,6 @@ const ( // TransmissionReaperBatchSize is the number of transmissions to delete in a // single batch. TransmissionReaperBatchSize = 10_000 - // TransmissionReaperRetryFrequency is the frequency at which the reaper - // will retry if it fails to delete stale transmissions. - TransmissionReaperRetryFrequency = 5 * time.Second // OvertimeDeleteTimeout is the maximum time we will spend trying to reap // after exit signal before giving up and logging an error. OvertimeDeleteTimeout = 2 * time.Second @@ -103,21 +100,16 @@ func (t *transmissionReaper) runLoop(ctx context.Context) { // deletion) // // https://smartcontract-it.atlassian.net/browse/MERC-6807 + // TODO: Should also reap other LLO garbage that can be left + // behind e.g. channel definitions etc n, err := t.reapStale(ctx, TransmissionReaperBatchSize) - if err == nil { - if n > 0 { - t.lggr.Infow("Reaped stale transmissions", "nDeleted", n) - } - break - } - - t.lggr.Errorw("Failed to reap", "err", err) - select { - case <-ctx.Done(): - return - case <-time.After(TransmissionReaperRetryFrequency): + if err != nil { + t.lggr.Errorw("Failed to reap", "err", err) continue } + if n > 0 { + t.lggr.Infow("Reaped stale transmissions", "nDeleted", n) + } } } } diff --git a/core/services/llo/cleanup_test.go b/core/services/llo/cleanup_test.go index feaa7beac86..f53a6e083f2 100644 --- a/core/services/llo/cleanup_test.go +++ b/core/services/llo/cleanup_test.go @@ -95,17 +95,17 @@ func Test_Cleanup(t *testing.T) { assert.NotNil(t, pd) }) t.Run("does not remove transmissions", func(t *testing.T) { - trs, err := torm1.Get(ctx, srvURL1, 10) + trs, err := torm1.Get(ctx, srvURL1, 10, 0) require.NoError(t, err) assert.Len(t, trs, 1) - trs, err = torm1.Get(ctx, srvURL2, 10) + trs, err = torm1.Get(ctx, srvURL2, 10, 0) require.NoError(t, err) assert.Len(t, trs, 1) - trs, err = torm2.Get(ctx, srvURL1, 10) + trs, err = torm2.Get(ctx, srvURL1, 10, 0) require.NoError(t, err) assert.Len(t, trs, 1) - trs, err = torm2.Get(ctx, srvURL2, 10) + trs, err = torm2.Get(ctx, srvURL2, 10, 0) require.NoError(t, err) assert.Len(t, trs, 1) }) diff --git a/core/services/llo/delegate.go b/core/services/llo/delegate.go index 8d70a669ffa..d250b4cd7f3 100644 --- a/core/services/llo/delegate.go +++ b/core/services/llo/delegate.go @@ -135,7 +135,7 @@ func (d *delegate) Start(ctx context.Context) error { case 1: lggr = logger.With(lggr, "instanceType", "Green") } - ocrLogger := logger.NewOCRWrapper(NewSuppressedLogger(lggr, d.cfg.TraceLogging, d.cfg.ReportingPluginConfig.VerboseLogging), d.cfg.TraceLogging, func(msg string) { + ocrLogger := logger.NewOCRWrapper(NewSuppressedLogger(lggr, d.cfg.TraceLogging, d.cfg.TraceLogging || d.cfg.ReportingPluginConfig.VerboseLogging), d.cfg.TraceLogging, func(msg string) { // NOTE: Some OCR loggers include a DB-persist here // We do not DB persist errors in LLO, since they could be quite voluminous and ought to be present in logs anyway. // This is a performance optimization diff --git a/core/services/llo/mercurytransmitter/orm.go b/core/services/llo/mercurytransmitter/orm.go index b2f2242d234..54be2c866b1 100644 --- a/core/services/llo/mercurytransmitter/orm.go +++ b/core/services/llo/mercurytransmitter/orm.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "math" + "time" "github.com/lib/pq" @@ -20,7 +21,7 @@ type ORM interface { DonID() uint32 Insert(ctx context.Context, transmissions []*Transmission) error Delete(ctx context.Context, hashes [][32]byte) error - Get(ctx context.Context, serverURL string, limit int) ([]*Transmission, error) + Get(ctx context.Context, serverURL string, limit int, maxAge time.Duration) ([]*Transmission, error) Prune(ctx context.Context, serverURL string, maxSize, batchSize int) (int64, error) } @@ -116,16 +117,24 @@ func (o *orm) Delete(ctx context.Context, hashes [][32]byte) error { } // Get returns all transmissions in chronologically descending order -func (o *orm) Get(ctx context.Context, serverURL string, limit int) ([]*Transmission, error) { +// NOTE: passing maxAge=0 disables any age filter +func (o *orm) Get(ctx context.Context, serverURL string, limit int, maxAge time.Duration) ([]*Transmission, error) { // The priority queue uses seqnr to sort transmissions so order by // the same fields here for optimal insertion into the pq. - rows, err := o.ds.QueryContext(ctx, ` + maxAgeClause := "" + params := []interface{}{o.donID, serverURL, limit} + if maxAge > 0 { + maxAgeClause = "\nAND inserted_at >= NOW() - ($4 * INTERVAL '1 MICROSECOND')" + params = append(params, maxAge.Microseconds()) + } + q := fmt.Sprintf(` SELECT config_digest, seq_nr, report, lifecycle_stage, report_format, signatures, signers FROM llo_mercury_transmit_queue - WHERE don_id = $1 AND server_url = $2 + WHERE don_id = $1 AND server_url = $2%s ORDER BY seq_nr DESC, inserted_at DESC LIMIT $3 - `, o.donID, serverURL, limit) + `, maxAgeClause) + rows, err := o.ds.QueryContext(ctx, q, params...) if err != nil { return nil, fmt.Errorf("llo orm: failed to get transmissions: %w", err) } diff --git a/core/services/llo/mercurytransmitter/orm_test.go b/core/services/llo/mercurytransmitter/orm_test.go index f21065f05f9..a3447ea2c74 100644 --- a/core/services/llo/mercurytransmitter/orm_test.go +++ b/core/services/llo/mercurytransmitter/orm_test.go @@ -2,6 +2,7 @@ package mercurytransmitter import ( "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,29 +34,29 @@ func TestORM(t *testing.T) { err := orm.Insert(ctx, transmissions) require.NoError(t, err) // Get limits - result, err := orm.Get(ctx, sURL, 0) + result, err := orm.Get(ctx, sURL, 0, 0) require.NoError(t, err) assert.Empty(t, result) // Get limits - result, err = orm.Get(ctx, sURL, 1) + result, err = orm.Get(ctx, sURL, 1, 0) require.NoError(t, err) require.Len(t, result, 1) assert.Equal(t, transmissions[len(transmissions)-1], result[0]) - result, err = orm.Get(ctx, sURL, 100) + result, err = orm.Get(ctx, sURL, 100, 0) require.NoError(t, err) assert.ElementsMatch(t, transmissions, result) - result, err = orm.Get(ctx, "other server url", 100) + result, err = orm.Get(ctx, "other server url", 100, 0) require.NoError(t, err) assert.Empty(t, result) // Delete err = orm.Delete(ctx, [][32]byte{transmissions[0].Hash()}) require.NoError(t, err) - result, err = orm.Get(ctx, sURL, 100) + result, err = orm.Get(ctx, sURL, 100, 0) require.NoError(t, err) require.Len(t, result, n-1) @@ -65,7 +66,7 @@ func TestORM(t *testing.T) { err = orm.Delete(ctx, [][32]byte{transmissions[1].Hash()}) require.NoError(t, err) - result, err = orm.Get(ctx, sURL, 100) + result, err = orm.Get(ctx, sURL, 100, 0) require.NoError(t, err) require.Len(t, result, n-2) // Prune @@ -77,7 +78,7 @@ func TestORM(t *testing.T) { require.NoError(t, err) assert.Equal(t, int64(n-1), d) - result, err = orm.Get(ctx, sURL, 100) + result, err = orm.Get(ctx, sURL, 100, 0) require.NoError(t, err) require.Len(t, result, 1) assert.Equal(t, transmissions[len(transmissions)-1], result[0]) @@ -86,7 +87,7 @@ func TestORM(t *testing.T) { d, err = orm.Prune(ctx, sURL, 1, n/3) require.NoError(t, err) assert.Zero(t, d) - result, err = orm.Get(ctx, sURL, 100) + result, err = orm.Get(ctx, sURL, 100, 0) require.NoError(t, err) require.Len(t, result, 1) assert.Equal(t, transmissions[len(transmissions)-1], result[0]) @@ -95,7 +96,7 @@ func TestORM(t *testing.T) { d, err = orm.Prune(ctx, sURL, 0, 1) require.NoError(t, err) assert.Equal(t, int64(1), d) - result, err = orm.Get(ctx, sURL, 100) + result, err = orm.Get(ctx, sURL, 100, 0) require.NoError(t, err) require.Empty(t, result) }) @@ -118,9 +119,30 @@ func TestORM(t *testing.T) { require.NoError(t, err) assert.Equal(t, int64(57), d) - result, err := orm.Get(ctx, sURL, 100) + result, err := orm.Get(ctx, sURL, 100, 0) require.NoError(t, err) require.Len(t, result, 43) assert.Equal(t, uint64(9), result[0].SeqNr) }) + + t.Run("Get respects maxAge argument and does not retrieve records older than this", func(t *testing.T) { + donID := uint32(101) + orm := NewORM(db, donID) + + transmissions := makeSampleTransmissions(10, sURL) + err := orm.Insert(ctx, transmissions) + require.NoError(t, err) + + pgtest.MustExec(t, db, `UPDATE llo_mercury_transmit_queue SET inserted_at = NOW() - INTERVAL '1 year' WHERE seq_nr < 5`) + + // Get with maxAge = 0 should return all records + result, err := orm.Get(ctx, sURL, 100, 0) + require.NoError(t, err) + require.Len(t, result, 10) + + // Get with maxAge = 1 month should return only the records with seq_nr >= 5 + result, err = orm.Get(ctx, sURL, 100, 30*24*time.Hour) + require.NoError(t, err) + require.Len(t, result, 5) + }) } diff --git a/core/services/llo/mercurytransmitter/persistence_manager.go b/core/services/llo/mercurytransmitter/persistence_manager.go index 04c6baf71aa..c8dd8ce6208 100644 --- a/core/services/llo/mercurytransmitter/persistence_manager.go +++ b/core/services/llo/mercurytransmitter/persistence_manager.go @@ -35,9 +35,6 @@ const ( // PruneBatchSize is the max number of transmission records to delete in // one query when pruning the table. PruneBatchSize = 10_000 - // PruneRetryFrequency is the frequency at which we retry a failed prune - // operation. - PruneRetryFrequency = 5 * time.Second // OvertimeDeleteTimeout is the maximum time we will spend trying to delete // queued transmissions after exit signal before giving up and logging an @@ -74,21 +71,27 @@ type persistenceManager struct { maxTransmitQueueSize int flushDeletesFrequency time.Duration pruneFrequency time.Duration + maxAge time.Duration transmitQueueDeleteErrorCount prometheus.Counter } -func NewPersistenceManager(lggr logger.Logger, orm ORM, serverURL string, maxTransmitQueueSize int, flushDeletesFrequency, pruneFrequency time.Duration) *persistenceManager { +func NewPersistenceManager(lggr logger.Logger, orm ORM, serverURL string, maxTransmitQueueSize int, flushDeletesFrequency, pruneFrequency, maxAge time.Duration) *persistenceManager { return &persistenceManager{ - orm: orm, - donID: orm.DonID(), - lggr: logger.Sugared(lggr).Named("LLOPersistenceManager"), - serverURL: serverURL, - stopCh: make(services.StopChan), - maxTransmitQueueSize: maxTransmitQueueSize, - flushDeletesFrequency: flushDeletesFrequency, - pruneFrequency: pruneFrequency, - transmitQueueDeleteErrorCount: promTransmitQueueDeleteErrorCount.WithLabelValues(strconv.Itoa(int(orm.DonID())), serverURL), + logger.Sugared(lggr).Named("LLOPersistenceManager"), + orm, + serverURL, + orm.DonID(), + services.StateMachine{}, + make(services.StopChan), + sync.WaitGroup{}, + sync.Mutex{}, + nil, + maxTransmitQueueSize, + flushDeletesFrequency, + pruneFrequency, + maxAge, + promTransmitQueueDeleteErrorCount.WithLabelValues(strconv.Itoa(int(orm.DonID())), serverURL), } } @@ -118,7 +121,7 @@ func (pm *persistenceManager) AsyncDelete(hash [32]byte) { } func (pm *persistenceManager) Load(ctx context.Context) ([]*Transmission, error) { - return pm.orm.Get(ctx, pm.serverURL, pm.maxTransmitQueueSize) + return pm.orm.Get(ctx, pm.serverURL, pm.maxTransmitQueueSize, pm.maxAge) } func (pm *persistenceManager) runFlushDeletesLoop() { @@ -217,21 +220,13 @@ func (pm *persistenceManager) runPruneLoop() { } return case <-ticker.C: - for { - n, err := pm.orm.Prune(ctx, pm.serverURL, pm.maxTransmitQueueSize, PruneBatchSize) - if err == nil { - if n > 0 { - pm.lggr.Debugw("Pruned transmit requests table", "nDeleted", n) - } - break - } + n, err := pm.orm.Prune(ctx, pm.serverURL, pm.maxTransmitQueueSize, PruneBatchSize) + if err != nil { pm.lggr.Errorw("Failed to prune transmit requests table", "err", err) - select { - case <-time.After(PruneRetryFrequency): - continue - case <-ctx.Done(): - return - } + continue + } + if n > 0 { + pm.lggr.Debugw("Pruned transmit requests table", "nDeleted", n) } } } diff --git a/core/services/llo/mercurytransmitter/persistence_manager_test.go b/core/services/llo/mercurytransmitter/persistence_manager_test.go index c05971ee5e5..a90fea588ae 100644 --- a/core/services/llo/mercurytransmitter/persistence_manager_test.go +++ b/core/services/llo/mercurytransmitter/persistence_manager_test.go @@ -23,7 +23,7 @@ func bootstrapPersistenceManager(t *testing.T, donID uint32, db *sqlx.DB, maxTra t.Helper() lggr, observedLogs := logger.TestLoggerObserved(t, zapcore.DebugLevel) orm := NewORM(db, donID) - return NewPersistenceManager(lggr, orm, "wss://example.com/mercury", maxTransmitQueueSize, 5*time.Millisecond, 5*time.Millisecond), observedLogs + return NewPersistenceManager(lggr, orm, "wss://example.com/mercury", maxTransmitQueueSize, 5*time.Millisecond, 5*time.Millisecond, 30*24*time.Hour), observedLogs } func TestPersistenceManager(t *testing.T) { @@ -32,30 +32,53 @@ func TestPersistenceManager(t *testing.T) { ctx := testutils.Context(t) db := pgtest.NewSqlxDB(t) - pm, _ := bootstrapPersistenceManager(t, donID1, db, 2) - transmissions := makeSampleTransmissions(3, sURL) - err := pm.orm.Insert(ctx, transmissions) - require.NoError(t, err) + t.Run("loads transmissions", func(t *testing.T) { + pm, _ := bootstrapPersistenceManager(t, donID1, db, 2) + transmissions := makeSampleTransmissions(3, sURL) + err := pm.orm.Insert(ctx, transmissions) + require.NoError(t, err) - sort.Slice(transmissions, func(i, j int) bool { - // sort by seqnr desc to match return of Get - return transmissions[i].SeqNr > transmissions[j].SeqNr - }) - result, err := pm.Load(ctx) - require.NoError(t, err) - assert.ElementsMatch(t, transmissions[0:2], result) + sort.Slice(transmissions, func(i, j int) bool { + // sort by seqnr desc to match return of Get + return transmissions[i].SeqNr > transmissions[j].SeqNr + }) + result, err := pm.Load(ctx) + require.NoError(t, err) + assert.ElementsMatch(t, transmissions[0:2], result) - err = pm.orm.Delete(ctx, [][32]byte{transmissions[0].Hash()}) - require.NoError(t, err) + err = pm.orm.Delete(ctx, [][32]byte{transmissions[0].Hash()}) + require.NoError(t, err) + }) t.Run("scopes load to only transmissions with matching don ID", func(t *testing.T) { + pm, _ := bootstrapPersistenceManager(t, donID1, db, 2) + transmissions := makeSampleTransmissions(3, sURL) + err := pm.orm.Insert(ctx, transmissions) + require.NoError(t, err) + pm2, _ := bootstrapPersistenceManager(t, donID2, db, 3) - result, err = pm2.Load(ctx) + result, err := pm2.Load(ctx) require.NoError(t, err) assert.Empty(t, result) }) + + t.Run("does not load records older than maxAge", func(t *testing.T) { + pm, _ := bootstrapPersistenceManager(t, donID1, db, 3) + transmissions := makeSampleTransmissions(3, sURL) + err := pm.orm.Insert(ctx, transmissions) + require.NoError(t, err) + + pgtest.MustExec(t, db, `UPDATE llo_mercury_transmit_queue SET inserted_at = NOW() - INTERVAL '1 year' WHERE seq_nr = 0`) + + result, err := pm.Load(ctx) + require.NoError(t, err) + + assert.Len(t, result, 2) + assert.Equal(t, uint64(2), result[0].SeqNr) + assert.Equal(t, uint64(1), result[1].SeqNr) + }) } func TestPersistenceManagerAsyncDelete(t *testing.T) { diff --git a/core/services/llo/mercurytransmitter/server.go b/core/services/llo/mercurytransmitter/server.go index 4a34b8b1461..c572d61d6c1 100644 --- a/core/services/llo/mercurytransmitter/server.go +++ b/core/services/llo/mercurytransmitter/server.go @@ -96,12 +96,13 @@ type server struct { } type QueueConfig interface { + ReaperMaxAge() commonconfig.Duration TransmitQueueMaxSize() uint32 TransmitTimeout() commonconfig.Duration } func newServer(lggr logger.Logger, verboseLogging bool, cfg QueueConfig, client grpc.Client, orm ORM, serverURL string) *server { - pm := NewPersistenceManager(lggr, orm, serverURL, int(cfg.TransmitQueueMaxSize()), FlushDeletesFrequency, PruneFrequency) + pm := NewPersistenceManager(lggr, orm, serverURL, int(cfg.TransmitQueueMaxSize()), FlushDeletesFrequency, PruneFrequency, cfg.ReaperMaxAge().Duration()) donIDStr := fmt.Sprintf("%d", pm.DonID()) var codecLggr logger.Logger if verboseLogging { diff --git a/core/services/llo/mercurytransmitter/transmitter.go b/core/services/llo/mercurytransmitter/transmitter.go index 396c7712a66..b6a2bb5ae4e 100644 --- a/core/services/llo/mercurytransmitter/transmitter.go +++ b/core/services/llo/mercurytransmitter/transmitter.go @@ -103,9 +103,10 @@ var _ Transmitter = (*transmitter)(nil) type Config interface { Protocol() config.MercuryTransmitterProtocol + ReaperMaxAge() commonconfig.Duration + TransmitConcurrency() uint32 TransmitQueueMaxSize() uint32 TransmitTimeout() commonconfig.Duration - TransmitConcurrency() uint32 } type transmitter struct { diff --git a/core/services/llo/mercurytransmitter/transmitter_test.go b/core/services/llo/mercurytransmitter/transmitter_test.go index b753016f33e..3769a4f247b 100644 --- a/core/services/llo/mercurytransmitter/transmitter_test.go +++ b/core/services/llo/mercurytransmitter/transmitter_test.go @@ -30,6 +30,10 @@ func (m mockCfg) Protocol() config.MercuryTransmitterProtocol { return config.MercuryTransmitterProtocolGRPC } +func (m mockCfg) ReaperMaxAge() commonconfig.Duration { + return *commonconfig.MustNewDuration(0) +} + func (m mockCfg) TransmitQueueMaxSize() uint32 { return 10_000 } diff --git a/core/services/ocr2/plugins/llo/integration_test.go b/core/services/ocr2/plugins/llo/integration_test.go index 80b86a5eb92..437c1a49343 100644 --- a/core/services/ocr2/plugins/llo/integration_test.go +++ b/core/services/ocr2/plugins/llo/integration_test.go @@ -1065,14 +1065,14 @@ func TestIntegration_LLO_stress_test_and_transmit_errors(t *testing.T) { // nReports: the number of reports to expect per node // LESS STRESSFUL - // const nChannels = 200 - // const maxQueueSize = 10 - // const nReports = 1_000 + const nChannels = 200 + const maxQueueSize = 10 + const nReports = 1_000 // MORE STRESSFUL - const nChannels = 2000 - const maxQueueSize = 4_000 - const nReports = 10_000 + // const nChannels = 2000 + // const maxQueueSize = 4_000 + // const nReports = 10_000 clientCSAKeys := make([]csakey.KeyV2, nNodes) clientPubKeys := make([]ed25519.PublicKey, nNodes) diff --git a/core/web/testdata/body/health.html b/core/web/testdata/body/health.html index 063709a24e8..b8f8cd43028 100644 --- a/core/web/testdata/body/health.html +++ b/core/web/testdata/body/health.html @@ -84,6 +84,9 @@
JobSpawner
+
+ LLOTransmissionReaper +
Mailbox
diff --git a/core/web/testdata/body/health.json b/core/web/testdata/body/health.json index f70eb302d0b..39aa690219a 100644 --- a/core/web/testdata/body/health.json +++ b/core/web/testdata/body/health.json @@ -144,6 +144,15 @@ "output": "" } }, + { + "type": "checks", + "id": "LLOTransmissionReaper", + "attributes": { + "name": "LLOTransmissionReaper", + "status": "passing", + "output": "" + } + }, { "type": "checks", "id": "Mailbox.Monitor", diff --git a/core/web/testdata/body/health.txt b/core/web/testdata/body/health.txt index ef27cc12ea7..3b0da89f6fb 100644 --- a/core/web/testdata/body/health.txt +++ b/core/web/testdata/body/health.txt @@ -15,6 +15,7 @@ ok EVM.0.Txm.WrappedEvmEstimator ok HeadReporter ok Heartbeat ok JobSpawner +ok LLOTransmissionReaper ok Mailbox.Monitor ok Mercury.WSRPCPool ok Mercury.WSRPCPool.CacheSet @@ -27,4 +28,4 @@ ok Solana.Bar.Chain.BalanceMonitor ok Solana.Bar.Chain.Txm ok Solana.Bar.Relayer ok TelemetryManager -ok WorkflowDBStore \ No newline at end of file +ok WorkflowDBStore From 8d2c3da23f906cee54911eab426d24dd85baf1c3 Mon Sep 17 00:00:00 2001 From: Bartek Tofel Date: Tue, 11 Feb 2025 18:11:39 +0100 Subject: [PATCH 17/83] [TT-1991] do not use github.sha in the reusable e2e workflow (#16319) * do not use github.sha in the reusable e2e workflow * use latest reusable workflow, fail integration tests if chainlink image isn't built --- .github/workflows/integration-tests.yml | 47 ++++++++++++------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index 0a101c7ff77..b76fb194abe 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -35,7 +35,7 @@ concurrency: env: # for run-test variables and environment - ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-tests:${{ inputs.evm-ref || github.sha }} + ENV_JOB_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-tests:${{ inputs.evm-ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink TEST_SUITE: smoke TEST_ARGS: -test.timeout 12m @@ -168,7 +168,7 @@ jobs: with: tag_suffix: ${{ matrix.image.tag-suffix }} dockerfile: ${{ matrix.image.dockerfile }} - git_commit_sha: ${{ inputs.evm-ref || github.sha }} + git_commit_sha: ${{ inputs.evm-ref || inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} AWS_REGION: ${{ secrets.QA_AWS_REGION }} AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }} dep_evm_sha: ${{ inputs.evm-ref }} @@ -183,11 +183,10 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && ( needs.changes.outputs.keystone_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@668a588b1865068140c888c253b72ba8809eb030 + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@e600c1954dacd5f4a2c24d49b81ab73cc9d75763 with: workflow_name: Run Core Workflow Engine Tests For PR - chainlink_version: ${{ inputs.evm-ref || github.sha }} - chainlink_upgrade_version: ${{ github.sha }} + chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} test_path: .github/e2e-tests.yml test_trigger: PR Workflow Engine E2E Core Tests upload_cl_node_coverage_artifact: true @@ -227,11 +226,10 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f5baaf5e95d718546820cc5fecb42b6df410343d + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@e600c1954dacd5f4a2c24d49b81ab73cc9d75763 with: workflow_name: Run Core E2E Tests For PR - chainlink_version: ${{ inputs.evm-ref || github.sha }} - chainlink_upgrade_version: ${{ github.sha }} + chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} test_path: .github/e2e-tests.yml test_trigger: PR E2E Core Tests upload_cl_node_coverage_artifact: true @@ -269,11 +267,10 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'merge_group' && ( needs.changes.outputs.core_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f5baaf5e95d718546820cc5fecb42b6df410343d + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@e600c1954dacd5f4a2c24d49b81ab73cc9d75763 with: workflow_name: Run Core E2E Tests For Merge Queue - chainlink_version: ${{ inputs.evm-ref || github.sha }} - chainlink_upgrade_version: ${{ github.sha }} + chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} test_path: .github/e2e-tests.yml test_trigger: Merge Queue E2E Core Tests upload_cl_node_coverage_artifact: true @@ -315,11 +312,10 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'pull_request' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f5baaf5e95d718546820cc5fecb42b6df410343d + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@e600c1954dacd5f4a2c24d49b81ab73cc9d75763 with: workflow_name: Run CCIP E2E Tests For PR - chainlink_version: ${{ inputs.evm-ref || github.sha }} - chainlink_upgrade_version: ${{ github.sha }} + chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} test_path: .github/e2e-tests.yml test_trigger: PR E2E CCIP Tests upload_cl_node_coverage_artifact: true @@ -358,11 +354,10 @@ jobs: contents: read needs: [build-chainlink, changes] if: github.event_name == 'merge_group' && (needs.changes.outputs.ccip_changes == 'true' || needs.changes.outputs.github_ci_changes == 'true') - uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@f5baaf5e95d718546820cc5fecb42b6df410343d + uses: smartcontractkit/.github/.github/workflows/run-e2e-tests.yml@e600c1954dacd5f4a2c24d49b81ab73cc9d75763 with: workflow_name: Run CCIP E2E Tests For Merge Queue - chainlink_version: ${{ inputs.evm-ref || github.sha }} - chainlink_upgrade_version: ${{ github.sha }} + chainlink_version: ${{ inputs.evm-ref || inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} test_path: .github/e2e-tests.yml test_trigger: Merge Queue E2E CCIP Tests upload_cl_node_coverage_artifact: true @@ -395,13 +390,13 @@ jobs: if: always() name: ETH Smoke Tests runs-on: ubuntu-latest - needs: [run-core-e2e-tests-for-pr, run-core-e2e-keystone-tests-for-pr, run-ccip-e2e-tests-for-pr, run-core-e2e-tests-for-merge-queue, run-ccip-e2e-tests-for-merge-queue] + needs: [build-chainlink, run-core-e2e-tests-for-pr, run-core-e2e-keystone-tests-for-pr, run-ccip-e2e-tests-for-pr, run-core-e2e-tests-for-merge-queue, run-ccip-e2e-tests-for-merge-queue] steps: - name: Check Core test results id: check_core_results run: | results='${{ needs.run-core-e2e-tests-for-pr.outputs.test_results }}' - echo "Core test results:" + echo "Core e2e test results:" echo "$results" | jq . node_migration_tests_failed=$(echo $results | jq '[.[] | select(.id == "integration-tests/migration/upgrade_version_test.go:*" ) | select(.result != "success")] | length > 0') @@ -411,7 +406,7 @@ jobs: id: check_core_keystone_results run: | results='${{ needs.run-core-e2e-keystone-tests-for-pr.outputs.test_results }}' - echo "Core test results:" + echo "Keystone e2e test results:" echo "$results" | jq . node_migration_tests_failed=$(echo $results | jq '[.[] | select(.id == "integration-tests/migration/upgrade_version_test.go:*" ) | select(.result != "success")] | length > 0') @@ -445,6 +440,10 @@ jobs: if: always() && needs.run-core-e2e-tests-for-merge-queue.result == 'failure' run: exit 1 + - name: Fail the job if Chainlink image wasn't built + if: always() && needs.build-chainlink.result == 'failure' + run: exit 1 + cleanup: name: Clean up integration environment deployments if: always() @@ -457,7 +456,7 @@ jobs: with: persist-credentials: false repository: smartcontractkit/chainlink - ref: ${{ inputs.cl_ref }} + ref: ${{ inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} - name: 🧼 Clean up Environment if: ${{ github.event_name == 'pull_request' }} @@ -675,7 +674,7 @@ jobs: get_solana_sha, ] env: - CHAINLINK_COMMIT_SHA: ${{ inputs.evm-ref || github.sha }} + CHAINLINK_COMMIT_SHA: ${{ inputs.evm-ref || inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} CHAINLINK_ENV_USER: ${{ github.actor }} TEST_LOG_LEVEL: debug CONTRACT_ARTIFACTS_PATH: contracts/target/deploy @@ -727,7 +726,7 @@ jobs: - name: Generate config overrides env: GH_INPUTS_EVM_REF: ${{ inputs.evm-ref }} - GH_SHA: ${{ github.sha }} + GH_SHA: ${{ inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} run: | # https://github.com/smartcontractkit/chainlink-testing-framework/lib/blob/main/config/README.md cat << EOF > config.toml [ChainlinkImage] @@ -749,7 +748,7 @@ jobs: test_command_to_run: export ENV_JOB_IMAGE=${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-solana-tests:${{ needs.get_solana_sha.outputs.sha }} && make test_smoke test_config_override_base64: ${{ env.BASE64_CONFIG_OVERRIDE }} cl_repo: ${{ env.CHAINLINK_IMAGE }} - cl_image_tag: ${{ inputs.evm-ref || github.sha }} + cl_image_tag: ${{ inputs.evm-ref || inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} publish_check_name: Solana Smoke Test Results go_mod_path: ./integration-tests/go.mod cache_key_id: core-solana-e2e-${{ env.MOD_CACHE_VERSION }} From e576e87e3b465c38e6ecda81745ffe566e5eef0e Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Tue, 11 Feb 2025 09:27:22 -0800 Subject: [PATCH 18/83] chore: disable experimental test optimization workflow (#16310) --- .github/workflows/ci-core-partial.yml | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci-core-partial.yml b/.github/workflows/ci-core-partial.yml index 9b7a1835188..a0ee5c75733 100644 --- a/.github/workflows/ci-core-partial.yml +++ b/.github/workflows/ci-core-partial.yml @@ -1,14 +1,16 @@ name: Experimental Test Optimization +# Disable on: - push: - branches: - - develop - # - "release/*" - # merge_group: - pull_request: - schedule: - - cron: "0 1 * * *" + workflow_dispatch: + # push: + # branches: + # - develop + # # - "release/*" + # # merge_group: + # pull_request: + # schedule: + # - cron: "0 1 * * *" env: # We explicitly have this env var not be "CL_DATABASE_URL" to avoid having it be used by core related tests @@ -140,7 +142,7 @@ jobs: if: ${{ needs.filter.outputs.should-collect-coverage == 'true' }} runs-on: ubuntu-latest steps: - - name: Checkout the repo + - name: Checkout the repo uses: actions/checkout@v4.2.1 with: persist-credentials: false From 96d3253e45158cda3e9e574e9b902206ce8c90d1 Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Tue, 11 Feb 2025 12:53:21 -0500 Subject: [PATCH 19/83] Bump MCMS and chainlink-ccip (#16291) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * clean commit history * adding test for setpool and pool lookuptable * fee quoter changes barring tests * fixing after fee quoter * updating receiver * bug fixes * go mods * logs * bug fix * offramp changes * Bump chainlink-solana * bug fix * linting * bug fix * Revert "solana tooling dev" This reverts commit 866a1d547c7773af59cf68fd2a2ad8d77e5fee68. * revert smoke * fix tests * lint * change address table init * fix tests * pass offramp in CCIP home * rename addresslookup to offrampaddresslookup * semantics * file split and extending lookup table * append pool instruction * fix chainlink_models_test.go * fix lint * Fix more tests * solana deploy * bumping mcms and chainlink-ccip * adding new price updater ix * feat: solana tooling dev * test * merging * man * merging * token pool lint * reverting * Revert "feat: solana tooling dev" This reverts commit 6bb66ee88c31b081d1e2c740f07fc3fd61502a3a. * reverting --------- Co-authored-by: yashnevatia Co-authored-by: Blaž Hrastnik --- core/scripts/go.mod | 4 +- core/scripts/go.sum | 8 ++-- .../changeset/solana/cs_chain_contracts.go | 15 ------- .../solana/cs_chain_contracts_test.go | 25 ++++++------ .../ccip/changeset/solana/cs_deploy_chain.go | 17 ++++++-- .../changeset/solana/cs_deploy_chain_test.go | 4 +- .../ccip/changeset/solana/cs_token_pool.go | 40 ++++++++----------- .../changeset/testhelpers/test_helpers.go | 1 + deployment/environment/memory/chain.go | 2 +- deployment/go.mod | 4 +- deployment/go.sum | 8 ++-- go.mod | 6 +-- go.sum | 12 +++--- integration-tests/go.mod | 4 +- integration-tests/go.sum | 8 ++-- integration-tests/load/go.mod | 4 +- integration-tests/load/go.sum | 8 ++-- 17 files changed, 78 insertions(+), 92 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index c8c59377181..723b7196fcf 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -303,7 +303,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect @@ -312,7 +312,7 @@ require ( github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect - github.com/smartcontractkit/mcms v0.9.0 // indirect + github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 4d91fcb7f49..a7fe7098d07 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1115,8 +1115,8 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= @@ -1147,8 +1147,8 @@ github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12i github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= -github.com/smartcontractkit/mcms v0.9.0 h1:tPbztEuJTUmvgHEHCPHMp3wUgS9CfjcA1zt+52xpLIc= -github.com/smartcontractkit/mcms v0.9.0/go.mod h1:dd6y+4EAXv1l2ziDeNcB5tYAnckEX/XiMjDosmadPYU= +github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= +github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o= github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc= diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts.go b/deployment/ccip/changeset/solana/cs_chain_contracts.go index 1dd965571c4..a5366ff5842 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts.go @@ -9,7 +9,6 @@ import ( solOffRamp "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" - solTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/token_pool" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" "github.com/smartcontractkit/chainlink/deployment" @@ -39,20 +38,6 @@ func GetTokenProgramID(programName string) (solana.PublicKey, error) { return programID, nil } -// GetPoolType returns the token pool type constant for the given string -func GetPoolType(poolType string) (solTokenPool.PoolType, error) { - poolTypes := map[string]solTokenPool.PoolType{ - "LockAndRelease": solTokenPool.LockAndRelease_PoolType, - "BurnAndMint": solTokenPool.BurnAndMint_PoolType, - } - - poolTypeConstant, ok := poolTypes[poolType] - if !ok { - return 0, fmt.Errorf("invalid pool type: %s. Must be one of: LockAndRelease, BurnAndMint", poolType) - } - return poolTypeConstant, nil -} - func commonValidation(e deployment.Environment, selector uint64, tokenPubKey solana.PublicKey) error { chain, ok := e.SolChains[selector] if !ok { diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go index 192bf2984e7..4ffc3c8647f 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go @@ -9,7 +9,7 @@ import ( solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" - solTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/token_pool" + solTestTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_token_pool" solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" @@ -132,7 +132,7 @@ func TestAddTokenPool(t *testing.T) { ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenProgramName: deployment.SPL2022Tokens, - PoolType: "LockAndRelease", + PoolType: solTestTokenPool.LockAndRelease_PoolType, // this works for testing, but if we really want some other authority we need to pass in a private key for signing purposes Authority: e.SolChains[solChain].DeployerKey.PublicKey().String(), }, @@ -143,18 +143,18 @@ func TestAddTokenPool(t *testing.T) { SolChainSelector: solChain, RemoteChainSelector: evmChain, SolTokenPubKey: tokenAddress.String(), - RemoteConfig: solTokenPool.RemoteConfig{ + RemoteConfig: solTestTokenPool.RemoteConfig{ // TODO:this can be potentially read from the state if we are given the token symbol - PoolAddresses: []solTokenPool.RemoteAddress{{Address: []byte{1, 2, 3}}}, - TokenAddress: solTokenPool.RemoteAddress{Address: []byte{4, 5, 6}}, + PoolAddresses: []solTestTokenPool.RemoteAddress{{Address: []byte{1, 2, 3}}}, + TokenAddress: solTestTokenPool.RemoteAddress{Address: []byte{4, 5, 6}}, Decimals: 9, }, - InboundRateLimit: solTokenPool.RateLimitConfig{ + InboundRateLimit: solTestTokenPool.RateLimitConfig{ Enabled: true, Capacity: uint64(1000), Rate: 1, }, - OutboundRateLimit: solTokenPool.RateLimitConfig{ + OutboundRateLimit: solTestTokenPool.RateLimitConfig{ Enabled: false, Capacity: 0, Rate: 0, @@ -167,20 +167,19 @@ func TestAddTokenPool(t *testing.T) { // test AddTokenPool results poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(tokenAddress, state.SolChains[solChain].TokenPool) require.NoError(t, err) - var configAccount solTokenPool.Config + var configAccount solTestTokenPool.State err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, poolConfigPDA, &configAccount) - t.Logf("configAccount: %+v", configAccount) require.NoError(t, err) - require.Equal(t, solTokenPool.LockAndRelease_PoolType, configAccount.PoolType) - require.Equal(t, tokenAddress, configAccount.Mint) + require.Equal(t, solTestTokenPool.LockAndRelease_PoolType, configAccount.PoolType) + require.Equal(t, tokenAddress, configAccount.Config.Mint) // try minting after this and see if the pool or the deployer key is the authority // test SetupTokenPoolForRemoteChain results remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(evmChain, tokenAddress, state.SolChains[solChain].TokenPool) - var remoteChainConfigAccount solTokenPool.ChainConfig + var remoteChainConfigAccount solTestTokenPool.ChainConfig err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, remoteChainConfigPDA, &remoteChainConfigAccount) require.NoError(t, err) - require.Equal(t, uint8(9), remoteChainConfigAccount.Remote.Decimals) + require.Equal(t, uint8(9), remoteChainConfigAccount.Base.Remote.Decimals) } func TestBilling(t *testing.T) { diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain.go b/deployment/ccip/changeset/solana/cs_deploy_chain.go index 44393c03ec4..08139899043 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain.go @@ -136,14 +136,12 @@ func initializeFeeQuoter( if err != nil { return fmt.Errorf("failed to get solana router program data: %w", err) } - offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) feeQuoterConfigPDA, _, _ := solState.FindFqConfigPDA(feeQuoterAddress) instruction, err := solFeeQuoter.NewInitializeInstruction( linkTokenAddress, deployment.SolDefaultMaxFeeJuelsPerMsg, ccipRouterProgram, - offRampBillingSignerPDA, feeQuoterConfigPDA, chain.DeployerKey.PublicKey(), solana.SystemProgramID, @@ -151,10 +149,21 @@ func initializeFeeQuoter( programData.Address, ).ValidateAndBuild() + offRampBillingSignerPDA, _, _ := solState.FindOfframpBillingSignerPDA(offRampAddress) + fqAllowedPriceUpdaterOfframpPDA, _, _ := solState.FindFqAllowedPriceUpdaterPDA(offRampBillingSignerPDA, feeQuoterAddress) + + priceUpdaterix, err := solFeeQuoter.NewAddPriceUpdaterInstruction( + offRampBillingSignerPDA, + fqAllowedPriceUpdaterOfframpPDA, + feeQuoterConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + ).ValidateAndBuild() + if err != nil { return fmt.Errorf("failed to build instruction: %w", err) } - if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { + if err := chain.Confirm([]solana.Instruction{instruction, priceUpdaterix}); err != nil { return fmt.Errorf("failed to confirm instructions: %w", err) } e.Logger.Infow("Initialized fee quoter", "chain", chain.String()) @@ -360,7 +369,7 @@ func deployChainContractsSolana( if chainState.TokenPool.IsZero() { // TODO: there should be two token pools deployed one of each type (lock/burn) // separate token pools are not ready yet - programID, err := chain.DeployProgram(e.Logger, "token_pool") + programID, err := chain.DeployProgram(e.Logger, "test_token_pool") if err != nil { return fmt.Errorf("failed to deploy program: %w", err) } diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index 6669775accc..9af3955753c 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -18,7 +18,7 @@ import ( commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" ) -func TestDeployChainContractsChangeset(t *testing.T) { +func TestDeployChainContractsChangesetSolana(t *testing.T) { t.Parallel() lggr := logger.TestLogger(t) e := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{ @@ -92,7 +92,7 @@ func TestDeployChainContractsChangeset(t *testing.T) { Config: changeset.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: map[uint64]changeset.ChainContractParams{ - solChainSelectors[0]: changeset.ChainContractParams{ + solChainSelectors[0]: { FeeQuoterParams: changeset.DefaultFeeQuoterParams(), OffRampParams: changeset.DefaultOffRampParams(), }, diff --git a/deployment/ccip/changeset/solana/cs_token_pool.go b/deployment/ccip/changeset/solana/cs_token_pool.go index e0bf2421842..191398d3ead 100644 --- a/deployment/ccip/changeset/solana/cs_token_pool.go +++ b/deployment/ccip/changeset/solana/cs_token_pool.go @@ -7,7 +7,7 @@ import ( "github.com/gagliardetto/solana-go" solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" - solTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/token_pool" + solTestTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_token_pool" solCommonUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" @@ -21,7 +21,7 @@ var _ deployment.ChangeSet[RemoteChainTokenPoolConfig] = SetupTokenPoolForRemote type TokenPoolConfig struct { ChainSelector uint64 - PoolType string + PoolType solTestTokenPool.PoolType Authority string TokenPubKey string TokenProgramName string @@ -37,9 +37,6 @@ func (cfg TokenPoolConfig) Validate(e deployment.Environment) error { if chainState.TokenPool.IsZero() { return fmt.Errorf("token pool not found in existing state, deploy the token pool first for chain %d", cfg.ChainSelector) } - if _, err := GetPoolType(cfg.PoolType); err != nil { - return err - } if _, err := GetTokenProgramID(cfg.TokenProgramName); err != nil { return err } @@ -50,7 +47,7 @@ func (cfg TokenPoolConfig) Validate(e deployment.Environment) error { return fmt.Errorf("failed to get token pool config address (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) } chain := e.SolChains[cfg.ChainSelector] - var poolConfigAccount solTokenPool.Config + var poolConfigAccount solTestTokenPool.State if err := chain.GetAccountDataBorshInto(context.Background(), poolConfigPDA, &poolConfigAccount); err == nil { return fmt.Errorf("token pool config already exists for (mint: %s, pool: %s)", tokenPubKey.String(), tokenPool.String()) } @@ -69,13 +66,9 @@ func AddTokenPool(e deployment.Environment, cfg TokenPoolConfig) (deployment.Cha // verified tokenprogramID, _ := GetTokenProgramID(cfg.TokenProgramName) - poolType, _ := GetPoolType(cfg.PoolType) poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) poolSigner, _ := solTokenUtil.TokenPoolSignerAddress(tokenPubKey, chainState.TokenPool) - // addressing errcheck in the next PR - rampAuthorityPubKey, _, _ := solState.FindExternalExecutionConfigPDA(chainState.Router) - // ata for token pool createI, tokenPoolATA, err := solTokenUtil.CreateAssociatedTokenAccount( tokenprogramID, @@ -87,14 +80,13 @@ func AddTokenPool(e deployment.Environment, cfg TokenPoolConfig) (deployment.Cha return deployment.ChangesetOutput{}, fmt.Errorf("failed to create associated token account for tokenpool (mint: %s, pool: %s): %w", tokenPubKey.String(), chainState.TokenPool.String(), err) } - solTokenPool.SetProgramID(chainState.TokenPool) + solTestTokenPool.SetProgramID(chainState.TokenPool) // initialize token pool for token - poolInitI, err := solTokenPool.NewInitializeInstruction( - poolType, - rampAuthorityPubKey, + poolInitI, err := solTestTokenPool.NewInitializeInstruction( + cfg.PoolType, + chainState.Router, poolConfigPDA, tokenPubKey, - poolSigner, authorityPubKey, // this is assumed to be chain.DeployerKey for now (owner of token pool) solana.SystemProgramID, ).ValidateAndBuild() @@ -129,9 +121,9 @@ type RemoteChainTokenPoolConfig struct { RemoteChainSelector uint64 SolTokenPubKey string // this is actually derivable from on chain given token symbol - RemoteConfig solTokenPool.RemoteConfig - InboundRateLimit solTokenPool.RateLimitConfig - OutboundRateLimit solTokenPool.RateLimitConfig + RemoteConfig solTestTokenPool.RemoteConfig + InboundRateLimit solTestTokenPool.RateLimitConfig + OutboundRateLimit solTestTokenPool.RateLimitConfig } func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { @@ -153,7 +145,7 @@ func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { if err != nil { return fmt.Errorf("failed to get token pool config address (mint: %s, pool: %s): %w", tokenPubKey.String(), tokenPool.String(), err) } - var poolConfigAccount solTokenPool.Config + var poolConfigAccount solTestTokenPool.State if err := chain.GetAccountDataBorshInto(context.Background(), poolConfigPDA, &poolConfigAccount); err != nil { return fmt.Errorf("token pool config not found (mint: %s, pool: %s): %w", tokenPubKey.String(), chainState.TokenPool.String(), err) } @@ -163,7 +155,7 @@ func (cfg RemoteChainTokenPoolConfig) Validate(e deployment.Environment) error { if err != nil { return fmt.Errorf("failed to get token pool remote chain config pda (remoteSelector: %d, mint: %s, pool: %s): %w", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String(), err) } - var remoteChainConfigAccount solTokenPool.ChainConfig + var remoteChainConfigAccount solTestTokenPool.ChainConfig if err := chain.GetAccountDataBorshInto(context.Background(), remoteChainConfigPDA, &remoteChainConfigAccount); err == nil { return fmt.Errorf("remote chain config already exists for (remoteSelector: %d, mint: %s, pool: %s)", cfg.RemoteChainSelector, tokenPubKey.String(), tokenPool.String()) } @@ -182,8 +174,8 @@ func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainToken poolConfigPDA, _ := solTokenUtil.TokenPoolConfigAddress(tokenPubKey, chainState.TokenPool) remoteChainConfigPDA, _, _ := solTokenUtil.TokenPoolChainConfigPDA(cfg.RemoteChainSelector, tokenPubKey, chainState.TokenPool) - solTokenPool.SetProgramID(chainState.TokenPool) - ixConfigure, err := solTokenPool.NewInitChainRemoteConfigInstruction( + solTestTokenPool.SetProgramID(chainState.TokenPool) + ixConfigure, err := solTestTokenPool.NewInitChainRemoteConfigInstruction( cfg.RemoteChainSelector, tokenPubKey, cfg.RemoteConfig, @@ -195,7 +187,7 @@ func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainToken if err != nil { return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) } - ixRates, err := solTokenPool.NewSetChainRateLimitInstruction( + ixRates, err := solTestTokenPool.NewSetChainRateLimitInstruction( cfg.RemoteChainSelector, tokenPubKey, cfg.InboundRateLimit, @@ -209,7 +201,7 @@ func SetupTokenPoolForRemoteChain(e deployment.Environment, cfg RemoteChainToken return deployment.ChangesetOutput{}, fmt.Errorf("failed to generate instructions: %w", err) } - ixAppend, err := solTokenPool.NewAppendRemotePoolAddressesInstruction( + ixAppend, err := solTestTokenPool.NewAppendRemotePoolAddressesInstruction( cfg.RemoteChainSelector, tokenPubKey, cfg.RemoteConfig.PoolAddresses, // i dont know why this is a list (is it for different types of pool of the same token?) diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 63d447a35dd..786943daecc 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -1442,6 +1442,7 @@ func DeploySolanaCcipReceiver(t *testing.T, e deployment.Environment) { solTestReceiver.SetProgramID(chainState.Receiver) externalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(chainState.Receiver) instruction, ixErr := solTestReceiver.NewInitializeInstruction( + chainState.Router, FindReceiverTargetAccount(chainState.Receiver), externalExecutionConfigPDA, e.SolChains[solSelector].DeployerKey.PublicKey(), diff --git a/deployment/environment/memory/chain.go b/deployment/environment/memory/chain.go index e0901bd244c..e9332f81601 100644 --- a/deployment/environment/memory/chain.go +++ b/deployment/environment/memory/chain.go @@ -197,7 +197,7 @@ func solChain(t *testing.T, chainID uint64, adminKey *solana.PrivateKey) (string programIds := map[string]string{ "ccip_router": solTestConfig.CcipRouterProgram.String(), - "token_pool": solTestConfig.CcipTokenPoolProgram.String(), + "test_token_pool": solTestConfig.CcipTokenPoolProgram.String(), "fee_quoter": solTestConfig.FeeQuoterProgram.String(), "test_ccip_receiver": solTestConfig.CcipLogicReceiver.String(), "ccip_offramp": solTestConfig.CcipOfframpProgram.String(), diff --git a/deployment/go.mod b/deployment/go.mod index 6231c8fd71b..82db28367f2 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -32,7 +32,7 @@ require ( github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 @@ -41,7 +41,7 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 - github.com/smartcontractkit/mcms v0.9.0 + github.com/smartcontractkit/mcms v0.10.0 github.com/stretchr/testify v1.10.0 github.com/testcontainers/testcontainers-go v0.35.0 go.uber.org/multierr v1.11.0 diff --git a/deployment/go.sum b/deployment/go.sum index bf937cfd3a3..89e3289895c 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1112,8 +1112,8 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= @@ -1144,8 +1144,8 @@ github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12i github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= -github.com/smartcontractkit/mcms v0.9.0 h1:tPbztEuJTUmvgHEHCPHMp3wUgS9CfjcA1zt+52xpLIc= -github.com/smartcontractkit/mcms v0.9.0/go.mod h1:dd6y+4EAXv1l2ziDeNcB5tYAnckEX/XiMjDosmadPYU= +github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= +github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o= github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc= diff --git a/go.mod b/go.mod index 5daebb19f1f..cb3241e2b88 100644 --- a/go.mod +++ b/go.mod @@ -92,7 +92,7 @@ require ( github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de github.com/smartcontractkit/wsrpc v0.8.2 - github.com/spf13/cast v1.6.0 + github.com/spf13/cast v1.7.1 github.com/stretchr/testify v1.10.0 github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a github.com/tidwall/gjson v1.18.0 @@ -195,7 +195,7 @@ require ( github.com/ethereum/c-kzg-4844 v1.0.0 // indirect github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.6 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect github.com/gagliardetto/utilz v0.1.1 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect @@ -211,7 +211,7 @@ require ( github.com/go-ole/go-ole v1.3.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.1 // indirect + github.com/go-playground/validator/v10 v10.24.0 // indirect github.com/go-webauthn/x v0.1.5 // indirect github.com/goccy/go-json v0.10.3 // indirect github.com/goccy/go-yaml v1.12.0 // indirect diff --git a/go.sum b/go.sum index 7f7e7245571..731145aa9d2 100644 --- a/go.sum +++ b/go.sum @@ -332,8 +332,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.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc= -github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= github.com/gagliardetto/binary v0.8.0 h1:U9ahc45v9HW0d15LoN++vIXSJyqR/pWw8DDlhd7zvxg= github.com/gagliardetto/binary v0.8.0/go.mod h1:2tfj51g5o9dnvsc+fL3Jxr22MuWzYXwx9wEoN0XQ7/c= github.com/gagliardetto/gofuzz v1.2.2 h1:XL/8qDMzcgvR4+CyRQW9UGdwPRPMHVJfqQ/uMvSUuQw= @@ -405,8 +405,8 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl 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.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= -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-playground/validator/v10 v10.24.0 h1:KHQckvo8G6hlWnrPX4NJJ+aBfWNAE/HH+qdL2cBpCmg= +github.com/go-playground/validator/v10 v10.24.0/go.mod h1:GGzBIJMuE98Ic/kJsBXbz1x/7cByt++cQ+YOuDM5wus= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -1057,8 +1057,8 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index fb92ae04b6a..44cf95ded4e 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -423,7 +423,7 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect @@ -432,7 +432,7 @@ require ( github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect - github.com/smartcontractkit/mcms v0.9.0 // indirect + github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 59c0ac71ca2..6cbb9711b7e 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1362,8 +1362,8 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= @@ -1402,8 +1402,8 @@ github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12i github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= -github.com/smartcontractkit/mcms v0.9.0 h1:tPbztEuJTUmvgHEHCPHMp3wUgS9CfjcA1zt+52xpLIc= -github.com/smartcontractkit/mcms v0.9.0/go.mod h1:dd6y+4EAXv1l2ziDeNcB5tYAnckEX/XiMjDosmadPYU= +github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= +github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o= github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index f0ba3d85429..c8c836baa10 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -409,7 +409,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect @@ -423,7 +423,7 @@ require ( github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 // indirect - github.com/smartcontractkit/mcms v0.9.0 // indirect + github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect github.com/smartcontractkit/wsrpc v0.8.3 // indirect github.com/soheilhy/cmux v0.1.5 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 6cc2ed50940..6ac7ddb148a 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1345,8 +1345,8 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= @@ -1383,8 +1383,8 @@ github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12i github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM= -github.com/smartcontractkit/mcms v0.9.0 h1:tPbztEuJTUmvgHEHCPHMp3wUgS9CfjcA1zt+52xpLIc= -github.com/smartcontractkit/mcms v0.9.0/go.mod h1:dd6y+4EAXv1l2ziDeNcB5tYAnckEX/XiMjDosmadPYU= +github.com/smartcontractkit/mcms v0.10.0 h1:wkBAr8HLyHKwejdwsDOMvIwmzT83tKr3jjB9senLahM= +github.com/smartcontractkit/mcms v0.10.0/go.mod h1:3N7+yvkO3hIFXYRYm3hxKCE6qDWdOC/rZdvIrwzlLKk= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de h1:n0w0rKF+SVM+S3WNlup6uabXj2zFlFNfrlsKCMMb/co= github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de/go.mod h1:Sl2MF/Fp3fgJIVzhdGhmZZX2BlnM0oUUyBP4s4xYb6o= github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de h1:66VQxXx3lvTaAZrMBkIcdH9VEjujUEvmBQdnyOJnkOc= From 3b89c464872609a87a172d93175f3314cb8558f6 Mon Sep 17 00:00:00 2001 From: Josh Weintraub <26035072+jhweintraub@users.noreply.github.com> Date: Tue, 11 Feb 2025 13:02:21 -0500 Subject: [PATCH 20/83] CCIP-5183 comment fixes and additional parameter checks (#16299) * comment fixes and additional parameter checks * Update gethwrappers * [Bot] Update changeset file with jira issues * fix provideSiloedLiquidity function after a merge conflict messed it up * Update gethwrappers * fix nits * fix comment * fix inconsistent error check --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> Co-authored-by: Rens Rooimans --- .../.changeset/twenty-pillows-remember.md | 10 ++++ contracts/gas-snapshots/ccip.gas-snapshot | 29 +++++------ .../snapshots/DataFeedsCacheGasTest.json | 30 ----------- .../ccip/pools/SiloedLockReleaseTokenPool.sol | 36 +++++++++---- ...kReleaseTokenPool.getAvailableTokens.t.sol | 29 +++++++++++ ...iloedLockReleaseTokenPool.lockOrBurn.t.sol | 2 + ...easeTokenPool.provideSiloedLiquidity.t.sol | 36 +++++-------- ...edLockReleaseTokenPool.setRebalancer.t.sol | 19 +++++-- ...easeTokenPool.updateSiloDesignations.t.sol | 14 ++++- ...ckReleaseTokenPool.withdrawLiquidity.t.sol | 49 ++++------------- .../siloed_lock_release_token_pool.go | 52 +++++++++---------- ...rapper-dependency-versions-do-not-edit.txt | 2 +- 12 files changed, 161 insertions(+), 147 deletions(-) create mode 100644 contracts/.changeset/twenty-pillows-remember.md delete mode 100644 contracts/snapshots/DataFeedsCacheGasTest.json create mode 100644 contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.getAvailableTokens.t.sol diff --git a/contracts/.changeset/twenty-pillows-remember.md b/contracts/.changeset/twenty-pillows-remember.md new file mode 100644 index 00000000000..02c3053c650 --- /dev/null +++ b/contracts/.changeset/twenty-pillows-remember.md @@ -0,0 +1,10 @@ +--- +'@chainlink/contracts': patch +--- + +Additional security and parameter checks and comment fixes + + +PR issue: CCIP-5183 + +Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 138d7f563dd..69b1d930963 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -362,22 +362,21 @@ Router_recoverTokens:test_RecoverTokens() (gas: 52686) Router_routeMessage:test_routeMessage_AutoExec() (gas: 41838) Router_routeMessage:test_routeMessage_ExecutionEvent() (gas: 157241) Router_routeMessage:test_routeMessage_ManualExec() (gas: 34884) -SiloedLockReleaseTokenPool_lockOrBurn:test_lockOrBurn_SiloedFunds() (gas: 76874) -SiloedLockReleaseTokenPool_lockOrBurn:test_lockOrBurn_UnsiloedFunds() (gas: 76104) -SiloedLockReleaseTokenPool_provideLiquidity:test_provideLiquidity() (gas: 89627) -SiloedLockReleaseTokenPool_provideSiloedLiquidity:test_SiloedChain() (gas: 82328) -SiloedLockReleaseTokenPool_provideSiloedLiquidity:test_UnsiloedChain() (gas: 81889) -SiloedLockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_RevertsWhen_InsufficientLiquidity_SiloedChain() (gas: 109975) +SiloedLockReleaseTokenPool_getAvailableTokens:test_getAvailableTokens_SiloedChain() (gas: 75798) +SiloedLockReleaseTokenPool_getAvailableTokens:test_getAvailableTokens_UnsiloedChain() (gas: 79119) +SiloedLockReleaseTokenPool_lockOrBurn:test_lockOrBurn_SiloedFunds() (gas: 77195) +SiloedLockReleaseTokenPool_lockOrBurn:test_lockOrBurn_UnsiloedFunds() (gas: 76425) +SiloedLockReleaseTokenPool_provideLiquidity:test_provideLiquidity() (gas: 94247) +SiloedLockReleaseTokenPool_provideSiloedLiquidity:test_provideSiloedLiquidity() (gas: 84925) +SiloedLockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_RevertsWhen_InsufficientLiquidity_SiloedChain() (gas: 110216) SiloedLockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_RevertsWhen_InsufficientLiquidity_UnsiloedChain() (gas: 113535) -SiloedLockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_SiloedChain() (gas: 262243) -SiloedLockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_UnsiloedChain() (gas: 263296) -SiloedLockReleaseTokenPool_setRebalancer:test_setRebalancer_UnsiloedChains() (gas: 23661) -SiloedLockReleaseTokenPool_setRebalancer:test_setSiloRebalancer() (gas: 27540) -SiloedLockReleaseTokenPool_updateSiloDesignations:test_updateSiloDesignations() (gas: 135167) -SiloedLockReleaseTokenPool_withdrawLiqudity:test_withdrawLiquidity_RevertsWhen_LegacyFunctionSelectorUnauthorized() (gas: 16067) -SiloedLockReleaseTokenPool_withdrawLiqudity:test_withdrawLiquidity_SiloedFunds() (gas: 70845) -SiloedLockReleaseTokenPool_withdrawLiqudity:test_withdrawLiquidity_UnsiloedFunds_LegacyFunctionSelector() (gas: 72904) -SiloedLockReleaseTokenPool_withdrawLiqudity:test_withdrawSiloedLiquidity_UnsiloedFunds() (gas: 70058) +SiloedLockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_SiloedChain() (gas: 262739) +SiloedLockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_UnsiloedChain() (gas: 263827) +SiloedLockReleaseTokenPool_setRebalancer:test_setRebalancer_UnsiloedChains() (gas: 23652) +SiloedLockReleaseTokenPool_setRebalancer:test_setSiloRebalancer() (gas: 27421) +SiloedLockReleaseTokenPool_updateSiloDesignations:test_updateSiloDesignations() (gas: 139625) +SiloedLockReleaseTokenPool_withdrawLiqudity:test_withdrawLiquidity_SiloedFunds() (gas: 73138) +SiloedLockReleaseTokenPool_withdrawLiqudity:test_withdrawLiquidity_UnsiloedFunds_LegacyFunctionSelector() (gas: 74648) TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole() (gas: 44236) TokenAdminRegistry_addRegistryModule:test_addRegistryModule() (gas: 67093) TokenAdminRegistry_getAllConfiguredTokens:test_getAllConfiguredTokens_outOfBounds() (gas: 11363) diff --git a/contracts/snapshots/DataFeedsCacheGasTest.json b/contracts/snapshots/DataFeedsCacheGasTest.json deleted file mode 100644 index 05abdd8b357..00000000000 --- a/contracts/snapshots/DataFeedsCacheGasTest.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "test_bundleDecimals_proxy_gas": "18742", - "test_decimals_proxy_gas": "13389", - "test_description_proxy_gas": "17161", - "test_getAnswer_proxy_gas": "15650", - "test_getRoundData_proxy_gas": "16427", - "test_getTimestamp_proxy_gas": "15653", - "test_latestAnswer_proxy_gas": "15005", - "test_latestBundleTimestamp_proxy_gas": "14942", - "test_latestBundle_proxy_gas": "16631", - "test_latestRoundData_proxy_gas": "18360", - "test_latestRound_proxy_gas": "15105", - "test_latestTimestamp_proxy_gas": "15081", - "test_removeDataIdMappingsForProxies1feed_gas": "19152", - "test_removeDataIdMappingsForProxies5feeds_gas": "55726", - "test_updateDataIdMappingsForProxies1feed_gas": "41733", - "test_updateDataIdMappingsForProxies5feeds_gas": "94263", - "test_write_onReport_prices_1_gas": "71259", - "test_write_onReport_prices_5_gas": "332760", - "test_write_removeFeedConfigs_1_gas": "67494", - "test_write_removeFeedConfigs_5_gas": "292926", - "test_write_setBundleFeedConfigs_1_gas": "280503", - "test_write_setBundleFeedConfigs_5_gas": "1292298", - "test_write_setBundleFeedConfigs_with_delete_1_gas": "115794", - "test_write_setBundleFeedConfigs_with_delete_5_gas": "468786", - "test_write_setDecimalFeedConfigs_1_gas": "215660", - "test_write_setDecimalFeedConfigs_5_gas": "976917", - "test_write_setDecimalFeedConfigs_with_delete_1_gas": "94866", - "test_write_setDecimalFeedConfigs_with_delete_5_gas": "372982" -} diff --git a/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol b/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol index f4ba4ef8de9..ea7b174850e 100644 --- a/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol +++ b/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol @@ -99,12 +99,11 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { // Since remoteConfig.isSiloed is used more than once, caching in memory saves gas instead of multiple SLOADs. bool chainIsSiloed = remoteConfig.isSiloed; - // Prevent A silent underflow by explicitly ensuring that enough funds are available to release + // Additional security check to prevent underflow by explicitly ensuring that enough funds are available to release uint256 availableLiquidity = chainIsSiloed ? remoteConfig.tokenBalance : s_unsiloedTokenBalance; if (localAmount > availableLiquidity) revert InsufficientLiquidity(availableLiquidity, localAmount); - // Tracking balances independently by chain is a security measure to prevent liquidity for one chain from being - // released by another chain. + // Deduct the amount from the correct silo balance, or the unsiloed balance. if (chainIsSiloed) { remoteConfig.tokenBalance -= localAmount; } else { @@ -126,6 +125,8 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { function getAvailableTokens( uint64 remoteChainSelector ) external view returns (uint256 lockedTokens) { + if (!isSupportedChain(remoteChainSelector)) revert InvalidChainSelector(remoteChainSelector); + if (s_chainConfigs[remoteChainSelector].isSiloed) { return s_chainConfigs[remoteChainSelector].tokenBalance; } @@ -174,10 +175,15 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { for (uint256 i = 0; i < adds.length; ++i) { // Since the zero chain selector is used to designate unsiloed chains, it should never be used for siloed chains. - if (adds[i].remoteChainSelector == 0 || s_chainConfigs[adds[i].remoteChainSelector].isSiloed) { + if ( + adds[i].remoteChainSelector == 0 || s_chainConfigs[adds[i].remoteChainSelector].isSiloed + || !isSupportedChain(adds[i].remoteChainSelector) + ) { revert InvalidChainSelector(adds[i].remoteChainSelector); } + if (adds[i].rebalancer == address(0)) revert ZeroAddressNotAllowed(); + s_chainConfigs[adds[i].remoteChainSelector] = SiloConfig({tokenBalance: 0, rebalancer: adds[i].rebalancer, isSiloed: true}); @@ -188,7 +194,7 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { /// @notice Gets the rebalancer able to provide liquidity for a remote chain selector /// @param remoteChainSelector The CCIP specific selector for the remote chain being interacted with. /// @return The current liquidity manager for the given siloed chain, or the unsiloed rebalancer if the chain is not siloed. - function getSiloRebalancer( + function getChainRebalancer( uint64 remoteChainSelector ) public view returns (address) { SiloConfig storage remoteConfig = s_chainConfigs[remoteChainSelector]; @@ -213,6 +219,7 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { SiloConfig storage remoteConfig = s_chainConfigs[remoteChainSelector]; if (!remoteConfig.isSiloed) revert ChainNotSiloed(remoteChainSelector); + if (newRebalancer == address(0)) revert ZeroAddressNotAllowed(); address oldRebalancer = remoteConfig.rebalancer; @@ -227,6 +234,8 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { function setRebalancer( address newRebalancer ) external onlyOwner { + if (newRebalancer == address(0)) revert ZeroAddressNotAllowed(); + address oldRebalancer = s_rebalancer; s_rebalancer = newRebalancer; @@ -244,7 +253,10 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { /// @param amount The amount of liquidity to provide. /// @dev Only the rebalancer for the chain can add liquidity function provideSiloedLiquidity(uint64 remoteChainSelector, uint256 amount) external { - if (remoteChainSelector == 0) revert InvalidChainSelector(0); + if (!s_chainConfigs[remoteChainSelector].isSiloed || remoteChainSelector == 0) { + revert ChainNotSiloed(remoteChainSelector); + } + _provideLiquidity(remoteChainSelector, amount); } @@ -260,7 +272,7 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { function _provideLiquidity(uint64 remoteChainSelector, uint256 amount) internal { if (amount == 0) revert LiquidityAmountCannotBeZero(); - if (msg.sender != getSiloRebalancer(remoteChainSelector)) revert Unauthorized(msg.sender); + if (msg.sender != getChainRebalancer(remoteChainSelector)) revert Unauthorized(msg.sender); // Storage is used instead of memory to save gas, as the state may need to be updated if the chain is siloed. SiloConfig storage remoteConfig = s_chainConfigs[remoteChainSelector]; @@ -295,21 +307,25 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { /// which can be considered the liquidity for all non-siloed chains sharing liquidity. /// @param amount The amount of liquidity to remove. function withdrawSiloedLiquidity(uint64 remoteChainSelector, uint256 amount) external { + if (!s_chainConfigs[remoteChainSelector].isSiloed || remoteChainSelector == 0) { + revert ChainNotSiloed(remoteChainSelector); + } + _withdrawLiquidity(remoteChainSelector, amount); } function _withdrawLiquidity(uint64 remoteChainSelector, uint256 amount) internal { if (amount == 0) revert LiquidityAmountCannotBeZero(); - if (msg.sender != getSiloRebalancer(remoteChainSelector)) revert Unauthorized(msg.sender); + if (msg.sender != getChainRebalancer(remoteChainSelector)) revert Unauthorized(msg.sender); // Save gas by using storage as multiple values may need to be read/written. SiloConfig storage remoteConfig = s_chainConfigs[remoteChainSelector]; - // Prevent A silent underflow by explicitly ensuring that enough funds are available to withdraw + // Additional security check to prevent underflow by explicitly ensuring that enough funds are available to release uint256 availableLiquidity = remoteConfig.isSiloed ? remoteConfig.tokenBalance : s_unsiloedTokenBalance; if (amount > availableLiquidity) revert InsufficientLiquidity(availableLiquidity, amount); - // If funds are siloed by chain, prevent more than has been locked from being removed from the token pool. + // Deduct the amount from the correct silo balance, or the unsiloed balance. if (remoteConfig.isSiloed) { remoteConfig.tokenBalance -= amount; } else { diff --git a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.getAvailableTokens.t.sol b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.getAvailableTokens.t.sol new file mode 100644 index 00000000000..9dbf0119e20 --- /dev/null +++ b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.getAvailableTokens.t.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.24; + +import {SiloedLockReleaseTokenPool} from "../../../pools/SiloedLockReleaseTokenPool.sol"; +import {SiloedLockReleaseTokenPoolSetup} from "./SiloedLockReleaseTokenPoolSetup.t.sol"; + +contract SiloedLockReleaseTokenPool_getAvailableTokens is SiloedLockReleaseTokenPoolSetup { + function test_getAvailableTokens_UnsiloedChain() public { + uint256 amount = 1e24; + + s_siloedLockReleaseTokenPool.provideLiquidity(amount); + + assertEq(s_siloedLockReleaseTokenPool.getAvailableTokens(DEST_CHAIN_SELECTOR), amount); + } + + function test_getAvailableTokens_SiloedChain() public { + uint256 amount = 1e24; + + s_siloedLockReleaseTokenPool.provideSiloedLiquidity(SILOED_CHAIN_SELECTOR, amount); + + assertEq(s_siloedLockReleaseTokenPool.getAvailableTokens(SILOED_CHAIN_SELECTOR), amount); + } + + function test_getAvailableTokens_RevertWhen_UnsupportedChain() public { + vm.expectRevert(abi.encodeWithSelector(SiloedLockReleaseTokenPool.InvalidChainSelector.selector, type(uint64).max)); + + s_siloedLockReleaseTokenPool.getAvailableTokens(type(uint64).max); + } +} diff --git a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.lockOrBurn.t.sol b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.lockOrBurn.t.sol index 2cf51a045e9..8803e0889d1 100644 --- a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.lockOrBurn.t.sol +++ b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.lockOrBurn.t.sol @@ -54,4 +54,6 @@ contract SiloedLockReleaseTokenPool_lockOrBurn is SiloedLockReleaseTokenPoolSetu assertEq(s_siloedLockReleaseTokenPool.getAvailableTokens(DEST_CHAIN_SELECTOR), AMOUNT); } + + // Reverts } diff --git a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.provideSiloedLiquidity.t.sol b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.provideSiloedLiquidity.t.sol index 167671dfad0..bc9da43c6af 100644 --- a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.provideSiloedLiquidity.t.sol +++ b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.provideSiloedLiquidity.t.sol @@ -14,23 +14,7 @@ contract SiloedLockReleaseTokenPool_provideSiloedLiquidity is SiloedLockReleaseT s_siloedLockReleaseTokenPool.setSiloRebalancer(SILOED_CHAIN_SELECTOR, OWNER); } - function test_UnsiloedChain() public { - uint256 amount = 1e24; - - vm.expectEmit(); - emit SiloedLockReleaseTokenPool.LiquidityAdded(DEST_CHAIN_SELECTOR, OWNER, amount); - - s_siloedLockReleaseTokenPool.provideSiloedLiquidity(DEST_CHAIN_SELECTOR, amount); - - assertEq(s_token.balanceOf(address(s_siloedLockReleaseTokenPool)), amount); - - // Since the funds for the destination chain are not siloed, - // the locked token amount should not be increased - assertEq(s_siloedLockReleaseTokenPool.getAvailableTokens(DEST_CHAIN_SELECTOR), amount); - assertEq(s_siloedLockReleaseTokenPool.getUnsiloedLiquidity(), amount); - } - - function test_SiloedChain() public { + function test_provideSiloedLiquidity() public { uint256 amount = 1e24; vm.expectEmit(); @@ -47,7 +31,7 @@ contract SiloedLockReleaseTokenPool_provideSiloedLiquidity is SiloedLockReleaseT // Reverts - function test_RevertWhen_UnauthorizedForSiloedChain() public { + function test_provideSiloedLiquidity_RevertWhen_UnauthorizedForSiloedChain() public { vm.startPrank(UNAUTHORIZED_ADDRESS); vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, UNAUTHORIZED_ADDRESS)); @@ -55,23 +39,29 @@ contract SiloedLockReleaseTokenPool_provideSiloedLiquidity is SiloedLockReleaseT s_siloedLockReleaseTokenPool.provideSiloedLiquidity(SILOED_CHAIN_SELECTOR, 1); } - function test_RevertWhen_UnauthorizedForUnsiloedChain() public { + function test_provideSiloedLiquidity_RevertWhen_UnauthorizedForUnsiloedChain() public { vm.startPrank(UNAUTHORIZED_ADDRESS); vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, UNAUTHORIZED_ADDRESS)); - s_siloedLockReleaseTokenPool.provideSiloedLiquidity(DEST_CHAIN_SELECTOR, 1); + s_siloedLockReleaseTokenPool.provideSiloedLiquidity(SILOED_CHAIN_SELECTOR, 1); } - function test_RevertWhen_LiquidityAmountCannotBeZero() public { + function test_provideSiloedLiquidity_RevertWhen_LiquidityAmountCannotBeZero() public { vm.expectRevert(abi.encodeWithSelector(SiloedLockReleaseTokenPool.LiquidityAmountCannotBeZero.selector)); s_siloedLockReleaseTokenPool.provideSiloedLiquidity(SILOED_CHAIN_SELECTOR, 0); } - function test_RevertWhen_InvalidChainSelector_Zero() public { - vm.expectRevert(abi.encodeWithSelector(SiloedLockReleaseTokenPool.InvalidChainSelector.selector, 0)); + function test_provideSiloedLiquidity_RevertWhen_ChainNotSiloed_Zero() public { + vm.expectRevert(abi.encodeWithSelector(SiloedLockReleaseTokenPool.ChainNotSiloed.selector, 0)); s_siloedLockReleaseTokenPool.provideSiloedLiquidity(0, 1); } + + function test_provideSiloedLiquidity_RevertWhen_ChainNotSiloed() public { + vm.expectRevert(abi.encodeWithSelector(SiloedLockReleaseTokenPool.ChainNotSiloed.selector, DEST_CHAIN_SELECTOR)); + + s_siloedLockReleaseTokenPool.provideSiloedLiquidity(DEST_CHAIN_SELECTOR, 1); + } } diff --git a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.setRebalancer.t.sol b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.setRebalancer.t.sol index 661381038ae..d7c6d5e5edd 100644 --- a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.setRebalancer.t.sol +++ b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.setRebalancer.t.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.24; import {SiloedLockReleaseTokenPool} from "../../../pools/SiloedLockReleaseTokenPool.sol"; +import {TokenPool} from "../../../pools/TokenPool.sol"; import {SiloedLockReleaseTokenPoolSetup} from "./SiloedLockReleaseTokenPoolSetup.t.sol"; contract SiloedLockReleaseTokenPool_setRebalancer is SiloedLockReleaseTokenPoolSetup { @@ -13,8 +14,8 @@ contract SiloedLockReleaseTokenPool_setRebalancer is SiloedLockReleaseTokenPoolS s_siloedLockReleaseTokenPool.setSiloRebalancer(SILOED_CHAIN_SELECTOR, REBALANCER_ADDRESS); - assertEq(s_siloedLockReleaseTokenPool.getSiloRebalancer(SILOED_CHAIN_SELECTOR), REBALANCER_ADDRESS); - assertEq(s_siloedLockReleaseTokenPool.getSiloRebalancer(DEST_CHAIN_SELECTOR), OWNER); + assertEq(s_siloedLockReleaseTokenPool.getChainRebalancer(SILOED_CHAIN_SELECTOR), REBALANCER_ADDRESS); + assertEq(s_siloedLockReleaseTokenPool.getChainRebalancer(DEST_CHAIN_SELECTOR), OWNER); } function test_setRebalancer_UnsiloedChains() public { @@ -23,7 +24,7 @@ contract SiloedLockReleaseTokenPool_setRebalancer is SiloedLockReleaseTokenPoolS s_siloedLockReleaseTokenPool.setRebalancer(REBALANCER_ADDRESS); - assertEq(s_siloedLockReleaseTokenPool.getSiloRebalancer(DEST_CHAIN_SELECTOR), REBALANCER_ADDRESS); + assertEq(s_siloedLockReleaseTokenPool.getChainRebalancer(DEST_CHAIN_SELECTOR), REBALANCER_ADDRESS); assertEq(s_siloedLockReleaseTokenPool.getRebalancer(), REBALANCER_ADDRESS); } @@ -34,4 +35,16 @@ contract SiloedLockReleaseTokenPool_setRebalancer is SiloedLockReleaseTokenPoolS s_siloedLockReleaseTokenPool.setSiloRebalancer(DEST_CHAIN_SELECTOR, REBALANCER_ADDRESS); } + + function test_SetSiloRebalancer_RevertWhen_InvalidZeroAddress() public { + vm.expectRevert(abi.encodeWithSelector(TokenPool.ZeroAddressNotAllowed.selector)); + + s_siloedLockReleaseTokenPool.setSiloRebalancer(SILOED_CHAIN_SELECTOR, address(0)); + } + + function test_SetRebalancer_RevertWhen_InvalidZeroAddress() public { + vm.expectRevert(abi.encodeWithSelector(TokenPool.ZeroAddressNotAllowed.selector)); + + s_siloedLockReleaseTokenPool.setRebalancer(address(0)); + } } diff --git a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.updateSiloDesignations.t.sol b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.updateSiloDesignations.t.sol index 38fdff34871..0cc1f28a410 100644 --- a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.updateSiloDesignations.t.sol +++ b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.updateSiloDesignations.t.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.24; import {SiloedLockReleaseTokenPool} from "../../../pools/SiloedLockReleaseTokenPool.sol"; +import {TokenPool} from "../../../pools/TokenPool.sol"; import {SiloedLockReleaseTokenPoolSetup} from "./SiloedLockReleaseTokenPoolSetup.t.sol"; contract SiloedLockReleaseTokenPool_updateSiloDesignations is SiloedLockReleaseTokenPoolSetup { @@ -46,7 +47,7 @@ contract SiloedLockReleaseTokenPool_updateSiloDesignations is SiloedLockReleaseT // Assert that the funds are siloed correctly assertTrue(s_siloedLockReleaseTokenPool.isSiloed(SILOED_CHAIN_SELECTOR)); assertEq(s_siloedLockReleaseTokenPool.getAvailableTokens(SILOED_CHAIN_SELECTOR), 0); - assertEq(s_siloedLockReleaseTokenPool.getSiloRebalancer(SILOED_CHAIN_SELECTOR), OWNER); + assertEq(s_siloedLockReleaseTokenPool.getChainRebalancer(SILOED_CHAIN_SELECTOR), OWNER); // Provide some Liquidity so that we can then check that it gets removed. s_siloedLockReleaseTokenPool.provideSiloedLiquidity(SILOED_CHAIN_SELECTOR, amount); @@ -88,4 +89,15 @@ contract SiloedLockReleaseTokenPool_updateSiloDesignations is SiloedLockReleaseT s_siloedLockReleaseTokenPool.updateSiloDesignations(new uint64[](0), adds); } + + function test_updateSiloDesignations_RevertWhen_InvalidZeroRebalancerAddress() public { + SiloedLockReleaseTokenPool.SiloConfigUpdate[] memory adds = new SiloedLockReleaseTokenPool.SiloConfigUpdate[](1); + adds[0] = + SiloedLockReleaseTokenPool.SiloConfigUpdate({remoteChainSelector: DEST_CHAIN_SELECTOR, rebalancer: address(0)}); + + // Rebalancer address cannot be zero + vm.expectRevert(abi.encodeWithSelector(TokenPool.ZeroAddressNotAllowed.selector)); + + s_siloedLockReleaseTokenPool.updateSiloDesignations(new uint64[](0), adds); + } } diff --git a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.withdrawLiquidity.t.sol b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.withdrawLiquidity.t.sol index ab9c58b2a38..76b9ab3c1f9 100644 --- a/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.withdrawLiquidity.t.sol +++ b/contracts/src/v0.8/ccip/test/pools/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.withdrawLiquidity.t.sol @@ -34,34 +34,13 @@ contract SiloedLockReleaseTokenPool_withdrawLiqudity is SiloedLockReleaseTokenPo assertEq(s_siloedLockReleaseTokenPool.getUnsiloedLiquidity(), 0); } - function test_withdrawSiloedLiquidity_UnsiloedFunds() public { - uint256 amount = 1e24; - - uint256 balanceBefore = s_token.balanceOf(OWNER); - - // Provide the Liquidity first - s_siloedLockReleaseTokenPool.provideSiloedLiquidity(DEST_CHAIN_SELECTOR, amount); - - assertEq(s_siloedLockReleaseTokenPool.getUnsiloedLiquidity(), amount); - - vm.expectEmit(); - emit SiloedLockReleaseTokenPool.LiquidityRemoved(DEST_CHAIN_SELECTOR, OWNER, amount); - - // Remove the Liquidity - s_siloedLockReleaseTokenPool.withdrawSiloedLiquidity(DEST_CHAIN_SELECTOR, amount); - - assertEq(s_token.balanceOf(OWNER), balanceBefore); - assertEq(s_token.balanceOf(address(s_siloedLockReleaseTokenPool)), 0); - assertEq(s_siloedLockReleaseTokenPool.getUnsiloedLiquidity(), 0); - } - function test_withdrawLiquidity_UnsiloedFunds_LegacyFunctionSelector() public { uint256 amount = 1e24; uint256 balanceBefore = s_token.balanceOf(OWNER); // Provide the Liquidity first - s_siloedLockReleaseTokenPool.provideSiloedLiquidity(DEST_CHAIN_SELECTOR, amount); + s_siloedLockReleaseTokenPool.provideLiquidity(amount); assertEq(s_siloedLockReleaseTokenPool.getUnsiloedLiquidity(), amount); @@ -93,30 +72,24 @@ contract SiloedLockReleaseTokenPool_withdrawLiqudity is SiloedLockReleaseTokenPo s_siloedLockReleaseTokenPool.withdrawSiloedLiquidity(SILOED_CHAIN_SELECTOR, withdrawAmount); } - function test_withdrawSiloedLiquidity_RevertWhen_UnsiloedFunds_NotEnoughLiquidity() public { - uint256 liquidityAmount = 1e24; - uint256 withdrawAmount = liquidityAmount + 1; - - s_siloedLockReleaseTokenPool.provideSiloedLiquidity(DEST_CHAIN_SELECTOR, liquidityAmount); + function test_withdrawSiloedLiquidity_RevertWhen_UnauthorizedOnlyUnsiloedRebalancer() public { + vm.startPrank(UNAUTHORIZED_ADDRESS); - // Call should revert due to underflow error due to trying to burn more tokens than are locked via CCIP. - vm.expectRevert( - abi.encodeWithSelector(SiloedLockReleaseTokenPool.InsufficientLiquidity.selector, liquidityAmount, withdrawAmount) - ); + vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, UNAUTHORIZED_ADDRESS)); - // Test withdrawing funds from unsiloed liquidity pool but underflow - s_siloedLockReleaseTokenPool.withdrawSiloedLiquidity(DEST_CHAIN_SELECTOR, withdrawAmount); + s_siloedLockReleaseTokenPool.withdrawSiloedLiquidity(SILOED_CHAIN_SELECTOR, 1); } - function test_withdrawSiloedLiqudity_RevertWhen_UnauthorizedOnlyUnsiloedRebalancer() public { - vm.startPrank(UNAUTHORIZED_ADDRESS); - - vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, UNAUTHORIZED_ADDRESS)); + function test_withdrawSiloedLiquidity_RevertWhen_ChainNotSiloed() public { + vm.expectRevert(abi.encodeWithSelector(SiloedLockReleaseTokenPool.ChainNotSiloed.selector, DEST_CHAIN_SELECTOR)); s_siloedLockReleaseTokenPool.withdrawSiloedLiquidity(DEST_CHAIN_SELECTOR, 1); + + vm.expectRevert(abi.encodeWithSelector(SiloedLockReleaseTokenPool.ChainNotSiloed.selector, 0)); + s_siloedLockReleaseTokenPool.withdrawSiloedLiquidity(0, 1); } - function test_withdrawLiquidity_RevertsWhen_LegacyFunctionSelectorUnauthorized() public { + function test_withdrawLiquidity_RevertWhen_LegacyFunctionSelectorUnauthorized() public { vm.startPrank(UNAUTHORIZED_ADDRESS); vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, UNAUTHORIZED_ADDRESS)); diff --git a/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go b/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go index b69ab8d64dc..781c4b7650d 100644 --- a/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go +++ b/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go @@ -86,8 +86,8 @@ type TokenPoolChainUpdate struct { } var SiloedLockReleaseTokenPoolMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAvailableTokens\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"lockedTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRebalancer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSiloRebalancer\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUnsiloedLiquidity\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provideLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provideSiloedLiquidity\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRebalancer\",\"inputs\":[{\"name\":\"newRebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSiloRebalancer\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateSiloDesignations\",\"inputs\":[{\"name\":\"removes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"adds\",\"type\":\"tuple[]\",\"internalType\":\"structSiloedLockReleaseTokenPool.SiloConfigUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rebalancer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSiloedLiquidity\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"rebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainUnsiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"amountUnsiloed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SiloRebalancerSet\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"oldRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnsiloedRebalancerSet\",\"inputs\":[{\"name\":\"oldRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InsufficientLiquidity\",\"inputs\":[{\"name\":\"availableLiquidity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requestedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidChainSelector\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"LiquidityAmountCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", - Bin: "0x61010080604052346103775761550d803803809161001d82856103f6565b833981019060a0818303126103775780516001600160a01b038116918282036103775761004c60208201610419565b60408201519092906001600160401b0381116103775782019480601f87011215610377578551956001600160401b0387116103e0578660051b906020820197610098604051998a6103f6565b885260208089019282010192831161037757602001905b8282106103c8575050506100d160806100ca60608501610427565b9301610427565b9333156103b757600180546001600160a01b03191633179055801580156103a6575b8015610395575b6103845760049260209260805260c0526040519283809263313ce56760e01b82525afa60009181610343575b50610318575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526101fa575b604051614f3190816105dc82396080518181816103e4015281816110950152818161187401528181611a6e0152818161295a01528181612b3801528181612f1a01528181612f7401526130dc015260a051818181611b2e01528181612ec301528181613b0c0152613b8f015260c051818181610df90152818161190f01526129f6015260e051818181610da701528181611953015261275b0152f35b604051602061020981836103f6565b60008252600036813760e051156103075760005b8251811015610284576001906001600160a01b0361023b828661043b565b5116836102478261047d565b610254575b50500161021d565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388361024c565b50905060005b82518110156102fe576001906001600160a01b036102a8828661043b565b511680156102f857836102ba8261057b565b6102c8575b50505b0161028a565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102bf565b506102c2565b5050503861015e565b6335f4a7b360e01b60005260046000fd5b60ff1660ff821681810361032c575061012c565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161037c575b8161035f602093836103f6565b810103126103775761037090610419565b9038610126565b600080fd5b3d9150610352565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038316156100fa565b506001600160a01b038516156100f3565b639b15e16f60e01b60005260046000fd5b602080916103d584610427565b8152019101906100af565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103e057604052565b519060ff8216820361037757565b51906001600160a01b038216820361037757565b805182101561044f5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561044f5760005260206000200190600090565b600081815260036020526040902054801561057457600019810181811161055e5760025460001981019190821161055e5781810361050d575b50505060025480156104f757600019016104d1816002610465565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61054661051e61052f936002610465565b90549060031b1c9283926002610465565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104b6565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105d557600254680100000000000000008110156103e0576105bc61052f8260018594016002556002610465565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a714613152575080630a861f2a1461301e578063181f5a7714612f9857806321df0da714612f47578063240028e814612ee757806324f65ee714612ea95780632d4a148f14612d6d57806331238ffc14612d2757806339077537146128f0578063432a6ba3146128bc5780634c5ef0ed146128a357806354c8a4f31461272957806362ddd3c4146126a65780636600f92c1461258a5780636cfd1553146124d05780636d3d1a581461249c5780636d9d216c146120cc57806379ba5097146120015780637d54534e14611f745780638926f54f14611f2f5780638da5cb5b14611efb578063962d402014611da55780639a4575b914611809578063a42a7b8b1461169b578063a7cd63b7146115e7578063acfecf91146114c7578063af0e58b9146114a9578063af58d59f1461145f578063b0f479a11461142b578063b7946580146113f3578063c0d786551461130b578063c4bffe2b146111db578063c75eea9c14611132578063ce3c752814610fd5578063cf7401f314610e5e578063d70be92f14610e1d578063dc0bd97114610dcc578063e0351e1314610d8f578063e8a1da17146104aa578063eb521a4c146102ef578063f1e73399146102c45763f2fde38b146101ed57600080fd5b346102bf5760206003193601126102bf5773ffffffffffffffffffffffffffffffffffffffff61021b61339a565b610223613cfb565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102bf5760206003193601126102bf5760206102e76102e26133bd565b613a43565b604051908152f35b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff61032860006139a2565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff161561043d5761039282825461375a565b90555b6104086040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e26084826132c0565b7f0000000000000000000000000000000000000000000000000000000000000000614296565b604051906000825260208201527f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf60403392a2005b5061044a81600a5461375a565b600a55610395565b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7fa90c0d190000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576104b83661346a565b9190926104c3613cfb565b6000905b828210610be65750505060009063ffffffff4216907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee184360301925b81811015610be4576000918160051b86013585811215610be05786019061012082360312610be05760405195610538876132a4565b823567ffffffffffffffff81168103610bdc578752602083013567ffffffffffffffff8111610bdc5783019536601f88011215610bdc5786359661057b8861369b565b97610589604051998a6132c0565b8089526020808a019160051b83010190368211610bd85760208301905b828210610ba5575050505060208801968752604084013567ffffffffffffffff8111610ba1576105d99036908601613a28565b92604089019384526106036105f1366060880161350a565b9560608b0196875260c036910161350a565b9660808a01978852610615865161413b565b61061f885161413b565b84515115610b795761063b67ffffffffffffffff8b5116614ac1565b15610b425767ffffffffffffffff8a5116815260076020526040812061077b87516fffffffffffffffffffffffffffffffff604082015116906107366fffffffffffffffffffffffffffffffff602083015116915115158360806040516106a1816132a4565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b6108a189516fffffffffffffffffffffffffffffffff6040820151169061085c6fffffffffffffffffffffffffffffffff602083015116915115158360806040516107c5816132a4565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b6004865191019080519067ffffffffffffffff8211610b15576108c4835461379b565b601f8111610ada575b50602090601f8311600114610a3b5761091b9291859183610a30575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b88518051821015610953579061094d6001926109468367ffffffffffffffff8f511692613787565b5190613d46565b0161091e565b5050977f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2939199975095610a2167ffffffffffffffff60019796949851169251935191516109ed6109b86040519687968752610100602088015261010087019061333b565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101939193929092610503565b015190508f806108e9565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b818110610ac25750908460019594939210610a8b575b505050811b01905561091e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080610a7e565b92936020600181928786015181550195019301610a68565b610b059084865260208620601f850160051c81019160208610610b0b575b601f0160051c01906139fe565b8e6108cd565b9091508190610af8565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff8111610bd457602091610bc98392833691890101613a28565b8152019101906105a6565b8a80fd5b8880fd5b8580fd5b8380fd5b005b909267ffffffffffffffff610c07610c0286868699979961371b565b6135de565b1692610c1284614802565b15610d6157836000526007602052610c306005604060002001614609565b9260005b8451811015610c6c57600190866000526007602052610c656005604060002001610c5e8389613787565b519061492d565b5001610c34565b5093909491959250806000526007602052600560406000206000815560006001820155600060028201556000600382015560048101610cab815461379b565b9081610d1e575b5050018054906000815581610cfd575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a10190919392936104c7565b6000526020600020908101905b81811015610cc25760008155600101610d0a565b81601f60009311600114610d365750555b8880610cb2565b81835260208320610d5191601f01861c8101906001016139fe565b8082528160208120915555610d2f565b837f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760206003193601126102bf576020610e40610e3b6133bd565b6139a2565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346102bf5760e06003193601126102bf57610e776133bd565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102bf57604051610ead8161326c565b60243580151581036102bf5781526044356fffffffffffffffffffffffffffffffff811681036102bf5760208201526064356fffffffffffffffffffffffffffffffff811681036102bf57604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c3601126102bf5760405190610f348261326c565b60843580151581036102bf57825260a4356fffffffffffffffffffffffffffffffff811681036102bf57602083015260c4356fffffffffffffffffffffffffffffffff811681036102bf57604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610fb3575b61045257610be492613f86565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610fa6565b346102bf5760406003193601126102bf57610fee6133bd565b60243580156104805773ffffffffffffffffffffffffffffffffffffffff611015836139a2565b1633036104525767ffffffffffffffff8216600052600c602052604060002060ff600182015460a01c168060001461112a5781545b8084116110f85750916110de917f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e936000146110e35761108b8282546135f3565b90555b6110b981337f0000000000000000000000000000000000000000000000000000000000000000613c99565b6040519182913395836020909392919367ffffffffffffffff60408201951681520152565b0390a2005b506110f081600a546135f3565b600a5561108e565b83907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a5461104a565b346102bf5760206003193601126102bf5767ffffffffffffffff6111546133bd565b61115c6138ef565b501660005260076020526111d761117e611179604060002061391a565b6140b6565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b346102bf5760006003193601126102bf576040516005548082528160208101600560005260206000209260005b8181106112f257505061121d925003826132c0565b80519061124261122c8361369b565b9261123a60405194856132c0565b80845261369b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401920136833760005b81518110156112a2578067ffffffffffffffff61128f60019385613787565b511661129b8287613787565b5201611270565b5050906040519182916020830190602084525180915260408301919060005b8181106112cf575050500390f35b825167ffffffffffffffff168452859450602093840193909201916001016112c1565b8454835260019485019486945060209093019201611208565b346102bf5760206003193601126102bf5761132461339a565b61132c613cfb565b73ffffffffffffffffffffffffffffffffffffffff81169081156113c957600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168491819081015b0390a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760206003193601126102bf576111d76114176114126133bd565b613980565b60405191829160208352602083019061333b565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b346102bf5760206003193601126102bf5767ffffffffffffffff6114816133bd565b6114896138ef565b501660005260076020526111d761117e611179600260406000200161391a565b346102bf5760006003193601126102bf576020600a54604051908152f35b346102bf5767ffffffffffffffff6114de366133d4565b9290916114e9613cfb565b1690611502826000526006602052604060002054151590565b156115b95781600052600760205261153360056040600020016115263686856135a7565b602081519101209061492d565b15611572577f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691926110de6040519283926020845260208401916138b0565b6115b5906040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501526040602485015260448401916138b0565b0390fd5b507f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760405160025490818152602081018092600260005260206000209060005b818110611685575050508161162c9103826132c0565b6040519182916020830190602084525180915260408301919060005b818110611656575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611648565b8254845260209093019260019283019201611616565b346102bf5760206003193601126102bf5767ffffffffffffffff6116bd6133bd565b1660005260076020526116d66005604060002001614609565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061171c6117068461369b565b9361171460405195866132c0565b80855261369b565b0160005b8181106117f857505060005b8151811015611774578061174260019284613787565b51600052600860205261175860406000206137ee565b6117628286613787565b5261176d8185613787565b500161172c565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106117ad57505050500390f35b919360206117e8827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06001959799849503018652885161333b565b960192019201859493919261179e565b806060602080938701015201611720565b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf5760a060031982360301126102bf576060602060405161184a81613288565b82815201526084810161185c8161362f565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d5957506024810177ffffffffffffffff000000000000000000000000000000006118c2826135de565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c7157600091611d2a575b50611d00576119516044830161362f565b7f0000000000000000000000000000000000000000000000000000000000000000611caa575b5067ffffffffffffffff61198a826135de565b166119a2816000526006602052604060002054151590565b15611c7d57602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa908115611c7157600091611c07575b5073ffffffffffffffffffffffffffffffffffffffff163303611bd95761141281611b949367ffffffffffffffff6064611a41611b24966135de565b92013591166000526007602052611a9460406000208273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614b70565b67ffffffffffffffff611aa6836135de565b16600052600c60205260ff60016040600020015460a01c16600014611bc55767ffffffffffffffff611ad7836135de565b16600052600c6020526040600020611af082825461375a565b90555b6040519081527f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860203392a26135de565b6111d760405160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260208152611b626040826132c0565b60405192611b6f84613288565b835260208301908152604051938493602085525160406020860152606085019061333b565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084830301604085015261333b565b611bd181600a5461375a565b600a55611af3565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6020813d602011611c69575b81611c20602093836132c0565b81010312611c6557519073ffffffffffffffffffffffffffffffffffffffff82168203611c62575073ffffffffffffffffffffffffffffffffffffffff611a05565b80fd5b5080fd5b3d9150611c13565b6040513d6000823e3d90fd5b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff16806000526003602052604060002054611977577fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b611d4c915060203d602011611d52575b611d4481836132c0565b810190613a81565b83611940565b503d611d3a565b611d7773ffffffffffffffffffffffffffffffffffffffff9161362f565b7f961c9a4f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760606003193601126102bf5760043567ffffffffffffffff81116102bf57611dd6903690600401613439565b9060243567ffffffffffffffff81116102bf57611df79036906004016134bc565b9060443567ffffffffffffffff81116102bf57611e189036906004016134bc565b73ffffffffffffffffffffffffffffffffffffffff6009541633141580611ed9575b61045257838614801590611ecf575b611ea55760005b868110611e5957005b80611e9f611e6d610c026001948b8b61371b565b611e78838989613777565b611e99611e91611e8986898b613777565b92369061350a565b91369061350a565b91613f86565b01611e50565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b5080861415611e49565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611e3a565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346102bf5760206003193601126102bf576020611f6a67ffffffffffffffff611f566133bd565b166000526006602052604060002054151590565b6040519015158152f35b346102bf5760206003193601126102bf577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611fc561339a565b611fcd613cfb565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346102bf5760006003193601126102bf5760005473ffffffffffffffffffffffffffffffffffffffff811633036120a2577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760406003193601126102bf5760043567ffffffffffffffff81116102bf576120fd903690600401613439565b6024359167ffffffffffffffff83116102bf57366023840112156102bf5782600401359167ffffffffffffffff83116102bf576024840193602436918560061b0101116102bf5761214c613cfb565b60005b81811061236e5750505060005b81811061216557005b67ffffffffffffffff61217c610c02838587613767565b16158015612339575b6122f4578061227c6121a5602061219f6001958789613767565b0161362f565b8573ffffffffffffffffffffffffffffffffffffffff80866040516121c98161326c565b6000815282602082019616865267ffffffffffffffff6121f4610c028a8d6040860199878b52613767565b16600052600c60205260406000209051815501935116167fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b7f180c6940bd64ba8f75679203ca32f8be2f629477a3307b190656e4b14dd5ddeb6122ab610c02838688613767565b6122bb602061219f85888a613767565b6040805167ffffffffffffffff93909316835273ffffffffffffffffffffffffffffffffffffffff91909116602083015290a10161215c565b610c029061230b9267ffffffffffffffff94613767565b7fd9a9cd68000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b5067ffffffffffffffff612351610c02838587613767565b16600052600c60205260ff60016040600020015460a01c16612185565b67ffffffffffffffff612385610c0283858761371b565b16600052600c60205260ff60016040600020015460a01c1615612457578067ffffffffffffffff6123bc610c02600194868861371b565b16600052600c6020527f7b5efb3f8090c5cfd24e170b667d0e2b6fdc3db6540d75b86d5b6655ba00eb936040600020546123f881600a5461375a565b600a5567ffffffffffffffff612412610c0285888a61371b565b16600052600c602052600084604082208281550155612435610c0284878961371b565b6040805167ffffffffffffffff9290921682526020820192909252a10161214f565b610c029061246e9267ffffffffffffffff9461371b565b7f46f5f12b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b346102bf5760206003193601126102bf577f66b1c1bdec8b60a3442bb25b5b6cd6fff3d0eceb6f5390be8e2f82a8ad39b23473ffffffffffffffffffffffffffffffffffffffff61251f61339a565b612527613cfb565b6113c4600b54918381167fffffffffffffffffffffffff0000000000000000000000000000000000000000841617600b55604051938493168390929173ffffffffffffffffffffffffffffffffffffffff60209181604085019616845216910152565b346102bf5760406003193601126102bf576125a36133bd565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036102bf5767ffffffffffffffff906125d6613cfb565b169081600052600c602052600160406000200190815460ff8160a01c16156126785782547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9283169081179093556040805191909216815260208101929092527f01efd4cd7dd64263689551000d4359d6559c839f39b773b1df3fd19ff060cf5f9190819081016110de565b837f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf576126b4366133d4565b6126bf929192613cfb565b67ffffffffffffffff82166126e1816000526006602052604060002054151590565b156126fc5750610be4926126f69136916135a7565b90613d46565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5761275161275961273d3661346a565b949161274a939193613cfb565b36916136b3565b9236916136b3565b7f0000000000000000000000000000000000000000000000000000000000000000156128795760005b82518110156127f5578073ffffffffffffffffffffffffffffffffffffffff6127ad60019386613787565b51166127b88161466c565b6127c4575b5001612782565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1846127bd565b5060005b8151811015610be4578073ffffffffffffffffffffffffffffffffffffffff61282460019385613787565b511680156128735761283581614a61565b612842575b505b016127f9565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a18361283a565b5061283c565b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576020611f6a6128b6366133d4565b91613650565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff600b5416604051908152f35b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf578060040161010060031983360301126102bf57600060405161293481613221565b52608482016129428161362f565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d595750602482019177ffffffffffffffff000000000000000000000000000000006129a9846135de565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c7157600091612d08575b50611d0057612a35836135de565b67ffffffffffffffff8116612a57816000526006602052604060002054151590565b15611c7d5750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff93909316918301919091523360248301526020908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115611c7157600091612ce9575b5015611bd957612ae1836135de565b612af360a48301916128b68386613556565b15612ca2575067ffffffffffffffff612b98612b92612b11866135de565b83606486013591166000526007602052612b8c612b87612b80600260406000200198612b767f00000000000000000000000000000000000000000000000000000000000000009a8673ffffffffffffffffffffffffffffffffffffffff8d1691614b70565b60c4890190613556565b36916135a7565b613a99565b90613b8c565b946135de565b16600052600c602052604060002060ff600182015460a01c1680600014612c9a5781545b808611612c685760208673ffffffffffffffffffffffffffffffffffffffff612c1188612c0c8460448b8b8b15612c5357612bf88482546135f3565b90555b0192612c068461362f565b90613c99565b61362f565b166040518281527f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52843392a380604051612c4a81613221565b52604051908152f35b50612c6083600a546135f3565b600a55612bfb565b85907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a54612bbc565b612cac9083613556565b6115b56040519283927f24eb47e50000000000000000000000000000000000000000000000000000000084526020600485015260248401916138b0565b612d02915060203d602011611d5257611d4481836132c0565b84612ad2565b612d21915060203d602011611d5257611d4481836132c0565b84612a27565b346102bf5760206003193601126102bf5767ffffffffffffffff612d496133bd565b16600052600c602052602060ff60016040600020015460a01c166040519015158152f35b346102bf5760406003193601126102bf57612d866133bd565b60243567ffffffffffffffff82168015612e7a5781156104805773ffffffffffffffffffffffffffffffffffffffff612dbe846139a2565b163303610452577f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf916110de91600052600c602052604060002060ff600182015460a01c16600014612e6557612e1582825461375a565b90555b6110b96040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e26084826132c0565b50612e7281600a5461375a565b600a55612e18565b7fd9a9cd6800000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b346102bf5760006003193601126102bf57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760206003193601126102bf576020612f0261339a565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760006003193601126102bf576111d7604051612fba6060826132c0565b602481527f53696c6f65644c6f636b52656c65617365546f6b656e506f6f6c20312e362e3060208201527f2d64657600000000000000000000000000000000000000000000000000000000604082015260405191829160208352602083019061333b565b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff61305760006139a2565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff16801561314a5781545b8084116110f8575015613135576130d28282546135f3565b90555b61310081337f0000000000000000000000000000000000000000000000000000000000000000613c99565b604051906000825260208201527f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e60403392a2005b5061314281600a546135f3565b600a556130d5565b600a546130ba565b346102bf5760206003193601126102bf57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036102bf57817faff2afbf00000000000000000000000000000000000000000000000000000000602093149081156131f7575b81156131cd575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014836131c6565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506131bf565b6020810190811067ffffffffffffffff82111761323d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761323d57604052565b6040810190811067ffffffffffffffff82111761323d57604052565b60a0810190811067ffffffffffffffff82111761323d57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761323d57604052565b67ffffffffffffffff811161323d57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b8481106133855750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201613346565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bf57565b6004359067ffffffffffffffff821682036102bf57565b60406003198201126102bf5760043567ffffffffffffffff811681036102bf579160243567ffffffffffffffff81116102bf57826023820112156102bf5780600401359267ffffffffffffffff84116102bf57602484830101116102bf576024019190565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf576020808501948460051b0101116102bf57565b60406003198201126102bf5760043567ffffffffffffffff81116102bf578161349591600401613439565b929092916024359067ffffffffffffffff82116102bf576134b891600401613439565b9091565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf57602080850194606085020101116102bf57565b35906fffffffffffffffffffffffffffffffff821682036102bf57565b91908260609103126102bf576040516135228161326c565b809280359081151582036102bf5760406135519181938552613546602082016134ed565b6020860152016134ed565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102bf570180359067ffffffffffffffff82116102bf576020019181360383136102bf57565b9291926135b382613301565b916135c160405193846132c0565b8294818452818301116102bf578281602093846000960137010152565b3567ffffffffffffffff811681036102bf5790565b9190820391821161360057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bf5790565b613698929167ffffffffffffffff61367b9216600052600760205260056040600020019236916135a7565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff811161323d5760051b60200190565b92916136be8261369b565b936136cc60405195866132c0565b602085848152019260051b81019182116102bf57915b8183106136ee57505050565b823573ffffffffffffffffffffffffffffffffffffffff811681036102bf578152602092830192016136e2565b919081101561372b5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190820180921161360057565b919081101561372b5760061b0190565b919081101561372b576060020190565b805182101561372b5760209160051b010190565b90600182811c921680156137e4575b60208310146137b557565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916137aa565b90604051918260008254926138028461379b565b80845293600181169081156138705750600114613829575b50613827925003836132c0565b565b90506000929192526020600020906000915b818310613854575050906020613827928201013861381a565b602091935080600191548385890101520191019091849261383b565b602093506138279592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861381a565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b604051906138fc826132a4565b60006080838281528260208201528260408201528260608201520152565b90604051613927816132a4565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff16600052600760205261369860046040600020016137ee565b67ffffffffffffffff16600052600c60205260016040600020015460ff8160a01c166139e5575073ffffffffffffffffffffffffffffffffffffffff600b541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b818110613a09575050565b600081556001016139fe565b8181029291811591840414171561360057565b9080601f830112156102bf57816020613698933591016135a7565b67ffffffffffffffff1680600052600c60205260ff60016040600020015460a01c16613a705750600a5490565b600052600c60205260406000205490565b908160209103126102bf575180151581036102bf5790565b80518015613b0857602003613aca576020818051810103126102bf5760208101519060ff8211613aca575060ff1690565b6115b5906040519182917f953576f700000000000000000000000000000000000000000000000000000000835260206004840152602483019061333b565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161360057565b60ff16604d811161360057600a0a90565b8115613b5d570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff811692828414613c9257828411613c685790613bd191613b2e565b91604d60ff8416118015613c2f575b613bf957505090613bf361369892613b42565b90613a15565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50613c3983613b42565b8015613b5d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613be0565b613c7191613b2e565b91604d60ff841611613bf957505090613c8c61369892613b42565b90613b53565b5050505090565b6138279273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252613cf66064836132c0565b614296565b73ffffffffffffffffffffffffffffffffffffffff600154163303613d1c57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156113c95767ffffffffffffffff81516020830120921691826000526007602052613d7b816005604060002001614b1b565b15613f425760005260086020526040600020815167ffffffffffffffff811161323d57613da8825461379b565b601f8111613f10575b506020601f8211600114613e4a5791613e24827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9593613e3a95600091613e3f575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b905560405191829160208352602083019061333b565b0390a2565b905084015138613df3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110613ef8575092613e3a9492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea989610613ec1575b5050811b019055611417565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880613eb5565b9192602060018192868a015181550194019201613e7a565b613f3c90836000526020600020601f840160051c81019160208510610b0b57601f0160051c01906139fe565b38613db1565b50906115b56040519283927f393b8ad2000000000000000000000000000000000000000000000000000000008452600484015260406024840152604483019061333b565b67ffffffffffffffff166000818152600660205260409020549092919015614088579161408560e09261405185613fdd7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761413b565b846000526007602052613ff48160406000206143d6565b613ffd8361413b565b8460005260076020526140178360026040600020016143d6565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6140be6138ef565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161411b602085019361411561410863ffffffff875116426135f3565b8560808901511690613a15565b9061375a565b8082101561413457505b16825263ffffffff4216905290565b9050614125565b8051156141ef576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff6020830151168110908115916141e6575b506141835750565b6064906141e4604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b9050153861417b565b6fffffffffffffffffffffffffffffffff60408201511615801590614277575b6142165750565b6064906141e4604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff602082015116151561420f565b73ffffffffffffffffffffffffffffffffffffffff6143259116916040926000808551936142c487866132c0565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d156143ce573d9161430983613301565b92614316875194856132c0565b83523d6000602085013e614e58565b8051908161433257505050565b602080614343938301019101613a81565b1561434b5750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b606091614e58565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199161450f606092805461441363ffffffff8260801c16426135f3565b908161454e575b50506fffffffffffffffffffffffffffffffff600181602086015116928281541680851060001461454657508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556144c38651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b61408560405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161444a565b6fffffffffffffffffffffffffffffffff9161458383928361457c6001880154948286169560801c90613a15565b911661375a565b8082101561460257505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff0000000000000000000000000000000016178155388061441a565b905061458d565b906040519182815491828252602082019060005260206000209260005b81811061463b575050613827925003836132c0565b8454835260019485019487945060209093019201614626565b805482101561372b5760005260206000200190600090565b60008181526003602052604090205480156147fb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161360057600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116136005781810361478c575b505050600254801561475d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161471a816002614654565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6147e361479d6147ae936002614654565b90549060031b1c9283926002614654565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806146e1565b5050600090565b60008181526006602052604090205480156147fb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161360057600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613600578181036148f3575b505050600554801561475d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016148b0816005614654565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b6149156149046147ae936005614654565b90549060031b1c9283926005614654565b90556000526006602052604060002055388080614877565b9060018201918160005282602052604060002054801515600014614a58577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613600578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161360057818103614a21575b5050508054801561475d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906149e28282614654565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b614a41614a316147ae9386614654565b90549060031b1c92839286614654565b9055600052836020526040600020553880806149aa565b50505050600090565b80600052600360205260406000205415600014614abb576002546801000000000000000081101561323d57614aa26147ae8260018594016002556002614654565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014614abb576005546801000000000000000081101561323d57614b026147ae8260018594016005556005614654565b9055600554906000526006602052604060002055600190565b60008281526001820160205260409020546147fb578054906801000000000000000082101561323d5782614b596147ae846001809601855584614654565b905580549260005201602052604060002055600190565b929192805460ff8160a01c16158015614e50575b614e49576fffffffffffffffffffffffffffffffff81169060018301908154614bc963ffffffff6fffffffffffffffffffffffffffffffff83169360801c16426135f3565b9081614dab575b5050848110614d295750838210614c5857507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff80614c2685602096956135f3565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b819450614c6a92505460801c926135f3565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019080821161360057614cb8614cbd9273ffffffffffffffffffffffffffffffffffffffff9461375a565b613b53565b9216918215614cf9577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614d7b577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b828592939511614e1f57614dc6926141159160801c90613a15565b80831015614e1a5750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178455913880614bd0565b614dd1565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b508215614b84565b91929015614ed35750815115614e6c575090565b3b15614e755790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015614ee65750805190602001fd5b6115b5906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260206004840152602483019061333b56fea164736f6c634300081a000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAvailableTokens\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"lockedTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChainRebalancer\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRebalancer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUnsiloedLiquidity\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provideLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provideSiloedLiquidity\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRebalancer\",\"inputs\":[{\"name\":\"newRebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSiloRebalancer\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateSiloDesignations\",\"inputs\":[{\"name\":\"removes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"adds\",\"type\":\"tuple[]\",\"internalType\":\"structSiloedLockReleaseTokenPool.SiloConfigUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rebalancer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSiloedLiquidity\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"rebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainUnsiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"amountUnsiloed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SiloRebalancerSet\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"oldRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnsiloedRebalancerSet\",\"inputs\":[{\"name\":\"oldRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InsufficientLiquidity\",\"inputs\":[{\"name\":\"availableLiquidity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requestedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidChainSelector\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"LiquidityAmountCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x6101008060405234610377576155fe803803809161001d82856103f6565b833981019060a0818303126103775780516001600160a01b038116918282036103775761004c60208201610419565b60408201519092906001600160401b0381116103775782019480601f87011215610377578551956001600160401b0387116103e0578660051b906020820197610098604051998a6103f6565b885260208089019282010192831161037757602001905b8282106103c8575050506100d160806100ca60608501610427565b9301610427565b9333156103b757600180546001600160a01b03191633179055801580156103a6575b8015610395575b6103845760049260209260805260c0526040519283809263313ce56760e01b82525afa60009181610343575b50610318575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526101fa575b60405161502290816105dc82396080518181816103e4015281816110780152818161188c01528181611a8601528181612a0b01528181612be901528181612fc20152818161301c0152613184015260a051818181611b4601528181612f6b01528181613bfd0152613c80015260c051818181610df9015281816119270152612aa7015260e051818181610da70152818161196b015261280c0152f35b604051602061020981836103f6565b60008252600036813760e051156103075760005b8251811015610284576001906001600160a01b0361023b828661043b565b5116836102478261047d565b610254575b50500161021d565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388361024c565b50905060005b82518110156102fe576001906001600160a01b036102a8828661043b565b511680156102f857836102ba8261057b565b6102c8575b50505b0161028a565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102bf565b506102c2565b5050503861015e565b6335f4a7b360e01b60005260046000fd5b60ff1660ff821681810361032c575061012c565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161037c575b8161035f602093836103f6565b810103126103775761037090610419565b9038610126565b600080fd5b3d9150610352565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038316156100fa565b506001600160a01b038516156100f3565b639b15e16f60e01b60005260046000fd5b602080916103d584610427565b8152019101906100af565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103e057604052565b519060ff8216820361037757565b51906001600160a01b038216820361037757565b805182101561044f5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561044f5760005260206000200190600090565b600081815260036020526040902054801561057457600019810181811161055e5760025460001981019190821161055e5781810361050d575b50505060025480156104f757600019016104d1816002610465565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61054661051e61052f936002610465565b90549060031b1c9283926002610465565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104b6565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105d557600254680100000000000000008110156103e0576105bc61052f8260018594016002556002610465565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146131fa575080630a861f2a146130c6578063181f5a771461304057806321df0da714612fef578063240028e814612f8f57806324f65ee714612f515780632d4a148f14612e1e57806331238ffc14612dd857806339077537146129a1578063432a6ba31461296d5780634c5ef0ed1461295457806354c8a4f3146127da57806362ddd3c4146127575780636600f92c146126395780636cfd15531461257c5780636d3d1a58146125485780636d9d216c1461212557806379ba50971461205a5780637d54534e14611fcd5780638632d5cc14611f8c5780638926f54f14611f475780638da5cb5b14611f13578063962d402014611dbd5780639a4575b914611821578063a42a7b8b146116b3578063a7cd63b7146115ff578063acfecf91146114df578063af0e58b9146114c1578063af58d59f14611477578063b0f479a114611443578063b79465801461140b578063c0d7865514611323578063c4bffe2b146111f3578063c75eea9c1461114a578063ce3c752814610f94578063cf7401f314610e1d578063dc0bd97114610dcc578063e0351e1314610d8f578063e8a1da17146104aa578063eb521a4c146102ef578063f1e73399146102c45763f2fde38b146101ed57600080fd5b346102bf5760206003193601126102bf5773ffffffffffffffffffffffffffffffffffffffff61021b613442565b610223613dec565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102bf5760206003193601126102bf5760206102e76102e2613465565b613aeb565b604051908152f35b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff610328600061381f565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff161561043d57610392828254613802565b90555b6104086040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e2608482613368565b7f0000000000000000000000000000000000000000000000000000000000000000614387565b604051906000825260208201527f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf60403392a2005b5061044a81600a54613802565b600a55610395565b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7fa90c0d190000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576104b836613512565b9190926104c3613dec565b6000905b828210610be65750505060009063ffffffff4216907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee184360301925b81811015610be4576000918160051b86013585811215610be05786019061012082360312610be057604051956105388761334c565b823567ffffffffffffffff81168103610bdc578752602083013567ffffffffffffffff8111610bdc5783019536601f88011215610bdc5786359661057b88613743565b97610589604051998a613368565b8089526020808a019160051b83010190368211610bd85760208301905b828210610ba5575050505060208801968752604084013567ffffffffffffffff8111610ba1576105d99036908601613ad0565b92604089019384526106036105f136606088016135b2565b9560608b0196875260c03691016135b2565b9660808a01978852610615865161422c565b61061f885161422c565b84515115610b795761063b67ffffffffffffffff8b5116614bb2565b15610b425767ffffffffffffffff8a5116815260076020526040812061077b87516fffffffffffffffffffffffffffffffff604082015116906107366fffffffffffffffffffffffffffffffff602083015116915115158360806040516106a18161334c565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b6108a189516fffffffffffffffffffffffffffffffff6040820151169061085c6fffffffffffffffffffffffffffffffff602083015116915115158360806040516107c58161334c565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b6004865191019080519067ffffffffffffffff8211610b15576108c4835461389f565b601f8111610ada575b50602090601f8311600114610a3b5761091b9291859183610a30575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b88518051821015610953579061094d6001926109468367ffffffffffffffff8f51169261388b565b5190613e37565b0161091e565b5050977f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2939199975095610a2167ffffffffffffffff60019796949851169251935191516109ed6109b8604051968796875261010060208801526101008701906133e3565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101939193929092610503565b015190508f806108e9565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b818110610ac25750908460019594939210610a8b575b505050811b01905561091e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080610a7e565b92936020600181928786015181550195019301610a68565b610b059084865260208620601f850160051c81019160208610610b0b575b601f0160051c0190613aa6565b8e6108cd565b9091508190610af8565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff8111610bd457602091610bc98392833691890101613ad0565b8152019101906105a6565b8a80fd5b8880fd5b8580fd5b8380fd5b005b909267ffffffffffffffff610c07610c028686869997996137c3565b613686565b1692610c12846148f3565b15610d6157836000526007602052610c3060056040600020016146fa565b9260005b8451811015610c6c57600190866000526007602052610c656005604060002001610c5e838961388b565b5190614a1e565b5001610c34565b5093909491959250806000526007602052600560406000206000815560006001820155600060028201556000600382015560048101610cab815461389f565b9081610d1e575b5050018054906000815581610cfd575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a10190919392936104c7565b6000526020600020908101905b81811015610cc25760008155600101610d0a565b81601f60009311600114610d365750555b8880610cb2565b81835260208320610d5191601f01861c810190600101613aa6565b8082528160208120915555610d2f565b837f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760e06003193601126102bf57610e36613465565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102bf57604051610e6c81613314565b60243580151581036102bf5781526044356fffffffffffffffffffffffffffffffff811681036102bf5760208201526064356fffffffffffffffffffffffffffffffff811681036102bf57604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c3601126102bf5760405190610ef382613314565b60843580151581036102bf57825260a4356fffffffffffffffffffffffffffffffff811681036102bf57602083015260c4356fffffffffffffffffffffffffffffffff811681036102bf57604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610f72575b61045257610be492614077565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610f65565b346102bf5760406003193601126102bf57610fad613465565b60243567ffffffffffffffff821680600052600c60205260ff60016040600020015460a01c16158015611142575b6111155781156104805773ffffffffffffffffffffffffffffffffffffffff6110038461381f565b16330361045257600052600c602052604060002060ff600182015460a01c168060001461110d5781545b8084116110db5750916110c1917f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e936000146110c65761106e82825461369b565b90555b61109c81337f0000000000000000000000000000000000000000000000000000000000000000613d8a565b6040519182913395836020909392919367ffffffffffffffff60408201951681520152565b0390a2005b506110d381600a5461369b565b600a55611071565b83907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a5461102d565b7f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b508015610fdb565b346102bf5760206003193601126102bf5767ffffffffffffffff61116c613465565b6111746139f3565b501660005260076020526111ef6111966111916040600020613a1e565b6141a7565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b346102bf5760006003193601126102bf576040516005548082528160208101600560005260206000209260005b81811061130a57505061123592500382613368565b80519061125a61124483613743565b926112526040519485613368565b808452613743565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401920136833760005b81518110156112ba578067ffffffffffffffff6112a76001938561388b565b51166112b3828761388b565b5201611288565b5050906040519182916020830190602084525180915260408301919060005b8181106112e7575050500390f35b825167ffffffffffffffff168452859450602093840193909201916001016112d9565b8454835260019485019486945060209093019201611220565b346102bf5760206003193601126102bf5761133c613442565b611344613dec565b73ffffffffffffffffffffffffffffffffffffffff81169081156113e157600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168491819081015b0390a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760206003193601126102bf576111ef61142f61142a613465565b613a84565b6040519182916020835260208301906133e3565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b346102bf5760206003193601126102bf5767ffffffffffffffff611499613465565b6114a16139f3565b501660005260076020526111ef6111966111916002604060002001613a1e565b346102bf5760006003193601126102bf576020600a54604051908152f35b346102bf5767ffffffffffffffff6114f63661347c565b929091611501613dec565b169061151a826000526006602052604060002054151590565b156115d15781600052600760205261154b600560406000200161153e36868561364f565b6020815191012090614a1e565b1561158a577f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691926110c16040519283926020845260208401916139b4565b6115cd906040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501526040602485015260448401916139b4565b0390fd5b507f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760405160025490818152602081018092600260005260206000209060005b81811061169d5750505081611644910382613368565b6040519182916020830190602084525180915260408301919060005b81811061166e575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611660565b825484526020909301926001928301920161162e565b346102bf5760206003193601126102bf5767ffffffffffffffff6116d5613465565b1660005260076020526116ee60056040600020016146fa565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061173461171e84613743565b9361172c6040519586613368565b808552613743565b0160005b81811061181057505060005b815181101561178c578061175a6001928461388b565b51600052600860205261177060406000206138f2565b61177a828661388b565b52611785818561388b565b5001611744565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106117c557505050500390f35b91936020611800827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0600195979984950301865288516133e3565b96019201920185949391926117b6565b806060602080938701015201611738565b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf5760a060031982360301126102bf576060602060405161186281613330565b828152015260848101611874816136d7565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d7157506024810177ffffffffffffffff000000000000000000000000000000006118da82613686565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c8957600091611d42575b50611d1857611969604483016136d7565b7f0000000000000000000000000000000000000000000000000000000000000000611cc2575b5067ffffffffffffffff6119a282613686565b166119ba816000526006602052604060002054151590565b15611c9557602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa908115611c8957600091611c1f575b5073ffffffffffffffffffffffffffffffffffffffff163303611bf15761142a81611bac9367ffffffffffffffff6064611a59611b3c96613686565b92013591166000526007602052611aac60406000208273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614c61565b67ffffffffffffffff611abe83613686565b16600052600c60205260ff60016040600020015460a01c16600014611bdd5767ffffffffffffffff611aef83613686565b16600052600c6020526040600020611b08828254613802565b90555b6040519081527f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860203392a2613686565b6111ef60405160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260208152611b7a604082613368565b60405192611b8784613330565b83526020830190815260405193849360208552516040602086015260608501906133e3565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526133e3565b611be981600a54613802565b600a55611b0b565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6020813d602011611c81575b81611c3860209383613368565b81010312611c7d57519073ffffffffffffffffffffffffffffffffffffffff82168203611c7a575073ffffffffffffffffffffffffffffffffffffffff611a1d565b80fd5b5080fd5b3d9150611c2b565b6040513d6000823e3d90fd5b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff1680600052600360205260406000205461198f577fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b611d64915060203d602011611d6a575b611d5c8183613368565b810190613b72565b83611958565b503d611d52565b611d8f73ffffffffffffffffffffffffffffffffffffffff916136d7565b7f961c9a4f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760606003193601126102bf5760043567ffffffffffffffff81116102bf57611dee9036906004016134e1565b9060243567ffffffffffffffff81116102bf57611e0f903690600401613564565b9060443567ffffffffffffffff81116102bf57611e30903690600401613564565b73ffffffffffffffffffffffffffffffffffffffff6009541633141580611ef1575b61045257838614801590611ee7575b611ebd5760005b868110611e7157005b80611eb7611e85610c026001948b8b6137c3565b611e9083898961387b565b611eb1611ea9611ea186898b61387b565b9236906135b2565b9136906135b2565b91614077565b01611e68565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b5080861415611e61565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611e52565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346102bf5760206003193601126102bf576020611f8267ffffffffffffffff611f6e613465565b166000526006602052604060002054151590565b6040519015158152f35b346102bf5760206003193601126102bf576020611faf611faa613465565b61381f565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346102bf5760206003193601126102bf577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff61201e613442565b612026613dec565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346102bf5760006003193601126102bf5760005473ffffffffffffffffffffffffffffffffffffffff811633036120fb577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760406003193601126102bf5760043567ffffffffffffffff81116102bf576121569036906004016134e1565b6024359167ffffffffffffffff83116102bf57366023840112156102bf5782600401359167ffffffffffffffff83116102bf576024840193602436918560061b0101116102bf576121a5613dec565b60005b81811061241a5750505060005b8181106121be57005b67ffffffffffffffff6121d5610c0283858761380f565b161580156123e5575b80156123c4575b61237f5773ffffffffffffffffffffffffffffffffffffffff612214602061220e84868861380f565b016136d7565b16156113e15780612307612230602061220e600195878961380f565b8573ffffffffffffffffffffffffffffffffffffffff808660405161225481613314565b6000815282602082019616865267ffffffffffffffff61227f610c028a8d6040860199878b5261380f565b16600052600c60205260406000209051815501935116167fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b7f180c6940bd64ba8f75679203ca32f8be2f629477a3307b190656e4b14dd5ddeb612336610c0283868861380f565b612346602061220e85888a61380f565b6040805167ffffffffffffffff93909316835273ffffffffffffffffffffffffffffffffffffffff91909116602083015290a1016121b5565b610c02906123969267ffffffffffffffff9461380f565b7fd9a9cd68000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506123df67ffffffffffffffff611f6e610c0284868861380f565b156121e5565b5067ffffffffffffffff6123fd610c0283858761380f565b16600052600c60205260ff60016040600020015460a01c166121de565b67ffffffffffffffff612431610c028385876137c3565b16600052600c60205260ff60016040600020015460a01c1615612503578067ffffffffffffffff612468610c0260019486886137c3565b16600052600c6020527f7b5efb3f8090c5cfd24e170b667d0e2b6fdc3db6540d75b86d5b6655ba00eb936040600020546124a481600a54613802565b600a5567ffffffffffffffff6124be610c0285888a6137c3565b16600052600c6020526000846040822082815501556124e1610c028487896137c3565b6040805167ffffffffffffffff9290921682526020820192909252a1016121a8565b610c029061251a9267ffffffffffffffff946137c3565b7f46f5f12b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b346102bf5760206003193601126102bf57612595613442565b61259d613dec565b73ffffffffffffffffffffffffffffffffffffffff81169081156113e157600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f66b1c1bdec8b60a3442bb25b5b6cd6fff3d0eceb6f5390be8e2f82a8ad39b23491819081016113dc565b346102bf5760406003193601126102bf57612652613465565b60243573ffffffffffffffffffffffffffffffffffffffff8116918282036102bf5767ffffffffffffffff90612686613dec565b169182600052600c60205260016040600020019081549060ff8260a01c16156127295780156113e15782547fffffffffffffffffffffffff000000000000000000000000000000000000000016179091556040805173ffffffffffffffffffffffffffffffffffffffff92831681529190921660208201527f01efd4cd7dd64263689551000d4359d6559c839f39b773b1df3fd19ff060cf5f91819081016110c1565b847f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf576127653661347c565b612770929192613dec565b67ffffffffffffffff8216612792816000526006602052604060002054151590565b156127ad5750610be4926127a791369161364f565b90613e37565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5761280261280a6127ee36613512565b94916127fb939193613dec565b369161375b565b92369161375b565b7f00000000000000000000000000000000000000000000000000000000000000001561292a5760005b82518110156128a6578073ffffffffffffffffffffffffffffffffffffffff61285e6001938661388b565b51166128698161475d565b612875575b5001612833565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a18461286e565b5060005b8151811015610be4578073ffffffffffffffffffffffffffffffffffffffff6128d56001938561388b565b51168015612924576128e681614b52565b6128f3575b505b016128aa565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1836128eb565b506128ed565b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576020611f826129673661347c565b916136f8565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff600b5416604051908152f35b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf578060040161010060031983360301126102bf5760006040516129e5816132c9565b52608482016129f3816136d7565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d715750602482019177ffffffffffffffff00000000000000000000000000000000612a5a84613686565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c8957600091612db9575b50611d1857612ae683613686565b67ffffffffffffffff8116612b08816000526006602052604060002054151590565b15611c955750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff93909316918301919091523360248301526020908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115611c8957600091612d9a575b5015611bf157612b9283613686565b612ba460a483019161296783866135fe565b15612d53575067ffffffffffffffff612c49612c43612bc286613686565b83606486013591166000526007602052612c3d612c38612c31600260406000200198612c277f00000000000000000000000000000000000000000000000000000000000000009a8673ffffffffffffffffffffffffffffffffffffffff8d1691614c61565b60c48901906135fe565b369161364f565b613b8a565b90613c7d565b94613686565b16600052600c602052604060002060ff600182015460a01c1680600014612d4b5781545b808611612d195760208673ffffffffffffffffffffffffffffffffffffffff612cc288612cbd8460448b8b8b15612d0457612ca984825461369b565b90555b0192612cb7846136d7565b90613d8a565b6136d7565b166040518281527f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52843392a380604051612cfb816132c9565b52604051908152f35b50612d1183600a5461369b565b600a55612cac565b85907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a54612c6d565b612d5d90836135fe565b6115cd6040519283927f24eb47e50000000000000000000000000000000000000000000000000000000084526020600485015260248401916139b4565b612db3915060203d602011611d6a57611d5c8183613368565b84612b83565b612dd2915060203d602011611d6a57611d5c8183613368565b84612ad8565b346102bf5760206003193601126102bf5767ffffffffffffffff612dfa613465565b16600052600c602052602060ff60016040600020015460a01c166040519015158152f35b346102bf5760406003193601126102bf57612e37613465565b60243567ffffffffffffffff821680600052600c60205260ff60016040600020015460a01c16158015612f49575b6111155781156104805773ffffffffffffffffffffffffffffffffffffffff612e8d8461381f565b163303610452577f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf916110c191600052600c602052604060002060ff600182015460a01c16600014612f3457612ee4828254613802565b90555b61109c6040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e2608482613368565b50612f4181600a54613802565b600a55612ee7565b508015612e65565b346102bf5760006003193601126102bf57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760206003193601126102bf576020612faa613442565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760006003193601126102bf576111ef604051613062606082613368565b602481527f53696c6f65644c6f636b52656c65617365546f6b656e506f6f6c20312e362e3060208201527f2d6465760000000000000000000000000000000000000000000000000000000060408201526040519182916020835260208301906133e3565b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff6130ff600061381f565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff1680156131f25781545b8084116110db5750156131dd5761317a82825461369b565b90555b6131a881337f0000000000000000000000000000000000000000000000000000000000000000613d8a565b604051906000825260208201527f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e60403392a2005b506131ea81600a5461369b565b600a5561317d565b600a54613162565b346102bf5760206003193601126102bf57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036102bf57817faff2afbf000000000000000000000000000000000000000000000000000000006020931490811561329f575b8115613275575b5015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148361326e565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150613267565b6020810190811067ffffffffffffffff8211176132e557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176132e557604052565b6040810190811067ffffffffffffffff8211176132e557604052565b60a0810190811067ffffffffffffffff8211176132e557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176132e557604052565b67ffffffffffffffff81116132e557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b84811061342d5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016133ee565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bf57565b6004359067ffffffffffffffff821682036102bf57565b60406003198201126102bf5760043567ffffffffffffffff811681036102bf579160243567ffffffffffffffff81116102bf57826023820112156102bf5780600401359267ffffffffffffffff84116102bf57602484830101116102bf576024019190565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf576020808501948460051b0101116102bf57565b60406003198201126102bf5760043567ffffffffffffffff81116102bf578161353d916004016134e1565b929092916024359067ffffffffffffffff82116102bf57613560916004016134e1565b9091565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf57602080850194606085020101116102bf57565b35906fffffffffffffffffffffffffffffffff821682036102bf57565b91908260609103126102bf576040516135ca81613314565b809280359081151582036102bf5760406135f991819385526135ee60208201613595565b602086015201613595565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102bf570180359067ffffffffffffffff82116102bf576020019181360383136102bf57565b92919261365b826133a9565b916136696040519384613368565b8294818452818301116102bf578281602093846000960137010152565b3567ffffffffffffffff811681036102bf5790565b919082039182116136a857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bf5790565b613740929167ffffffffffffffff61372392166000526007602052600560406000200192369161364f565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff81116132e55760051b60200190565b929161376682613743565b936137746040519586613368565b602085848152019260051b81019182116102bf57915b81831061379657505050565b823573ffffffffffffffffffffffffffffffffffffffff811681036102bf5781526020928301920161378a565b91908110156137d35760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919082018092116136a857565b91908110156137d35760061b0190565b67ffffffffffffffff16600052600c60205260016040600020015460ff8160a01c16613862575073ffffffffffffffffffffffffffffffffffffffff600b541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b91908110156137d3576060020190565b80518210156137d35760209160051b010190565b90600182811c921680156138e8575b60208310146138b957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916138ae565b90604051918260008254926139068461389f565b8084529360018116908115613974575060011461392d575b5061392b92500383613368565b565b90506000929192526020600020906000915b81831061395857505090602061392b928201013861391e565b602091935080600191548385890101520191019091849261393f565b6020935061392b9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861391e565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60405190613a008261334c565b60006080838281528260208201528260408201528260608201520152565b90604051613a2b8161334c565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff16600052600760205261374060046040600020016138f2565b818110613ab1575050565b60008155600101613aa6565b818102929181159184041417156136a857565b9080601f830112156102bf578160206137409335910161364f565b67ffffffffffffffff16613b0c816000526006602052604060002054151590565b15613b455780600052600c60205260ff60016040600020015460a01c16613b345750600a5490565b600052600c60205260406000205490565b7fd9a9cd680000000000000000000000000000000000000000000000000000000060005260045260246000fd5b908160209103126102bf575180151581036102bf5790565b80518015613bf957602003613bbb576020818051810103126102bf5760208101519060ff8211613bbb575060ff1690565b6115cd906040519182917f953576f70000000000000000000000000000000000000000000000000000000083526020600484015260248301906133e3565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff82116136a857565b60ff16604d81116136a857600a0a90565b8115613c4e570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff811692828414613d8357828411613d595790613cc291613c1f565b91604d60ff8416118015613d20575b613cea57505090613ce461374092613c33565b90613abd565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50613d2a83613c33565b8015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613cd1565b613d6291613c1f565b91604d60ff841611613cea57505090613d7d61374092613c33565b90613c44565b5050505090565b61392b9273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252613de7606483613368565b614387565b73ffffffffffffffffffffffffffffffffffffffff600154163303613e0d57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156113e15767ffffffffffffffff81516020830120921691826000526007602052613e6c816005604060002001614c0c565b156140335760005260086020526040600020815167ffffffffffffffff81116132e557613e99825461389f565b601f8111614001575b506020601f8211600114613f3b5791613f15827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9593613f2b95600091613f30575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90556040519182916020835260208301906133e3565b0390a2565b905084015138613ee4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110613fe9575092613f2b9492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea989610613fb2575b5050811b01905561142f565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880613fa6565b9192602060018192868a015181550194019201613f6b565b61402d90836000526020600020601f840160051c81019160208510610b0b57601f0160051c0190613aa6565b38613ea2565b50906115cd6040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401526040602484015260448301906133e3565b67ffffffffffffffff166000818152600660205260409020549092919015614179579161417660e092614142856140ce7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761422c565b8460005260076020526140e58160406000206144c7565b6140ee8361422c565b8460005260076020526141088360026040600020016144c7565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6141af6139f3565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161420c60208501936142066141f963ffffffff8751164261369b565b8560808901511690613abd565b90613802565b8082101561422557505b16825263ffffffff4216905290565b9050614216565b8051156142e0576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff6020830151168110908115916142d7575b506142745750565b6064906142d5604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b9050153861426c565b6fffffffffffffffffffffffffffffffff60408201511615801590614368575b6143075750565b6064906142d5604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515614300565b73ffffffffffffffffffffffffffffffffffffffff6144169116916040926000808551936143b58786613368565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d156144bf573d916143fa836133a9565b9261440787519485613368565b83523d6000602085013e614f49565b8051908161442357505050565b602080614434938301019101613b72565b1561443c5750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b606091614f49565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1991614600606092805461450463ffffffff8260801c164261369b565b908161463f575b50506fffffffffffffffffffffffffffffffff600181602086015116928281541680851060001461463757508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556145b48651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b61417660405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161453b565b6fffffffffffffffffffffffffffffffff9161467483928361466d6001880154948286169560801c90613abd565b9116613802565b808210156146f357505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff0000000000000000000000000000000016178155388061450b565b905061467e565b906040519182815491828252602082019060005260206000209260005b81811061472c57505061392b92500383613368565b8454835260019485019487945060209093019201614717565b80548210156137d35760005260206000200190600090565b60008181526003602052604090205480156148ec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116136a857600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116136a85781810361487d575b505050600254801561484e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161480b816002614745565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6148d461488e61489f936002614745565b90549060031b1c9283926002614745565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806147d2565b5050600090565b60008181526006602052604090205480156148ec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116136a857600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116136a8578181036149e4575b505050600554801561484e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016149a1816005614745565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b614a066149f561489f936005614745565b90549060031b1c9283926005614745565b90556000526006602052604060002055388080614968565b9060018201918160005282602052604060002054801515600014614b49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116136a8578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116136a857818103614b12575b5050508054801561484e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614ad38282614745565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b614b32614b2261489f9386614745565b90549060031b1c92839286614745565b905560005283602052604060002055388080614a9b565b50505050600090565b80600052600360205260406000205415600014614bac57600254680100000000000000008110156132e557614b9361489f8260018594016002556002614745565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014614bac57600554680100000000000000008110156132e557614bf361489f8260018594016005556005614745565b9055600554906000526006602052604060002055600190565b60008281526001820160205260409020546148ec57805490680100000000000000008210156132e55782614c4a61489f846001809601855584614745565b905580549260005201602052604060002055600190565b929192805460ff8160a01c16158015614f41575b614f3a576fffffffffffffffffffffffffffffffff81169060018301908154614cba63ffffffff6fffffffffffffffffffffffffffffffff83169360801c164261369b565b9081614e9c575b5050848110614e1a5750838210614d4957507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff80614d17856020969561369b565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b819450614d5b92505460801c9261369b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908082116136a857614da9614dae9273ffffffffffffffffffffffffffffffffffffffff94613802565b613c44565b9216918215614dea577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614e6c577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b828592939511614f1057614eb7926142069160801c90613abd565b80831015614f0b5750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178455913880614cc1565b614ec2565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b508215614c75565b91929015614fc45750815115614f5d575090565b3b15614f665790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015614fd75750805190602001fd5b6115cd906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906133e356fea164736f6c634300081a000a", } var SiloedLockReleaseTokenPoolABI = SiloedLockReleaseTokenPoolMetaData.ABI @@ -292,6 +292,28 @@ func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetA return _SiloedLockReleaseTokenPool.Contract.GetAvailableTokens(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) } +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetChainRebalancer(opts *bind.CallOpts, remoteChainSelector uint64) (common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getChainRebalancer", remoteChainSelector) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetChainRebalancer(remoteChainSelector uint64) (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetChainRebalancer(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetChainRebalancer(remoteChainSelector uint64) (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetChainRebalancer(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { var out []interface{} err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) @@ -468,28 +490,6 @@ func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetR return _SiloedLockReleaseTokenPool.Contract.GetRouter(&_SiloedLockReleaseTokenPool.CallOpts) } -func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetSiloRebalancer(opts *bind.CallOpts, remoteChainSelector uint64) (common.Address, error) { - var out []interface{} - err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getSiloRebalancer", remoteChainSelector) - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetSiloRebalancer(remoteChainSelector uint64) (common.Address, error) { - return _SiloedLockReleaseTokenPool.Contract.GetSiloRebalancer(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) -} - -func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetSiloRebalancer(remoteChainSelector uint64) (common.Address, error) { - return _SiloedLockReleaseTokenPool.Contract.GetSiloRebalancer(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) -} - func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { var out []interface{} err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getSupportedChains") @@ -3975,6 +3975,8 @@ type SiloedLockReleaseTokenPoolInterface interface { GetAvailableTokens(opts *bind.CallOpts, remoteChainSelector uint64) (*big.Int, error) + GetChainRebalancer(opts *bind.CallOpts, remoteChainSelector uint64) (common.Address, error) + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) @@ -3991,8 +3993,6 @@ type SiloedLockReleaseTokenPoolInterface interface { GetRouter(opts *bind.CallOpts) (common.Address, error) - GetSiloRebalancer(opts *bind.CallOpts, remoteChainSelector uint64) (common.Address, error) - GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) GetToken(opts *bind.CallOpts) (common.Address, error) diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 3ee77361e51..ab5f01ce9ad 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -28,7 +28,7 @@ rmn_home: ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.abi.json ../. rmn_proxy_contract: ../../../contracts/solc/ccip/RMNProxy/RMNProxy.sol/RMNProxy.abi.json ../../../contracts/solc/ccip/RMNProxy/RMNProxy.sol/RMNProxy.bin 4d06f9e5c6f72daef745e6114faed3bae57ad29758d75de5a4eefcd5f0172328 rmn_remote: ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.abi.json ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.bin 32173df61397fc104bc6bcd9d8e929165ee3911518350dc7f2bb5d1d94875a94 router: ../../../contracts/solc/ccip/Router/Router.sol/Router.abi.json ../../../contracts/solc/ccip/Router/Router.sol/Router.bin 0103ab2fd344179d49f0320d0a47ec8255fe8a401a2f2c8973e8314dc49d2413 -siloed_lock_release_token_pool: ../../../contracts/solc/ccip/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.sol/SiloedLockReleaseTokenPool.abi.json ../../../contracts/solc/ccip/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.sol/SiloedLockReleaseTokenPool.bin 53a592f99d2a47e0b9b012d6f863a0224ba106b687511ff6c67cea160c42fc3a +siloed_lock_release_token_pool: ../../../contracts/solc/ccip/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.sol/SiloedLockReleaseTokenPool.abi.json ../../../contracts/solc/ccip/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.sol/SiloedLockReleaseTokenPool.bin f08d3e14a2659499c381cf5a9fc7d985df85c5ee020c7f7cb129d4565b90c3af token_admin_registry: ../../../contracts/solc/ccip/TokenAdminRegistry/TokenAdminRegistry.sol/TokenAdminRegistry.abi.json ../../../contracts/solc/ccip/TokenAdminRegistry/TokenAdminRegistry.sol/TokenAdminRegistry.bin 086268b9df56e089a69a96ce3e4fd03a07a00a1c8812ba9504e31930a5c3ff1d token_pool: ../../../contracts/solc/ccip/TokenPool/TokenPool.sol/TokenPool.abi.json ../../../contracts/solc/ccip/TokenPool/TokenPool.sol/TokenPool.bin 6c00ce7b2082f40d5f9b4808eb692a90e81c312b4f5d70d62e4b1ef69a164a9f usdc_reader_tester: ../../../contracts/solc/ccip/USDCReaderTester/USDCReaderTester.sol/USDCReaderTester.abi.json ../../../contracts/solc/ccip/USDCReaderTester/USDCReaderTester.sol/USDCReaderTester.bin 7622b1e42bc9c3933c51607d765d8463796c615155596929e554a58ed68b263d From ae6e01d7c4d0c2e12d3ade177612b09ced7020a0 Mon Sep 17 00:00:00 2001 From: Brandon West <3317895+Bwest981@users.noreply.github.com> Date: Tue, 11 Feb 2025 13:30:00 -0500 Subject: [PATCH 21/83] Merge release/2.20.0 to develop (#16302) * Bump version and update CHANGELOG for core v2.20.0 Signed-off-by: bwest981 <3317895+Bwest981@users.noreply.github.com> * Fix client/server start race for LLO (#16032) * Fix "cache already exists for contract" when deleting/adding LLO job (#16044) * Bump version and update CHANGELOG for core v2.20.0 * Send client_pub_key as grpc metadata (#16049) * Finalize date on changelog for 2.20.0 Signed-off-by: bwest981 <3317895+Bwest981@users.noreply.github.com> --------- Signed-off-by: bwest981 <3317895+Bwest981@users.noreply.github.com> Co-authored-by: Sam --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16647fb4b9b..0082994c6f7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog Chainlink Core -## 2.20.0 - UNRELEASED +## 2.20.0 - 2025-01-30 ### Minor Changes @@ -48,6 +48,8 @@ - [#15899](https://github.com/smartcontractkit/chainlink/pull/15899) [`796357b17c`](https://github.com/smartcontractkit/chainlink/commit/796357b17ca875ba80e157fc08b0da5db4ed1644) - #updated feat:create tron chain config on operator ui +- [#16019](https://github.com/smartcontractkit/chainlink/pull/16019) [`c75092086f`](https://github.com/smartcontractkit/chainlink/commit/c75092086f790d273abb08f18f1b03f7934e30dc) - Bump to start the next version + ### Patch Changes - [#15357](https://github.com/smartcontractkit/chainlink/pull/15357) [`18cb44e891`](https://github.com/smartcontractkit/chainlink/commit/18cb44e891a00edff7486640ffc8e0c9275a04f8) - #updated use real contracts in ccipreader_tests where possible From ab06bf0277b5641c24596d05351dd23df544a72c Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Tue, 11 Feb 2025 20:35:15 +0100 Subject: [PATCH 22/83] Release CCIP 1.6 (#16298) * rm -dev suffix * changesets * [Bot] Update changeset file with jira issues * fix lint + rebase --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> --- .changeset/fresh-meals-admire.md | 5 +++++ contracts/.changeset/eighty-ducks-flow.md | 10 +++++++++ contracts/gas-snapshots/ccip.gas-snapshot | 8 +++---- .../ccip/.changeset/loud-drinks-worry.md | 5 +++++ contracts/src/v0.8/ccip/FeeQuoter.sol | 2 +- .../v0.8/ccip/MultiAggregateRateLimiter.sol | 2 +- contracts/src/v0.8/ccip/NonceManager.sol | 2 +- .../src/v0.8/ccip/capability/CCIPHome.sol | 2 +- contracts/src/v0.8/ccip/offRamp/OffRamp.sol | 2 +- contracts/src/v0.8/ccip/onRamp/OnRamp.sol | 2 +- .../ccip/pools/SiloedLockReleaseTokenPool.sol | 2 +- contracts/src/v0.8/ccip/rmn/RMNHome.sol | 2 +- contracts/src/v0.8/ccip/rmn/RMNRemote.sol | 2 +- .../feeQuoter/FeeQuoter.constructor.t.sol | 2 +- .../offRamp/OffRamp/OffRamp.constructor.t.sol | 2 +- .../onRamp/OnRamp/OnRamp.constructor.t.sol | 2 +- ...ultiAggregateRateLimiter_constructor.t.sol | 2 +- core/capabilities/ccip/ccipevm/commitcodec.go | 2 +- .../capabilities/ccip/ccipevm/executecodec.go | 2 +- core/capabilities/ccip/ccipevm/msghasher.go | 2 +- .../ccip/generated/ccip_home/ccip_home.go | 2 +- .../ccip/generated/fee_quoter/fee_quoter.go | 2 +- .../multi_aggregate_rate_limiter.go | 2 +- .../generated/nonce_manager/nonce_manager.go | 2 +- .../ccip/generated/offramp/offramp.go | 2 +- .../offramp_with_message_transformer.go | 2 +- .../ccip/generated/onramp/onramp.go | 2 +- .../onramp_with_message_transformer.go | 2 +- .../ccip/generated/rmn_home/rmn_home.go | 2 +- .../ccip/generated/rmn_remote/rmn_remote.go | 2 +- .../siloed_lock_release_token_pool.go | 2 +- ...rapper-dependency-versions-do-not-edit.txt | 22 +++++++++---------- .../ccipdata/price_registry_reader_test.go | 2 +- .../plugins/ccip/internal/ccipdata/reader.go | 3 ++- deployment/address_book.go | 12 +++++----- deployment/ccip/changeset/cs_deploy_chain.go | 10 ++++----- deployment/ccip/changeset/cs_home_chain.go | 4 ++-- deployment/ccip/changeset/state.go | 14 ++++++------ deployment/ccip/view/v1_6/ccip_home_test.go | 2 +- 39 files changed, 86 insertions(+), 65 deletions(-) create mode 100644 .changeset/fresh-meals-admire.md create mode 100644 contracts/.changeset/eighty-ducks-flow.md create mode 100644 contracts/release/ccip/.changeset/loud-drinks-worry.md diff --git a/.changeset/fresh-meals-admire.md b/.changeset/fresh-meals-admire.md new file mode 100644 index 00000000000..f27bf7c3df4 --- /dev/null +++ b/.changeset/fresh-meals-admire.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal remove -dev suffix from ccip contracts diff --git a/contracts/.changeset/eighty-ducks-flow.md b/contracts/.changeset/eighty-ducks-flow.md new file mode 100644 index 00000000000..cc56f6788cb --- /dev/null +++ b/contracts/.changeset/eighty-ducks-flow.md @@ -0,0 +1,10 @@ +--- +'@chainlink/contracts': minor +--- + +release CCIP 1.6, remove -dev suffix + + +PR issue: CCIP-5181 + +Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot index 69b1d930963..70728c3d2d1 100644 --- a/contracts/gas-snapshots/ccip.gas-snapshot +++ b/contracts/gas-snapshots/ccip.gas-snapshot @@ -162,8 +162,8 @@ MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_SingleConfigOutboun MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig() (gas: 54084) MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfigWithNoDifference() (gas: 38924) MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs() (gas: 12505) -MultiAggregateRateLimiter_constructor:test_Constructor() (gas: 2102740) -MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers() (gas: 1986594) +MultiAggregateRateLimiter_constructor:test_Constructor() (gas: 2100225) +MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers() (gas: 1984394) MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket() (gas: 30888) MultiAggregateRateLimiter_getTokenBucket:test_Refill() (gas: 48378) MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue() (gas: 17594) @@ -237,7 +237,7 @@ OffRamp_commit:test_ReportOnlyRootSuccess_gas() (gas: 141950) OffRamp_commit:test_RootWithRMNDisabled() (gas: 159871) OffRamp_commit:test_StaleReportWithRoot() (gas: 237218) OffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot() (gas: 211061) -OffRamp_constructor:test_Constructor() (gas: 6393595) +OffRamp_constructor:test_Constructor() (gas: 6390407) OffRamp_execute:test_LargeBatch() (gas: 3537164) OffRamp_execute:test_MultipleReports() (gas: 306127) OffRamp_execute:test_MultipleReportsWithPartialValidationFailures() (gas: 369525) @@ -290,7 +290,7 @@ OnRampWithMessageTransformer_setMessageTransformer:test_setMessageTransformer() OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates() (gas: 325996) OnRamp_applyAllowlistUpdates:test_applyAllowlistUpdates_InvalidAllowListRequestDisabledAllowListWithAdds() (gas: 17190) OnRamp_applyDestChainConfigUpdates:test_ApplyDestChainConfigUpdates() (gas: 65874) -OnRamp_constructor:test_Constructor() (gas: 2726787) +OnRamp_constructor:test_Constructor() (gas: 2723399) OnRamp_forwardFromRouter:test_ForwardFromRouter() (gas: 154050) OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2() (gas: 154885) OnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue() (gas: 124086) diff --git a/contracts/release/ccip/.changeset/loud-drinks-worry.md b/contracts/release/ccip/.changeset/loud-drinks-worry.md new file mode 100644 index 00000000000..701370a2686 --- /dev/null +++ b/contracts/release/ccip/.changeset/loud-drinks-worry.md @@ -0,0 +1,5 @@ +--- +'@chainlink/contracts-ccip': minor +--- + +release CCIP 1.6, remove -dev suffix diff --git a/contracts/src/v0.8/ccip/FeeQuoter.sol b/contracts/src/v0.8/ccip/FeeQuoter.sol index 0766e1dd3e6..75db83f9662 100644 --- a/contracts/src/v0.8/ccip/FeeQuoter.sol +++ b/contracts/src/v0.8/ccip/FeeQuoter.sol @@ -169,7 +169,7 @@ contract FeeQuoter is AuthorizedCallers, IFeeQuoter, ITypeAndVersion, IReceiver, /// @dev The decimals that Keystone reports prices in. uint256 public constant KEYSTONE_PRICE_DECIMALS = 18; - string public constant override typeAndVersion = "FeeQuoter 1.6.0-dev"; + string public constant override typeAndVersion = "FeeQuoter 1.6.0"; /// @dev The gas price per unit of gas for a given destination chain, in USD with 18 decimals. Multiple gas prices can /// be encoded into the same value. Each price takes {Internal.GAS_PRICE_BITS} bits. For example, if Optimism is the diff --git a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol index fc553e4939c..844a5570e28 100644 --- a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol +++ b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol @@ -54,7 +54,7 @@ contract MultiAggregateRateLimiter is IMessageInterceptor, AuthorizedCallers, IT RateLimiter.TokenBucket outboundLaneBucket; // Bucket for the outbound lane (local -> remote). } - string public constant override typeAndVersion = "MultiAggregateRateLimiter 1.6.0-dev"; + string public constant override typeAndVersion = "MultiAggregateRateLimiter 1.6.0"; bytes32 private constant EMPTY_ENCODED_ADDRESS_HASH = keccak256(abi.encode(address(0))); diff --git a/contracts/src/v0.8/ccip/NonceManager.sol b/contracts/src/v0.8/ccip/NonceManager.sol index d8569658fcc..81e765681a7 100644 --- a/contracts/src/v0.8/ccip/NonceManager.sol +++ b/contracts/src/v0.8/ccip/NonceManager.sol @@ -29,7 +29,7 @@ contract NonceManager is INonceManager, AuthorizedCallers, ITypeAndVersion { PreviousRamps prevRamps; // Previous on/off ramps. } - string public constant override typeAndVersion = "NonceManager 1.6.0-dev"; + string public constant override typeAndVersion = "NonceManager 1.6.0"; /// @dev The previous on/off ramps per chain selector. mapping(uint64 chainSelector => PreviousRamps previousRamps) private s_previousRamps; diff --git a/contracts/src/v0.8/ccip/capability/CCIPHome.sol b/contracts/src/v0.8/ccip/capability/CCIPHome.sol index 174b2e3d83b..ef7718ca63c 100644 --- a/contracts/src/v0.8/ccip/capability/CCIPHome.sol +++ b/contracts/src/v0.8/ccip/capability/CCIPHome.sol @@ -136,7 +136,7 @@ contract CCIPHome is Ownable2StepMsgSender, ITypeAndVersion, ICapabilityConfigur ChainConfig chainConfig; } - string public constant override typeAndVersion = "CCIPHome 1.6.0-dev"; + string public constant override typeAndVersion = "CCIPHome 1.6.0"; /// @dev A prefix added to all config digests that is unique to the implementation. uint256 private constant PREFIX = 0x000a << (256 - 16); // 0x000a00..00 diff --git a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol index 8b7a8444e68..f12e970d9e5 100644 --- a/contracts/src/v0.8/ccip/offRamp/OffRamp.sol +++ b/contracts/src/v0.8/ccip/offRamp/OffRamp.sol @@ -144,7 +144,7 @@ contract OffRamp is ITypeAndVersion, MultiOCR3Base { } // STATIC CONFIG - string public constant override typeAndVersion = "OffRamp 1.6.0-dev"; + string public constant override typeAndVersion = "OffRamp 1.6.0"; /// @dev Hash of encoded address(0) used for empty address checks. bytes32 internal constant EMPTY_ENCODED_ADDRESS_HASH = keccak256(abi.encode(address(0))); /// @dev ChainSelector of this chain. diff --git a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol index 3a15807592f..165c0b2217e 100644 --- a/contracts/src/v0.8/ccip/onRamp/OnRamp.sol +++ b/contracts/src/v0.8/ccip/onRamp/OnRamp.sol @@ -103,7 +103,7 @@ contract OnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, Ownable2StepMsgSender } // STATIC CONFIG - string public constant override typeAndVersion = "OnRamp 1.6.0-dev"; + string public constant override typeAndVersion = "OnRamp 1.6.0"; /// @dev The chain ID of the source chain that this contract is deployed to. uint64 private immutable i_chainSelector; /// @dev The rmn contract. diff --git a/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol b/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol index ea7b174850e..28a05a0a818 100644 --- a/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol +++ b/contracts/src/v0.8/ccip/pools/SiloedLockReleaseTokenPool.sol @@ -26,7 +26,7 @@ contract SiloedLockReleaseTokenPool is TokenPool, ITypeAndVersion { event SiloRebalancerSet(uint64 indexed remoteChainSelector, address oldRebalancer, address newRebalancer); event UnsiloedRebalancerSet(address oldRebalancer, address newRebalancer); - string public constant override typeAndVersion = "SiloedLockReleaseTokenPool 1.6.0-dev"; + string public constant override typeAndVersion = "SiloedLockReleaseTokenPool 1.6.0"; /// @notice The amount of tokens available for remote chains which are not siloed as an additional security precaution. uint256 internal s_unsiloedTokenBalance; diff --git a/contracts/src/v0.8/ccip/rmn/RMNHome.sol b/contracts/src/v0.8/ccip/rmn/RMNHome.sol index b1eb56679f4..4b8aaa22f52 100644 --- a/contracts/src/v0.8/ccip/rmn/RMNHome.sol +++ b/contracts/src/v0.8/ccip/rmn/RMNHome.sol @@ -107,7 +107,7 @@ contract RMNHome is Ownable2StepMsgSender, ITypeAndVersion { DynamicConfig dynamicConfig; } - string public constant override typeAndVersion = "RMNHome 1.6.0-dev"; + string public constant override typeAndVersion = "RMNHome 1.6.0"; /// @notice Used for encoding the config digest prefix, unique per Home contract implementation. uint256 private constant PREFIX = 0x000b << (256 - 16); // 0x000b00..00. diff --git a/contracts/src/v0.8/ccip/rmn/RMNRemote.sol b/contracts/src/v0.8/ccip/rmn/RMNRemote.sol index e5ce290d3b8..283b06745ac 100644 --- a/contracts/src/v0.8/ccip/rmn/RMNRemote.sol +++ b/contracts/src/v0.8/ccip/rmn/RMNRemote.sol @@ -65,7 +65,7 @@ contract RMNRemote is Ownable2StepMsgSender, ITypeAndVersion, IRMNRemote, IRMN { /// @dev this is included in the preimage of the digest that RMN nodes sign. bytes32 private constant RMN_V1_6_ANY2EVM_REPORT = keccak256("RMN_V1_6_ANY2EVM_REPORT"); - string public constant override typeAndVersion = "RMNRemote 1.6.0-dev"; + string public constant override typeAndVersion = "RMNRemote 1.6.0"; uint64 internal immutable i_localChainSelector; IRMN internal immutable i_legacyRMN; diff --git a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.constructor.t.sol b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.constructor.t.sol index e77e52dd25e..198fa50b228 100644 --- a/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.constructor.t.sol +++ b/contracts/src/v0.8/ccip/test/feeQuoter/FeeQuoter.constructor.t.sol @@ -39,7 +39,7 @@ contract FeeQuoter_constructor is FeeQuoterSetup { _assertFeeQuoterStaticConfigsEqual(s_feeQuoter.getStaticConfig(), staticConfig); assertEq(feeTokens, s_feeQuoter.getFeeTokens()); assertEq(priceUpdaters, s_feeQuoter.getAllAuthorizedCallers()); - assertEq(s_feeQuoter.typeAndVersion(), "FeeQuoter 1.6.0-dev"); + assertEq(s_feeQuoter.typeAndVersion(), "FeeQuoter 1.6.0"); _assertTokenPriceFeedConfigEquality( tokenPriceFeedUpdates[0].feedConfig, s_feeQuoter.getTokenPriceFeedConfig(s_sourceTokens[0]) diff --git a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol index 2ed0def646a..315c3462f5a 100644 --- a/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol +++ b/contracts/src/v0.8/ccip/test/offRamp/OffRamp/OffRamp.constructor.t.sol @@ -119,7 +119,7 @@ contract OffRamp_constructor is OffRampSetup { _assertSourceChainConfigEquality(actualSourceChainConfigs[1], expectedSourceChainConfig2); // OffRamp initial values - assertEq("OffRamp 1.6.0-dev", s_offRamp.typeAndVersion()); + assertEq("OffRamp 1.6.0", s_offRamp.typeAndVersion()); assertEq(OWNER, s_offRamp.owner()); assertEq(0, s_offRamp.getLatestPriceSequenceNumber()); diff --git a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.constructor.t.sol b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.constructor.t.sol index 70153562e54..07525bd3d23 100644 --- a/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.constructor.t.sol +++ b/contracts/src/v0.8/ccip/test/onRamp/OnRamp/OnRamp.constructor.t.sol @@ -36,7 +36,7 @@ contract OnRamp_constructor is OnRampSetup { assertEq(dynamicConfig.feeQuoter, gotDynamicConfig.feeQuoter); // Initial values - assertEq("OnRamp 1.6.0-dev", s_onRamp.typeAndVersion()); + assertEq("OnRamp 1.6.0", s_onRamp.typeAndVersion()); assertEq(OWNER, s_onRamp.owner()); assertEq(1, s_onRamp.getExpectedNextSequenceNumber(DEST_CHAIN_SELECTOR)); } diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_constructor.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_constructor.t.sol index c9ea2bce69a..2062c6d4254 100644 --- a/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_constructor.t.sol +++ b/contracts/src/v0.8/ccip/test/rateLimiter/MutiAggregateRateLimiter/MultiAggregateRateLimiter_constructor.t.sol @@ -33,6 +33,6 @@ contract MultiAggregateRateLimiter_constructor is MultiAggregateRateLimiterSetup assertEq(OWNER, s_rateLimiter.owner()); assertEq(address(s_feeQuoter), s_rateLimiter.getFeeQuoter()); - assertEq(s_rateLimiter.typeAndVersion(), "MultiAggregateRateLimiter 1.6.0-dev"); + assertEq(s_rateLimiter.typeAndVersion(), "MultiAggregateRateLimiter 1.6.0"); } } diff --git a/core/capabilities/ccip/ccipevm/commitcodec.go b/core/capabilities/ccip/ccipevm/commitcodec.go index bbd6fe9f1e1..622433df50c 100644 --- a/core/capabilities/ccip/ccipevm/commitcodec.go +++ b/core/capabilities/ccip/ccipevm/commitcodec.go @@ -20,7 +20,7 @@ var ( // CommitPluginCodecV1 is a codec for encoding and decoding commit plugin reports. // Compatible with: -// - "OffRamp 1.6.0-dev" +// - "OffRamp 1.6.0" type CommitPluginCodecV1 struct{} func NewCommitPluginCodecV1() *CommitPluginCodecV1 { diff --git a/core/capabilities/ccip/ccipevm/executecodec.go b/core/capabilities/ccip/ccipevm/executecodec.go index 6c3ba8a586a..57b93e16262 100644 --- a/core/capabilities/ccip/ccipevm/executecodec.go +++ b/core/capabilities/ccip/ccipevm/executecodec.go @@ -15,7 +15,7 @@ import ( // ExecutePluginCodecV1 is a codec for encoding and decoding execute plugin reports. // Compatible with: -// - "OffRamp 1.6.0-dev" +// - "OffRamp 1.6.0" type ExecutePluginCodecV1 struct { executeReportMethodInputs abi.Arguments } diff --git a/core/capabilities/ccip/ccipevm/msghasher.go b/core/capabilities/ccip/ccipevm/msghasher.go index 7d880d4197f..60d677d8e34 100644 --- a/core/capabilities/ccip/ccipevm/msghasher.go +++ b/core/capabilities/ccip/ccipevm/msghasher.go @@ -38,7 +38,7 @@ var ( // MessageHasherV1 implements the MessageHasher interface. // Compatible with: -// - "OnRamp 1.6.0-dev" +// - "OnRamp 1.6.0" type MessageHasherV1 struct { lggr logger.Logger } diff --git a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go index 83a854121f5..bd4cce655d9 100644 --- a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go +++ b/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go @@ -66,7 +66,7 @@ type CCIPHomeVersionedConfig struct { var CCIPHomeMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"capabilitiesRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainConfigUpdates\",\"inputs\":[{\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeCapabilityConfigSet\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"update\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveDigest\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllChainConfigs\",\"inputs\":[{\"name\":\"pageIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pageSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllConfigs\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"activeConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"candidateConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCandidateDigest\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCapabilityConfiguration\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"configuration\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getCapabilityRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChainConfig\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"versionedConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"ok\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfigDigests\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"activeConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNumChainConfigurations\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"promoteCandidateAndRevokeActive\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"digestToPromote\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestToRevoke\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeCandidate\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCandidate\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"digestToOverwrite\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"newConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ActiveConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CandidateConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CapabilityConfigurationSet\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigRemoved\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigSet\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigPromoted\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"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\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainSelectorNotFound\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainSelectorNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"gotConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DONIdMismatch\",\"inputs\":[{\"name\":\"callDonId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"capabilityRegistryDonId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"FChainMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FChainTooHigh\",\"inputs\":[{\"name\":\"fChain\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"FRoleDON\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"FTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Node\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"type\":\"error\",\"name\":\"InvalidPluginType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSelector\",\"inputs\":[{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoOpStateTransitionNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughTransmitters\",\"inputs\":[{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimum\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OfframpAddressCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RMNHomeAddressCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RevokingZeroDigestNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TooManySigners\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", - Bin: "0x60a03460bf57601f613d6638819003918201601f19168301916001600160401b0383118484101760c45780849260209460405283398101031260bf57516001600160a01b03811680820360bf57331560ae57600180546001600160a01b031916331790556006805463ffffffff1916905515609d57608052604051613c8b90816100db823960805181818161026601528181612f3901526139bd0152f35b6342bcdf7f60e11b60005260046000fd5b639b15e16f60e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610157578063020330e614610152578063181f5a771461014d57806333d9704a146101485780633df45a72146101435780634851d5491461013e5780635a837f97146101395780635f1edd9c146101345780637524051a1461012f57806379ba50971461012a5780637ac0d41e146101255780638318ed5d146101205780638da5cb5b1461011b578063922ea40614610116578063b149092b14610111578063b74b23561461010c578063bae4e0fa14610107578063f2fde38b14610102578063f442c89a146100fd5763fba64a7c146100f857600080fd5b61172d565b611472565b61134e565b6110e5565b61100a565b610f90565b610ee2565b610e90565b610e2f565b610df3565b610d0a565b610c0f565b610bbb565b610934565b6108ae565b6107ce565b61072c565b610415565b61021b565b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361021657807f78bea72100000000000000000000000000000000000000000000000000000000602092149081156101ec575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386101e1565b600080fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176102d557604052565b61028a565b610100810190811067ffffffffffffffff8211176102d557604052565b6040810190811067ffffffffffffffff8211176102d557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d557604052565b60405190610363604083610313565b565b6040519061036361010083610313565b67ffffffffffffffff81116102d557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106103c25750506000910152565b81810151838201526020016103b2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361040e815180928187528780880191016103af565b0116010190565b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165761049260408051906104568183610313565b601282527f43434950486f6d6520312e362e302d64657600000000000000000000000000006020830152519182916020835260208301906103d2565b0390f35b63ffffffff81160361021657565b6064359061036382610496565b6002111561021657565b3590610363826104b1565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6060910112610216576004356104fc81610496565b90602435610509816104b1565b9060443590565b6002111561051a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90600282101561051a5752565b61058a9181518152604061057960208401516060602085015260608401906103d2565b9201519060408184039101526103d2565b90565b9080602083519182815201916020808360051b8301019401926000915b8383106105b957505050505090565b90919293946020806105f5837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528951610556565b970193019301919392906105aa565b90604061058a9263ffffffff81511683526020810151602084015201519060606040820152610637606082018351610549565b602082015167ffffffffffffffff166080820152604082015160ff1660a0820152606082015167ffffffffffffffff1660c082015260e06106f86106c361068e6080860151610100858701526101608601906103d2565b60a08601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0868303016101008701526103d2565b60c08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08583030161012086015261058d565b920151906101407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0828503019101526103d2565b346102165761075a610746610740366104c6565b91611b23565b604051928392604084526040840190610604565b90151560208301520390f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126102165760043561079c81610496565b9060243561058a816104b1565b90916107c061058a93604084526040840190610604565b916020818403910152610604565b34610216576107dc36610766565b906107e56117dc565b906107ee6117dc565b9261083d61083763ffffffff841680600052600560205261081384604060002061183b565b90600052600760205263ffffffff61082f85604060002061183b565b541690611882565b50611a52565b60208101516108a4575b508161087c82610876610837946108716108829763ffffffff166000526005602052604060002090565b61183b565b9261312a565b90611882565b602081015161089c575b50610492604051928392836107a9565b91503861088c565b9250610882610847565b346102165761091f60016108c136610766565b929061087c63ffffffff821694856000526005602052846109056108e983604060002061183b565b88600052600760205263ffffffff61082f85604060002061183b565b50015495600052600560205261087681604060002061183b565b50015460408051928352602083019190915290f35b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043561096f81610496565b6024359061097c826104b1565b604435916064359161098c613150565b831580610bb3575b610b89576109ae6109a5838361312a565b63ffffffff1690565b8460016109d8836109d3876108718863ffffffff166000526005602052604060002090565b611882565b50015403610b2f57506001610a2f610a04846108718563ffffffff166000526005602052604060002090565b61087c610a25866108718763ffffffff166000526007602052604060002090565b5463ffffffff1690565b50018054848103610af9575091610871610a60926000610aa0955563ffffffff166000526007602052604060002090565b6001610a70825463ffffffff1690565b1863ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055565b80610ace575b507ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e600080a2005b7f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8600080a238610aa6565b7f93df584c00000000000000000000000000000000000000000000000000000000600052600452602484905260446000fd5b6000fd5b610b576001916109d3610b2b95610871899663ffffffff166000526005602052604060002090565b5001547f93df584c00000000000000000000000000000000000000000000000000000000600052600452602452604490565b7f7b4d1e4f0000000000000000000000000000000000000000000000000000000060005260046000fd5b508215610994565b346102165760206001610c0463ffffffff8061082f610bd936610766565b9316928360005260058752610bf281604060002061183b565b9360005260078752604060002061183b565b500154604051908152f35b3461021657610c1d366104c6565b91610c26613150565b8215610ce05763ffffffff610c3b838361312a565b169263ffffffff82166000526005602052806001610c61866109d387604060002061183b565b50015403610cb957926109d3600193610871610cb4946000977f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b8980a263ffffffff166000526005602052604060002090565b500155005b6001610b57856109d386610871610b2b9763ffffffff166000526005602052604060002090565b7f0849d8cc0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760005473ffffffffffffffffffffffffffffffffffffffff81163303610dc9577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576020600354604051908152f35b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657610e69600435610496565b6040516020610e788183610313565b600082526104926040519282849384528301906103d2565b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b34610216576020610efb610ef536610766565b90611bed565b604051908152f35b67ffffffffffffffff81160361021657565b6044359061036382610f03565b359061036382610f03565b9190606081019083519160608252825180915260206080830193019060005b818110610f7a5750505060408460ff602061058a9697015116602084015201519060408184039101526103d2565b8251855260209485019490920191600101610f4c565b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165767ffffffffffffffff600435610fd481610f03565b610fdc611c1a565b50166000526002602052610492610ff66040600020611c3a565b604051918291602083526020830190610f2d565b346102165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657611047602435600435611e24565b6040518091602082016020835281518091526040830190602060408260051b8601019301916000905b82821061107f57505050500390f35b919360206110d5827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186526040838a5167ffffffffffffffff815116845201519181858201520190610f2d565b9601920192018594939192611070565b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043561112081610496565b60243561112c816104b1565b60443567ffffffffffffffff8111610216576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc826004019236030112610216576064359261117b613150565b61118d611188368461206f565b613231565b6111978382611bed565b9380850361131c57917f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c69161087c9493610492966112f1575b506112cf8260026112936111f16111ec60065463ffffffff1690565b612158565b946112278663ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006006541617600655565b6112728660405161126b8161123f8960208301612418565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610313565b8b846135b0565b99896108768c9b6108718563ffffffff166000526005602052604060002090565b506001810188905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff861617815501612936565b6112de60405192839283612abe565b0390a26040519081529081906020820190565b7f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b600080a2386111d0565b7f93df584c00000000000000000000000000000000000000000000000000000000600052600485905260245260446000fd5b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043573ffffffffffffffffffffffffffffffffffffffff8116809103610216576113a66136c5565b33811461141757807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b9181601f840112156102165782359167ffffffffffffffff8311610216576020808501948460051b01011161021657565b346102165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043567ffffffffffffffff8111610216576114c1903690600401611441565b60243567ffffffffffffffff8111610216576114e1903690600401611441565b9190926114ec6136c5565b60005b8281106116015750505060005b81811061150557005b611525611520611516838587612b7a565b6020810190612662565b612bba565b90611539611534828587612b7a565b612429565b6115438351613948565b61155a611554602085015160ff1690565b60ff1690565b156115d75782816115ab6001956115a67f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e09567ffffffffffffffff166000526002602052604060002090565b612d9a565b6115be67ffffffffffffffff8216613bed565b506115ce60405192839283612e2d565b0390a1016114fc565b7fa9b3766e0000000000000000000000000000000000000000000000000000000060005260046000fd5b61163c611638611625611618611534858888612adb565b67ffffffffffffffff1690565b6000526004602052604060002054151590565b1590565b6116e657806116766116716116576115346001958888612adb565b67ffffffffffffffff166000526002602052604060002090565b612b33565b61168f61168a611618611534848888612adb565b613b09565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f06116dd6116c2611534848888612adb565b60405167ffffffffffffffff90911681529081906020820190565b0390a1016114ef565b61153490610b2b936116f793612adb565b7f1bd4d2d20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043567ffffffffffffffff81116102165761177c903690600401611441565b505060243567ffffffffffffffff811161021657366023820112156102165780600401359067ffffffffffffffff8211610216573660248383010111610216576117da916117c8610f15565b5060246117d36104a4565b9201612f20565b005b604051906117e9826102b9565b8160008152600060208201526040805191611803836102da565b60008352600060208401526000828401526000606084015260606080840152606060a0840152606060c0840152606060e08401520152565b90600281101561051a57600052602052604060002090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906002811015611896576007020190600090565b611853565b600282101561051a5752565b90600182811c921680156118f0575b60208310146118c157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916118b6565b906040519182600082549261190e846118a7565b808452936001811690811561197a5750600114611933575b5061036392500383610313565b90506000929192526020600020906000915b81831061195e5750509060206103639282010138611926565b6020919350806001915483858901015201910190918492611945565b602093506103639592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611926565b67ffffffffffffffff81116102d55760051b60200190565b9081546119de816119ba565b926119ec6040519485610313565b818452602084019060005260206000206000915b838310611a0d5750505050565b60036020600192604051611a20816102b9565b85548152611a2f8587016118fa565b83820152611a3f600287016118fa565b6040820152815201920192019190611a00565b9060405191611a60836102b9565b60408363ffffffff835416815260018301546020820152611b1a6006835194611a88866102da565b611ae1611ad06002830154611aa060ff82168a61189b565b67ffffffffffffffff600882901c1660208a015260ff604882901c16888a015260501c67ffffffffffffffff1690565b67ffffffffffffffff166060880152565b611aed600382016118fa565b6080870152611afe600482016118fa565b60a0870152611b0f600582016119d2565b60c0870152016118fa565b60e08401520152565b90611b2c6117dc565b9260005b60028110611b42575050505090600090565b63ffffffff8416806000526005602052826001611b67846109d388604060002061183b565b5001541480611ba8575b611b7e5750600101611b30565b611ba2955061083794506109d392506000939193526005602052604060002061183b565b90600190565b50821515611b71565b91611be9918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b611c149061087c60019363ffffffff8316600052600560205261087681604060002061183b565b50015490565b60405190611c27826102b9565b6060604083828152600060208201520152565b90604051611c47816102b9565b809260405180602083549182815201908360005260206000209060005b818110611cab5750505060409282611c83611ca6946002940382610313565b8552611ca0611c96600183015460ff1690565b60ff166020870152565b016118fa565b910152565b8254845260209093019260019283019201611c64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9081600302916003830403611d0157565b611cc1565b81810292918115918404141715611d0157565b60405190611d28602083610313565b600080835282815b828110611d3c57505050565b602090604051611d4b816102f7565b60008152611d57611c1a565b8382015282828501015201611d30565b90611d71826119ba565b611d7e6040519182610313565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611dac82946119ba565b019060005b828110611dbd57505050565b602090604051611dcc816102f7565b60008152611dd8611c1a565b8382015282828501015201611db1565b9060018201809211611d0157565b91908201809211611d0157565b91908203918211611d0157565b80518210156118965760209160051b010190565b611e318260035492611d06565b9180158015611f03575b611ef857611e499083611df6565b90808211611ef0575b50611e65611e608383611e03565b611d67565b91805b828110611e755750505090565b80611ee9611e87611618600194613a41565b611ec8611ea88267ffffffffffffffff166000526002602052604060002090565b611ec3611eb3610354565b67ffffffffffffffff9094168452565b611c3a565b6020820152611ed78584611e03565b90611ee28289611e10565b5286611e10565b5001611e68565b905038611e52565b50505061058a611d19565b5081831015611e3b565b60ff81160361021657565b359061036382611f0d565b81601f8201121561021657803590611f3a82610375565b92611f486040519485610313565b8284526020838301011161021657816000926020809301838601378301015290565b9080601f8301121561021657813591611f82836119ba565b92611f906040519485610313565b80845260208085019160051b830101918383116102165760208101915b838310611fbc57505050505090565b823567ffffffffffffffff81116102165782019060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126102165760405190612009826102b9565b60208301358252604083013567ffffffffffffffff81116102165787602061203392860101611f23565b602083015260608301359167ffffffffffffffff83116102165761205f88602080969581960101611f23565b6040820152815201920191611fad565b9190916101008184031261021657612085610365565b9261208f826104bb565b845261209d60208301610f22565b60208501526120ae60408301611f18565b60408501526120bf60608301610f22565b6060850152608082013567ffffffffffffffff811161021657816120e4918401611f23565b608085015260a082013567ffffffffffffffff81116102165781612109918401611f23565b60a085015260c082013567ffffffffffffffff8111610216578161212e918401611f6a565b60c085015260e082013567ffffffffffffffff8111610216576121519201611f23565b60e0830152565b63ffffffff1663ffffffff8114611d015760010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561021657016020813591019167ffffffffffffffff821161021657813603831361021657565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561021657016020813591019167ffffffffffffffff8211610216578160051b3603831361021657565b90602083828152019060208160051b85010193836000915b8383106122795750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301865286357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1843603018112156102165760206123206001938683940190813581526123126123076122f78685018561216f565b60608886015260608501916121bf565b92604081019061216f565b9160408185039101526121bf565b980196019493019190612269565b61058a916123448161233f846104bb565b610549565b61236461235360208401610f22565b67ffffffffffffffff166020830152565b61237d61237360408401611f18565b60ff166040830152565b61239d61238c60608401610f22565b67ffffffffffffffff166060830152565b61240a6123ff6123e46123c96123b6608087018761216f565b61010060808801526101008701916121bf565b6123d660a087018761216f565b9086830360a08801526121bf565b6123f160c08601866121fe565b9085830360c0870152612251565b9260e081019061216f565b9160e08185039101526121bf565b90602061058a92818152019061232e565b3561058a81610f03565b3561058a81611f0d565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610216570180359067ffffffffffffffff82116102165760200191813603831361021657565b818110612499575050565b6000815560010161248e565b9190601f81116124b457505050565b610363926000526020600020906020601f840160051c830193106124e0575b601f0160051c019061248e565b90915081906124d3565b90929167ffffffffffffffff81116102d5576125108161250a84546118a7565b846124a5565b6000601f821160011461256a578190611be993949560009261255f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b01359050388061252d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169461259d84600052602060002090565b91805b8781106125f65750836001959697106125be575b505050811b019055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690553880806125b4565b909260206001819286860135815501940191016125a0565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610216570180359067ffffffffffffffff821161021657602001918160051b3603831361021657565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610216570190565b61269f81546118a7565b90816126a9575050565b81601f600093116001146126bb575055565b818352602083206126d791601f0160051c81019060010161248e565b808252602082209081548360011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8560031b1c191617905555565b90803582556001820161272a602083018361243d565b9067ffffffffffffffff82116102d55761274e8261274885546118a7565b856124a5565b600090601f83116001146127bd57926127a7836127b49460029794610363999760009261255f5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b604081019061243d565b929091016124ea565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316916127f085600052602060002090565b92815b81811061285957509360029693610363989693600193836127b49810612821575b505050811b0190556127aa565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080612814565b919360206001819287870135815501950192016127f3565b6801000000000000000083116102d55780548382558084106128d9575b50906128a08192600052602060002090565b906000925b8484106128b3575050505050565b60036020826128cd6128c760019587612662565b87612714565b019301930192916128a5565b80600302906003820403611d015783600302600381048503611d015782600052602060002091820191015b818110612911575061288e565b6003906000815561292460018201612695565b61293060028201612695565b01612904565b90803591612943836104b1565b600283101561051a576127b46004926103639460ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0085541691161783556129ca61299060208301612429565b84547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178455565b612a146129d960408301612433565b84547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178455565b612a66612a2360608301612429565b84547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178455565b612a80612a76608083018361243d565b90600186016124ea565b612a9a612a9060a083018361243d565b90600286016124ea565b612ab4612aaa60c083018361260e565b9060038601612871565b60e081019061243d565b60409063ffffffff61058a9493168152816020820152019061232e565b91908110156118965760051b0190565b906801000000000000000081116102d557815491818155828210612b0e57505050565b600052602060002091820191015b818110612b27575050565b60008155600101612b1c565b80546000825580612b53575b506002816000600161036394015501612695565b816000526020600020908101905b818110612b6e5750612b3f565b60008155600101612b61565b91908110156118965760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610216570190565b6060813603126102165760405190612bd1826102b9565b803567ffffffffffffffff811161021657810136601f8201121561021657803590612bfb826119ba565b91612c096040519384610313565b80835260208084019160051b8301019136831161021657602001905b828210612c6b575050508252612c3d60208201611f18565b602083015260408101359067ffffffffffffffff821161021657612c6391369101611f23565b604082015290565b8135815260209182019101612c25565b919091825167ffffffffffffffff81116102d557612c9d8161250a84546118a7565b6020601f8211600114612cf6578190611be9939495600092612ceb5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b01519050388061252d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0821690612d2984600052602060002090565b9160005b818110612d8257509583600195969710612d4b57505050811b019055565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806125b4565b9192602060018192868b015181550194019201612d2d565b90805180519067ffffffffffffffff82116102d557602090612dbc8386612aeb565b0183600052602060002060005b838110612e1957505050509060026040610363936001840160ff6020830151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905501519101612c7b565b600190602084519401938184015501612dc9565b60409067ffffffffffffffff61058a94931681528160208201520190610f2d565b906004116102165790600490565b906024116102165760040190602090565b919091357fffffffff0000000000000000000000000000000000000000000000000000000081169260048110612ea1575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b90816020910312610216573590565b908092918237016000815290565b3d15612f1b573d90612f0182610375565b91612f0f6040519384610313565b82523d6000602084013e565b606090565b909173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361310057612f72612f6c8484612e4e565b90612e6d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa0000000000000000000000000000000000000000000000000000000081141590816130d5575b816130aa575b5061305b5750612fe1612fd98484612e5c565b810190612ed3565b63ffffffff82168103613022575050600091829161300460405180938193612ee2565b039082305af1613012612ef0565b901561301b5750565b60203d9101fd5b7f8a6e4ce80000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7f12ba286f000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7f5a837f97000000000000000000000000000000000000000000000000000000009150141538612fc6565b7f7524051a000000000000000000000000000000000000000000000000000000008114159150612fc0565b7fac7a7efd0000000000000000000000000000000000000000000000000000000060005260046000fd5b61314a60019263ffffffff8093166000526007602052604060002061183b565b54161890565b30330361315957565b7f371a73280000000000000000000000000000000000000000000000000000000060005260046000fd5b6040516020810190600082526020815261319e604082610313565b51902090565b906131ae826119ba565b6131bb6040519182610313565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06131e982946119ba565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d015760010190565b90602061058a928181520190610556565b6020810167ffffffffffffffff613250825167ffffffffffffffff1690565b161561358657815161326181610510565b61326a81610510565b151580613568575b61353e57608082015180518015918215613528575b50506134fe5760a0820151805180159182156134e8575b50506134be576132bf611638611625611618845167ffffffffffffffff1690565b6134aa576132f961155460016132f16116576132e2611554604089015160ff1690565b955167ffffffffffffffff1690565b015460ff1690565b918183116134765760c0019182515191610100831161344c5761331b90611cf0565b8211156134225760009161332e816131a4565b9360005b8281106133905750505061334861334d91611cf0565b611de8565b9081811061336057505061036390613948565b7f548dd21f0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b61339b818351611e10565b51604081015151613412575b602081015151158015613409575b6133cf5790600191516133c88289611e10565b5201613332565b613405906040519182917f9fa4031400000000000000000000000000000000000000000000000000000000835260048301613220565b0390fd5b508051156133b5565b9461341c906131f3565b946133a7565b7f4856694e0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f1b925da60000000000000000000000000000000000000000000000000000000060005260046000fd5b507f2db220400000000000000000000000000000000000000000000000000000000060005260049190915260245260446000fd5b51610b2b9067ffffffffffffffff166116f7565b7fdee985740000000000000000000000000000000000000000000000000000000060005260046000fd5b6020012090506134f6613183565b14388061329e565b7f358c19270000000000000000000000000000000000000000000000000000000060005260046000fd5b602001209050613536613183565b143880613287565b7f3302dbd70000000000000000000000000000000000000000000000000000000060005260046000fd5b506001825161357681610510565b61357f81610510565b1415613272565b7f698cf8e00000000000000000000000000000000000000000000000000000000060005260046000fd5b90613677929361360663ffffffff9283604051957f45564d0000000000000000000000000000000000000000000000000000000000602088015246604088015230606088015216608086015260a0850190610549565b1660c082015260c0815261361b60e082610313565b6020604051938261363586945180928580880191016103af565b8301613649825180938580850191016103af565b0101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610313565b602081519101207fffff00000000000000000000000000000000000000000000000000000000000019167e0a0000000000000000000000000000000000000000000000000000000000001790565b73ffffffffffffffffffffffffffffffffffffffff6001541633036136e657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b519061036382610496565b9080601f83011215610216578151613732816119ba565b926137406040519485610313565b81845260208085019260051b82010192831161021657602001905b8282106137685750505090565b815181526020918201910161375b565b9080601f8301121561021657815161378f816119ba565b9261379d6040519485610313565b81845260208085019260051b82010192831161021657602001905b8282106137c55750505090565b81518152602091820191016137b8565b6020818303126102165780519067ffffffffffffffff821161021657019080601f830112156102165781519161380a836119ba565b926138186040519485610313565b80845260208085019160051b830101918383116102165760208101915b83831061384457505050505090565b825167ffffffffffffffff8111610216578201906101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126102165761388d610365565b9061389a60208401613710565b82526138a860408401613710565b60208301526138b960608401613710565b60408301526080830151606083015260a0830151608083015260c083015160a083015260e083015167ffffffffffffffff8111610216578760206138ff9286010161371b565b60c08301526101008301519167ffffffffffffffff83116102165761392c88602080969581960101613778565b60e0820152815201920191613835565b6040513d6000823e3d90fd5b80516139515750565b60405180917f05a519660000000000000000000000000000000000000000000000000000000082526024820160206004840152815180915260206044840192019060005b818110613a10575050509080600092038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015613a0b576139ec5750565b613a08903d806000833e613a008183610313565b8101906137d5565b50565b61393c565b8251845285945060209384019390920191600101613995565b80548210156118965760005260206000200190600090565b6003548110156118965760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b015490565b80548015613ada577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613aab8282613a29565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081815260046020526040902054908115613be6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211611d0157600354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401938411611d01578383600095613ba59503613bab575b505050613b946003613a76565b600490600052602052604060002090565b55600190565b613b94613bd791613bcd613bc3613bdd956003613a29565b90549060031b1c90565b9283916003613a29565b90611bb1565b55388080613b87565b5050600090565b600081815260046020526040902054613c7857600354680100000000000000008110156102d557613c5f613c2a8260018594016003556003613a29565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600354906000526004602052604060002055600190565b5060009056fea164736f6c634300081a000a", + Bin: "0x60a03460bf57601f613d6638819003918201601f19168301916001600160401b0383118484101760c45780849260209460405283398101031260bf57516001600160a01b03811680820360bf57331560ae57600180546001600160a01b031916331790556006805463ffffffff1916905515609d57608052604051613c8b90816100db823960805181818161026601528181612f3901526139bd0152f35b6342bcdf7f60e11b60005260046000fd5b639b15e16f60e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610157578063020330e614610152578063181f5a771461014d57806333d9704a146101485780633df45a72146101435780634851d5491461013e5780635a837f97146101395780635f1edd9c146101345780637524051a1461012f57806379ba50971461012a5780637ac0d41e146101255780638318ed5d146101205780638da5cb5b1461011b578063922ea40614610116578063b149092b14610111578063b74b23561461010c578063bae4e0fa14610107578063f2fde38b14610102578063f442c89a146100fd5763fba64a7c146100f857600080fd5b61172d565b611472565b61134e565b6110e5565b61100a565b610f90565b610ee2565b610e90565b610e2f565b610df3565b610d0a565b610c0f565b610bbb565b610934565b6108ae565b6107ce565b61072c565b610415565b61021b565b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361021657807f78bea72100000000000000000000000000000000000000000000000000000000602092149081156101ec575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386101e1565b600080fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176102d557604052565b61028a565b610100810190811067ffffffffffffffff8211176102d557604052565b6040810190811067ffffffffffffffff8211176102d557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d557604052565b60405190610363604083610313565b565b6040519061036361010083610313565b67ffffffffffffffff81116102d557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106103c25750506000910152565b81810151838201526020016103b2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361040e815180928187528780880191016103af565b0116010190565b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165761049260408051906104568183610313565b600e82527f43434950486f6d6520312e362e300000000000000000000000000000000000006020830152519182916020835260208301906103d2565b0390f35b63ffffffff81160361021657565b6064359061036382610496565b6002111561021657565b3590610363826104b1565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6060910112610216576004356104fc81610496565b90602435610509816104b1565b9060443590565b6002111561051a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90600282101561051a5752565b61058a9181518152604061057960208401516060602085015260608401906103d2565b9201519060408184039101526103d2565b90565b9080602083519182815201916020808360051b8301019401926000915b8383106105b957505050505090565b90919293946020806105f5837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528951610556565b970193019301919392906105aa565b90604061058a9263ffffffff81511683526020810151602084015201519060606040820152610637606082018351610549565b602082015167ffffffffffffffff166080820152604082015160ff1660a0820152606082015167ffffffffffffffff1660c082015260e06106f86106c361068e6080860151610100858701526101608601906103d2565b60a08601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0868303016101008701526103d2565b60c08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08583030161012086015261058d565b920151906101407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0828503019101526103d2565b346102165761075a610746610740366104c6565b91611b23565b604051928392604084526040840190610604565b90151560208301520390f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126102165760043561079c81610496565b9060243561058a816104b1565b90916107c061058a93604084526040840190610604565b916020818403910152610604565b34610216576107dc36610766565b906107e56117dc565b906107ee6117dc565b9261083d61083763ffffffff841680600052600560205261081384604060002061183b565b90600052600760205263ffffffff61082f85604060002061183b565b541690611882565b50611a52565b60208101516108a4575b508161087c82610876610837946108716108829763ffffffff166000526005602052604060002090565b61183b565b9261312a565b90611882565b602081015161089c575b50610492604051928392836107a9565b91503861088c565b9250610882610847565b346102165761091f60016108c136610766565b929061087c63ffffffff821694856000526005602052846109056108e983604060002061183b565b88600052600760205263ffffffff61082f85604060002061183b565b50015495600052600560205261087681604060002061183b565b50015460408051928352602083019190915290f35b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043561096f81610496565b6024359061097c826104b1565b604435916064359161098c613150565b831580610bb3575b610b89576109ae6109a5838361312a565b63ffffffff1690565b8460016109d8836109d3876108718863ffffffff166000526005602052604060002090565b611882565b50015403610b2f57506001610a2f610a04846108718563ffffffff166000526005602052604060002090565b61087c610a25866108718763ffffffff166000526007602052604060002090565b5463ffffffff1690565b50018054848103610af9575091610871610a60926000610aa0955563ffffffff166000526007602052604060002090565b6001610a70825463ffffffff1690565b1863ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055565b80610ace575b507ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e600080a2005b7f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8600080a238610aa6565b7f93df584c00000000000000000000000000000000000000000000000000000000600052600452602484905260446000fd5b6000fd5b610b576001916109d3610b2b95610871899663ffffffff166000526005602052604060002090565b5001547f93df584c00000000000000000000000000000000000000000000000000000000600052600452602452604490565b7f7b4d1e4f0000000000000000000000000000000000000000000000000000000060005260046000fd5b508215610994565b346102165760206001610c0463ffffffff8061082f610bd936610766565b9316928360005260058752610bf281604060002061183b565b9360005260078752604060002061183b565b500154604051908152f35b3461021657610c1d366104c6565b91610c26613150565b8215610ce05763ffffffff610c3b838361312a565b169263ffffffff82166000526005602052806001610c61866109d387604060002061183b565b50015403610cb957926109d3600193610871610cb4946000977f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b8980a263ffffffff166000526005602052604060002090565b500155005b6001610b57856109d386610871610b2b9763ffffffff166000526005602052604060002090565b7f0849d8cc0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760005473ffffffffffffffffffffffffffffffffffffffff81163303610dc9577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576020600354604051908152f35b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657610e69600435610496565b6040516020610e788183610313565b600082526104926040519282849384528301906103d2565b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b34610216576020610efb610ef536610766565b90611bed565b604051908152f35b67ffffffffffffffff81160361021657565b6044359061036382610f03565b359061036382610f03565b9190606081019083519160608252825180915260206080830193019060005b818110610f7a5750505060408460ff602061058a9697015116602084015201519060408184039101526103d2565b8251855260209485019490920191600101610f4c565b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165767ffffffffffffffff600435610fd481610f03565b610fdc611c1a565b50166000526002602052610492610ff66040600020611c3a565b604051918291602083526020830190610f2d565b346102165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657611047602435600435611e24565b6040518091602082016020835281518091526040830190602060408260051b8601019301916000905b82821061107f57505050500390f35b919360206110d5827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186526040838a5167ffffffffffffffff815116845201519181858201520190610f2d565b9601920192018594939192611070565b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043561112081610496565b60243561112c816104b1565b60443567ffffffffffffffff8111610216576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc826004019236030112610216576064359261117b613150565b61118d611188368461206f565b613231565b6111978382611bed565b9380850361131c57917f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c69161087c9493610492966112f1575b506112cf8260026112936111f16111ec60065463ffffffff1690565b612158565b946112278663ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006006541617600655565b6112728660405161126b8161123f8960208301612418565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610313565b8b846135b0565b99896108768c9b6108718563ffffffff166000526005602052604060002090565b506001810188905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff861617815501612936565b6112de60405192839283612abe565b0390a26040519081529081906020820190565b7f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b600080a2386111d0565b7f93df584c00000000000000000000000000000000000000000000000000000000600052600485905260245260446000fd5b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043573ffffffffffffffffffffffffffffffffffffffff8116809103610216576113a66136c5565b33811461141757807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b9181601f840112156102165782359167ffffffffffffffff8311610216576020808501948460051b01011161021657565b346102165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043567ffffffffffffffff8111610216576114c1903690600401611441565b60243567ffffffffffffffff8111610216576114e1903690600401611441565b9190926114ec6136c5565b60005b8281106116015750505060005b81811061150557005b611525611520611516838587612b7a565b6020810190612662565b612bba565b90611539611534828587612b7a565b612429565b6115438351613948565b61155a611554602085015160ff1690565b60ff1690565b156115d75782816115ab6001956115a67f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e09567ffffffffffffffff166000526002602052604060002090565b612d9a565b6115be67ffffffffffffffff8216613bed565b506115ce60405192839283612e2d565b0390a1016114fc565b7fa9b3766e0000000000000000000000000000000000000000000000000000000060005260046000fd5b61163c611638611625611618611534858888612adb565b67ffffffffffffffff1690565b6000526004602052604060002054151590565b1590565b6116e657806116766116716116576115346001958888612adb565b67ffffffffffffffff166000526002602052604060002090565b612b33565b61168f61168a611618611534848888612adb565b613b09565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f06116dd6116c2611534848888612adb565b60405167ffffffffffffffff90911681529081906020820190565b0390a1016114ef565b61153490610b2b936116f793612adb565b7f1bd4d2d20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043567ffffffffffffffff81116102165761177c903690600401611441565b505060243567ffffffffffffffff811161021657366023820112156102165780600401359067ffffffffffffffff8211610216573660248383010111610216576117da916117c8610f15565b5060246117d36104a4565b9201612f20565b005b604051906117e9826102b9565b8160008152600060208201526040805191611803836102da565b60008352600060208401526000828401526000606084015260606080840152606060a0840152606060c0840152606060e08401520152565b90600281101561051a57600052602052604060002090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906002811015611896576007020190600090565b611853565b600282101561051a5752565b90600182811c921680156118f0575b60208310146118c157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916118b6565b906040519182600082549261190e846118a7565b808452936001811690811561197a5750600114611933575b5061036392500383610313565b90506000929192526020600020906000915b81831061195e5750509060206103639282010138611926565b6020919350806001915483858901015201910190918492611945565b602093506103639592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611926565b67ffffffffffffffff81116102d55760051b60200190565b9081546119de816119ba565b926119ec6040519485610313565b818452602084019060005260206000206000915b838310611a0d5750505050565b60036020600192604051611a20816102b9565b85548152611a2f8587016118fa565b83820152611a3f600287016118fa565b6040820152815201920192019190611a00565b9060405191611a60836102b9565b60408363ffffffff835416815260018301546020820152611b1a6006835194611a88866102da565b611ae1611ad06002830154611aa060ff82168a61189b565b67ffffffffffffffff600882901c1660208a015260ff604882901c16888a015260501c67ffffffffffffffff1690565b67ffffffffffffffff166060880152565b611aed600382016118fa565b6080870152611afe600482016118fa565b60a0870152611b0f600582016119d2565b60c0870152016118fa565b60e08401520152565b90611b2c6117dc565b9260005b60028110611b42575050505090600090565b63ffffffff8416806000526005602052826001611b67846109d388604060002061183b565b5001541480611ba8575b611b7e5750600101611b30565b611ba2955061083794506109d392506000939193526005602052604060002061183b565b90600190565b50821515611b71565b91611be9918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b611c149061087c60019363ffffffff8316600052600560205261087681604060002061183b565b50015490565b60405190611c27826102b9565b6060604083828152600060208201520152565b90604051611c47816102b9565b809260405180602083549182815201908360005260206000209060005b818110611cab5750505060409282611c83611ca6946002940382610313565b8552611ca0611c96600183015460ff1690565b60ff166020870152565b016118fa565b910152565b8254845260209093019260019283019201611c64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9081600302916003830403611d0157565b611cc1565b81810292918115918404141715611d0157565b60405190611d28602083610313565b600080835282815b828110611d3c57505050565b602090604051611d4b816102f7565b60008152611d57611c1a565b8382015282828501015201611d30565b90611d71826119ba565b611d7e6040519182610313565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611dac82946119ba565b019060005b828110611dbd57505050565b602090604051611dcc816102f7565b60008152611dd8611c1a565b8382015282828501015201611db1565b9060018201809211611d0157565b91908201809211611d0157565b91908203918211611d0157565b80518210156118965760209160051b010190565b611e318260035492611d06565b9180158015611f03575b611ef857611e499083611df6565b90808211611ef0575b50611e65611e608383611e03565b611d67565b91805b828110611e755750505090565b80611ee9611e87611618600194613a41565b611ec8611ea88267ffffffffffffffff166000526002602052604060002090565b611ec3611eb3610354565b67ffffffffffffffff9094168452565b611c3a565b6020820152611ed78584611e03565b90611ee28289611e10565b5286611e10565b5001611e68565b905038611e52565b50505061058a611d19565b5081831015611e3b565b60ff81160361021657565b359061036382611f0d565b81601f8201121561021657803590611f3a82610375565b92611f486040519485610313565b8284526020838301011161021657816000926020809301838601378301015290565b9080601f8301121561021657813591611f82836119ba565b92611f906040519485610313565b80845260208085019160051b830101918383116102165760208101915b838310611fbc57505050505090565b823567ffffffffffffffff81116102165782019060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126102165760405190612009826102b9565b60208301358252604083013567ffffffffffffffff81116102165787602061203392860101611f23565b602083015260608301359167ffffffffffffffff83116102165761205f88602080969581960101611f23565b6040820152815201920191611fad565b9190916101008184031261021657612085610365565b9261208f826104bb565b845261209d60208301610f22565b60208501526120ae60408301611f18565b60408501526120bf60608301610f22565b6060850152608082013567ffffffffffffffff811161021657816120e4918401611f23565b608085015260a082013567ffffffffffffffff81116102165781612109918401611f23565b60a085015260c082013567ffffffffffffffff8111610216578161212e918401611f6a565b60c085015260e082013567ffffffffffffffff8111610216576121519201611f23565b60e0830152565b63ffffffff1663ffffffff8114611d015760010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561021657016020813591019167ffffffffffffffff821161021657813603831361021657565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561021657016020813591019167ffffffffffffffff8211610216578160051b3603831361021657565b90602083828152019060208160051b85010193836000915b8383106122795750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301865286357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1843603018112156102165760206123206001938683940190813581526123126123076122f78685018561216f565b60608886015260608501916121bf565b92604081019061216f565b9160408185039101526121bf565b980196019493019190612269565b61058a916123448161233f846104bb565b610549565b61236461235360208401610f22565b67ffffffffffffffff166020830152565b61237d61237360408401611f18565b60ff166040830152565b61239d61238c60608401610f22565b67ffffffffffffffff166060830152565b61240a6123ff6123e46123c96123b6608087018761216f565b61010060808801526101008701916121bf565b6123d660a087018761216f565b9086830360a08801526121bf565b6123f160c08601866121fe565b9085830360c0870152612251565b9260e081019061216f565b9160e08185039101526121bf565b90602061058a92818152019061232e565b3561058a81610f03565b3561058a81611f0d565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610216570180359067ffffffffffffffff82116102165760200191813603831361021657565b818110612499575050565b6000815560010161248e565b9190601f81116124b457505050565b610363926000526020600020906020601f840160051c830193106124e0575b601f0160051c019061248e565b90915081906124d3565b90929167ffffffffffffffff81116102d5576125108161250a84546118a7565b846124a5565b6000601f821160011461256a578190611be993949560009261255f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b01359050388061252d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169461259d84600052602060002090565b91805b8781106125f65750836001959697106125be575b505050811b019055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690553880806125b4565b909260206001819286860135815501940191016125a0565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610216570180359067ffffffffffffffff821161021657602001918160051b3603831361021657565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610216570190565b61269f81546118a7565b90816126a9575050565b81601f600093116001146126bb575055565b818352602083206126d791601f0160051c81019060010161248e565b808252602082209081548360011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8560031b1c191617905555565b90803582556001820161272a602083018361243d565b9067ffffffffffffffff82116102d55761274e8261274885546118a7565b856124a5565b600090601f83116001146127bd57926127a7836127b49460029794610363999760009261255f5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b604081019061243d565b929091016124ea565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316916127f085600052602060002090565b92815b81811061285957509360029693610363989693600193836127b49810612821575b505050811b0190556127aa565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080612814565b919360206001819287870135815501950192016127f3565b6801000000000000000083116102d55780548382558084106128d9575b50906128a08192600052602060002090565b906000925b8484106128b3575050505050565b60036020826128cd6128c760019587612662565b87612714565b019301930192916128a5565b80600302906003820403611d015783600302600381048503611d015782600052602060002091820191015b818110612911575061288e565b6003906000815561292460018201612695565b61293060028201612695565b01612904565b90803591612943836104b1565b600283101561051a576127b46004926103639460ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0085541691161783556129ca61299060208301612429565b84547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178455565b612a146129d960408301612433565b84547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178455565b612a66612a2360608301612429565b84547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178455565b612a80612a76608083018361243d565b90600186016124ea565b612a9a612a9060a083018361243d565b90600286016124ea565b612ab4612aaa60c083018361260e565b9060038601612871565b60e081019061243d565b60409063ffffffff61058a9493168152816020820152019061232e565b91908110156118965760051b0190565b906801000000000000000081116102d557815491818155828210612b0e57505050565b600052602060002091820191015b818110612b27575050565b60008155600101612b1c565b80546000825580612b53575b506002816000600161036394015501612695565b816000526020600020908101905b818110612b6e5750612b3f565b60008155600101612b61565b91908110156118965760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610216570190565b6060813603126102165760405190612bd1826102b9565b803567ffffffffffffffff811161021657810136601f8201121561021657803590612bfb826119ba565b91612c096040519384610313565b80835260208084019160051b8301019136831161021657602001905b828210612c6b575050508252612c3d60208201611f18565b602083015260408101359067ffffffffffffffff821161021657612c6391369101611f23565b604082015290565b8135815260209182019101612c25565b919091825167ffffffffffffffff81116102d557612c9d8161250a84546118a7565b6020601f8211600114612cf6578190611be9939495600092612ceb5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b01519050388061252d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0821690612d2984600052602060002090565b9160005b818110612d8257509583600195969710612d4b57505050811b019055565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806125b4565b9192602060018192868b015181550194019201612d2d565b90805180519067ffffffffffffffff82116102d557602090612dbc8386612aeb565b0183600052602060002060005b838110612e1957505050509060026040610363936001840160ff6020830151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905501519101612c7b565b600190602084519401938184015501612dc9565b60409067ffffffffffffffff61058a94931681528160208201520190610f2d565b906004116102165790600490565b906024116102165760040190602090565b919091357fffffffff0000000000000000000000000000000000000000000000000000000081169260048110612ea1575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b90816020910312610216573590565b908092918237016000815290565b3d15612f1b573d90612f0182610375565b91612f0f6040519384610313565b82523d6000602084013e565b606090565b909173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361310057612f72612f6c8484612e4e565b90612e6d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa0000000000000000000000000000000000000000000000000000000081141590816130d5575b816130aa575b5061305b5750612fe1612fd98484612e5c565b810190612ed3565b63ffffffff82168103613022575050600091829161300460405180938193612ee2565b039082305af1613012612ef0565b901561301b5750565b60203d9101fd5b7f8a6e4ce80000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7f12ba286f000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7f5a837f97000000000000000000000000000000000000000000000000000000009150141538612fc6565b7f7524051a000000000000000000000000000000000000000000000000000000008114159150612fc0565b7fac7a7efd0000000000000000000000000000000000000000000000000000000060005260046000fd5b61314a60019263ffffffff8093166000526007602052604060002061183b565b54161890565b30330361315957565b7f371a73280000000000000000000000000000000000000000000000000000000060005260046000fd5b6040516020810190600082526020815261319e604082610313565b51902090565b906131ae826119ba565b6131bb6040519182610313565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06131e982946119ba565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d015760010190565b90602061058a928181520190610556565b6020810167ffffffffffffffff613250825167ffffffffffffffff1690565b161561358657815161326181610510565b61326a81610510565b151580613568575b61353e57608082015180518015918215613528575b50506134fe5760a0820151805180159182156134e8575b50506134be576132bf611638611625611618845167ffffffffffffffff1690565b6134aa576132f961155460016132f16116576132e2611554604089015160ff1690565b955167ffffffffffffffff1690565b015460ff1690565b918183116134765760c0019182515191610100831161344c5761331b90611cf0565b8211156134225760009161332e816131a4565b9360005b8281106133905750505061334861334d91611cf0565b611de8565b9081811061336057505061036390613948565b7f548dd21f0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b61339b818351611e10565b51604081015151613412575b602081015151158015613409575b6133cf5790600191516133c88289611e10565b5201613332565b613405906040519182917f9fa4031400000000000000000000000000000000000000000000000000000000835260048301613220565b0390fd5b508051156133b5565b9461341c906131f3565b946133a7565b7f4856694e0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f1b925da60000000000000000000000000000000000000000000000000000000060005260046000fd5b507f2db220400000000000000000000000000000000000000000000000000000000060005260049190915260245260446000fd5b51610b2b9067ffffffffffffffff166116f7565b7fdee985740000000000000000000000000000000000000000000000000000000060005260046000fd5b6020012090506134f6613183565b14388061329e565b7f358c19270000000000000000000000000000000000000000000000000000000060005260046000fd5b602001209050613536613183565b143880613287565b7f3302dbd70000000000000000000000000000000000000000000000000000000060005260046000fd5b506001825161357681610510565b61357f81610510565b1415613272565b7f698cf8e00000000000000000000000000000000000000000000000000000000060005260046000fd5b90613677929361360663ffffffff9283604051957f45564d0000000000000000000000000000000000000000000000000000000000602088015246604088015230606088015216608086015260a0850190610549565b1660c082015260c0815261361b60e082610313565b6020604051938261363586945180928580880191016103af565b8301613649825180938580850191016103af565b0101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610313565b602081519101207fffff00000000000000000000000000000000000000000000000000000000000019167e0a0000000000000000000000000000000000000000000000000000000000001790565b73ffffffffffffffffffffffffffffffffffffffff6001541633036136e657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b519061036382610496565b9080601f83011215610216578151613732816119ba565b926137406040519485610313565b81845260208085019260051b82010192831161021657602001905b8282106137685750505090565b815181526020918201910161375b565b9080601f8301121561021657815161378f816119ba565b9261379d6040519485610313565b81845260208085019260051b82010192831161021657602001905b8282106137c55750505090565b81518152602091820191016137b8565b6020818303126102165780519067ffffffffffffffff821161021657019080601f830112156102165781519161380a836119ba565b926138186040519485610313565b80845260208085019160051b830101918383116102165760208101915b83831061384457505050505090565b825167ffffffffffffffff8111610216578201906101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126102165761388d610365565b9061389a60208401613710565b82526138a860408401613710565b60208301526138b960608401613710565b60408301526080830151606083015260a0830151608083015260c083015160a083015260e083015167ffffffffffffffff8111610216578760206138ff9286010161371b565b60c08301526101008301519167ffffffffffffffff83116102165761392c88602080969581960101613778565b60e0820152815201920191613835565b6040513d6000823e3d90fd5b80516139515750565b60405180917f05a519660000000000000000000000000000000000000000000000000000000082526024820160206004840152815180915260206044840192019060005b818110613a10575050509080600092038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015613a0b576139ec5750565b613a08903d806000833e613a008183610313565b8101906137d5565b50565b61393c565b8251845285945060209384019390920191600101613995565b80548210156118965760005260206000200190600090565b6003548110156118965760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b015490565b80548015613ada577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613aab8282613a29565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081815260046020526040902054908115613be6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211611d0157600354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401938411611d01578383600095613ba59503613bab575b505050613b946003613a76565b600490600052602052604060002090565b55600190565b613b94613bd791613bcd613bc3613bdd956003613a29565b90549060031b1c90565b9283916003613a29565b90611bb1565b55388080613b87565b5050600090565b600081815260046020526040902054613c7857600354680100000000000000008110156102d557613c5f613c2a8260018594016003556003613a29565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600354906000526004602052604060002055600190565b5060009056fea164736f6c634300081a000a", } var CCIPHomeABI = CCIPHomeMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go index 9f181ef2a28..668483e5ed9 100644 --- a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go +++ b/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go @@ -159,7 +159,7 @@ type KeystoneFeedsPermissionHandlerPermission struct { var FeeQuoterMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"priceUpdaters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"FEE_BASE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyFeeTokensUpdates\",\"inputs\":[{\"name\":\"feeTokensToRemove\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokensToAdd\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"inputs\":[{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyTokenTransferFeeConfigUpdates\",\"inputs\":[{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertTokenAmount\",\"inputs\":[{\"name\":\"fromToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fromTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"toToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestinationChainGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeTokens\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPremiumMultiplierWeiPerEth\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenAndGasPrices\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"tokenPrice\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"gasPriceValue\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPriceFeedConfig\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrices\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onReport\",\"inputs\":[{\"name\":\"metadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessageArgs\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"messageReceiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"convertedExtraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenReceiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processPoolReturnData\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setReportPermissions\",\"inputs\":[{\"name\":\"permissions\",\"type\":\"tuple[]\",\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updatePrices\",\"inputs\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateTokenPriceFeeds\",\"inputs\":[{\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenAdded\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenRemoved\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"PremiumMultiplierWeiPerEthUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PriceFeedPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"priceFeedConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReportPermissionSet\",\"inputs\":[{\"name\":\"reportId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"permission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigDeleted\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerUnitGasUpdated\",\"inputs\":[{\"name\":\"destChain\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DataFeedValueOutOfUint224Range\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DestinationChainNotEnabled\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeTokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidChainFamilySelector\",\"inputs\":[{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidDestBytesOverhead\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidEVMAddress\",\"inputs\":[{\"name\":\"encodedAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsTag\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeRange\",\"inputs\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidSVMAddress\",\"inputs\":[{\"name\":\"SVMAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSVMExtraArgsWritableBitmap\",\"inputs\":[{\"name\":\"accountIsWritableBitmap\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStaticConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenReceiver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageComputeUnitLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageFeeTooHigh\",\"inputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MessageGasLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageTooLarge\",\"inputs\":[{\"name\":\"maxSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actualSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReportForwarderUnauthorized\",\"inputs\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"}]},{\"type\":\"error\",\"name\":\"SourceTokenDataTooLarge\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StaleGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timePassed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TooManySVMExtraArgsAccounts\",\"inputs\":[{\"name\":\"numAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedNumberOfTokens\",\"inputs\":[{\"name\":\"numberOfTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", - Bin: "0x60e06040523461106a576172d580380380610019816112d6565b928339810190808203610120811261106a5760601361106a5761003a611298565b81516001600160601b038116810361106a57815261005a602083016112fb565b906020810191825261006e6040840161130f565b6040820190815260608401516001600160401b03811161106a5785610094918601611337565b60808501519094906001600160401b03811161106a57866100b6918301611337565b60a08201519096906001600160401b03811161106a5782019080601f8301121561106a5781516100ed6100e882611320565b6112d6565b9260208085848152019260071b8201019083821161106a57602001915b8183106112235750505060c08301516001600160401b03811161106a5783019781601f8a01121561106a578851986101446100e88b611320565b996020808c838152019160051b8301019184831161106a5760208101915b8383106110c1575050505060e08401516001600160401b03811161106a5784019382601f8601121561106a57845161019c6100e882611320565b9560208088848152019260061b8201019085821161106a57602001915b81831061108557505050610100810151906001600160401b03821161106a570182601f8201121561106a578051906101f36100e883611320565b93602061028081878681520194028301019181831161106a57602001925b828410610ea857505050503315610e9757600180546001600160a01b031916331790556020986102408a6112d6565b976000895260003681376102526112b7565b998a52888b8b015260005b89518110156102c4576001906001600160a01b0361027b828d6113d0565b51168d610287826115bc565b610294575b50500161025d565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1388d61028c565b508a985089519660005b885181101561033f576001600160a01b036102e9828b6113d0565b511690811561032e577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef8c83610320600195611544565b50604051908152a1016102ce565b6342bcdf7f60e11b60005260046000fd5b5081518a985089906001600160a01b0316158015610e85575b8015610e76575b610e655791516001600160a01b031660a05290516001600160601b03166080525163ffffffff1660c052610392866112d6565b9360008552600036813760005b855181101561040e576001906103c76001600160a01b036103c0838a6113d0565b5116611451565b6103d2575b0161039f565b818060a01b036103e282896113d0565b51167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26103cc565b508694508560005b84518110156104855760019061043e6001600160a01b0361043783896113d0565b5116611583565b610449575b01610416565b818060a01b0361045982886113d0565b51167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2610443565b508593508460005b835181101561054757806104a3600192866113d0565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf606089858060a01b038451169301518360005260078b5260406000209060ff878060a01b038251169283898060a01b03198254161781558d8301908151604082549501948460a81b8651151560a81b16918560a01b9060a01b169061ffff60a01b19161717905560405193845251168c8301525115156040820152a20161048d565b5091509160005b8251811015610afd5761056181846113d0565b51856001600160401b0361057584876113d0565b5151169101519080158015610aea575b8015610acc575b8015610a92575b610a7e57600081815260098852604090205460019392919060081b6001600160e01b03191661093657807f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806106fc868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a25b60005260098752826040600020825115158382549162ffff008c83015160081b169066ffffffff000000604084015160181b166affffffff00000000000000606085015160381b16926effffffff0000000000000000000000608086015160581b169260ff60781b60a087015160781b169460ff60801b60c088015160801b169161ffff60881b60e089015160881b169063ffffffff60981b6101008a015160981b169361ffff60b81b6101208b015160b81b169661ffff60c81b6101408c015160c81b169963ffffffff60d81b6101608d015160081c169b61018060ff60f81b910151151560f81b169c8f8060f81b039a63ffffffff60d81b199961ffff60c81b199861ffff60b81b199763ffffffff60981b199661ffff60881b199560ff60801b199460ff60781b19936effffffff0000000000000000000000199260ff6affffffff000000000000001992169066ffffffffffffff19161716171617161716171617161716171617161716179063ffffffff60d81b1617178155019061ffff6101a0820151169082549165ffffffff00006101c083015160101b169269ffffffff0000000000006101e084015160301b166a01000000000000000000008860901b0361020085015160501b169263ffffffff60901b61022086015160901b169461024063ffffffff60b01b91015160b01b169563ffffffff60b01b199363ffffffff60901b19926a01000000000000000000008c60901b0319918c8060501b03191617161716171617171790550161054e565b807f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e360405180610a76868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a2610700565b63c35aa79d60e01b60005260045260246000fd5b5063ffffffff60e01b61016083015116630a04b54b60e21b8114159081610aba575b50610593565b6307842f7160e21b1415905088610ab4565b5063ffffffff6101e08301511663ffffffff6060840151161061058c565b5063ffffffff6101e08301511615610585565b84828560005b8151811015610b83576001906001600160a01b03610b2182856113d0565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d86848060401b0381610b5786896113d0565b510151168360005260088252604060002081878060401b0319825416179055604051908152a201610b03565b83600184610b90836112d6565b9060008252600092610e60575b909282935b8251851015610d9f57610bb585846113d0565b5180516001600160401b0316939083019190855b83518051821015610d8e57610bdf8287926113d0565b51015184516001600160a01b0390610bf89084906113d0565b5151169063ffffffff815116908781019163ffffffff8351169081811015610d795750506080810163ffffffff815116898110610d62575090899291838c52600a8a5260408c20600160a01b6001900386168d528a5260408c2092825163ffffffff169380549180518d1b67ffffffff0000000016916040860192835160401b69ffff000000000000000016966060810195865160501b6dffffffff00000000000000000000169063ffffffff60701b895160701b169260a001998b60ff60901b8c51151560901b169560ff60901b199363ffffffff60701b19926dffffffff000000000000000000001991600160501b60019003191617161716171617171790556040519586525163ffffffff168c8601525161ffff1660408501525163ffffffff1660608401525163ffffffff16608083015251151560a082015260c07f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b591a3600101610bc9565b6312766e0160e11b8c52600485905260245260448bfd5b6305a7b3d160e11b8c5260045260245260448afd5b505060019096019593509050610ba2565b9150825b8251811015610e21576001906001600160401b03610dc182866113d0565b515116828060a01b0384610dd584886113d0565b5101511690808752600a855260408720848060a01b038316885285528660408120557f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b8780a301610da3565b604051615c84908161165182396080518181816106240152610c93015260a05181818161065a0152610c44015260c05181818161068101526139220152f35b610b9d565b63d794ef9560e01b60005260046000fd5b5063ffffffff8251161561035f565b5080516001600160601b031615610358565b639b15e16f60e01b60005260046000fd5b838203610280811261106a57610260610ebf6112b7565b91610ec9876113ad565b8352601f19011261106a576040519161026083016001600160401b0381118482101761106f57604052610efe602087016113a0565b8352610f0c604087016113c1565b6020840152610f1d6060870161130f565b6040840152610f2e6080870161130f565b6060840152610f3f60a0870161130f565b6080840152610f5060c08701611392565b60a0840152610f6160e08701611392565b60c0840152610f7361010087016113c1565b60e0840152610f85610120870161130f565b610100840152610f9861014087016113c1565b610120840152610fab61016087016113c1565b610140840152610180860151916001600160e01b03198316830361106a5783602093610160610280960152610fe36101a089016113a0565b610180820152610ff66101c089016113c1565b6101a08201526110096101e0890161130f565b6101c082015261101c610200890161130f565b6101e082015261102f61022089016113ad565b610200820152611042610240890161130f565b610220820152611055610260890161130f565b61024082015283820152815201930192610211565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408387031261106a57602060409161109c6112b7565b6110a5866112fb565b81526110b28387016113ad565b838201528152019201916101b9565b82516001600160401b03811161106a5782016040818803601f19011261106a576110e96112b7565b906110f6602082016113ad565b825260408101516001600160401b03811161106a57602091010187601f8201121561106a5780516111296100e882611320565b91602060e08185858152019302820101908a821161106a57602001915b8183106111655750505091816020938480940152815201920191610162565b828b0360e0811261106a5760c061117a6112b7565b91611184866112fb565b8352601f19011261106a576040519160c08301916001600160401b0383118484101761106f5760e0936020936040526111be84880161130f565b81526111cc6040880161130f565b848201526111dc606088016113c1565b60408201526111ed6080880161130f565b60608201526111fe60a0880161130f565b608082015261120f60c088016113a0565b60a082015283820152815201920191611146565b8284036080811261106a5760606112386112b7565b91611242866112fb565b8352601f19011261106a5760809160209161125b611298565b6112668488016112fb565b815261127460408801611392565b84820152611284606088016113a0565b60408201528382015281520192019161010a565b60405190606082016001600160401b0381118382101761106f57604052565b60408051919082016001600160401b0381118382101761106f57604052565b6040519190601f01601f191682016001600160401b0381118382101761106f57604052565b51906001600160a01b038216820361106a57565b519063ffffffff8216820361106a57565b6001600160401b03811161106f5760051b60200190565b9080601f8301121561106a5781516113516100e882611320565b9260208085848152019260051b82010192831161106a57602001905b82821061137a5750505090565b60208091611387846112fb565b81520191019061136d565b519060ff8216820361106a57565b5190811515820361106a57565b51906001600160401b038216820361106a57565b519061ffff8216820361106a57565b80518210156113e45760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156113e45760005260206000200190600090565b8054801561143b57600019019061142982826113fa565b8154906000199060031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b6000818152600c602052604090205480156115125760001981018181116114fc57600b546000198101919082116114fc578181036114ab575b505050611497600b611412565b600052600c60205260006040812055600190565b6114e46114bc6114cd93600b6113fa565b90549060031b1c928392600b6113fa565b819391549060031b91821b91600019901b19161790565b9055600052600c60205260406000205538808061148a565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8054906801000000000000000082101561106f57816114cd916001611540940181556113fa565b9055565b8060005260036020526040600020541560001461157d57611566816002611519565b600254906000526003602052604060002055600190565b50600090565b80600052600c6020526040600020541560001461157d576115a581600b611519565b600b5490600052600c602052604060002055600190565b60008181526003602052604090205480156115125760001981018181116114fc576002546000198101919082116114fc57808203611616575b5050506116026002611412565b600052600360205260006040812055600190565b6116386116276114cd9360026113fa565b90549060031b1c92839260026113fa565b905560005260036020526040600020553880806115f556fe6080604052600436101561001257600080fd5b60003560e01c806241e5be1461021657806301447eaa1461021157806301ffc9a71461020c578063061877e31461020757806306285c6914610202578063181f5a77146101fd5780632451a627146101f8578063325c868e146101f35780633937306f146101ee5780633a49bb49146101e957806341ed29e7146101e457806345ac924d146101df5780634ab35b0b146101da578063514e8cff146101d55780636def4ce7146101d0578063770e2dc4146101cb57806379ba5097146101c65780637afac322146101c1578063805f2132146101bc57806382b49eb0146101b757806387b8d879146101b25780638da5cb5b146101ad57806391a2749a146101a8578063a69c64c0146101a3578063bf78e03f1461019e578063cdc73d5114610199578063d02641a014610194578063d63d3af21461018f578063d8694ccd1461018a578063f2fde38b14610185578063fbe3f778146101805763ffdb4b371461017b57600080fd5b6126eb565b6125ee565b612532565b6120ce565b6120b2565b612069565b611ff2565b611f4c565b611e93565b611dff565b611dd8565b611bbc565b611a3f565b6117a4565b61166b565b611553565b611334565b6111b5565b610fde565b610fa6565b610edd565b610d48565b610bd2565b6108e0565b6108c4565b610841565b61079f565b6105e8565b6105a0565b61047c565b6103b0565b61023e565b6001600160a01b0381160361022c57565b600080fd5b359061023c8261021b565b565b3461022c57606060031936011261022c5760206102756004356102608161021b565b602435604435916102708361021b565b61286d565b604051908152f35b6004359067ffffffffffffffff8216820361022c57565b6024359067ffffffffffffffff8216820361022c57565b359067ffffffffffffffff8216820361022c57565b9181601f8401121561022c5782359167ffffffffffffffff831161022c576020808501948460051b01011161022c57565b919082519283825260005b84811061031d575050601f19601f8460006020809697860101520116010190565b806020809284010151828286010152016102fc565b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061036557505050505090565b90919293946020806103a1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301875289516102f1565b97019301930191939290610356565b3461022c57606060031936011261022c576103c961027d565b60243567ffffffffffffffff811161022c576103e99036906004016102c0565b6044929192359167ffffffffffffffff831161022c573660238401121561022c5782600401359167ffffffffffffffff831161022c573660248460061b8601011161022c5761044b94602461043f950192612a7b565b60405191829182610332565b0390f35b35907fffffffff000000000000000000000000000000000000000000000000000000008216820361022c57565b3461022c57602060031936011261022c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361022c577fffffffff00000000000000000000000000000000000000000000000000000000602091167f805f2132000000000000000000000000000000000000000000000000000000008114908115610576575b811561054c575b8115610522575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438610517565b7f181f5a770000000000000000000000000000000000000000000000000000000081149150610510565b7fe364892e0000000000000000000000000000000000000000000000000000000081149150610509565b3461022c57602060031936011261022c576001600160a01b036004356105c58161021b565b166000526008602052602067ffffffffffffffff60406000205416604051908152f35b3461022c57600060031936011261022c57610601612ca5565b506060604051610610816106e8565b63ffffffff6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016918281526001600160a01b0360406020830192827f00000000000000000000000000000000000000000000000000000000000000001684520191837f00000000000000000000000000000000000000000000000000000000000000001683526040519485525116602084015251166040820152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761070457604052565b6106b9565b60a0810190811067ffffffffffffffff82111761070457604052565b6040810190811067ffffffffffffffff82111761070457604052565b60c0810190811067ffffffffffffffff82111761070457604052565b90601f601f19910116810190811067ffffffffffffffff82111761070457604052565b6040519061023c60408361075d565b6040519061023c6102608361075d565b3461022c57600060031936011261022c5761044b60408051906107c2818361075d565b601382527f46656551756f74657220312e362e302d646576000000000000000000000000006020830152519182916020835260208301906102f1565b602060408183019282815284518094520192019060005b8181106108225750505090565b82516001600160a01b0316845260209384019390920191600101610815565b3461022c57600060031936011261022c5760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b8181106108ae5761044b856108a28187038261075d565b604051918291826107fe565b825484526020909301926001928301920161088b565b3461022c57600060031936011261022c57602060405160248152f35b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c5780600401906040600319823603011261022c5761091e613e45565b6109288280612cc4565b4263ffffffff1692915060005b818110610a995750506024019061094c8284612cc4565b92905060005b83811061095b57005b8061097a61097560019361096f868a612cc4565b90612916565b612d63565b7fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e67ffffffffffffffff610a75610a676020850194610a596109c387516001600160e01b031690565b6109dd6109ce610780565b6001600160e01b039092168252565b63ffffffff8c166020820152610a186109fe845167ffffffffffffffff1690565b67ffffffffffffffff166000526005602052604060002090565b815160209092015160e01b7fffffffff00000000000000000000000000000000000000000000000000000000166001600160e01b0392909216919091179055565b5167ffffffffffffffff1690565b93516001600160e01b031690565b604080516001600160e01b039290921682524260208301529190931692a201610952565b80610ab2610aad60019361096f8980612cc4565b612d2c565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b03610b4b610a676020850194610b3e610afa87516001600160e01b031690565b610b056109ce610780565b63ffffffff8d166020820152610a18610b2584516001600160a01b031690565b6001600160a01b03166000526006602052604060002090565b516001600160a01b031690565b604080516001600160e01b039290921682524260208301529190931692a201610935565b9181601f8401121561022c5782359167ffffffffffffffff831161022c576020838186019501011161022c57565b92610bcf9492610bc1928552151560208501526080604085015260808401906102f1565b9160608184039101526102f1565b90565b3461022c5760a060031936011261022c57610beb61027d565b60243590610bf88261021b565b6044359160643567ffffffffffffffff811161022c57610c1c903690600401610b6f565b93909160843567ffffffffffffffff811161022c57610c3f903690600401610b6f565b9290917f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382166001600160a01b03821614600014610d0b575050935b6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016808611610cda575091610ccb939161044b9693613e89565b90939160405194859485610b9d565b857f6a92a4830000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b91610d159261286d565b93610c84565b67ffffffffffffffff81116107045760051b60200190565b8015150361022c57565b359061023c82610d33565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590610d8582610d1b565b90610d93604051928361075d565b828252602460a06020840194028201019036821161022c57602401925b818410610dc257610dc083612d88565b005b60a08436031261022c5760405190610dd982610709565b8435610de48161021b565b825260208501357fffffffffffffffffffff000000000000000000000000000000000000000000008116810361022c5760208301526040850135907fffff0000000000000000000000000000000000000000000000000000000000008216820361022c5782602092604060a0950152610e5f60608801610231565b6060820152610e7060808801610d3d565b6080820152815201930192610db0565b602060408183019282815284518094520192019060005b818110610ea45750505090565b9091926020604082610ed2600194885163ffffffff602080926001600160e01b038151168552015116910152565b019401929101610e97565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c57610f0e9036906004016102c0565b610f1781610d1b565b91610f25604051938461075d565b818352601f19610f3483610d1b565b0160005b818110610f8f57505060005b82811015610f8157600190610f65610f608260051b850161292b565b6138ce565b610f6f8287612a67565b52610f7a8186612a67565b5001610f44565b6040518061044b8682610e80565b602090610f9a612ee6565b82828801015201610f38565b3461022c57602060031936011261022c576020610fcd600435610fc88161021b565b613b92565b6001600160e01b0360405191168152f35b3461022c57602060031936011261022c5767ffffffffffffffff61100061027d565b611008612ee6565b5016600052600560205260406000206040519061102482610725565b546001600160e01b038116825260e01c6020820152604051809161044b82604081019263ffffffff602080926001600160e01b038151168552015116910152565b61023c909291926102408061026083019561108284825115159052565b60208181015161ffff169085015260408181015163ffffffff169085015260608181015163ffffffff169085015260808181015163ffffffff169085015260a08181015160ff169085015260c08181015160ff169085015260e08181015161ffff16908501526101008181015163ffffffff16908501526101208181015161ffff16908501526101408181015161ffff1690850152610160818101517fffffffff000000000000000000000000000000000000000000000000000000001690850152610180818101511515908501526101a08181015161ffff16908501526101c08181015163ffffffff16908501526101e08181015163ffffffff16908501526102008181015167ffffffffffffffff16908501526102208181015163ffffffff1690850152015163ffffffff16910152565b3461022c57602060031936011261022c5761044b6112786112736111d761027d565b60006102406111e461078f565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e08201528261020082015282610220820152015267ffffffffffffffff166000526009602052604060002090565b612f24565b60405191829182611065565b359063ffffffff8216820361022c57565b359061ffff8216820361022c57565b81601f8201121561022c578035906112bb82610d1b565b926112c9604051948561075d565b82845260208085019360061b8301019181831161022c57602001925b8284106112f3575050505090565b60408483031261022c576020604091825161130d81610725565b611316876102ab565b8152828701356113258161021b565b838201528152019301926112e5565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013561137081610d1b565b9161137e604051938461075d565b8183526024602084019260051b8201019036821161022c5760248101925b8284106113cd576024358567ffffffffffffffff821161022c576113c7610dc09236906004016112a4565b90613092565b833567ffffffffffffffff811161022c57820160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc823603011261022c576040519061141982610725565b611425602482016102ab565b8252604481013567ffffffffffffffff811161022c57602491010136601f8201121561022c57803561145681610d1b565b91611464604051938461075d565b818352602060e081850193028201019036821161022c57602001915b81831061149f575050509181602093848094015281520193019261139c565b82360360e0811261022c5760c0601f19604051926114bc84610725565b86356114c78161021b565b8452011261022c5760e0916020916040516114e181610741565b6114ec848801611284565b81526114fa60408801611284565b8482015261150a60608801611295565b604082015261151b60808801611284565b606082015261152c60a08801611284565b608082015260c087013561153f81610d33565b60a082015283820152815201920191611480565b3461022c57600060031936011261022c576000546001600160a01b03811633036115da577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b9080601f8301121561022c57813561161b81610d1b565b92611629604051948561075d565b81845260208085019260051b82010192831161022c57602001905b8282106116515750505090565b6020809183356116608161021b565b815201910190611644565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c5761169c903690600401611604565b60243567ffffffffffffffff811161022c576116bc903690600401611604565b906116c56140c6565b60005b815181101561173457806116e96116e4610b3e60019486612a67565b61593d565b6116f4575b016116c8565b6001600160a01b03611709610b3e8386612a67565b167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26116ee565b8260005b8151811015610dc05780611759611754610b3e60019486612a67565b615951565b611764575b01611738565b6001600160a01b03611779610b3e8386612a67565b167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a261175e565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c576117d5903690600401610b6f565b6024359167ffffffffffffffff831161022c5761182e61182661180c611802611836963690600401610b6f565b94909536916129c6565b90604082015190605e604a84015160601c93015191929190565b919033614258565b810190613341565b60005b8151811015610dc05761188161187c6118636118558486612a67565b51516001600160a01b031690565b6001600160a01b03166000526007602052604060002090565b613400565b6118956118916040830151151590565b1590565b6119f657906118e06118ad6020600194015160ff1690565b6118da6118ce60206118bf8689612a67565b5101516001600160e01b031690565b6001600160e01b031690565b90614326565b6118fb60406118ef8487612a67565b51015163ffffffff1690565b63ffffffff61192661191d611916610b25611855888b612a67565b5460e01c90565b63ffffffff1690565b9116106119f05761197461193f60406118ef8588612a67565b61196461194a610780565b6001600160e01b03851681529163ffffffff166020830152565b610a18610b256118558689612a67565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b036119aa6118558588612a67565b6119e66119bc60406118ef888b612a67565b60405193849316958390929163ffffffff6020916001600160e01b03604085019616845216910152565b0390a25b01611839565b506119ea565b611a3b611a066118558486612a67565b7f06439c6b000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b6000fd5b3461022c57604060031936011261022c5761044b611ac7611a5e61027d565b67ffffffffffffffff60243591611a748361021b565b600060a0604051611a8481610741565b828152826020820152826040820152826060820152826080820152015216600052600a6020526040600020906001600160a01b0316600052602052604060002090565b611b43611b3a60405192611ada84610741565b5463ffffffff8116845263ffffffff8160201c16602085015261ffff8160401c166040850152611b21611b148263ffffffff9060501c1690565b63ffffffff166060860152565b63ffffffff607082901c16608085015260901c60ff1690565b151560a0830152565b6040519182918291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b60ff81160361022c57565b359061023c82611ba6565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590611bf982610d1b565b90611c07604051928361075d565b82825260246102806020840194028201019036821161022c57602401925b818410611c3557610dc083613436565b833603610280811261022c57610260601f1960405192611c5484610725565b611c5d886102ab565b8452011261022c5761028091602091611c7461078f565b611c7f848901610d3d565b8152611c8d60408901611295565b84820152611c9d60608901611284565b6040820152611cae60808901611284565b6060820152611cbf60a08901611284565b6080820152611cd060c08901611bb1565b60a0820152611ce160e08901611bb1565b60c0820152611cf36101008901611295565b60e0820152611d056101208901611284565b610100820152611d186101408901611295565b610120820152611d2b6101608901611295565b610140820152611d3e610180890161044f565b610160820152611d516101a08901610d3d565b610180820152611d646101c08901611295565b6101a0820152611d776101e08901611284565b6101c0820152611d8a6102008901611284565b6101e0820152611d9d61022089016102ab565b610200820152611db06102408901611284565b610220820152611dc36102608901611284565b61024082015283820152815201930192611c25565b3461022c57600060031936011261022c5760206001600160a01b0360015416604051908152f35b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c576040600319823603011261022c57604051611e3c81610725565b816004013567ffffffffffffffff811161022c57611e609060043691850101611604565b8152602482013567ffffffffffffffff811161022c57610dc0926004611e899236920101611604565b60208201526136a0565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590611ed082610d1b565b90611ede604051928361075d565b8282526024602083019360061b8201019036821161022c57602401925b818410611f0b57610dc0836137f2565b60408436031261022c5760206040918251611f2581610725565b8635611f308161021b565b8152611f3d8388016102ab565b83820152815201930192611efb565b3461022c57602060031936011261022c576001600160a01b03600435611f718161021b565b611f79612ca5565b5016600052600760205261044b604060002060ff60405191611f9a836106e8565b546001600160a01b0381168352818160a01c16602084015260a81c16151560408201526040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b3461022c57600060031936011261022c57604051806020600b54918281520190600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99060005b8181106120535761044b856108a28187038261075d565b825484526020909301926001928301920161203c565b3461022c57602060031936011261022c57604061208b600435610f608161021b565b6120b08251809263ffffffff602080926001600160e01b038151168552015116910152565bf35b3461022c57600060031936011261022c57602060405160128152f35b3461022c57604060031936011261022c576120e761027d565b60243567ffffffffffffffff811161022c57806004019060a0600319823603011261022c5761212d6112738467ffffffffffffffff166000526009602052604060002090565b61213a6118918251151590565b6124fa57606482016121706118916121518361292b565b6001600160a01b03166000526001600b01602052604060002054151590565b6124b95790839160448401956121868785612cc4565b9590506121c760248201916121aa60846121a0858a612975565b9390500188612975565b90896121c06121b98b80612975565b36916129c6565b9389614c68565b92846121d5610fc88361292b565b9889946121f36121ed61022085015163ffffffff1690565b82614fa0565b9b6000808c1561247f57505061225961ffff8561227e996122659998966122999661228c966122506122406101c06122346101a061229f9f015161ffff1690565b97015163ffffffff1690565b9161224a8c61292b565b94612cc4565b96909516615091565b9891989790989461292b565b6001600160a01b03166000526008602052604060002090565b5467ffffffffffffffff1690565b67ffffffffffffffff1690565b90612821565b9560009761ffff6122b661014089015161ffff1690565b16612424575b509461229961228c61020061238a61044b9d6dffffffffffffffffffffffffffff6123826123a29f9e9b61237d6001600160e01b039f9b9c61239a9f61237d9e63ffffffff61231161237d9f61231b94612975565b92905016906139ea565b908b60a0810161233e612338612332835160ff1690565b60ff1690565b85612821565b9360e0830191612350835161ffff1690565b9061ffff821683116123b2575b505050506080015161237d9161191d9163ffffffff16613a28565b613a28565b6139ea565b911690612821565b93015167ffffffffffffffff1690565b911690612834565b6040519081529081906020820190565b61191d94965061237d959361ffff612413612402612378966123fc6123f56123ec60809960ff6123e661241a9b5160ff1690565b166139f7565b965161ffff1690565b61ffff1690565b906138c1565b61229961233260c08d015160ff1690565b91166139ea565b959383955061235d565b9095949897508261244a8b989495986dffffffffffffffffffffffffffff9060701c1690565b6dffffffffffffffffffffffffffff16916124658489612975565b905061247193886152b3565b9697939438969392966122bc565b969593509650505061229961228c61227e6122656124b36124ae61191d61024061229f99015163ffffffff1690565b6127da565b9461292b565b6124c5611a3b9161292b565b7f2502348c000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b7f99ac52f20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff841660045260246000fd5b3461022c57602060031936011261022c576001600160a01b036004356125578161021b565b61255f6140c6565b163381146125c457807fffffffffffffffffffffffff000000000000000000000000000000000000000060005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c5780600401359061262b82610d1b565b90612639604051928361075d565b8282526024602083019360071b8201019036821161022c57602401925b81841061266657610dc083613a42565b8336036080811261022c576060601f196040519261268384610725565b873561268e8161021b565b8452011261022c576080916020916040516126a8816106e8565b838801356126b58161021b565b815260408801356126c581611ba6565b8482015260608801356126d781610d33565b604082015283820152815201930192612656565b3461022c57604060031936011261022c576004356127088161021b565b612710610294565b9067ffffffffffffffff82169182600052600960205260ff604060002054161561277d5761274061276192613b92565b92600052600960205263ffffffff60016040600020015460901c1690614fa0565b604080516001600160e01b039384168152919092166020820152f35b827f99ac52f20000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90662386f26fc10000820291808304662386f26fc1000014901517156127fc57565b6127ab565b90655af3107a4000820291808304655af3107a400014901517156127fc57565b818102929181159184041417156127fc57565b811561283e570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b612897612891610bcf94936001600160e01b0361288a8195613b92565b1690612821565b92613b92565b1690612834565b906128a882610d1b565b6128b5604051918261075d565b828152601f196128c58294610d1b565b019060005b8281106128d657505050565b8060606020809385010152016128ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156129265760061b0190565b6128e7565b35610bcf8161021b565b91908110156129265760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618136030182121561022c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561022c570180359067ffffffffffffffff821161022c5760200191813603831361022c57565b92919267ffffffffffffffff821161070457604051916129f0601f8201601f19166020018461075d565b82948184528183011161022c578281602093846000960137010152565b9061023c604051612a1d81610741565b925463ffffffff8082168552602082811c821690860152604082811c61ffff1690860152605082901c81166060860152607082901c16608085015260901c60ff16151560a0840152565b80518210156129265760209160051b010190565b909291612ac8612a9f8367ffffffffffffffff166000526009602052604060002090565b5460081b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90612ad28161289e565b9560005b828110612ae7575050505050505090565b612afa612af5828489612916565b61292b565b8388612b14612b0a858484612935565b6040810190612975565b905060208111612c2a575b508392612b4e612b486121b9612b3e600198612b8997612b8497612935565b6020810190612975565b89613c0a565b612b6c8967ffffffffffffffff16600052600a602052604060002090565b906001600160a01b0316600052602052604060002090565b612a0d565b60a081015115612bee57612bd2612baa6060612bc493015163ffffffff1690565b6040805163ffffffff909216602083015290928391820190565b03601f19810183528261075d565b612bdc828b612a67565b52612be7818a612a67565b5001612ad6565b50612bc4612bd2612c2584612c178a67ffffffffffffffff166000526009602052604060002090565b015460101c63ffffffff1690565b612baa565b915050612c6261191d612c5584612b6c8b67ffffffffffffffff16600052600a602052604060002090565b5460701c63ffffffff1690565b10612c6f57838838612b1f565b7f36f536ca000000000000000000000000000000000000000000000000000000006000526001600160a01b031660045260246000fd5b60405190612cb2826106e8565b60006040838281528260208201520152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561022c570180359067ffffffffffffffff821161022c57602001918160061b3603831361022c57565b35906001600160e01b038216820361022c57565b60408136031261022c57612d5b602060405192612d4884610725565b8035612d538161021b565b845201612d18565b602082015290565b60408136031261022c57612d5b602060405192612d7f84610725565b612d53816102ab565b90612d916140c6565b60005b8251811015612ee15780612daa60019285612a67565b517f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a360a06001600160a01b038351169260608101936001600160a01b0380865116957fffff000000000000000000000000000000000000000000000000000000000000612e4860208601947fffffffffffffffffffff00000000000000000000000000000000000000000000865116604088019a848c5116926158b9565b977fffffffffffffffffffff000000000000000000000000000000000000000000006080870195612eb4875115158c600052600460205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b8560405198511688525116602087015251166040850152511660608301525115156080820152a201612d94565b509050565b60405190612ef382610725565b60006020838281520152565b90604051612f0c81610725565b91546001600160e01b038116835260e01c6020830152565b9061023c6130846001612f3561078f565b946130236130198254612f51612f4b8260ff1690565b15158a52565b61ffff600882901c1660208a015263ffffffff601882901c1660408a015263ffffffff603882901c1660608a015263ffffffff605882901c1660808a015260ff607882901c1660a08a015260ff608082901c1660c08a015261ffff608882901c1660e08a015263ffffffff609882901c166101008a015261ffff60b882901c166101208a015261ffff60c882901c166101408a01527fffffffff00000000000000000000000000000000000000000000000000000000600882901b166101608a015260f81c90565b1515610180880152565b015461ffff81166101a086015263ffffffff601082901c166101c086015263ffffffff603082901c166101e086015267ffffffffffffffff605082901c1661020086015263ffffffff609082901c1661022086015260b01c63ffffffff1690565b63ffffffff16610240840152565b9061309b6140c6565b6000915b805183101561328d576130b28382612a67565b51906130c6825167ffffffffffffffff1690565b946020600093019367ffffffffffffffff8716935b85518051821015613278576130f282602092612a67565b510151613103611855838951612a67565b8151602083015163ffffffff90811691168181101561323f575050608082015163ffffffff16602081106131fe575090867f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b56001600160a01b038461318d858f60019998612b6c6131889267ffffffffffffffff16600052600a602052604060002090565b614104565b6131f560405192839216958291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b0390a3016130db565b7f24ecdc02000000000000000000000000000000000000000000000000000000006000526001600160a01b0390911660045263ffffffff1660245260446000fd5b7f0b4f67a20000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b5050955092509260019150019192909261309f565b50905060005b815181101561333d57806132bb6132ac60019385612a67565b515167ffffffffffffffff1690565b67ffffffffffffffff6001600160a01b036132ea60206132db8689612a67565b5101516001600160a01b031690565b600061330e82612b6c8767ffffffffffffffff16600052600a602052604060002090565b551691167f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b600080a301613293565b5050565b60208183031261022c5780359067ffffffffffffffff821161022c570181601f8201121561022c5780359061337582610d1b565b92613383604051948561075d565b8284526020606081860194028301019181831161022c57602001925b8284106133ad575050505090565b60608483031261022c5760206060916040516133c8816106e8565b86356133d38161021b565b81526133e0838801612d18565b838201526133f060408801611284565b604082015281520193019261339f565b9060405161340d816106e8565b604060ff8294546001600160a01b0381168452818160a01c16602085015260a81c161515910152565b9061343f6140c6565b60005b8251811015612ee1576134558184612a67565b5160206134656132ac8487612a67565b9101519067ffffffffffffffff811680158015613681575b8015613653575b80156135a6575b61356e579161353482600195946134e46134bf612a9f6135399767ffffffffffffffff166000526009602052604060002090565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61353f577f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806135178782611065565b0390a267ffffffffffffffff166000526009602052604060002090565b614433565b01613442565b7f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e3604051806135178782611065565b7fc35aa79d0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff821660045260246000fd5b507fffffffff000000000000000000000000000000000000000000000000000000006135f66101608501517fffffffff000000000000000000000000000000000000000000000000000000001690565b167f2812d52c000000000000000000000000000000000000000000000000000000008114159081613628575b5061348b565b7f1e10bdc4000000000000000000000000000000000000000000000000000000009150141538613622565b506101e083015163ffffffff1663ffffffff61367961191d606087015163ffffffff1690565b911611613484565b5063ffffffff6136996101e085015163ffffffff1690565b161561347d565b6136a86140c6565b60208101519160005b835181101561373557806136ca610b3e60019387612a67565b6136ec6136e76001600160a01b0383165b6001600160a01b031690565b615bec565b6136f8575b50016136b1565b6040516001600160a01b039190911681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758090602090a1386136f1565b5091505160005b815181101561333d57613752610b3e8284612a67565b906001600160a01b038216156137c8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6137bf836137a461379f6136db6001976001600160a01b031690565b615b73565b506040516001600160a01b0390911681529081906020820190565b0390a10161373c565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b6137fa6140c6565b60005b815181101561333d57806001600160a01b0361381b60019385612a67565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d6138b867ffffffffffffffff60206138578689612a67565b51015116836000526008602052604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790556040519182918291909167ffffffffffffffff6020820193169052565b0390a2016137fd565b919082039182116127fc57565b6138d6612ee6565b506138fc6138f7826001600160a01b03166000526006602052604060002090565b612eff565b602081019161391b61391561191d855163ffffffff1690565b426138c1565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016116139c35761187c613967916001600160a01b03166000526007602052604060002090565b6139776118916040830151151590565b80156139c9575b6139c35761398b90614b01565b9163ffffffff6139b361191d6139a8602087015163ffffffff1690565b935163ffffffff1690565b9116106139be575090565b905090565b50905090565b506001600160a01b036139e382516001600160a01b031690565b161561397e565b919082018092116127fc57565b9061ffff8091169116029061ffff82169182036127fc57565b63ffffffff60209116019063ffffffff82116127fc57565b9063ffffffff8091169116019063ffffffff82116127fc57565b90613a4b6140c6565b60005b8251811015612ee15780613a6460019285612a67565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf613b8960206001600160a01b038451169301518360005260076020526040600020613ae96001600160a01b0383511682906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b602082015181547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000075ff0000000000000000000000000000000000000000006040870151151560a81b169360a01b169116171790556040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b0390a201613a4e565b613b9b816138ce565b9063ffffffff602083015116158015613bf8575b613bc15750516001600160e01b031690565b6001600160a01b03907f06439c6b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506001600160e01b0382511615613baf565b907fffffffff0000000000000000000000000000000000000000000000000000000082167f2812d52c000000000000000000000000000000000000000000000000000000008114613cd8577f1e10bdc40000000000000000000000000000000000000000000000000000000014613ccb577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000821660045260246000fd5b61023c9150600190615378565b5090506020815103613d1157613cf76020825183010160208301615369565b6001600160a01b038111908115613d4b575b50613d115750565b613d47906040519182917f8d666f6000000000000000000000000000000000000000000000000000000000835260048301615358565b0390fd5b61040091501038613d09565b917fffffffff0000000000000000000000000000000000000000000000000000000083167f2812d52c000000000000000000000000000000000000000000000000000000008114613e25577f1e10bdc40000000000000000000000000000000000000000000000000000000014613e18577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b61023c9250151590615378565b505090506020815103613d1157613cf76020825183010160208301615369565b33600052600360205260406000205415613e5b57565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b611273613eb09196949395929667ffffffffffffffff166000526009602052604060002090565b946101608601947f2812d52c000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613f2388517fffffffff000000000000000000000000000000000000000000000000000000001690565b16146140815750507f1e10bdc4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613f9786517fffffffff000000000000000000000000000000000000000000000000000000001690565b161461401857611a3b613fca85517fffffffff000000000000000000000000000000000000000000000000000000001690565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff0000000000000000000000000000000000000000000000000000000016600452602490565b61406c93506121b960606140568763ffffffff61404d6101806140458661407a9b9d015163ffffffff1690565b930151151590565b91168587615754565b0151604051958691602083019190602083019252565b03601f19810186528561075d565b9160019190565b945094916140a7916140a161191d6101e0610bcf96015163ffffffff1690565b916154d5565b936140be60206140b6876155f6565b960151151590565b9336916129c6565b6001600160a01b036001541633036140da57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b815181546020808501516040808701517fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090941663ffffffff958616179190921b67ffffffff00000000161791901b69ffff000000000000000016178255606083015161023c936142149260a0926141b6911685547fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff1660509190911b6dffffffff0000000000000000000016178555565b61420d6141ca608083015163ffffffff1690565b85547fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff1660709190911b71ffffffff000000000000000000000000000016178555565b0151151590565b81547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1690151560901b72ff00000000000000000000000000000000000016179055565b91929092614268828286866158b9565b600052600460205260ff60406000205416156142845750505050565b6040517f097e17ff0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529390921660248401527fffffffffffffffffffff0000000000000000000000000000000000000000000090911660448301527fffff000000000000000000000000000000000000000000000000000000000000166064820152608490fd5b604d81116127fc57600a0a90565b60ff1660120160ff81116127fc5760ff169060248211156143c1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116127fc5761437761437d92614318565b90612834565b6001600160e01b038111614397576001600160e01b031690565b7f10cb51d10000000000000000000000000000000000000000000000000000000060005260046000fd5b9060240390602482116127fc576122996143da92614318565b61437d565b9060ff80911691160160ff81116127fc5760ff169060248211156143c1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116127fc5761437761437d92614318565b90614a4d610240600161023c9461447e61444d8651151590565b829060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6144c4614490602087015161ffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff1660089190911b62ffff0016178255565b6145106144d8604087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff1660189190911b66ffffffff00000016178255565b614560614524606087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff1660389190911b6affffffff0000000000000016178255565b6145b4614574608087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff1660589190911b6effffffff000000000000000000000016178255565b6146066145c560a087015160ff1690565b82547fffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff1660789190911b6fff00000000000000000000000000000016178255565b61465961461760c087015160ff1690565b82547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff1660809190911b70ff0000000000000000000000000000000016178255565b6146af61466b60e087015161ffff1690565b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff1660889190911b72ffff000000000000000000000000000000000016178255565b61470c6146c461010087015163ffffffff1690565b82547fffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff1660989190911b76ffffffff0000000000000000000000000000000000000016178255565b61476961471f61012087015161ffff1690565b82547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff1660b89190911b78ffff000000000000000000000000000000000000000000000016178255565b6147c861477c61014087015161ffff1690565b82547fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff1660c89190911b7affff0000000000000000000000000000000000000000000000000016178255565b6148496147f96101608701517fffffffff000000000000000000000000000000000000000000000000000000001690565b82547fff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff1660089190911c7effffffff00000000000000000000000000000000000000000000000000000016178255565b6148aa61485a610180870151151590565b82547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016178255565b01926148ee6148bf6101a083015161ffff1690565b859061ffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000825416179055565b61493a6149036101c083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff1660109190911b65ffffffff000016178555565b61498a61494f6101e083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1660309190911b69ffffffff00000000000016178555565b6149e66149a361020083015167ffffffffffffffff1690565b85547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178555565b614a426149fb61022083015163ffffffff1690565b85547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff1660909190911b75ffffffff00000000000000000000000000000000000016178555565b015163ffffffff1690565b7fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff79ffffffff0000000000000000000000000000000000000000000083549260b01b169116179055565b519069ffffffffffffffffffff8216820361022c57565b908160a091031261022c57614ac281614a97565b91602082015191604081015191610bcf608060608401519301614a97565b6040513d6000823e3d90fd5b9081602091031261022c5751610bcf81611ba6565b614b09612ee6565b50614b216136db6136db83516001600160a01b031690565b90604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a082600481865afa928315614c2957600092600094614c2e575b5060008312614397576020600491604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa928315614c2957610bcf9363ffffffff93614bca93600092614bf3575b506020015160ff165b906143df565b92614be5614bd6610780565b6001600160e01b039095168552565b1663ffffffff166020830152565b614bc4919250614c1a602091823d8411614c22575b614c12818361075d565b810190614aec565b929150614bbb565b503d614c08565b614ae0565b909350614c5491925060a03d60a011614c61575b614c4c818361075d565b810190614aae565b5093925050919238614b64565b503d614c42565b9291949390614c8161191d604086015163ffffffff1690565b808211614f70575050602083015161ffff16808611614f3a5750610160830194614ccb86517fffffffff000000000000000000000000000000000000000000000000000000001690565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f2812d52c000000000000000000000000000000000000000000000000000000008103614d8d5750505082610bcf9492614d5d92614d386101e0614d889997015163ffffffff1690565b9063ffffffff614d556101806140b6606088015163ffffffff1690565b941692615965565b519384925b517fffffffff000000000000000000000000000000000000000000000000000000001690565b613d57565b91949392917f1e10bdc40000000000000000000000000000000000000000000000000000000003614eeb575090829163ffffffff614de3610180614ddb6060614deb98015163ffffffff1690565b950151151590565b931691615754565b90151580614edf575b614eb5576080810180515160408111614e83575060208201519051519067ffffffffffffffff9081169081831c16614e4957505091610bcf91614e4161191d614d88955163ffffffff1690565b938492614d62565b7fafa933080000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260245260446000fd5b7f8a0d71f700000000000000000000000000000000000000000000000000000000600052600452604060245260446000fd5b7f5bed51920000000000000000000000000000000000000000000000000000000060005260046000fd5b50606081015115614df4565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7fd88dddd600000000000000000000000000000000000000000000000000000000600052600486905261ffff1660245260446000fd5b7f869337890000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b67ffffffffffffffff8116600052600560205260406000209160405192614fc684610725565b546001600160e01b038116845260e01c9182602085015263ffffffff82169283615000575b50505050610bcf90516001600160e01b031690565b63ffffffff1642908103939084116127fc57831161501e5780614feb565b7ff08bcb3e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045263ffffffff1660245260445260646000fd5b60408136031261022c5760206040519161507a83610725565b80356150858161021b565b83520135602082015290565b9694919695929390956000946000986000986000965b8088106150bb575050505050505050929190565b9091929394959697999a6150d86150d38a848b612916565b615061565b9a615126612b848d61510f6151018967ffffffffffffffff16600052600a602052604060002090565b91516001600160a01b031690565b6001600160a01b0316600052602052604060002090565b9161513761189160a0850151151590565b6152805760009c60408401906151526123f5835161ffff1690565b615208575b5050606083015163ffffffff1661516d91613a28565b9c60808301516151809063ffffffff1690565b61518991613a28565b9b82516151999063ffffffff1690565b63ffffffff166151a8906127da565b600193908083106151fc57506124ae61191d60206151cb93015163ffffffff1690565b8082116151eb57506151dc916139ea565b985b01969594939291906150a7565b90506151f6916139ea565b986151de565b9150506151f6916139ea565b90612299615271939f61525f6152689460208f8e6123f595506001600160a01b0361523a85516001600160a01b031690565b91166001600160a01b03821614615279576152559150613b92565b915b0151906159cd565b925161ffff1690565b620186a0900490565b9b3880615157565b5091615257565b999b50600191506152a7846152a16152ad9361529b8b6127da565b906139ea565b9b613a28565b9c613a10565b9a6151de565b91939093806101e00193846101e0116127fc5761012081029080820461012014901517156127fc576101e09101018093116127fc576123f5610140615349610bcf966dffffffffffffffffffffffffffff6123826153346153216153539a63ffffffff6122999a16906139ea565b6122996123f56101208c015161ffff1690565b61529b61191d6101008b015163ffffffff1690565b93015161ffff1690565b612801565b906020610bcf9281815201906102f1565b9081602091031261022c575190565b9060208251036153e0576153895750565b60208180518101031261022c576020810151156153a35750565b613d47906040519182917fff828faa00000000000000000000000000000000000000000000000000000000835260206004840181815201906102f1565b6040517fff828faa0000000000000000000000000000000000000000000000000000000081526020600482015280613d4760248201856102f1565b919091357fffffffff000000000000000000000000000000000000000000000000000000008116926004811061544f575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b909291928360041161022c57831161022c57600401916003190190565b9060041161022c5790600490565b9081604091031261022c576020604051916154c683610725565b805183520151612d5b81610d33565b916154de612ee6565b5081156155d4575061551f6121b982806155197fffffffff00000000000000000000000000000000000000000000000000000000958761541b565b95615481565b91167f181dcf1000000000000000000000000000000000000000000000000000000000810361555c575080602080610bcf935183010191016154ac565b7f97a657c900000000000000000000000000000000000000000000000000000000146155ac577f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b806020806155bf93518301019101615369565b6155c7610780565b9081526000602082015290565b91505067ffffffffffffffff6155e8610780565b911681526000602082015290565b6020604051917f181dcf1000000000000000000000000000000000000000000000000000000000828401528051602484015201511515604482015260448152610bcf60648261075d565b6040519061564d82610709565b60606080836000815260006020820152600060408201526000838201520152565b60208183031261022c5780359067ffffffffffffffff821161022c57019060a08282031261022c57604051916156a383610709565b6156ac81611284565b83526156ba602082016102ab565b602084015260408101356156cd81610d33565b60408401526060810135606084015260808101359067ffffffffffffffff821161022c57019080601f8301121561022c57813561570981610d1b565b92615717604051948561075d565b81845260208085019260051b82010192831161022c57602001905b82821061574457505050608082015290565b8135815260209182019101615732565b61575c615640565b50811561588f577f1f3b3aba000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000006157b86157b2858561549e565b9061541b565b160361586557816157d4926157cc92615481565b81019061566e565b918061584f575b6158255763ffffffff6157f2835163ffffffff1690565b16116157fb5790565b7f2e2b0c290000000000000000000000000000000000000000000000000000000060005260046000fd5b7fee433e990000000000000000000000000000000000000000000000000000000060005260046000fd5b506158606118916040840151151590565b6157db565b7f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fb00b53dc0000000000000000000000000000000000000000000000000000000060005260046000fd5b604080516001600160a01b039283166020820190815292909316908301527fffffffffffffffffffff0000000000000000000000000000000000000000000090921660608201527fffff0000000000000000000000000000000000000000000000000000000000009092166080830152906159378160a08101612bc4565b51902090565b6001600160a01b03610bcf9116600b615a7a565b6001600160a01b03610bcf9116600b615bae565b9063ffffffff6159829395949561597a612ee6565b5016916154d5565b918251116159a35780615997575b6158255790565b50602081015115615990565b7f4c4fc93a0000000000000000000000000000000000000000000000000000000060005260046000fd5b670de0b6b3a7640000916001600160e01b036159e99216612821565b0490565b80548210156129265760005260206000200190600090565b91615a1f918354906000199060031b92831b921b19161790565b9055565b80548015615a4b576000190190615a3a82826159ed565b60001982549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001810191806000528260205260406000205492831515600014615b2c5760001984018481116127fc5783549360001985019485116127fc576000958583615add97615ace9503615ae3575b505050615a23565b90600052602052604060002090565b55600190565b615b13615b0d91615b04615afa615b2395886159ed565b90549060031b1c90565b928391876159ed565b90615a05565b8590600052602052604060002090565b55388080615ac6565b50505050600090565b805490680100000000000000008210156107045781615b5c916001615a1f940181556159ed565b81939154906000199060031b92831b921b19161790565b600081815260036020526040902054615ba857615b91816002615b35565b600254906000526003602052604060002055600190565b50600090565b6000828152600182016020526040902054615be55780615bd083600193615b35565b80549260005201602052604060002055600190565b5050600090565b600081815260036020526040902054908115615be5576000198201908282116127fc576002549260001984019384116127fc578383615add9460009603615c4c575b505050615c3b6002615a23565b600390600052602052604060002090565b615c3b615b0d91615c64615afa615c6e9560026159ed565b92839160026159ed565b55388080615c2e56fea164736f6c634300081a000a", + Bin: "0x60e06040523461106a576172d580380380610019816112d6565b928339810190808203610120811261106a5760601361106a5761003a611298565b81516001600160601b038116810361106a57815261005a602083016112fb565b906020810191825261006e6040840161130f565b6040820190815260608401516001600160401b03811161106a5785610094918601611337565b60808501519094906001600160401b03811161106a57866100b6918301611337565b60a08201519096906001600160401b03811161106a5782019080601f8301121561106a5781516100ed6100e882611320565b6112d6565b9260208085848152019260071b8201019083821161106a57602001915b8183106112235750505060c08301516001600160401b03811161106a5783019781601f8a01121561106a578851986101446100e88b611320565b996020808c838152019160051b8301019184831161106a5760208101915b8383106110c1575050505060e08401516001600160401b03811161106a5784019382601f8601121561106a57845161019c6100e882611320565b9560208088848152019260061b8201019085821161106a57602001915b81831061108557505050610100810151906001600160401b03821161106a570182601f8201121561106a578051906101f36100e883611320565b93602061028081878681520194028301019181831161106a57602001925b828410610ea857505050503315610e9757600180546001600160a01b031916331790556020986102408a6112d6565b976000895260003681376102526112b7565b998a52888b8b015260005b89518110156102c4576001906001600160a01b0361027b828d6113d0565b51168d610287826115bc565b610294575b50500161025d565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1388d61028c565b508a985089519660005b885181101561033f576001600160a01b036102e9828b6113d0565b511690811561032e577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef8c83610320600195611544565b50604051908152a1016102ce565b6342bcdf7f60e11b60005260046000fd5b5081518a985089906001600160a01b0316158015610e85575b8015610e76575b610e655791516001600160a01b031660a05290516001600160601b03166080525163ffffffff1660c052610392866112d6565b9360008552600036813760005b855181101561040e576001906103c76001600160a01b036103c0838a6113d0565b5116611451565b6103d2575b0161039f565b818060a01b036103e282896113d0565b51167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26103cc565b508694508560005b84518110156104855760019061043e6001600160a01b0361043783896113d0565b5116611583565b610449575b01610416565b818060a01b0361045982886113d0565b51167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2610443565b508593508460005b835181101561054757806104a3600192866113d0565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf606089858060a01b038451169301518360005260078b5260406000209060ff878060a01b038251169283898060a01b03198254161781558d8301908151604082549501948460a81b8651151560a81b16918560a01b9060a01b169061ffff60a01b19161717905560405193845251168c8301525115156040820152a20161048d565b5091509160005b8251811015610afd5761056181846113d0565b51856001600160401b0361057584876113d0565b5151169101519080158015610aea575b8015610acc575b8015610a92575b610a7e57600081815260098852604090205460019392919060081b6001600160e01b03191661093657807f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806106fc868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a25b60005260098752826040600020825115158382549162ffff008c83015160081b169066ffffffff000000604084015160181b166affffffff00000000000000606085015160381b16926effffffff0000000000000000000000608086015160581b169260ff60781b60a087015160781b169460ff60801b60c088015160801b169161ffff60881b60e089015160881b169063ffffffff60981b6101008a015160981b169361ffff60b81b6101208b015160b81b169661ffff60c81b6101408c015160c81b169963ffffffff60d81b6101608d015160081c169b61018060ff60f81b910151151560f81b169c8f8060f81b039a63ffffffff60d81b199961ffff60c81b199861ffff60b81b199763ffffffff60981b199661ffff60881b199560ff60801b199460ff60781b19936effffffff0000000000000000000000199260ff6affffffff000000000000001992169066ffffffffffffff19161716171617161716171617161716171617161716179063ffffffff60d81b1617178155019061ffff6101a0820151169082549165ffffffff00006101c083015160101b169269ffffffff0000000000006101e084015160301b166a01000000000000000000008860901b0361020085015160501b169263ffffffff60901b61022086015160901b169461024063ffffffff60b01b91015160b01b169563ffffffff60b01b199363ffffffff60901b19926a01000000000000000000008c60901b0319918c8060501b03191617161716171617171790550161054e565b807f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e360405180610a76868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a2610700565b63c35aa79d60e01b60005260045260246000fd5b5063ffffffff60e01b61016083015116630a04b54b60e21b8114159081610aba575b50610593565b6307842f7160e21b1415905088610ab4565b5063ffffffff6101e08301511663ffffffff6060840151161061058c565b5063ffffffff6101e08301511615610585565b84828560005b8151811015610b83576001906001600160a01b03610b2182856113d0565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d86848060401b0381610b5786896113d0565b510151168360005260088252604060002081878060401b0319825416179055604051908152a201610b03565b83600184610b90836112d6565b9060008252600092610e60575b909282935b8251851015610d9f57610bb585846113d0565b5180516001600160401b0316939083019190855b83518051821015610d8e57610bdf8287926113d0565b51015184516001600160a01b0390610bf89084906113d0565b5151169063ffffffff815116908781019163ffffffff8351169081811015610d795750506080810163ffffffff815116898110610d62575090899291838c52600a8a5260408c20600160a01b6001900386168d528a5260408c2092825163ffffffff169380549180518d1b67ffffffff0000000016916040860192835160401b69ffff000000000000000016966060810195865160501b6dffffffff00000000000000000000169063ffffffff60701b895160701b169260a001998b60ff60901b8c51151560901b169560ff60901b199363ffffffff60701b19926dffffffff000000000000000000001991600160501b60019003191617161716171617171790556040519586525163ffffffff168c8601525161ffff1660408501525163ffffffff1660608401525163ffffffff16608083015251151560a082015260c07f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b591a3600101610bc9565b6312766e0160e11b8c52600485905260245260448bfd5b6305a7b3d160e11b8c5260045260245260448afd5b505060019096019593509050610ba2565b9150825b8251811015610e21576001906001600160401b03610dc182866113d0565b515116828060a01b0384610dd584886113d0565b5101511690808752600a855260408720848060a01b038316885285528660408120557f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b8780a301610da3565b604051615c84908161165182396080518181816106240152610c93015260a05181818161065a0152610c44015260c05181818161068101526139220152f35b610b9d565b63d794ef9560e01b60005260046000fd5b5063ffffffff8251161561035f565b5080516001600160601b031615610358565b639b15e16f60e01b60005260046000fd5b838203610280811261106a57610260610ebf6112b7565b91610ec9876113ad565b8352601f19011261106a576040519161026083016001600160401b0381118482101761106f57604052610efe602087016113a0565b8352610f0c604087016113c1565b6020840152610f1d6060870161130f565b6040840152610f2e6080870161130f565b6060840152610f3f60a0870161130f565b6080840152610f5060c08701611392565b60a0840152610f6160e08701611392565b60c0840152610f7361010087016113c1565b60e0840152610f85610120870161130f565b610100840152610f9861014087016113c1565b610120840152610fab61016087016113c1565b610140840152610180860151916001600160e01b03198316830361106a5783602093610160610280960152610fe36101a089016113a0565b610180820152610ff66101c089016113c1565b6101a08201526110096101e0890161130f565b6101c082015261101c610200890161130f565b6101e082015261102f61022089016113ad565b610200820152611042610240890161130f565b610220820152611055610260890161130f565b61024082015283820152815201930192610211565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408387031261106a57602060409161109c6112b7565b6110a5866112fb565b81526110b28387016113ad565b838201528152019201916101b9565b82516001600160401b03811161106a5782016040818803601f19011261106a576110e96112b7565b906110f6602082016113ad565b825260408101516001600160401b03811161106a57602091010187601f8201121561106a5780516111296100e882611320565b91602060e08185858152019302820101908a821161106a57602001915b8183106111655750505091816020938480940152815201920191610162565b828b0360e0811261106a5760c061117a6112b7565b91611184866112fb565b8352601f19011261106a576040519160c08301916001600160401b0383118484101761106f5760e0936020936040526111be84880161130f565b81526111cc6040880161130f565b848201526111dc606088016113c1565b60408201526111ed6080880161130f565b60608201526111fe60a0880161130f565b608082015261120f60c088016113a0565b60a082015283820152815201920191611146565b8284036080811261106a5760606112386112b7565b91611242866112fb565b8352601f19011261106a5760809160209161125b611298565b6112668488016112fb565b815261127460408801611392565b84820152611284606088016113a0565b60408201528382015281520192019161010a565b60405190606082016001600160401b0381118382101761106f57604052565b60408051919082016001600160401b0381118382101761106f57604052565b6040519190601f01601f191682016001600160401b0381118382101761106f57604052565b51906001600160a01b038216820361106a57565b519063ffffffff8216820361106a57565b6001600160401b03811161106f5760051b60200190565b9080601f8301121561106a5781516113516100e882611320565b9260208085848152019260051b82010192831161106a57602001905b82821061137a5750505090565b60208091611387846112fb565b81520191019061136d565b519060ff8216820361106a57565b5190811515820361106a57565b51906001600160401b038216820361106a57565b519061ffff8216820361106a57565b80518210156113e45760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156113e45760005260206000200190600090565b8054801561143b57600019019061142982826113fa565b8154906000199060031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b6000818152600c602052604090205480156115125760001981018181116114fc57600b546000198101919082116114fc578181036114ab575b505050611497600b611412565b600052600c60205260006040812055600190565b6114e46114bc6114cd93600b6113fa565b90549060031b1c928392600b6113fa565b819391549060031b91821b91600019901b19161790565b9055600052600c60205260406000205538808061148a565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8054906801000000000000000082101561106f57816114cd916001611540940181556113fa565b9055565b8060005260036020526040600020541560001461157d57611566816002611519565b600254906000526003602052604060002055600190565b50600090565b80600052600c6020526040600020541560001461157d576115a581600b611519565b600b5490600052600c602052604060002055600190565b60008181526003602052604090205480156115125760001981018181116114fc576002546000198101919082116114fc57808203611616575b5050506116026002611412565b600052600360205260006040812055600190565b6116386116276114cd9360026113fa565b90549060031b1c92839260026113fa565b905560005260036020526040600020553880806115f556fe6080604052600436101561001257600080fd5b60003560e01c806241e5be1461021657806301447eaa1461021157806301ffc9a71461020c578063061877e31461020757806306285c6914610202578063181f5a77146101fd5780632451a627146101f8578063325c868e146101f35780633937306f146101ee5780633a49bb49146101e957806341ed29e7146101e457806345ac924d146101df5780634ab35b0b146101da578063514e8cff146101d55780636def4ce7146101d0578063770e2dc4146101cb57806379ba5097146101c65780637afac322146101c1578063805f2132146101bc57806382b49eb0146101b757806387b8d879146101b25780638da5cb5b146101ad57806391a2749a146101a8578063a69c64c0146101a3578063bf78e03f1461019e578063cdc73d5114610199578063d02641a014610194578063d63d3af21461018f578063d8694ccd1461018a578063f2fde38b14610185578063fbe3f778146101805763ffdb4b371461017b57600080fd5b6126eb565b6125ee565b612532565b6120ce565b6120b2565b612069565b611ff2565b611f4c565b611e93565b611dff565b611dd8565b611bbc565b611a3f565b6117a4565b61166b565b611553565b611334565b6111b5565b610fde565b610fa6565b610edd565b610d48565b610bd2565b6108e0565b6108c4565b610841565b61079f565b6105e8565b6105a0565b61047c565b6103b0565b61023e565b6001600160a01b0381160361022c57565b600080fd5b359061023c8261021b565b565b3461022c57606060031936011261022c5760206102756004356102608161021b565b602435604435916102708361021b565b61286d565b604051908152f35b6004359067ffffffffffffffff8216820361022c57565b6024359067ffffffffffffffff8216820361022c57565b359067ffffffffffffffff8216820361022c57565b9181601f8401121561022c5782359167ffffffffffffffff831161022c576020808501948460051b01011161022c57565b919082519283825260005b84811061031d575050601f19601f8460006020809697860101520116010190565b806020809284010151828286010152016102fc565b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061036557505050505090565b90919293946020806103a1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301875289516102f1565b97019301930191939290610356565b3461022c57606060031936011261022c576103c961027d565b60243567ffffffffffffffff811161022c576103e99036906004016102c0565b6044929192359167ffffffffffffffff831161022c573660238401121561022c5782600401359167ffffffffffffffff831161022c573660248460061b8601011161022c5761044b94602461043f950192612a7b565b60405191829182610332565b0390f35b35907fffffffff000000000000000000000000000000000000000000000000000000008216820361022c57565b3461022c57602060031936011261022c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361022c577fffffffff00000000000000000000000000000000000000000000000000000000602091167f805f2132000000000000000000000000000000000000000000000000000000008114908115610576575b811561054c575b8115610522575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438610517565b7f181f5a770000000000000000000000000000000000000000000000000000000081149150610510565b7fe364892e0000000000000000000000000000000000000000000000000000000081149150610509565b3461022c57602060031936011261022c576001600160a01b036004356105c58161021b565b166000526008602052602067ffffffffffffffff60406000205416604051908152f35b3461022c57600060031936011261022c57610601612ca5565b506060604051610610816106e8565b63ffffffff6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016918281526001600160a01b0360406020830192827f00000000000000000000000000000000000000000000000000000000000000001684520191837f00000000000000000000000000000000000000000000000000000000000000001683526040519485525116602084015251166040820152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761070457604052565b6106b9565b60a0810190811067ffffffffffffffff82111761070457604052565b6040810190811067ffffffffffffffff82111761070457604052565b60c0810190811067ffffffffffffffff82111761070457604052565b90601f601f19910116810190811067ffffffffffffffff82111761070457604052565b6040519061023c60408361075d565b6040519061023c6102608361075d565b3461022c57600060031936011261022c5761044b60408051906107c2818361075d565b600f82527f46656551756f74657220312e362e3000000000000000000000000000000000006020830152519182916020835260208301906102f1565b602060408183019282815284518094520192019060005b8181106108225750505090565b82516001600160a01b0316845260209384019390920191600101610815565b3461022c57600060031936011261022c5760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b8181106108ae5761044b856108a28187038261075d565b604051918291826107fe565b825484526020909301926001928301920161088b565b3461022c57600060031936011261022c57602060405160248152f35b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c5780600401906040600319823603011261022c5761091e613e45565b6109288280612cc4565b4263ffffffff1692915060005b818110610a995750506024019061094c8284612cc4565b92905060005b83811061095b57005b8061097a61097560019361096f868a612cc4565b90612916565b612d63565b7fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e67ffffffffffffffff610a75610a676020850194610a596109c387516001600160e01b031690565b6109dd6109ce610780565b6001600160e01b039092168252565b63ffffffff8c166020820152610a186109fe845167ffffffffffffffff1690565b67ffffffffffffffff166000526005602052604060002090565b815160209092015160e01b7fffffffff00000000000000000000000000000000000000000000000000000000166001600160e01b0392909216919091179055565b5167ffffffffffffffff1690565b93516001600160e01b031690565b604080516001600160e01b039290921682524260208301529190931692a201610952565b80610ab2610aad60019361096f8980612cc4565b612d2c565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b03610b4b610a676020850194610b3e610afa87516001600160e01b031690565b610b056109ce610780565b63ffffffff8d166020820152610a18610b2584516001600160a01b031690565b6001600160a01b03166000526006602052604060002090565b516001600160a01b031690565b604080516001600160e01b039290921682524260208301529190931692a201610935565b9181601f8401121561022c5782359167ffffffffffffffff831161022c576020838186019501011161022c57565b92610bcf9492610bc1928552151560208501526080604085015260808401906102f1565b9160608184039101526102f1565b90565b3461022c5760a060031936011261022c57610beb61027d565b60243590610bf88261021b565b6044359160643567ffffffffffffffff811161022c57610c1c903690600401610b6f565b93909160843567ffffffffffffffff811161022c57610c3f903690600401610b6f565b9290917f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382166001600160a01b03821614600014610d0b575050935b6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016808611610cda575091610ccb939161044b9693613e89565b90939160405194859485610b9d565b857f6a92a4830000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b91610d159261286d565b93610c84565b67ffffffffffffffff81116107045760051b60200190565b8015150361022c57565b359061023c82610d33565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590610d8582610d1b565b90610d93604051928361075d565b828252602460a06020840194028201019036821161022c57602401925b818410610dc257610dc083612d88565b005b60a08436031261022c5760405190610dd982610709565b8435610de48161021b565b825260208501357fffffffffffffffffffff000000000000000000000000000000000000000000008116810361022c5760208301526040850135907fffff0000000000000000000000000000000000000000000000000000000000008216820361022c5782602092604060a0950152610e5f60608801610231565b6060820152610e7060808801610d3d565b6080820152815201930192610db0565b602060408183019282815284518094520192019060005b818110610ea45750505090565b9091926020604082610ed2600194885163ffffffff602080926001600160e01b038151168552015116910152565b019401929101610e97565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c57610f0e9036906004016102c0565b610f1781610d1b565b91610f25604051938461075d565b818352601f19610f3483610d1b565b0160005b818110610f8f57505060005b82811015610f8157600190610f65610f608260051b850161292b565b6138ce565b610f6f8287612a67565b52610f7a8186612a67565b5001610f44565b6040518061044b8682610e80565b602090610f9a612ee6565b82828801015201610f38565b3461022c57602060031936011261022c576020610fcd600435610fc88161021b565b613b92565b6001600160e01b0360405191168152f35b3461022c57602060031936011261022c5767ffffffffffffffff61100061027d565b611008612ee6565b5016600052600560205260406000206040519061102482610725565b546001600160e01b038116825260e01c6020820152604051809161044b82604081019263ffffffff602080926001600160e01b038151168552015116910152565b61023c909291926102408061026083019561108284825115159052565b60208181015161ffff169085015260408181015163ffffffff169085015260608181015163ffffffff169085015260808181015163ffffffff169085015260a08181015160ff169085015260c08181015160ff169085015260e08181015161ffff16908501526101008181015163ffffffff16908501526101208181015161ffff16908501526101408181015161ffff1690850152610160818101517fffffffff000000000000000000000000000000000000000000000000000000001690850152610180818101511515908501526101a08181015161ffff16908501526101c08181015163ffffffff16908501526101e08181015163ffffffff16908501526102008181015167ffffffffffffffff16908501526102208181015163ffffffff1690850152015163ffffffff16910152565b3461022c57602060031936011261022c5761044b6112786112736111d761027d565b60006102406111e461078f565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e08201528261020082015282610220820152015267ffffffffffffffff166000526009602052604060002090565b612f24565b60405191829182611065565b359063ffffffff8216820361022c57565b359061ffff8216820361022c57565b81601f8201121561022c578035906112bb82610d1b565b926112c9604051948561075d565b82845260208085019360061b8301019181831161022c57602001925b8284106112f3575050505090565b60408483031261022c576020604091825161130d81610725565b611316876102ab565b8152828701356113258161021b565b838201528152019301926112e5565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013561137081610d1b565b9161137e604051938461075d565b8183526024602084019260051b8201019036821161022c5760248101925b8284106113cd576024358567ffffffffffffffff821161022c576113c7610dc09236906004016112a4565b90613092565b833567ffffffffffffffff811161022c57820160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc823603011261022c576040519061141982610725565b611425602482016102ab565b8252604481013567ffffffffffffffff811161022c57602491010136601f8201121561022c57803561145681610d1b565b91611464604051938461075d565b818352602060e081850193028201019036821161022c57602001915b81831061149f575050509181602093848094015281520193019261139c565b82360360e0811261022c5760c0601f19604051926114bc84610725565b86356114c78161021b565b8452011261022c5760e0916020916040516114e181610741565b6114ec848801611284565b81526114fa60408801611284565b8482015261150a60608801611295565b604082015261151b60808801611284565b606082015261152c60a08801611284565b608082015260c087013561153f81610d33565b60a082015283820152815201920191611480565b3461022c57600060031936011261022c576000546001600160a01b03811633036115da577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b9080601f8301121561022c57813561161b81610d1b565b92611629604051948561075d565b81845260208085019260051b82010192831161022c57602001905b8282106116515750505090565b6020809183356116608161021b565b815201910190611644565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c5761169c903690600401611604565b60243567ffffffffffffffff811161022c576116bc903690600401611604565b906116c56140c6565b60005b815181101561173457806116e96116e4610b3e60019486612a67565b61593d565b6116f4575b016116c8565b6001600160a01b03611709610b3e8386612a67565b167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26116ee565b8260005b8151811015610dc05780611759611754610b3e60019486612a67565b615951565b611764575b01611738565b6001600160a01b03611779610b3e8386612a67565b167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a261175e565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c576117d5903690600401610b6f565b6024359167ffffffffffffffff831161022c5761182e61182661180c611802611836963690600401610b6f565b94909536916129c6565b90604082015190605e604a84015160601c93015191929190565b919033614258565b810190613341565b60005b8151811015610dc05761188161187c6118636118558486612a67565b51516001600160a01b031690565b6001600160a01b03166000526007602052604060002090565b613400565b6118956118916040830151151590565b1590565b6119f657906118e06118ad6020600194015160ff1690565b6118da6118ce60206118bf8689612a67565b5101516001600160e01b031690565b6001600160e01b031690565b90614326565b6118fb60406118ef8487612a67565b51015163ffffffff1690565b63ffffffff61192661191d611916610b25611855888b612a67565b5460e01c90565b63ffffffff1690565b9116106119f05761197461193f60406118ef8588612a67565b61196461194a610780565b6001600160e01b03851681529163ffffffff166020830152565b610a18610b256118558689612a67565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b036119aa6118558588612a67565b6119e66119bc60406118ef888b612a67565b60405193849316958390929163ffffffff6020916001600160e01b03604085019616845216910152565b0390a25b01611839565b506119ea565b611a3b611a066118558486612a67565b7f06439c6b000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b6000fd5b3461022c57604060031936011261022c5761044b611ac7611a5e61027d565b67ffffffffffffffff60243591611a748361021b565b600060a0604051611a8481610741565b828152826020820152826040820152826060820152826080820152015216600052600a6020526040600020906001600160a01b0316600052602052604060002090565b611b43611b3a60405192611ada84610741565b5463ffffffff8116845263ffffffff8160201c16602085015261ffff8160401c166040850152611b21611b148263ffffffff9060501c1690565b63ffffffff166060860152565b63ffffffff607082901c16608085015260901c60ff1690565b151560a0830152565b6040519182918291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b60ff81160361022c57565b359061023c82611ba6565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590611bf982610d1b565b90611c07604051928361075d565b82825260246102806020840194028201019036821161022c57602401925b818410611c3557610dc083613436565b833603610280811261022c57610260601f1960405192611c5484610725565b611c5d886102ab565b8452011261022c5761028091602091611c7461078f565b611c7f848901610d3d565b8152611c8d60408901611295565b84820152611c9d60608901611284565b6040820152611cae60808901611284565b6060820152611cbf60a08901611284565b6080820152611cd060c08901611bb1565b60a0820152611ce160e08901611bb1565b60c0820152611cf36101008901611295565b60e0820152611d056101208901611284565b610100820152611d186101408901611295565b610120820152611d2b6101608901611295565b610140820152611d3e610180890161044f565b610160820152611d516101a08901610d3d565b610180820152611d646101c08901611295565b6101a0820152611d776101e08901611284565b6101c0820152611d8a6102008901611284565b6101e0820152611d9d61022089016102ab565b610200820152611db06102408901611284565b610220820152611dc36102608901611284565b61024082015283820152815201930192611c25565b3461022c57600060031936011261022c5760206001600160a01b0360015416604051908152f35b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c576040600319823603011261022c57604051611e3c81610725565b816004013567ffffffffffffffff811161022c57611e609060043691850101611604565b8152602482013567ffffffffffffffff811161022c57610dc0926004611e899236920101611604565b60208201526136a0565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590611ed082610d1b565b90611ede604051928361075d565b8282526024602083019360061b8201019036821161022c57602401925b818410611f0b57610dc0836137f2565b60408436031261022c5760206040918251611f2581610725565b8635611f308161021b565b8152611f3d8388016102ab565b83820152815201930192611efb565b3461022c57602060031936011261022c576001600160a01b03600435611f718161021b565b611f79612ca5565b5016600052600760205261044b604060002060ff60405191611f9a836106e8565b546001600160a01b0381168352818160a01c16602084015260a81c16151560408201526040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b3461022c57600060031936011261022c57604051806020600b54918281520190600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99060005b8181106120535761044b856108a28187038261075d565b825484526020909301926001928301920161203c565b3461022c57602060031936011261022c57604061208b600435610f608161021b565b6120b08251809263ffffffff602080926001600160e01b038151168552015116910152565bf35b3461022c57600060031936011261022c57602060405160128152f35b3461022c57604060031936011261022c576120e761027d565b60243567ffffffffffffffff811161022c57806004019060a0600319823603011261022c5761212d6112738467ffffffffffffffff166000526009602052604060002090565b61213a6118918251151590565b6124fa57606482016121706118916121518361292b565b6001600160a01b03166000526001600b01602052604060002054151590565b6124b95790839160448401956121868785612cc4565b9590506121c760248201916121aa60846121a0858a612975565b9390500188612975565b90896121c06121b98b80612975565b36916129c6565b9389614c68565b92846121d5610fc88361292b565b9889946121f36121ed61022085015163ffffffff1690565b82614fa0565b9b6000808c1561247f57505061225961ffff8561227e996122659998966122999661228c966122506122406101c06122346101a061229f9f015161ffff1690565b97015163ffffffff1690565b9161224a8c61292b565b94612cc4565b96909516615091565b9891989790989461292b565b6001600160a01b03166000526008602052604060002090565b5467ffffffffffffffff1690565b67ffffffffffffffff1690565b90612821565b9560009761ffff6122b661014089015161ffff1690565b16612424575b509461229961228c61020061238a61044b9d6dffffffffffffffffffffffffffff6123826123a29f9e9b61237d6001600160e01b039f9b9c61239a9f61237d9e63ffffffff61231161237d9f61231b94612975565b92905016906139ea565b908b60a0810161233e612338612332835160ff1690565b60ff1690565b85612821565b9360e0830191612350835161ffff1690565b9061ffff821683116123b2575b505050506080015161237d9161191d9163ffffffff16613a28565b613a28565b6139ea565b911690612821565b93015167ffffffffffffffff1690565b911690612834565b6040519081529081906020820190565b61191d94965061237d959361ffff612413612402612378966123fc6123f56123ec60809960ff6123e661241a9b5160ff1690565b166139f7565b965161ffff1690565b61ffff1690565b906138c1565b61229961233260c08d015160ff1690565b91166139ea565b959383955061235d565b9095949897508261244a8b989495986dffffffffffffffffffffffffffff9060701c1690565b6dffffffffffffffffffffffffffff16916124658489612975565b905061247193886152b3565b9697939438969392966122bc565b969593509650505061229961228c61227e6122656124b36124ae61191d61024061229f99015163ffffffff1690565b6127da565b9461292b565b6124c5611a3b9161292b565b7f2502348c000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b7f99ac52f20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff841660045260246000fd5b3461022c57602060031936011261022c576001600160a01b036004356125578161021b565b61255f6140c6565b163381146125c457807fffffffffffffffffffffffff000000000000000000000000000000000000000060005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c5780600401359061262b82610d1b565b90612639604051928361075d565b8282526024602083019360071b8201019036821161022c57602401925b81841061266657610dc083613a42565b8336036080811261022c576060601f196040519261268384610725565b873561268e8161021b565b8452011261022c576080916020916040516126a8816106e8565b838801356126b58161021b565b815260408801356126c581611ba6565b8482015260608801356126d781610d33565b604082015283820152815201930192612656565b3461022c57604060031936011261022c576004356127088161021b565b612710610294565b9067ffffffffffffffff82169182600052600960205260ff604060002054161561277d5761274061276192613b92565b92600052600960205263ffffffff60016040600020015460901c1690614fa0565b604080516001600160e01b039384168152919092166020820152f35b827f99ac52f20000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90662386f26fc10000820291808304662386f26fc1000014901517156127fc57565b6127ab565b90655af3107a4000820291808304655af3107a400014901517156127fc57565b818102929181159184041417156127fc57565b811561283e570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b612897612891610bcf94936001600160e01b0361288a8195613b92565b1690612821565b92613b92565b1690612834565b906128a882610d1b565b6128b5604051918261075d565b828152601f196128c58294610d1b565b019060005b8281106128d657505050565b8060606020809385010152016128ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156129265760061b0190565b6128e7565b35610bcf8161021b565b91908110156129265760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618136030182121561022c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561022c570180359067ffffffffffffffff821161022c5760200191813603831361022c57565b92919267ffffffffffffffff821161070457604051916129f0601f8201601f19166020018461075d565b82948184528183011161022c578281602093846000960137010152565b9061023c604051612a1d81610741565b925463ffffffff8082168552602082811c821690860152604082811c61ffff1690860152605082901c81166060860152607082901c16608085015260901c60ff16151560a0840152565b80518210156129265760209160051b010190565b909291612ac8612a9f8367ffffffffffffffff166000526009602052604060002090565b5460081b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90612ad28161289e565b9560005b828110612ae7575050505050505090565b612afa612af5828489612916565b61292b565b8388612b14612b0a858484612935565b6040810190612975565b905060208111612c2a575b508392612b4e612b486121b9612b3e600198612b8997612b8497612935565b6020810190612975565b89613c0a565b612b6c8967ffffffffffffffff16600052600a602052604060002090565b906001600160a01b0316600052602052604060002090565b612a0d565b60a081015115612bee57612bd2612baa6060612bc493015163ffffffff1690565b6040805163ffffffff909216602083015290928391820190565b03601f19810183528261075d565b612bdc828b612a67565b52612be7818a612a67565b5001612ad6565b50612bc4612bd2612c2584612c178a67ffffffffffffffff166000526009602052604060002090565b015460101c63ffffffff1690565b612baa565b915050612c6261191d612c5584612b6c8b67ffffffffffffffff16600052600a602052604060002090565b5460701c63ffffffff1690565b10612c6f57838838612b1f565b7f36f536ca000000000000000000000000000000000000000000000000000000006000526001600160a01b031660045260246000fd5b60405190612cb2826106e8565b60006040838281528260208201520152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561022c570180359067ffffffffffffffff821161022c57602001918160061b3603831361022c57565b35906001600160e01b038216820361022c57565b60408136031261022c57612d5b602060405192612d4884610725565b8035612d538161021b565b845201612d18565b602082015290565b60408136031261022c57612d5b602060405192612d7f84610725565b612d53816102ab565b90612d916140c6565b60005b8251811015612ee15780612daa60019285612a67565b517f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a360a06001600160a01b038351169260608101936001600160a01b0380865116957fffff000000000000000000000000000000000000000000000000000000000000612e4860208601947fffffffffffffffffffff00000000000000000000000000000000000000000000865116604088019a848c5116926158b9565b977fffffffffffffffffffff000000000000000000000000000000000000000000006080870195612eb4875115158c600052600460205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b8560405198511688525116602087015251166040850152511660608301525115156080820152a201612d94565b509050565b60405190612ef382610725565b60006020838281520152565b90604051612f0c81610725565b91546001600160e01b038116835260e01c6020830152565b9061023c6130846001612f3561078f565b946130236130198254612f51612f4b8260ff1690565b15158a52565b61ffff600882901c1660208a015263ffffffff601882901c1660408a015263ffffffff603882901c1660608a015263ffffffff605882901c1660808a015260ff607882901c1660a08a015260ff608082901c1660c08a015261ffff608882901c1660e08a015263ffffffff609882901c166101008a015261ffff60b882901c166101208a015261ffff60c882901c166101408a01527fffffffff00000000000000000000000000000000000000000000000000000000600882901b166101608a015260f81c90565b1515610180880152565b015461ffff81166101a086015263ffffffff601082901c166101c086015263ffffffff603082901c166101e086015267ffffffffffffffff605082901c1661020086015263ffffffff609082901c1661022086015260b01c63ffffffff1690565b63ffffffff16610240840152565b9061309b6140c6565b6000915b805183101561328d576130b28382612a67565b51906130c6825167ffffffffffffffff1690565b946020600093019367ffffffffffffffff8716935b85518051821015613278576130f282602092612a67565b510151613103611855838951612a67565b8151602083015163ffffffff90811691168181101561323f575050608082015163ffffffff16602081106131fe575090867f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b56001600160a01b038461318d858f60019998612b6c6131889267ffffffffffffffff16600052600a602052604060002090565b614104565b6131f560405192839216958291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b0390a3016130db565b7f24ecdc02000000000000000000000000000000000000000000000000000000006000526001600160a01b0390911660045263ffffffff1660245260446000fd5b7f0b4f67a20000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b5050955092509260019150019192909261309f565b50905060005b815181101561333d57806132bb6132ac60019385612a67565b515167ffffffffffffffff1690565b67ffffffffffffffff6001600160a01b036132ea60206132db8689612a67565b5101516001600160a01b031690565b600061330e82612b6c8767ffffffffffffffff16600052600a602052604060002090565b551691167f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b600080a301613293565b5050565b60208183031261022c5780359067ffffffffffffffff821161022c570181601f8201121561022c5780359061337582610d1b565b92613383604051948561075d565b8284526020606081860194028301019181831161022c57602001925b8284106133ad575050505090565b60608483031261022c5760206060916040516133c8816106e8565b86356133d38161021b565b81526133e0838801612d18565b838201526133f060408801611284565b604082015281520193019261339f565b9060405161340d816106e8565b604060ff8294546001600160a01b0381168452818160a01c16602085015260a81c161515910152565b9061343f6140c6565b60005b8251811015612ee1576134558184612a67565b5160206134656132ac8487612a67565b9101519067ffffffffffffffff811680158015613681575b8015613653575b80156135a6575b61356e579161353482600195946134e46134bf612a9f6135399767ffffffffffffffff166000526009602052604060002090565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61353f577f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806135178782611065565b0390a267ffffffffffffffff166000526009602052604060002090565b614433565b01613442565b7f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e3604051806135178782611065565b7fc35aa79d0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff821660045260246000fd5b507fffffffff000000000000000000000000000000000000000000000000000000006135f66101608501517fffffffff000000000000000000000000000000000000000000000000000000001690565b167f2812d52c000000000000000000000000000000000000000000000000000000008114159081613628575b5061348b565b7f1e10bdc4000000000000000000000000000000000000000000000000000000009150141538613622565b506101e083015163ffffffff1663ffffffff61367961191d606087015163ffffffff1690565b911611613484565b5063ffffffff6136996101e085015163ffffffff1690565b161561347d565b6136a86140c6565b60208101519160005b835181101561373557806136ca610b3e60019387612a67565b6136ec6136e76001600160a01b0383165b6001600160a01b031690565b615bec565b6136f8575b50016136b1565b6040516001600160a01b039190911681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758090602090a1386136f1565b5091505160005b815181101561333d57613752610b3e8284612a67565b906001600160a01b038216156137c8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6137bf836137a461379f6136db6001976001600160a01b031690565b615b73565b506040516001600160a01b0390911681529081906020820190565b0390a10161373c565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b6137fa6140c6565b60005b815181101561333d57806001600160a01b0361381b60019385612a67565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d6138b867ffffffffffffffff60206138578689612a67565b51015116836000526008602052604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790556040519182918291909167ffffffffffffffff6020820193169052565b0390a2016137fd565b919082039182116127fc57565b6138d6612ee6565b506138fc6138f7826001600160a01b03166000526006602052604060002090565b612eff565b602081019161391b61391561191d855163ffffffff1690565b426138c1565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016116139c35761187c613967916001600160a01b03166000526007602052604060002090565b6139776118916040830151151590565b80156139c9575b6139c35761398b90614b01565b9163ffffffff6139b361191d6139a8602087015163ffffffff1690565b935163ffffffff1690565b9116106139be575090565b905090565b50905090565b506001600160a01b036139e382516001600160a01b031690565b161561397e565b919082018092116127fc57565b9061ffff8091169116029061ffff82169182036127fc57565b63ffffffff60209116019063ffffffff82116127fc57565b9063ffffffff8091169116019063ffffffff82116127fc57565b90613a4b6140c6565b60005b8251811015612ee15780613a6460019285612a67565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf613b8960206001600160a01b038451169301518360005260076020526040600020613ae96001600160a01b0383511682906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b602082015181547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000075ff0000000000000000000000000000000000000000006040870151151560a81b169360a01b169116171790556040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b0390a201613a4e565b613b9b816138ce565b9063ffffffff602083015116158015613bf8575b613bc15750516001600160e01b031690565b6001600160a01b03907f06439c6b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506001600160e01b0382511615613baf565b907fffffffff0000000000000000000000000000000000000000000000000000000082167f2812d52c000000000000000000000000000000000000000000000000000000008114613cd8577f1e10bdc40000000000000000000000000000000000000000000000000000000014613ccb577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000821660045260246000fd5b61023c9150600190615378565b5090506020815103613d1157613cf76020825183010160208301615369565b6001600160a01b038111908115613d4b575b50613d115750565b613d47906040519182917f8d666f6000000000000000000000000000000000000000000000000000000000835260048301615358565b0390fd5b61040091501038613d09565b917fffffffff0000000000000000000000000000000000000000000000000000000083167f2812d52c000000000000000000000000000000000000000000000000000000008114613e25577f1e10bdc40000000000000000000000000000000000000000000000000000000014613e18577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b61023c9250151590615378565b505090506020815103613d1157613cf76020825183010160208301615369565b33600052600360205260406000205415613e5b57565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b611273613eb09196949395929667ffffffffffffffff166000526009602052604060002090565b946101608601947f2812d52c000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613f2388517fffffffff000000000000000000000000000000000000000000000000000000001690565b16146140815750507f1e10bdc4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613f9786517fffffffff000000000000000000000000000000000000000000000000000000001690565b161461401857611a3b613fca85517fffffffff000000000000000000000000000000000000000000000000000000001690565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff0000000000000000000000000000000000000000000000000000000016600452602490565b61406c93506121b960606140568763ffffffff61404d6101806140458661407a9b9d015163ffffffff1690565b930151151590565b91168587615754565b0151604051958691602083019190602083019252565b03601f19810186528561075d565b9160019190565b945094916140a7916140a161191d6101e0610bcf96015163ffffffff1690565b916154d5565b936140be60206140b6876155f6565b960151151590565b9336916129c6565b6001600160a01b036001541633036140da57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b815181546020808501516040808701517fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090941663ffffffff958616179190921b67ffffffff00000000161791901b69ffff000000000000000016178255606083015161023c936142149260a0926141b6911685547fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff1660509190911b6dffffffff0000000000000000000016178555565b61420d6141ca608083015163ffffffff1690565b85547fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff1660709190911b71ffffffff000000000000000000000000000016178555565b0151151590565b81547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1690151560901b72ff00000000000000000000000000000000000016179055565b91929092614268828286866158b9565b600052600460205260ff60406000205416156142845750505050565b6040517f097e17ff0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529390921660248401527fffffffffffffffffffff0000000000000000000000000000000000000000000090911660448301527fffff000000000000000000000000000000000000000000000000000000000000166064820152608490fd5b604d81116127fc57600a0a90565b60ff1660120160ff81116127fc5760ff169060248211156143c1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116127fc5761437761437d92614318565b90612834565b6001600160e01b038111614397576001600160e01b031690565b7f10cb51d10000000000000000000000000000000000000000000000000000000060005260046000fd5b9060240390602482116127fc576122996143da92614318565b61437d565b9060ff80911691160160ff81116127fc5760ff169060248211156143c1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116127fc5761437761437d92614318565b90614a4d610240600161023c9461447e61444d8651151590565b829060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6144c4614490602087015161ffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff1660089190911b62ffff0016178255565b6145106144d8604087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff1660189190911b66ffffffff00000016178255565b614560614524606087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff1660389190911b6affffffff0000000000000016178255565b6145b4614574608087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff1660589190911b6effffffff000000000000000000000016178255565b6146066145c560a087015160ff1690565b82547fffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff1660789190911b6fff00000000000000000000000000000016178255565b61465961461760c087015160ff1690565b82547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff1660809190911b70ff0000000000000000000000000000000016178255565b6146af61466b60e087015161ffff1690565b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff1660889190911b72ffff000000000000000000000000000000000016178255565b61470c6146c461010087015163ffffffff1690565b82547fffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff1660989190911b76ffffffff0000000000000000000000000000000000000016178255565b61476961471f61012087015161ffff1690565b82547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff1660b89190911b78ffff000000000000000000000000000000000000000000000016178255565b6147c861477c61014087015161ffff1690565b82547fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff1660c89190911b7affff0000000000000000000000000000000000000000000000000016178255565b6148496147f96101608701517fffffffff000000000000000000000000000000000000000000000000000000001690565b82547fff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff1660089190911c7effffffff00000000000000000000000000000000000000000000000000000016178255565b6148aa61485a610180870151151590565b82547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016178255565b01926148ee6148bf6101a083015161ffff1690565b859061ffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000825416179055565b61493a6149036101c083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff1660109190911b65ffffffff000016178555565b61498a61494f6101e083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1660309190911b69ffffffff00000000000016178555565b6149e66149a361020083015167ffffffffffffffff1690565b85547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178555565b614a426149fb61022083015163ffffffff1690565b85547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff1660909190911b75ffffffff00000000000000000000000000000000000016178555565b015163ffffffff1690565b7fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff79ffffffff0000000000000000000000000000000000000000000083549260b01b169116179055565b519069ffffffffffffffffffff8216820361022c57565b908160a091031261022c57614ac281614a97565b91602082015191604081015191610bcf608060608401519301614a97565b6040513d6000823e3d90fd5b9081602091031261022c5751610bcf81611ba6565b614b09612ee6565b50614b216136db6136db83516001600160a01b031690565b90604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a082600481865afa928315614c2957600092600094614c2e575b5060008312614397576020600491604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa928315614c2957610bcf9363ffffffff93614bca93600092614bf3575b506020015160ff165b906143df565b92614be5614bd6610780565b6001600160e01b039095168552565b1663ffffffff166020830152565b614bc4919250614c1a602091823d8411614c22575b614c12818361075d565b810190614aec565b929150614bbb565b503d614c08565b614ae0565b909350614c5491925060a03d60a011614c61575b614c4c818361075d565b810190614aae565b5093925050919238614b64565b503d614c42565b9291949390614c8161191d604086015163ffffffff1690565b808211614f70575050602083015161ffff16808611614f3a5750610160830194614ccb86517fffffffff000000000000000000000000000000000000000000000000000000001690565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f2812d52c000000000000000000000000000000000000000000000000000000008103614d8d5750505082610bcf9492614d5d92614d386101e0614d889997015163ffffffff1690565b9063ffffffff614d556101806140b6606088015163ffffffff1690565b941692615965565b519384925b517fffffffff000000000000000000000000000000000000000000000000000000001690565b613d57565b91949392917f1e10bdc40000000000000000000000000000000000000000000000000000000003614eeb575090829163ffffffff614de3610180614ddb6060614deb98015163ffffffff1690565b950151151590565b931691615754565b90151580614edf575b614eb5576080810180515160408111614e83575060208201519051519067ffffffffffffffff9081169081831c16614e4957505091610bcf91614e4161191d614d88955163ffffffff1690565b938492614d62565b7fafa933080000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260245260446000fd5b7f8a0d71f700000000000000000000000000000000000000000000000000000000600052600452604060245260446000fd5b7f5bed51920000000000000000000000000000000000000000000000000000000060005260046000fd5b50606081015115614df4565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7fd88dddd600000000000000000000000000000000000000000000000000000000600052600486905261ffff1660245260446000fd5b7f869337890000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b67ffffffffffffffff8116600052600560205260406000209160405192614fc684610725565b546001600160e01b038116845260e01c9182602085015263ffffffff82169283615000575b50505050610bcf90516001600160e01b031690565b63ffffffff1642908103939084116127fc57831161501e5780614feb565b7ff08bcb3e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045263ffffffff1660245260445260646000fd5b60408136031261022c5760206040519161507a83610725565b80356150858161021b565b83520135602082015290565b9694919695929390956000946000986000986000965b8088106150bb575050505050505050929190565b9091929394959697999a6150d86150d38a848b612916565b615061565b9a615126612b848d61510f6151018967ffffffffffffffff16600052600a602052604060002090565b91516001600160a01b031690565b6001600160a01b0316600052602052604060002090565b9161513761189160a0850151151590565b6152805760009c60408401906151526123f5835161ffff1690565b615208575b5050606083015163ffffffff1661516d91613a28565b9c60808301516151809063ffffffff1690565b61518991613a28565b9b82516151999063ffffffff1690565b63ffffffff166151a8906127da565b600193908083106151fc57506124ae61191d60206151cb93015163ffffffff1690565b8082116151eb57506151dc916139ea565b985b01969594939291906150a7565b90506151f6916139ea565b986151de565b9150506151f6916139ea565b90612299615271939f61525f6152689460208f8e6123f595506001600160a01b0361523a85516001600160a01b031690565b91166001600160a01b03821614615279576152559150613b92565b915b0151906159cd565b925161ffff1690565b620186a0900490565b9b3880615157565b5091615257565b999b50600191506152a7846152a16152ad9361529b8b6127da565b906139ea565b9b613a28565b9c613a10565b9a6151de565b91939093806101e00193846101e0116127fc5761012081029080820461012014901517156127fc576101e09101018093116127fc576123f5610140615349610bcf966dffffffffffffffffffffffffffff6123826153346153216153539a63ffffffff6122999a16906139ea565b6122996123f56101208c015161ffff1690565b61529b61191d6101008b015163ffffffff1690565b93015161ffff1690565b612801565b906020610bcf9281815201906102f1565b9081602091031261022c575190565b9060208251036153e0576153895750565b60208180518101031261022c576020810151156153a35750565b613d47906040519182917fff828faa00000000000000000000000000000000000000000000000000000000835260206004840181815201906102f1565b6040517fff828faa0000000000000000000000000000000000000000000000000000000081526020600482015280613d4760248201856102f1565b919091357fffffffff000000000000000000000000000000000000000000000000000000008116926004811061544f575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b909291928360041161022c57831161022c57600401916003190190565b9060041161022c5790600490565b9081604091031261022c576020604051916154c683610725565b805183520151612d5b81610d33565b916154de612ee6565b5081156155d4575061551f6121b982806155197fffffffff00000000000000000000000000000000000000000000000000000000958761541b565b95615481565b91167f181dcf1000000000000000000000000000000000000000000000000000000000810361555c575080602080610bcf935183010191016154ac565b7f97a657c900000000000000000000000000000000000000000000000000000000146155ac577f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b806020806155bf93518301019101615369565b6155c7610780565b9081526000602082015290565b91505067ffffffffffffffff6155e8610780565b911681526000602082015290565b6020604051917f181dcf1000000000000000000000000000000000000000000000000000000000828401528051602484015201511515604482015260448152610bcf60648261075d565b6040519061564d82610709565b60606080836000815260006020820152600060408201526000838201520152565b60208183031261022c5780359067ffffffffffffffff821161022c57019060a08282031261022c57604051916156a383610709565b6156ac81611284565b83526156ba602082016102ab565b602084015260408101356156cd81610d33565b60408401526060810135606084015260808101359067ffffffffffffffff821161022c57019080601f8301121561022c57813561570981610d1b565b92615717604051948561075d565b81845260208085019260051b82010192831161022c57602001905b82821061574457505050608082015290565b8135815260209182019101615732565b61575c615640565b50811561588f577f1f3b3aba000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000006157b86157b2858561549e565b9061541b565b160361586557816157d4926157cc92615481565b81019061566e565b918061584f575b6158255763ffffffff6157f2835163ffffffff1690565b16116157fb5790565b7f2e2b0c290000000000000000000000000000000000000000000000000000000060005260046000fd5b7fee433e990000000000000000000000000000000000000000000000000000000060005260046000fd5b506158606118916040840151151590565b6157db565b7f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fb00b53dc0000000000000000000000000000000000000000000000000000000060005260046000fd5b604080516001600160a01b039283166020820190815292909316908301527fffffffffffffffffffff0000000000000000000000000000000000000000000090921660608201527fffff0000000000000000000000000000000000000000000000000000000000009092166080830152906159378160a08101612bc4565b51902090565b6001600160a01b03610bcf9116600b615a7a565b6001600160a01b03610bcf9116600b615bae565b9063ffffffff6159829395949561597a612ee6565b5016916154d5565b918251116159a35780615997575b6158255790565b50602081015115615990565b7f4c4fc93a0000000000000000000000000000000000000000000000000000000060005260046000fd5b670de0b6b3a7640000916001600160e01b036159e99216612821565b0490565b80548210156129265760005260206000200190600090565b91615a1f918354906000199060031b92831b921b19161790565b9055565b80548015615a4b576000190190615a3a82826159ed565b60001982549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001810191806000528260205260406000205492831515600014615b2c5760001984018481116127fc5783549360001985019485116127fc576000958583615add97615ace9503615ae3575b505050615a23565b90600052602052604060002090565b55600190565b615b13615b0d91615b04615afa615b2395886159ed565b90549060031b1c90565b928391876159ed565b90615a05565b8590600052602052604060002090565b55388080615ac6565b50505050600090565b805490680100000000000000008210156107045781615b5c916001615a1f940181556159ed565b81939154906000199060031b92831b921b19161790565b600081815260036020526040902054615ba857615b91816002615b35565b600254906000526003602052604060002055600190565b50600090565b6000828152600182016020526040902054615be55780615bd083600193615b35565b80549260005201602052604060002055600190565b5050600090565b600081815260036020526040902054908115615be5576000198201908282116127fc576002549260001984019384116127fc578383615add9460009603615c4c575b505050615c3b6002615a23565b600390600052602052604060002090565b615c3b615b0d91615c64615afa615c6e9560026159ed565b92839160026159ed565b55388080615c2e56fea164736f6c634300081a000a", } var FeeQuoterABI = FeeQuoterMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go b/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go index c4e5d8e11e0..5e09a995863 100644 --- a/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go +++ b/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go @@ -88,7 +88,7 @@ type RateLimiterTokenBucket struct { var MultiAggregateRateLimiterMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"authorizedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyRateLimiterConfigUpdates\",\"inputs\":[{\"name\":\"rateLimiterUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.RateLimiterConfigArgs[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"currentRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllRateLimitTokens\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"localTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"remoteTokens\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeQuoter\",\"inputs\":[],\"outputs\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onInboundMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onOutboundMessage\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setFeeQuoter\",\"inputs\":[{\"name\":\"newFeeQuoter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateRateLimitTokens\",\"inputs\":[{\"name\":\"removes\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"adds\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.RateLimitTokenArgs[]\",\"components\":[{\"name\":\"localTokenArgs\",\"type\":\"tuple\",\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeQuoterSet\",\"inputs\":[{\"name\":\"newFeeQuoter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"RateLimiterConfigUpdated\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenAggregateRateLimitAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenAggregateRateLimitRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PriceNotFoundForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", - Bin: "0x60806040523461026457612f548038038061001981610269565b928339810190604081830312610264576100328161028e565b602082015190916001600160401b03821161026457019180601f84011215610264578251926001600160401b038411610225578360051b90602080610078818501610269565b80978152019282010192831161026457602001905b82821061024c57505050331561023b57600180546001600160a01b0319163317905560206100ba81610269565b60008152600036813760408051949085016001600160401b03811186821017610225576040528452808285015260005b8151811015610151576001906001600160a01b0361010882856102a2565b511684610114826102e4565b610121575b5050016100ea565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a13884610119565b5050915160005b81518110156101c9576001600160a01b0361017382846102a2565b51169081156101b8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef85836101aa6001956103e2565b50604051908152a101610158565b6342bcdf7f60e11b60005260046000fd5b50506001600160a01b03169081156101b857600580546001600160a01b031916831790556040519182527f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac91a1604051612b1190816104438239f35b634e487b7160e01b600052604160045260246000fd5b639b15e16f60e01b60005260046000fd5b602080916102598461028e565b81520191019061008d565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761022557604052565b51906001600160a01b038216820361026457565b80518210156102b65760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156102b65760005260206000200190600090565b60008181526003602052604090205480156103db5760001981018181116103c5576002546000198101919082116103c557808203610374575b505050600254801561035e57600019016103388160026102cc565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6103ad6103856103969360026102cc565b90549060031b1c92839260026102cc565b819391549060031b91821b91600019901b19161790565b9055600052600360205260406000205538808061031d565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8060005260036020526040600020541560001461043c57600254680100000000000000008110156102255761042361039682600185940160025560026102cc565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816308d450a114611ca3575080630a35bcc414611b72578063181f5a7714611ace5780631af18b7b1461156c5780632451a627146114bf578063537e304e146111f557806379ba50971461110c5780638da5cb5b146110ba57806391a2749a14610efc578063e0a0e50614610bbb578063e145291614610b69578063e835232b14610a8d578063f2fde38b1461099d5763fe843cd0146100b957600080fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985736602382011215610998578060040135610113816120da565b916101216040519384611ff8565b818352602460a06020850193028201019036821161099857602401915b8183106108ea578361014e61243d565b6000905b80518210156108e8576101658282612345565b519160408301519267ffffffffffffffff8151169081156108be576020015115156101908183612408565b805463ffffffff8160801c16801560001461066757505085516000915015610592576fffffffffffffffffffffffffffffffff6040870151166fffffffffffffffffffffffffffffffff602088015116811090811591610589575b50610526577ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b979161042960019697608093505b6fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116825115159160405161025d81611fa4565b828152602081019363ffffffff4216855260408201908152606082019384528882019283528a886000146104315760036103ef966103816fffffffffffffffffffffffffffffffff969587958695600052600660205261033a63ffffffff604060002095888060028901965116167fffffffffffffffffffffffffffffffff00000000000000000000000000000000865416178555511683907fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff73ffffffff0000000000000000000000000000000083549260801b169116179055565b5181547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016179055565b01945116167fffffffffffffffffffffffffffffffff0000000000000000000000000000000084541617835551166fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60405192835260208301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba20190610152565b8d6fffffffffffffffffffffffffffffffff949361038186946104da63ffffffff6105219b8897600052600660205287806040600020975116167fffffffffffffffffffffffffffffffff00000000000000000000000000000000875416178655511684907fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff73ffffffff0000000000000000000000000000000083549260801b169116179055565b5182547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178255565b6103ef565b606486610587604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b905015876101eb565b506fffffffffffffffffffffffffffffffff60408601511615801590610648575b6105e75760807ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b97916104296001969761021e565b606485610587604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff60208601511615156105b3565b6001969761079c6080947ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b9796946106a16104299542612430565b9081610804575b50506fffffffffffffffffffffffffffffffff8a8160208601511692828154168085106000146107fc57508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556107508651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1960606040516107f681856fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba16103ef565b8380916106d7565b6fffffffffffffffffffffffffffffffff916108388392838f6108319088015494828616958e1c906126f0565b91166123cc565b808210156108b757505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff00000000000000000000000000000000161781558b806106a8565b9050610842565b7fc65608950000000000000000000000000000000000000000000000000000000060005260046000fd5b005b82360360a081126109985760607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06040519261092584611fdc565b61092e87612050565b845261093c602088016121ac565b602085015201126109985760a09160209160405161095981611fdc565b610965604088016121ac565b8152610973606088016122fd565b84820152610983608088016122fd565b6040820152604082015281520192019161013e565b600080fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985773ffffffffffffffffffffffffffffffffffffffff6109e96120f2565b6109f161243d565b16338114610a6357807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985773ffffffffffffffffffffffffffffffffffffffff610ad96120f2565b610ae161243d565b168015610b3f576020817f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac927fffffffffffffffffffffffff00000000000000000000000000000000000000006005541617600555604051908152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857610bf2612039565b60243567ffffffffffffffff8111610998578036039060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261099857610c3a612388565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60448201359201821215610998570160048101359067ffffffffffffffff8211610998576024018160061b3603811361099857610c99913691612136565b90610ca5600182612408565b9160ff835460a01c16610cb457005b6000929167ffffffffffffffff16835b8251811015610ee857816000526004602052610d16604060002073ffffffffffffffffffffffffffffffffffffffff610cfd8487612345565b5151169060019160005201602052604060002054151590565b610d23575b600101610cc4565b93610d2e8584612345565b5173ffffffffffffffffffffffffffffffffffffffff60055416604073ffffffffffffffffffffffffffffffffffffffff83511660248251809481937fd02641a000000000000000000000000000000000000000000000000000000000835260048301525afa8015610edc57600090610e3c575b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505116908115610df75791670de0b6b3a7640000610de8610def9360206001960151906126f0565b04906123cc565b949050610d1b565b73ffffffffffffffffffffffffffffffffffffffff9051167f9a655f7b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040823d8211610ed4575b81610e5460409383611ff8565b81010312610ecd5760405191610e6983611fc0565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610ed0578352602001519063ffffffff82168203610ecd575060208201527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90610da2565b80fd5b8280fd5b3d9150610e47565b6040513d6000823e3d90fd5b5050509080610ef357005b6108e891612488565b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126109985760405190610f7682611fc0565b806004013567ffffffffffffffff811161099857610f9a9060043691840101612298565b825260248101359067ffffffffffffffff8211610998576004610fc09236920101612298565b60208201908152610fcf61243d565b519060005b8251811015611047578073ffffffffffffffffffffffffffffffffffffffff610fff60019386612345565b511661100a81612785565b611016575b5001610fd4565b60207fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a18461100f565b505160005b81518110156108e85773ffffffffffffffffffffffffffffffffffffffff6110748284612345565b5116908115610b3f577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6020836110ac600195612a4f565b50604051908152a10161104c565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760005473ffffffffffffffffffffffffffffffffffffffff811633036111cb577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985767ffffffffffffffff611235612039565b168060005260046020526040600020549061124f826120da565b9161125d6040519384611ff8565b8083527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061128a826120da565b0136602085013761129a816120da565b916112a86040519384611ff8565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06112d5836120da565b0160005b8181106114ae57505060005b82811061138457611305858560405192839260408452604084019061224e565b8281036020840152815180825260208201916020808360051b8301019401926000915b8383106113355786860387f35b919395509193602080611372837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301875289516121b9565b97019301930190928695949293611328565b8160005260046020526040600020600261139e838361276d565b90549060031b1c918260005201602052604060002090604051916000908054906113c782612703565b8086529160018116908115611469575060011461142f575b505082916114076001959473ffffffffffffffffffffffffffffffffffffffff930384611ff8565b166114128389612345565b5261141d8287612345565b526114288186612345565b50016112e5565b6000908152602081209092505b8183106114535750508201602001816114076113df565b600181602092548386890101520192019161143c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208088019190915292151560051b8601909201925083915061140790506113df565b8060606020809388010152016112d9565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b818110611556576115528561153e81870382611ff8565b60405191829160208352602083019061224e565b0390f35b8254845260209093019260019283019201611527565b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985736602382011215610998578060040135906115c7826120da565b916115d56040519384611ff8565b8083526024602084019160061b8301019136831161099857602401905b828210611ab4576024358467ffffffffffffffff82116109985736602383011215610998578160040135611625816120da565b926116336040519485611ff8565b8184526024602085019260051b820101903682116109985760248101925b828410611a2157858561166261243d565b60005b815181101561176d578073ffffffffffffffffffffffffffffffffffffffff602061169260019486612345565b5101511667ffffffffffffffff6116a98386612345565b515116908160005260046020526116e7816040600020816000526002810160205260406000206116d98154612703565b908161172b575b505061291b565b6116f4575b505001611665565b7f530cabd30786b7235e124a6c0db77e0b685ef22813b1fe87554247f404eb8ed69160409182519182526020820152a184806116ec565b81601f600093118a146117425750555b89806116e0565b8183526020832061175d91601f0160051c8101908b01612756565b808252816020812091555561173b565b8260005b81518110156108e8576117848183612345565b515160206117928385612345565b51015173ffffffffffffffffffffffffffffffffffffffff6020830151169182158015611a18575b80156119ec575b610b3f5767ffffffffffffffff905116806000526004602052604060002083600052600281016020526040600020835167ffffffffffffffff81116119bd5761180a8254612703565b601f8111611980575b506020601f82116001146118d5579261186d9282889796959360019a99946000916118ca575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828c1b9260031b1c1916179055612aaf565b61187b575b50505001611771565b7fad72a792d2a307f400c278be7deaeec6964276783304580cdc4e905436b8d5c5926118b960405193849384526060602085015260608401906121b9565b9060408301520390a1838080611872565b90508701518c611839565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110611968575083899897969361186d969360019c9b968d9410611931575b5050811b019055612aaf565b8901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c80611925565b9192602060018192868c015181550194019201611905565b6119ad90836000526020600020601f840160051c810191602085106119b3575b601f0160051c0190612756565b88611813565b90915081906119a0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b508151602083012060405160208101906000825260208152611a0f604082611ff8565b519020146117c1565b508151156117ba565b833567ffffffffffffffff811161099857820160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82360301126109985760405191611a6d83611fc0565b611a7a3660248401612218565b835260648201359267ffffffffffffffff841161099857611aa5602094936024869536920101612065565b83820152815201930192611651565b6020604091611ac33685612218565b8152019101906115f2565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857611552604051611b0e606082611ff8565b602381527f4d756c7469416767726567617465526174654c696d6974657220312e362e302d60208201527f646576000000000000000000000000000000000000000000000000000000000060408201526040519182916020835260208301906121b9565b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857611ba9612039565b6024359081151582036109985760a091611bcb91611bc561231a565b50612408565b6fffffffffffffffffffffffffffffffff60405191611be983611fa4565b8181549181831685526001602086019163ffffffff8560801c16835260ff6040880195891c161515855201549263ffffffff60608701928486168452608088019560801c8652611c3761231a565b508480855116611c64828b5116611c5e611c548787511642612430565b858c5116906126f0565b906123cc565b80821015611c9c57505b1680985281421681526040519788525116602087015251151560408601525116606084015251166080820152f35b9050611c6e565b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261099857611d1982611fa4565b80600401358252611d2c60248201612050565b9060208301918252604481013567ffffffffffffffff811161099857611d589060043691840101612065565b6040840152606481013567ffffffffffffffff811161099857611d819060043691840101612065565b606084015260848101359067ffffffffffffffff821161099857019036602383011215610998576080611dc767ffffffffffffffff933690602460048201359101612136565b9301928352611dd4612388565b51169051611de3600083612408565b9060ff825460a01c16611df257005b60009260005b8251811015610ee857816000526004602052611e31604060002073ffffffffffffffffffffffffffffffffffffffff610cfd8487612345565b611e3e575b600101611df8565b93611e498584612345565b5173ffffffffffffffffffffffffffffffffffffffff60055416604073ffffffffffffffffffffffffffffffffffffffff83511660248251809481937fd02641a000000000000000000000000000000000000000000000000000000000835260048301525afa8015610edc57600090611f0b575b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505116908115610df75791670de0b6b3a7640000610de8611f039360206001960151906126f0565b949050611e36565b6040823d8211611f9c575b81611f2360409383611ff8565b81010312610ecd5760405191611f3883611fc0565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610ed0578352602001519063ffffffff82168203610ecd575060208201527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90611ebd565b3d9150611f16565b60a0810190811067ffffffffffffffff8211176119bd57604052565b6040810190811067ffffffffffffffff8211176119bd57604052565b6060810190811067ffffffffffffffff8211176119bd57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176119bd57604052565b6004359067ffffffffffffffff8216820361099857565b359067ffffffffffffffff8216820361099857565b81601f820112156109985780359067ffffffffffffffff82116119bd57604051926120b8601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200185611ff8565b8284526020838301011161099857816000926020809301838601378301015290565b67ffffffffffffffff81116119bd5760051b60200190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361099857565b359073ffffffffffffffffffffffffffffffffffffffff8216820361099857565b929192612142826120da565b936121506040519586611ff8565b602085848152019260061b82019181831161099857925b8284106121745750505050565b604084830312610998576020604091825161218e81611fc0565b61219787612115565b81528287013583820152815201930192612167565b3590811515820361099857565b919082519283825260005b8481106122035750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016121c4565b91908260409103126109985760405161223081611fc0565b602061224981839561224181612050565b855201612115565b910152565b906020808351928381520192019060005b81811061226c5750505090565b825173ffffffffffffffffffffffffffffffffffffffff1684526020938401939092019160010161225f565b9080601f830112156109985781356122af816120da565b926122bd6040519485611ff8565b81845260208085019260051b82010192831161099857602001905b8282106122e55750505090565b602080916122f284612115565b8152019101906122d8565b35906fffffffffffffffffffffffffffffffff8216820361099857565b6040519061232782611fa4565b60006080838281528260208201528260408201528260608201520152565b80518210156123595760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3360005260036020526040600020541561239e57565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b919082018092116123d957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff16600052600660205260406000209060001461242d5760020190565b90565b919082039182116123d957565b73ffffffffffffffffffffffffffffffffffffffff60015416330361245e57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b805460ff8160a01c161580156126e8575b6126e3576fffffffffffffffffffffffffffffffff811690600183019081546124de63ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642612430565b9081612645575b5050848110612613575083821061256a5750916020916fffffffffffffffffffffffffffffffff80612538847f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a97612430565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b5460801c6125788285612430565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018281116123d9576125ab916123cc565b9080156125e45790047f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b84907ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8285929395116126b95761266092611c5e9160801c906126f0565b808310156126b45750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806124e5565b61266b565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b505050565b508215612499565b818102929181159184041417156123d957565b90600182811c9216801561274c575b602083101461271d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612712565b818110612761575050565b60008155600101612756565b80548210156123595760005260206000200190600090565b6000818152600360205260409020548015612914577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116123d957600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116123d9578082036128a5575b5050506002548015612876577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161283381600261276d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6128fc6128b66128c793600261276d565b90549060031b1c928392600261276d565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806127fa565b5050600090565b9060018201918160005282602052604060002054801515600014612a46577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116123d9578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116123d957808203612a0f575b50505080548015612876577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906129d0828261276d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b612a2f612a1f6128c7938661276d565b90549060031b1c9283928661276d565b905560005283602052604060002055388080612998565b50505050600090565b80600052600360205260406000205415600014612aa957600254680100000000000000008110156119bd57612a906128c7826001859401600255600261276d565b9055600254906000526003602052604060002055600190565b50600090565b600082815260018201602052604090205461291457805490680100000000000000008210156119bd5782612aed6128c784600180960185558461276d565b90558054926000520160205260406000205560019056fea164736f6c634300081a000a", + Bin: "0x60806040523461026457612f2d8038038061001981610269565b928339810190604081830312610264576100328161028e565b602082015190916001600160401b03821161026457019180601f84011215610264578251926001600160401b038411610225578360051b90602080610078818501610269565b80978152019282010192831161026457602001905b82821061024c57505050331561023b57600180546001600160a01b0319163317905560206100ba81610269565b60008152600036813760408051949085016001600160401b03811186821017610225576040528452808285015260005b8151811015610151576001906001600160a01b0361010882856102a2565b511684610114826102e4565b610121575b5050016100ea565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a13884610119565b5050915160005b81518110156101c9576001600160a01b0361017382846102a2565b51169081156101b8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef85836101aa6001956103e2565b50604051908152a101610158565b6342bcdf7f60e11b60005260046000fd5b50506001600160a01b03169081156101b857600580546001600160a01b031916831790556040519182527f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac91a1604051612aea90816104438239f35b634e487b7160e01b600052604160045260246000fd5b639b15e16f60e01b60005260046000fd5b602080916102598461028e565b81520191019061008d565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761022557604052565b51906001600160a01b038216820361026457565b80518210156102b65760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156102b65760005260206000200190600090565b60008181526003602052604090205480156103db5760001981018181116103c5576002546000198101919082116103c557808203610374575b505050600254801561035e57600019016103388160026102cc565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6103ad6103856103969360026102cc565b90549060031b1c92839260026102cc565b819391549060031b91821b91600019901b19161790565b9055600052600360205260406000205538808061031d565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8060005260036020526040600020541560001461043c57600254680100000000000000008110156102255761042361039682600185940160025560026102cc565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816308d450a114611c7c575080630a35bcc414611b4b578063181f5a7714611ace5780631af18b7b1461156c5780632451a627146114bf578063537e304e146111f557806379ba50971461110c5780638da5cb5b146110ba57806391a2749a14610efc578063e0a0e50614610bbb578063e145291614610b69578063e835232b14610a8d578063f2fde38b1461099d5763fe843cd0146100b957600080fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985736602382011215610998578060040135610113816120b3565b916101216040519384611fd1565b818352602460a06020850193028201019036821161099857602401915b8183106108ea578361014e612416565b6000905b80518210156108e857610165828261231e565b519160408301519267ffffffffffffffff8151169081156108be5760200151151561019081836123e1565b805463ffffffff8160801c16801560001461066757505085516000915015610592576fffffffffffffffffffffffffffffffff6040870151166fffffffffffffffffffffffffffffffff602088015116811090811591610589575b50610526577ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b979161042960019697608093505b6fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116825115159160405161025d81611f7d565b828152602081019363ffffffff4216855260408201908152606082019384528882019283528a886000146104315760036103ef966103816fffffffffffffffffffffffffffffffff969587958695600052600660205261033a63ffffffff604060002095888060028901965116167fffffffffffffffffffffffffffffffff00000000000000000000000000000000865416178555511683907fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff73ffffffff0000000000000000000000000000000083549260801b169116179055565b5181547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016179055565b01945116167fffffffffffffffffffffffffffffffff0000000000000000000000000000000084541617835551166fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60405192835260208301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba20190610152565b8d6fffffffffffffffffffffffffffffffff949361038186946104da63ffffffff6105219b8897600052600660205287806040600020975116167fffffffffffffffffffffffffffffffff00000000000000000000000000000000875416178655511684907fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff73ffffffff0000000000000000000000000000000083549260801b169116179055565b5182547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178255565b6103ef565b606486610587604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b905015876101eb565b506fffffffffffffffffffffffffffffffff60408601511615801590610648575b6105e75760807ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b97916104296001969761021e565b606485610587604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff60208601511615156105b3565b6001969761079c6080947ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b9796946106a16104299542612409565b9081610804575b50506fffffffffffffffffffffffffffffffff8a8160208601511692828154168085106000146107fc57508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556107508651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1960606040516107f681856fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba16103ef565b8380916106d7565b6fffffffffffffffffffffffffffffffff916108388392838f6108319088015494828616958e1c906126c9565b91166123a5565b808210156108b757505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff00000000000000000000000000000000161781558b806106a8565b9050610842565b7fc65608950000000000000000000000000000000000000000000000000000000060005260046000fd5b005b82360360a081126109985760607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06040519261092584611fb5565b61092e87612029565b845261093c60208801612185565b602085015201126109985760a09160209160405161095981611fb5565b61096560408801612185565b8152610973606088016122d6565b84820152610983608088016122d6565b6040820152604082015281520192019161013e565b600080fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985773ffffffffffffffffffffffffffffffffffffffff6109e96120cb565b6109f1612416565b16338114610a6357807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985773ffffffffffffffffffffffffffffffffffffffff610ad96120cb565b610ae1612416565b168015610b3f576020817f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac927fffffffffffffffffffffffff00000000000000000000000000000000000000006005541617600555604051908152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857610bf2612012565b60243567ffffffffffffffff8111610998578036039060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261099857610c3a612361565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60448201359201821215610998570160048101359067ffffffffffffffff8211610998576024018160061b3603811361099857610c9991369161210f565b90610ca56001826123e1565b9160ff835460a01c16610cb457005b6000929167ffffffffffffffff16835b8251811015610ee857816000526004602052610d16604060002073ffffffffffffffffffffffffffffffffffffffff610cfd848761231e565b5151169060019160005201602052604060002054151590565b610d23575b600101610cc4565b93610d2e858461231e565b5173ffffffffffffffffffffffffffffffffffffffff60055416604073ffffffffffffffffffffffffffffffffffffffff83511660248251809481937fd02641a000000000000000000000000000000000000000000000000000000000835260048301525afa8015610edc57600090610e3c575b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505116908115610df75791670de0b6b3a7640000610de8610def9360206001960151906126c9565b04906123a5565b949050610d1b565b73ffffffffffffffffffffffffffffffffffffffff9051167f9a655f7b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040823d8211610ed4575b81610e5460409383611fd1565b81010312610ecd5760405191610e6983611f99565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610ed0578352602001519063ffffffff82168203610ecd575060208201527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90610da2565b80fd5b8280fd5b3d9150610e47565b6040513d6000823e3d90fd5b5050509080610ef357005b6108e891612461565b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126109985760405190610f7682611f99565b806004013567ffffffffffffffff811161099857610f9a9060043691840101612271565b825260248101359067ffffffffffffffff8211610998576004610fc09236920101612271565b60208201908152610fcf612416565b519060005b8251811015611047578073ffffffffffffffffffffffffffffffffffffffff610fff6001938661231e565b511661100a8161275e565b611016575b5001610fd4565b60207fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a18461100f565b505160005b81518110156108e85773ffffffffffffffffffffffffffffffffffffffff611074828461231e565b5116908115610b3f577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6020836110ac600195612a28565b50604051908152a10161104c565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760005473ffffffffffffffffffffffffffffffffffffffff811633036111cb577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985767ffffffffffffffff611235612012565b168060005260046020526040600020549061124f826120b3565b9161125d6040519384611fd1565b8083527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061128a826120b3565b0136602085013761129a816120b3565b916112a86040519384611fd1565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06112d5836120b3565b0160005b8181106114ae57505060005b828110611384576113058585604051928392604084526040840190612227565b8281036020840152815180825260208201916020808360051b8301019401926000915b8383106113355786860387f35b919395509193602080611372837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528951612192565b97019301930190928695949293611328565b8160005260046020526040600020600261139e8383612746565b90549060031b1c918260005201602052604060002090604051916000908054906113c7826126dc565b8086529160018116908115611469575060011461142f575b505082916114076001959473ffffffffffffffffffffffffffffffffffffffff930384611fd1565b16611412838961231e565b5261141d828761231e565b52611428818661231e565b50016112e5565b6000908152602081209092505b8183106114535750508201602001816114076113df565b600181602092548386890101520192019161143c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208088019190915292151560051b8601909201925083915061140790506113df565b8060606020809388010152016112d9565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b818110611556576115528561153e81870382611fd1565b604051918291602083526020830190612227565b0390f35b8254845260209093019260019283019201611527565b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985736602382011215610998578060040135906115c7826120b3565b916115d56040519384611fd1565b8083526024602084019160061b8301019136831161099857602401905b828210611ab4576024358467ffffffffffffffff82116109985736602383011215610998578160040135611625816120b3565b926116336040519485611fd1565b8184526024602085019260051b820101903682116109985760248101925b828410611a21578585611662612416565b60005b815181101561176d578073ffffffffffffffffffffffffffffffffffffffff60206116926001948661231e565b5101511667ffffffffffffffff6116a9838661231e565b515116908160005260046020526116e7816040600020816000526002810160205260406000206116d981546126dc565b908161172b575b50506128f4565b6116f4575b505001611665565b7f530cabd30786b7235e124a6c0db77e0b685ef22813b1fe87554247f404eb8ed69160409182519182526020820152a184806116ec565b81601f600093118a146117425750555b89806116e0565b8183526020832061175d91601f0160051c8101908b0161272f565b808252816020812091555561173b565b8260005b81518110156108e857611784818361231e565b51516020611792838561231e565b51015173ffffffffffffffffffffffffffffffffffffffff6020830151169182158015611a18575b80156119ec575b610b3f5767ffffffffffffffff905116806000526004602052604060002083600052600281016020526040600020835167ffffffffffffffff81116119bd5761180a82546126dc565b601f8111611980575b506020601f82116001146118d5579261186d9282889796959360019a99946000916118ca575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828c1b9260031b1c1916179055612a88565b61187b575b50505001611771565b7fad72a792d2a307f400c278be7deaeec6964276783304580cdc4e905436b8d5c5926118b96040519384938452606060208501526060840190612192565b9060408301520390a1838080611872565b90508701518c611839565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110611968575083899897969361186d969360019c9b968d9410611931575b5050811b019055612a88565b8901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c80611925565b9192602060018192868c015181550194019201611905565b6119ad90836000526020600020601f840160051c810191602085106119b3575b601f0160051c019061272f565b88611813565b90915081906119a0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b508151602083012060405160208101906000825260208152611a0f604082611fd1565b519020146117c1565b508151156117ba565b833567ffffffffffffffff811161099857820160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82360301126109985760405191611a6d83611f99565b611a7a36602484016121f1565b835260648201359267ffffffffffffffff841161099857611aa560209493602486953692010161203e565b83820152815201930192611651565b6020604091611ac336856121f1565b8152019101906115f2565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610998576115526040805190611b0f8183611fd1565b601f82527f4d756c7469416767726567617465526174654c696d6974657220312e362e3000602083015251918291602083526020830190612192565b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857611b82612012565b6024359081151582036109985760a091611ba491611b9e6122f3565b506123e1565b6fffffffffffffffffffffffffffffffff60405191611bc283611f7d565b8181549181831685526001602086019163ffffffff8560801c16835260ff6040880195891c161515855201549263ffffffff60608701928486168452608088019560801c8652611c106122f3565b508480855116611c3d828b5116611c37611c2d8787511642612409565b858c5116906126c9565b906123a5565b80821015611c7557505b1680985281421681526040519788525116602087015251151560408601525116606084015251166080820152f35b9050611c47565b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261099857611cf282611f7d565b80600401358252611d0560248201612029565b9060208301918252604481013567ffffffffffffffff811161099857611d31906004369184010161203e565b6040840152606481013567ffffffffffffffff811161099857611d5a906004369184010161203e565b606084015260848101359067ffffffffffffffff821161099857019036602383011215610998576080611da067ffffffffffffffff93369060246004820135910161210f565b9301928352611dad612361565b51169051611dbc6000836123e1565b9060ff825460a01c16611dcb57005b60009260005b8251811015610ee857816000526004602052611e0a604060002073ffffffffffffffffffffffffffffffffffffffff610cfd848761231e565b611e17575b600101611dd1565b93611e22858461231e565b5173ffffffffffffffffffffffffffffffffffffffff60055416604073ffffffffffffffffffffffffffffffffffffffff83511660248251809481937fd02641a000000000000000000000000000000000000000000000000000000000835260048301525afa8015610edc57600090611ee4575b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505116908115610df75791670de0b6b3a7640000610de8611edc9360206001960151906126c9565b949050611e0f565b6040823d8211611f75575b81611efc60409383611fd1565b81010312610ecd5760405191611f1183611f99565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610ed0578352602001519063ffffffff82168203610ecd575060208201527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90611e96565b3d9150611eef565b60a0810190811067ffffffffffffffff8211176119bd57604052565b6040810190811067ffffffffffffffff8211176119bd57604052565b6060810190811067ffffffffffffffff8211176119bd57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176119bd57604052565b6004359067ffffffffffffffff8216820361099857565b359067ffffffffffffffff8216820361099857565b81601f820112156109985780359067ffffffffffffffff82116119bd5760405192612091601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200185611fd1565b8284526020838301011161099857816000926020809301838601378301015290565b67ffffffffffffffff81116119bd5760051b60200190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361099857565b359073ffffffffffffffffffffffffffffffffffffffff8216820361099857565b92919261211b826120b3565b936121296040519586611fd1565b602085848152019260061b82019181831161099857925b82841061214d5750505050565b604084830312610998576020604091825161216781611f99565b612170876120ee565b81528287013583820152815201930192612140565b3590811515820361099857565b919082519283825260005b8481106121dc5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161219d565b91908260409103126109985760405161220981611f99565b602061222281839561221a81612029565b8552016120ee565b910152565b906020808351928381520192019060005b8181106122455750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612238565b9080601f83011215610998578135612288816120b3565b926122966040519485611fd1565b81845260208085019260051b82010192831161099857602001905b8282106122be5750505090565b602080916122cb846120ee565b8152019101906122b1565b35906fffffffffffffffffffffffffffffffff8216820361099857565b6040519061230082611f7d565b60006080838281528260208201528260408201528260608201520152565b80518210156123325760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3360005260036020526040600020541561237757565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b919082018092116123b257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff1660005260066020526040600020906000146124065760020190565b90565b919082039182116123b257565b73ffffffffffffffffffffffffffffffffffffffff60015416330361243757565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b805460ff8160a01c161580156126c1575b6126bc576fffffffffffffffffffffffffffffffff811690600183019081546124b763ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642612409565b908161261e575b50508481106125ec57508382106125435750916020916fffffffffffffffffffffffffffffffff80612511847f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a97612409565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b5460801c6125518285612409565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018281116123b257612584916123a5565b9080156125bd5790047f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b84907ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8285929395116126925761263992611c379160801c906126c9565b8083101561268d5750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806124be565b612644565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b505050565b508215612472565b818102929181159184041417156123b257565b90600182811c92168015612725575b60208310146126f657565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916126eb565b81811061273a575050565b6000815560010161272f565b80548210156123325760005260206000200190600090565b60008181526003602052604090205480156128ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116123b257600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116123b25780820361287e575b505050600254801561284f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161280c816002612746565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6128d561288f6128a0936002612746565b90549060031b1c9283926002612746565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806127d3565b5050600090565b9060018201918160005282602052604060002054801515600014612a1f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116123b2578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116123b2578082036129e8575b5050508054801561284f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906129a98282612746565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b612a086129f86128a09386612746565b90549060031b1c92839286612746565b905560005283602052604060002055388080612971565b50505050600090565b80600052600360205260406000205415600014612a8257600254680100000000000000008110156119bd57612a696128a08260018594016002556002612746565b9055600254906000526003602052604060002055600190565b50600090565b60008281526001820160205260409020546128ed57805490680100000000000000008210156119bd5782612ac66128a0846001809601855584612746565b90558054926000520160205260406000205560019056fea164736f6c634300081a000a", } var MultiAggregateRateLimiterABI = MultiAggregateRateLimiterMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go b/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go index 5593b55e827..97258d80cdf 100644 --- a/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go +++ b/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go @@ -48,7 +48,7 @@ type NonceManagerPreviousRampsArgs struct { var NonceManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"authorizedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyPreviousRampsUpdates\",\"inputs\":[{\"name\":\"previousRampsArgs\",\"type\":\"tuple[]\",\"internalType\":\"structNonceManager.PreviousRampsArgs[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"overrideExistingRamps\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"prevRamps\",\"type\":\"tuple\",\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getIncrementedOutboundNonce\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getOutboundNonce\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPreviousRamps\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"incrementInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"expectedNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"PreviousRampsUpdated\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"prevRamp\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedIncorrectNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousRampAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", - Bin: "0x60806040523461020f576117738038038061001981610214565b92833981019060208183031261020f578051906001600160401b03821161020f570181601f8201121561020f578051916001600160401b0383116101c8578260051b9160208061006a818601610214565b80968152019382010191821161020f57602001915b8183106101ef578333156101de57600180546001600160a01b031916331790556020906100ab82610214565b60008152600036813760408051929083016001600160401b038111848210176101c8576040528252808383015260005b8151811015610142576001906001600160a01b036100f98285610239565b5116856101058261027b565b610112575b5050016100db565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1858561010a565b50505160005b81518110156101b9576001600160a01b036101638284610239565b51169081156101a8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef848361019a600195610379565b50604051908152a101610148565b6342bcdf7f60e11b60005260046000fd5b60405161139990816103da8239f35b634e487b7160e01b600052604160045260246000fd5b639b15e16f60e01b60005260046000fd5b82516001600160a01b038116810361020f5781526020928301920161007f565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176101c857604052565b805182101561024d5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561024d5760005260206000200190600090565b600081815260036020526040902054801561037257600019810181811161035c5760025460001981019190821161035c5780820361030b575b50505060025480156102f557600019016102cf816002610263565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61034461031c61032d936002610263565b90549060031b1c9283926002610263565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806102b4565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146103d357600254680100000000000000008110156101c8576103ba61032d8260018594016002556002610263565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c908163181f5a7714610a94575080632451a627146109a6578063294b5630146108ff57806379ba5097146108165780637a75a094146105f95780638da5cb5b146105a757806391a2749a146103bd578063bf18402a14610373578063c9223625146102fe578063e0e03cae14610272578063ea458c0c1461019b5763f2fde38b146100a357600080fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff8116809103610196576100fb610e81565b33811461016c57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760206101d4610bef565b6101dc610c06565b6101e461113a565b67ffffffffffffffff6101ff6101fa8385610f2f565b610d1e565b92166000526005835273ffffffffffffffffffffffffffffffffffffffff604060002091166000528252604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905567ffffffffffffffff60405191168152f35b346101965760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576102a9610bef565b60243567ffffffffffffffff81168103610196576044359067ffffffffffffffff8211610196576020926102e46102f4933690600401610cba565b9290916102ef61113a565b610d6d565b6040519015158152f35b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657610335610bef565b60243567ffffffffffffffff81116101965760209161035b610361923690600401610cba565b9161104a565b67ffffffffffffffff60405191168152f35b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760206103616103af610bef565b6103b7610c06565b90610f2f565b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043567ffffffffffffffff81116101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610196576040519061043782610b63565b806004013567ffffffffffffffff81116101965761045b9060043691840101610c4a565b825260248101359067ffffffffffffffff82116101965760046104819236920101610c4a565b60208201908152610490610e81565b519060005b8251811015610508578073ffffffffffffffffffffffffffffffffffffffff6104c060019386610ecc565b51166104cb81611196565b6104d7575b5001610495565b60207fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1846104d0565b505160005b81518110156105a55773ffffffffffffffffffffffffffffffffffffffff6105358284610ecc565b511690811561057b577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef60208361056d60019561132c565b50604051908152a10161050d565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b005b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043567ffffffffffffffff8111610196573660238201121561019657806004013567ffffffffffffffff8111610196573660248260071b8401011161019657610670610e81565b60005b818110156105a55760008160071b84016024810167ffffffffffffffff61069982610ce8565b1683526004602052604083209273ffffffffffffffffffffffffffffffffffffffff845416158015906107f3575b6107b3575b5060408273ffffffffffffffffffffffffffffffffffffffff6107a667ffffffffffffffff6107907fa2e43edcbc4fd175ae4bebbe3fd6139871ed1f1783cd4a1ace59b90d302c3319966084606460019c9b9a01968661072b89610cfd565b167fffffffffffffffffffffffff00000000000000000000000000000000000000008c5416178b550198858c6107608c610cfd565b920191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610ce8565b16958261079e865195610c29565b168452610c29565b166020820152a201610673565b60448301358015908115036107ef57156106cc57807fc6117ae20000000000000000000000000000000000000000000000000000000060049252fd5b5080fd5b5073ffffffffffffffffffffffffffffffffffffffff60018501541615156106c7565b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760005473ffffffffffffffffffffffffffffffffffffffff811633036108d5577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965767ffffffffffffffff61093f610bef565b6000602060405161094f81610b63565b828152015216600052600460205260408060002073ffffffffffffffffffffffffffffffffffffffff825161098381610b63565b602082600181865416958685520154169101908152835192835251166020820152f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576040518060206002549283815201809260026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b818110610a7e5750505081610a25910382610bae565b6040519182916020830190602084525180915260408301919060005b818110610a4f575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101610a41565b8254845260209093019260019283019201610a0f565b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657610acc81610b63565b601681527f4e6f6e63654d616e6167657220312e362e302d64657600000000000000000000602082015260405190602082528181519182602083015260005b838110610b4b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610b0b565b6040810190811067ffffffffffffffff821117610b7f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b7f57604052565b6004359067ffffffffffffffff8216820361019657565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361019657565b359073ffffffffffffffffffffffffffffffffffffffff8216820361019657565b9080601f830112156101965781359167ffffffffffffffff8311610b7f578260051b9060405193610c7e6020840186610bae565b845260208085019282010192831161019657602001905b828210610ca25750505090565b60208091610caf84610c29565b815201910190610c95565b9181601f840112156101965782359167ffffffffffffffff8311610196576020838186019501011161019657565b3567ffffffffffffffff811681036101965790565b3573ffffffffffffffffffffffffffffffffffffffff811681036101965790565b67ffffffffffffffff60019116019067ffffffffffffffff8211610d3e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291909267ffffffffffffffff610d886101fa85858561104a565b94168067ffffffffffffffff861603610df8575067ffffffffffffffff9291836020921660005260068252604060002083604051948593843782019081520301902091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600190565b7f606ff8179e5e3c059b82df931acc496b7b6053e8879042f8267f930e0595f69f9450601f8467ffffffffffffffff956080957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09460405198899716875260208701526060604087015281606087015286860137600085828601015201168101030190a1600090565b73ffffffffffffffffffffffffffffffffffffffff600154163303610ea257565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b8051821015610ee05760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610196575167ffffffffffffffff811681036101965790565b67ffffffffffffffff1690816000526005602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205267ffffffffffffffff60406000205416918215610f8157505090565b600052600460205273ffffffffffffffffffffffffffffffffffffffff604060002054169081610fb057505090565b6020919250602473ffffffffffffffffffffffffffffffffffffffff9160405194859384927f856c82470000000000000000000000000000000000000000000000000000000084521660048301525afa90811561103e57600091611012575090565b611034915060203d602011611037575b61102c8183610bae565b810190610f0f565b90565b503d611022565b6040513d6000823e3d90fd5b67ffffffffffffffff90929192169182600052600660205267ffffffffffffffff60406000206020604051809286868337868201908152030190205416928315611095575b50505090565b600052600460205273ffffffffffffffffffffffffffffffffffffffff6001604060002001541691821561108f57819293509060209181010312610196573573ffffffffffffffffffffffffffffffffffffffff8116809103610196576020906024604051809481937f856c824700000000000000000000000000000000000000000000000000000000835260048301525afa90811561103e57600091611012575090565b3360005260036020526040600020541561115057565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b8054821015610ee05760005260206000200190600090565b6000818152600360205260409020548015611325577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111610d3e57600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211610d3e578082036112b6575b5050506002548015611287577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161124481600261117e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61130d6112c76112d893600261117e565b90549060031b1c928392600261117e565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600052600360205260406000205538808061120b565b5050600090565b806000526003602052604060002054156000146113865760025468010000000000000000811015610b7f5761136d6112d8826001859401600255600261117e565b9055600254906000526003602052604060002055600190565b5060009056fea164736f6c634300081a000a", + Bin: "0x60806040523461020f576117738038038061001981610214565b92833981019060208183031261020f578051906001600160401b03821161020f570181601f8201121561020f578051916001600160401b0383116101c8578260051b9160208061006a818601610214565b80968152019382010191821161020f57602001915b8183106101ef578333156101de57600180546001600160a01b031916331790556020906100ab82610214565b60008152600036813760408051929083016001600160401b038111848210176101c8576040528252808383015260005b8151811015610142576001906001600160a01b036100f98285610239565b5116856101058261027b565b610112575b5050016100db565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1858561010a565b50505160005b81518110156101b9576001600160a01b036101638284610239565b51169081156101a8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef848361019a600195610379565b50604051908152a101610148565b6342bcdf7f60e11b60005260046000fd5b60405161139990816103da8239f35b634e487b7160e01b600052604160045260246000fd5b639b15e16f60e01b60005260046000fd5b82516001600160a01b038116810361020f5781526020928301920161007f565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176101c857604052565b805182101561024d5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561024d5760005260206000200190600090565b600081815260036020526040902054801561037257600019810181811161035c5760025460001981019190821161035c5780820361030b575b50505060025480156102f557600019016102cf816002610263565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61034461031c61032d936002610263565b90549060031b1c9283926002610263565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806102b4565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146103d357600254680100000000000000008110156101c8576103ba61032d8260018594016002556002610263565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c908163181f5a7714610a94575080632451a627146109a6578063294b5630146108ff57806379ba5097146108165780637a75a094146105f95780638da5cb5b146105a757806391a2749a146103bd578063bf18402a14610373578063c9223625146102fe578063e0e03cae14610272578063ea458c0c1461019b5763f2fde38b146100a357600080fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff8116809103610196576100fb610e81565b33811461016c57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760206101d4610bef565b6101dc610c06565b6101e461113a565b67ffffffffffffffff6101ff6101fa8385610f2f565b610d1e565b92166000526005835273ffffffffffffffffffffffffffffffffffffffff604060002091166000528252604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905567ffffffffffffffff60405191168152f35b346101965760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576102a9610bef565b60243567ffffffffffffffff81168103610196576044359067ffffffffffffffff8211610196576020926102e46102f4933690600401610cba565b9290916102ef61113a565b610d6d565b6040519015158152f35b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657610335610bef565b60243567ffffffffffffffff81116101965760209161035b610361923690600401610cba565b9161104a565b67ffffffffffffffff60405191168152f35b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760206103616103af610bef565b6103b7610c06565b90610f2f565b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043567ffffffffffffffff81116101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610196576040519061043782610b63565b806004013567ffffffffffffffff81116101965761045b9060043691840101610c4a565b825260248101359067ffffffffffffffff82116101965760046104819236920101610c4a565b60208201908152610490610e81565b519060005b8251811015610508578073ffffffffffffffffffffffffffffffffffffffff6104c060019386610ecc565b51166104cb81611196565b6104d7575b5001610495565b60207fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1846104d0565b505160005b81518110156105a55773ffffffffffffffffffffffffffffffffffffffff6105358284610ecc565b511690811561057b577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef60208361056d60019561132c565b50604051908152a10161050d565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b005b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043567ffffffffffffffff8111610196573660238201121561019657806004013567ffffffffffffffff8111610196573660248260071b8401011161019657610670610e81565b60005b818110156105a55760008160071b84016024810167ffffffffffffffff61069982610ce8565b1683526004602052604083209273ffffffffffffffffffffffffffffffffffffffff845416158015906107f3575b6107b3575b5060408273ffffffffffffffffffffffffffffffffffffffff6107a667ffffffffffffffff6107907fa2e43edcbc4fd175ae4bebbe3fd6139871ed1f1783cd4a1ace59b90d302c3319966084606460019c9b9a01968661072b89610cfd565b167fffffffffffffffffffffffff00000000000000000000000000000000000000008c5416178b550198858c6107608c610cfd565b920191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610ce8565b16958261079e865195610c29565b168452610c29565b166020820152a201610673565b60448301358015908115036107ef57156106cc57807fc6117ae20000000000000000000000000000000000000000000000000000000060049252fd5b5080fd5b5073ffffffffffffffffffffffffffffffffffffffff60018501541615156106c7565b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760005473ffffffffffffffffffffffffffffffffffffffff811633036108d5577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965767ffffffffffffffff61093f610bef565b6000602060405161094f81610b63565b828152015216600052600460205260408060002073ffffffffffffffffffffffffffffffffffffffff825161098381610b63565b602082600181865416958685520154169101908152835192835251166020820152f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576040518060206002549283815201809260026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b818110610a7e5750505081610a25910382610bae565b6040519182916020830190602084525180915260408301919060005b818110610a4f575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101610a41565b8254845260209093019260019283019201610a0f565b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657610acc81610b63565b601281527f4e6f6e63654d616e6167657220312e362e300000000000000000000000000000602082015260405190602082528181519182602083015260005b838110610b4b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610b0b565b6040810190811067ffffffffffffffff821117610b7f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b7f57604052565b6004359067ffffffffffffffff8216820361019657565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361019657565b359073ffffffffffffffffffffffffffffffffffffffff8216820361019657565b9080601f830112156101965781359167ffffffffffffffff8311610b7f578260051b9060405193610c7e6020840186610bae565b845260208085019282010192831161019657602001905b828210610ca25750505090565b60208091610caf84610c29565b815201910190610c95565b9181601f840112156101965782359167ffffffffffffffff8311610196576020838186019501011161019657565b3567ffffffffffffffff811681036101965790565b3573ffffffffffffffffffffffffffffffffffffffff811681036101965790565b67ffffffffffffffff60019116019067ffffffffffffffff8211610d3e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291909267ffffffffffffffff610d886101fa85858561104a565b94168067ffffffffffffffff861603610df8575067ffffffffffffffff9291836020921660005260068252604060002083604051948593843782019081520301902091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600190565b7f606ff8179e5e3c059b82df931acc496b7b6053e8879042f8267f930e0595f69f9450601f8467ffffffffffffffff956080957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09460405198899716875260208701526060604087015281606087015286860137600085828601015201168101030190a1600090565b73ffffffffffffffffffffffffffffffffffffffff600154163303610ea257565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b8051821015610ee05760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610196575167ffffffffffffffff811681036101965790565b67ffffffffffffffff1690816000526005602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205267ffffffffffffffff60406000205416918215610f8157505090565b600052600460205273ffffffffffffffffffffffffffffffffffffffff604060002054169081610fb057505090565b6020919250602473ffffffffffffffffffffffffffffffffffffffff9160405194859384927f856c82470000000000000000000000000000000000000000000000000000000084521660048301525afa90811561103e57600091611012575090565b611034915060203d602011611037575b61102c8183610bae565b810190610f0f565b90565b503d611022565b6040513d6000823e3d90fd5b67ffffffffffffffff90929192169182600052600660205267ffffffffffffffff60406000206020604051809286868337868201908152030190205416928315611095575b50505090565b600052600460205273ffffffffffffffffffffffffffffffffffffffff6001604060002001541691821561108f57819293509060209181010312610196573573ffffffffffffffffffffffffffffffffffffffff8116809103610196576020906024604051809481937f856c824700000000000000000000000000000000000000000000000000000000835260048301525afa90811561103e57600091611012575090565b3360005260036020526040600020541561115057565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b8054821015610ee05760005260206000200190600090565b6000818152600360205260409020548015611325577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111610d3e57600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211610d3e578082036112b6575b5050506002548015611287577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161124481600261117e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61130d6112c76112d893600261117e565b90549060031b1c928392600261117e565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600052600360205260406000205538808061120b565b5050600090565b806000526003602052604060002054156000146113865760025468010000000000000000811015610b7f5761136d6112d8826001859401600255600261117e565b9055600254906000526003602052604060002055600190565b5060009056fea164736f6c634300081a000a", } var NonceManagerABI = NonceManagerMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/offramp/offramp.go index d6a6119fa7d..fd3e1bba087 100644 --- a/core/gethwrappers/ccip/generated/offramp/offramp.go +++ b/core/gethwrappers/ccip/generated/offramp/offramp.go @@ -158,7 +158,7 @@ type OffRampStaticConfig struct { var OffRampMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applySourceChainConfigUpdates\",\"inputs\":[{\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"commit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"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\":\"execute\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeSingleMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllSourceChainConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExecutionState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMerkleRoot\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyExecute\",\"inputs\":[{\"name\":\"reports\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\",\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"components\":[{\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AlreadyAttempted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RootRemoved\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedAlreadyExecutedMessage\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedReportExecution\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainConfigSet\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sourceConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainSelectorAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaticConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CommitOnRampMismatch\",\"inputs\":[{\"name\":\"reportOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"configOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"EmptyBatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyReport\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientGasToCompleteTx\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"InvalidDataLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInterval\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"min\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"max\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionGasLimit\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"newLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionTokenGasOverride\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"oldLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverride\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageDestChainSelector\",\"inputs\":[{\"name\":\"messageDestChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNewState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newState\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}]},{\"type\":\"error\",\"name\":\"InvalidOnRampUpdate\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionGasAmountCountMismatch\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ManualExecutionGasLimitMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionNotYetEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotACompatiblePool\",\"inputs\":[{\"name\":\"notPool\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReceiverError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReleaseOrMintBalanceMismatch\",\"inputs\":[{\"name\":\"amountReleased\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePre\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePost\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RootAlreadyCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"RootBlessingMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"isBlessed\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"RootNotCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SourceChainNotEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SourceChainSelectorMismatch\",\"inputs\":[{\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"StaleCommitReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"TokenDataMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"TokenHandlingError\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedTokenData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", - Bin: "0x610140806040523461084b57616654803803809161001d8285610881565b8339810190808203610120811261084b5760a0811261084b5760405161004281610866565b61004b836108a4565b8152602083015161ffff8116810361084b57602082019081526040840151906001600160a01b038216820361084b576040830191825261008d606086016108b8565b926060810193845260606100a3608088016108b8565b6080830190815295609f19011261084b5760405194606086016001600160401b03811187821017610850576040526100dd60a088016108b8565b865260c08701519463ffffffff8616860361084b576020870195865261010560e089016108b8565b6040880190815261010089015190986001600160401b03821161084b570189601f8201121561084b578051996001600160401b038b11610850578a60051b916040519b6101568d6020860190610881565b8c526020808d01938201019082821161084b5760208101935b82851061073a575050505050331561072957600180546001600160a01b031916331790554660805284516001600160a01b0316158015610717575b8015610705575b6106e35782516001600160401b0316156106f45782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a181516001600160a01b0316156106e357905160048054835163ffffffff60a01b60a09190911b166001600160a01b039384166001600160c01b03199092168217179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff166020820152925116908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d90606090a160005b8151811015610656576020600582901b8301810151908101516001600160401b031690600082156106475781516001600160a01b0316156105ae57828152600860205260408120916080810151600184019261035384546108d9565b6105e8578454600160a81b600160e81b031916600160a81b1785556040518681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b815180159081156105bd575b506105ae578151916001600160401b03831161059a576103c785546108d9565b601f8111610555575b50602091601f84116001146104d65760ff948460019a9998956104c2956000805160206166348339815191529995606095926104cb575b5050600019600383901b1c1916908b1b1783555b604081015115158554908760a01b9060a01b16908760a01b1916178555898060a01b038151168a8060a01b0319865416178555015115158354908560e81b9060e81b16908560e81b191617835561047186610996565b506040519384936020855254898060a01b0381166020860152818160a01c1615156040860152898060401b038160a81c16606086015260e81c161515608084015260a08084015260c0830190610913565b0390a2016102f7565b015190503880610407565b9190601f198416868452828420935b81811061053d5750946001856104c2956000805160206166348339815191529995606095849e9d9c9960ff9b10610524575b505050811b01835561041b565b015160001960f88460031b161c19169055388080610517565b929360206001819287860151815501950193016104e5565b85835260208320601f850160051c81019160208610610590575b601f0160051c01905b81811061058557506103d0565b838155600101610578565b909150819061056f565b634e487b7160e01b82526041600452602482fd5b6342bcdf7f60e11b8152600490fd5b905060208301206040516020810190838252602081526105de604082610881565b51902014386103a7565b845460a81c6001600160401b03166001141580610619575b1561039b57632105803760e11b81526004869052602490fd5b506040516106328161062b8188610913565b0382610881565b60208151910120825160208401201415610600565b63c656089560e01b8152600490fd5b604051615c0a9081610a2a82396080518161327e015260a05181818161019f0152614367015260c0518181816101f501528181612ebd0152818161379201528181613a660152614301015260e0518181816102240152614b63015261010051818181610253015261472c0152610120518181816101c6015281816121b101528181614c5601526158bb0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101b1565b5080516001600160a01b0316156101aa565b639b15e16f60e01b60005260046000fd5b84516001600160401b03811161084b57820160a0818603601f19011261084b576040519061076782610866565b60208101516001600160a01b038116810361084b57825261078a604082016108a4565b602083015261079b606082016108cc565b60408301526107ac608082016108cc565b606083015260a08101516001600160401b03811161084b57602091010185601f8201121561084b5780516001600160401b03811161085057604051916107fc601f8301601f191660200184610881565b818352876020838301011161084b5760005b828110610836575050918160006020809694958196010152608082015281520194019361016f565b8060208092840101518282870101520161080e565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761085057604052565b601f909101601f19168101906001600160401b0382119082101761085057604052565b51906001600160401b038216820361084b57565b51906001600160a01b038216820361084b57565b5190811515820361084b57565b90600182811c92168015610909575b60208310146108f357565b634e487b7160e01b600052602260045260246000fd5b91607f16916108e8565b60009291815491610923836108d9565b8083529260018116908115610979575060011461093f57505050565b60009081526020812093945091925b83831061095f575060209250010190565b60018160209294939454838587010152019101919061094e565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a235760065468010000000000000000811015610850576001810180600655811015610a0d577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806306285c6914610157578063181f5a77146101525780633f4b04aa1461014d5780635215505b146101485780635e36480c146101435780635e7bb0081461013e57806360987c20146101395780636f9e320f146101345780637437ff9f1461012f57806379ba50971461012a57806385572ffb146101255780638da5cb5b14610120578063c673e5841461011b578063ccd37ba314610116578063cd19723714610111578063de5e0b9a1461010c578063e9d68a8e14610107578063f2fde38b14610102578063f58e03fc146100fd5763f716f99f146100f857600080fd5b6118ae565b611791565b611706565b611661565b6115c5565b611467565b611408565b611343565b61125b565b611225565b6111a5565b611105565b610f90565b610f15565b610d0e565b610729565b6105ba565b61049e565b61043f565b61016c565b600091031261016757565b600080fd5b34610167576000366003190112610167576101856119e9565b506102cd604051610195816102e7565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761030257604052565b6102d1565b604081019081106001600160401b0382111761030257604052565b606081019081106001600160401b0382111761030257604052565b608081019081106001600160401b0382111761030257604052565b90601f801991011681019081106001600160401b0382111761030257604052565b6040519061038860c083610358565b565b6040519061038860a083610358565b60405190610388608083610358565b6040519061038861010083610358565b60405190610388604083610358565b6001600160401b03811161030257601f01601f191660200190565b604051906103f1602083610358565b60008252565b60005b83811061040a5750506000910152565b81810151838201526020016103fa565b90602091610433815180928185528580860191016103f7565b601f01601f1916010190565b34610167576000366003190112610167576102cd60408051906104628183610358565b601182527f4f666652616d7020312e362e302d64657600000000000000000000000000000060208301525191829160208352602083019061041a565b346101675760003660031901126101675760206001600160401b03600b5416604051908152f35b9060a06080610516936001600160a01b0381511684526020810151151560208501526001600160401b036040820151166040850152606081015115156060850152015191816080820152019061041a565b90565b6040810160408252825180915260206060830193019060005b81811061059b575050506020818303910152815180825260208201916020808360051b8301019401926000915b83831061056e57505050505090565b909192939460208061058c600193601f1986820301875289516104c5565b9701930193019193929061055f565b82516001600160401b0316855260209485019490920191600101610532565b34610167576000366003190112610167576006546105d781610771565b906105e56040519283610358565b808252601f196105f482610771565b0160005b8181106106b657505061060a81611a42565b9060005b8181106106265750506102cd60405192839283610519565b8061065c6106446106386001946141e8565b6001600160401b031690565b61064e8387611a9c565b906001600160401b03169052565b61069a61069561067c61066f8488611a9c565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611b88565b6106a48287611a9c565b526106af8186611a9c565b500161060e565b6020906106c1611a14565b828287010152016105f8565b600435906001600160401b038216820361016757565b35906001600160401b038216820361016757565b634e487b7160e01b600052602160045260246000fd5b6004111561071757565b6106f7565b9060048210156107175752565b34610167576040366003190112610167576107426106cd565b602435906001600160401b03821682036101675760209161076291611c31565b61076f604051809261071c565bf35b6001600160401b0381116103025760051b60200190565b91908260a0910312610167576040516107a0816102e7565b60806107e5818395803585526107b8602082016106e3565b60208601526107c9604082016106e3565b60408601526107da606082016106e3565b6060860152016106e3565b910152565b9291926107f6826103c7565b916108046040519384610358565b829481845281830111610167578281602093846000960137010152565b9080601f8301121561016757816020610516933591016107ea565b6001600160a01b0381160361016757565b35906103888261083c565b63ffffffff81160361016757565b359061038882610858565b81601f820112156101675780359061088882610771565b926108966040519485610358565b82845260208085019360051b830101918183116101675760208101935b8385106108c257505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757604051916108ef836102e7565b60208201356001600160401b0381116101675785602061091192850101610821565b835260408201356109218161083c565b602084015261093260608301610866565b60408401526080820135926001600160401b0384116101675760a08361095f886020809881980101610821565b6060840152013560808201528152019401936108b3565b919091610140818403126101675761098c610379565b926109978183610788565b845260a08201356001600160401b03811161016757816109b8918401610821565b602085015260c08201356001600160401b03811161016757816109dc918401610821565b60408501526109ed60e0830161084d565b606085015261010082013560808501526101208201356001600160401b03811161016757610a1b9201610871565b60a0830152565b9080601f83011215610167578135610a3981610771565b92610a476040519485610358565b81845260208085019260051b820101918383116101675760208201905b838210610a7357505050505090565b81356001600160401b03811161016757602091610a9587848094880101610976565b815201910190610a64565b81601f8201121561016757803590610ab782610771565b92610ac56040519485610358565b82845260208085019360051b830101918183116101675760208101935b838510610af157505050505090565b84356001600160401b03811161016757820183603f82011215610167576020810135610b1c81610771565b91610b2a6040519384610358565b8183526020808085019360051b83010101918683116101675760408201905b838210610b63575050509082525060209485019401610ae2565b81356001600160401b03811161016757602091610b878a8480809589010101610821565b815201910190610b49565b929190610b9e81610771565b93610bac6040519586610358565b602085838152019160051b810192831161016757905b828210610bce57505050565b8135815260209182019101610bc2565b9080601f830112156101675781602061051693359101610b92565b81601f8201121561016757803590610c1082610771565b92610c1e6040519485610358565b82845260208085019360051b830101918183116101675760208101935b838510610c4a57505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757610c7261038a565b91610c7f602083016106e3565b835260408201356001600160401b03811161016757856020610ca392850101610a22565b602084015260608201356001600160401b03811161016757856020610cca92850101610aa0565b60408401526080820135926001600160401b0384116101675760a083610cf7886020809881980101610bde565b606084015201356080820152815201940193610c3b565b34610167576040366003190112610167576004356001600160401b03811161016757610d3e903690600401610bf9565b6024356001600160401b038111610167573660238201121561016757806004013591610d6983610771565b91610d776040519384610358565b8383526024602084019460051b820101903682116101675760248101945b828610610da857610da68585611c79565b005b85356001600160401b03811161016757820136604382011215610167576024810135610dd381610771565b91610de16040519384610358565b818352602060248185019360051b83010101903682116101675760448101925b828410610e1b575050509082525060209586019501610d95565b83356001600160401b038111610167576024908301016040601f1982360301126101675760405190610e4c82610307565b6020810135825260408101356001600160401b03811161016757602091010136601f8201121561016757803590610e8282610771565b91610e906040519384610358565b80835260208084019160051b8301019136831161016757602001905b828210610ecb5750505091816020938480940152815201930192610e01565b602080918335610eda81610858565b815201910190610eac565b9181601f84011215610167578235916001600160401b038311610167576020808501948460051b01011161016757565b34610167576060366003190112610167576004356001600160401b03811161016757610f45903690600401610976565b6024356001600160401b03811161016757610f64903690600401610ee5565b91604435926001600160401b03841161016757610f88610da6943690600401610ee5565b939092612089565b34610167576060366003190112610167576000604051610faf81610322565b600435610fbb8161083c565b8152602435610fc981610858565b6020820190815260443590610fdd8261083c565b60408301918252610fec613534565b6001600160a01b03835116156110f657916110b86001600160a01b036110f0937fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d95611051838651166001600160a01b03166001600160a01b03196004541617600455565b517fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006004549260a01b1691161760045551166001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b0390a180f35b6342bcdf7f60e11b8452600484fd5b346101675760003660031901126101675760006040805161112581610322565b82815282602082015201526102cd60405161113f81610322565b63ffffffff6004546001600160a01b038116835260a01c1660208201526001600160a01b036005541660408201526040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b34610167576000366003190112610167576000546001600160a01b0381163303611214576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b34610167576020366003190112610167576004356001600160401b0381116101675760a090600319903603011261016757600080fd5b346101675760003660031901126101675760206001600160a01b0360015416604051908152f35b6004359060ff8216820361016757565b359060ff8216820361016757565b906020808351928381520192019060005b8181106112be5750505090565b82516001600160a01b03168452602093840193909201916001016112b1565b906105169160208152606082518051602084015260ff602082015116604084015260ff60408201511682840152015115156080820152604061132e602084015160c060a085015260e08401906112a0565b9201519060c0601f19828503019101526112a0565b346101675760203660031901126101675760ff61135e611282565b60606040805161136d81610322565b81516113788161033d565b6000815260006020820152600083820152600084820152815282602082015201521660005260026020526102cd604060002060036113f7604051926113bc84610322565b6113c581612366565b84526040516113e2816113db816002860161239f565b0382610358565b60208501526113db604051809481930161239f565b6040820152604051918291826112dd565b34610167576040366003190112610167576114216106cd565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b8015150361016757565b359061038882611452565b34610167576020366003190112610167576004356001600160401b0381116101675736602382011215610167578060040135906114a382610771565b906114b16040519283610358565b8282526024602083019360051b820101903682116101675760248101935b8285106114df57610da6846123f6565b84356001600160401b03811161016757820160a06023198236030112610167576040519161150c836102e7565b602482013561151a8161083c565b8352611528604483016106e3565b6020840152606482013561153b81611452565b6040840152608482013561154e81611452565b606084015260a4820135926001600160401b0384116101675761157b602094936024869536920101610821565b60808201528152019401936114cf565b9060049160441161016757565b9181601f84011215610167578235916001600160401b038311610167576020838186019501011161016757565b346101675760c0366003190112610167576115df3661158b565b6044356001600160401b038111610167576115fe903690600401611598565b6064929192356001600160401b03811161016757611620903690600401610ee5565b60843594916001600160401b03861161016757611644610da6963690600401610ee5565b94909360a43596612cb9565b9060206105169281815201906104c5565b34610167576020366003190112610167576001600160401b036116826106cd565b61168a611a14565b501660005260086020526102cd60406000206116f56001604051926116ae846102e7565b6116ef60ff82546001600160a01b0381168752818160a01c16151560208801526001600160401b038160a81c16604088015260e81c16606086019015159052565b01611b6d565b608082015260405191829182611650565b34610167576020366003190112610167576001600160a01b0360043561172b8161083c565b611733613534565b1633811461178057806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b34610167576060366003190112610167576117ab3661158b565b6044356001600160401b038111610167576117ca903690600401611598565b91828201602083820312610167578235906001600160401b038211610167576117f4918401610bf9565b6040519060206118048184610358565b60008352601f19810160005b81811061183857505050610da69491611828916132bf565b611830612f33565b928392613bb0565b60608582018401528201611810565b9080601f8301121561016757813561185e81610771565b9261186c6040519485610358565b81845260208085019260051b82010192831161016757602001905b8282106118945750505090565b6020809183356118a38161083c565b815201910190611887565b34610167576020366003190112610167576004356001600160401b0381116101675736602382011215610167578060040135906118ea82610771565b906118f86040519283610358565b8282526024602083019360051b820101903682116101675760248101935b82851061192657610da684612f4f565b84356001600160401b03811161016757820160c060231982360301126101675761194e610379565b916024820135835261196260448301611292565b602084015261197360648301611292565b60408401526119846084830161145c565b606084015260a48201356001600160401b038111610167576119ac9060243691850101611847565b608084015260c4820135926001600160401b038411610167576119d9602094936024869536920101611847565b60a0820152815201940193611916565b604051906119f6826102e7565b60006080838281528260208201528260408201528260608201520152565b60405190611a21826102e7565b60606080836000815260006020820152600060408201526000838201520152565b90611a4c82610771565b611a596040519182610358565b8281528092611a6a601f1991610771565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611a975760200190565b611a74565b8051821015611a975760209160051b010190565b90600182811c92168015611ae0575b6020831014611aca57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611abf565b60009291815491611afa83611ab0565b8083529260018116908115611b505750600114611b1657505050565b60009081526020812093945091925b838310611b36575060209250010190565b600181602092949394548385870101520191019190611b25565b915050602093945060ff929192191683830152151560051b010190565b90610388611b819260405193848092611aea565b0383610358565b9060016080604051611b99816102e7565b611bef819560ff81546001600160a01b0381168552818160a01c16151560208601526001600160401b038160a81c16604086015260e81c1615156060840152611be86040518096819301611aea565b0384610358565b0152565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611c1f57565b611bf3565b91908203918211611c1f57565b611c3d82607f92613238565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611c1f576003911c1660048110156107175790565b611c8161327c565b805182518103611e7c5760005b818110611ca157505090610388916132bf565b611cab8184611a9c565b516020810190815151611cbe8488611a9c565b519283518203611e7c5790916000925b808410611ce2575050505050600101611c8e565b91949398611cf4848b98939598611a9c565b515198611d02888851611a9c565b519980611e33575b5060a08a01988b6020611d208b8d515193611a9c565b5101515103611df25760005b8a5151811015611ddd57611d68611d5f611d558f6020611d4d8f8793611a9c565b510151611a9c565b5163ffffffff1690565b63ffffffff1690565b8b81611d79575b5050600101611d2c565b611d5f6040611d8c85611d989451611a9c565b51015163ffffffff1690565b90818110611da757508b611d6f565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611cce565b611e2f8b51611e0d606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b6000fd5b60808b0151811015611d0a57611e2f908b611e5588516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190611e9a82610307565b60006020838281520152565b60405190611eb5602083610358565b600080835282815b828110611ec957505050565b602090611ed4611e8d565b82828501015201611ebd565b805182526001600160401b0360208201511660208301526080611f27611f15604084015160a0604087015260a086019061041a565b6060840151858203606087015261041a565b9101519160808183039101526020808351928381520192019060005b818110611f505750505090565b825180516001600160a01b031685526020908101518186015260409094019390920191600101611f43565b906020610516928181520190611ee0565b6040513d6000823e3d90fd5b3d15611fc3573d90611fa9826103c7565b91611fb76040519384610358565b82523d6000602084013e565b606090565b90602061051692818152019061041a565b9091606082840312610167578151611ff081611452565b9260208301516001600160401b0381116101675783019080601f830112156101675781519161201e836103c7565b9161202c6040519384610358565b838352602084830101116101675760409261204d91602080850191016103f7565b92015190565b9293606092959461ffff6120776001600160a01b0394608088526080880190611ee0565b97166020860152604085015216910152565b929093913033036123555761209c611ea6565b9460a0850151805161230e575b50505050508051916120c7602084519401516001600160401b031690565b9060208301519160408401926120f48451926120e161038a565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b0361211d6005546001600160a01b031690565b1680612291575b5051511580612285575b801561226f575b8015612246575b612242576121da918161217f61217361216661067c602060009751016001600160401b0390511690565b546001600160a01b031690565b6001600160a01b031690565b908361219a606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f00000000000000000000000000000000000000000000000000000000000000009060048601612053565b03925af190811561223d57600090600092612216575b50156121f95750565b6040516302a35ba360e21b8152908190611dd99060048301611fc8565b905061223591503d806000833e61222d8183610358565b810190611fd9565b5090386121f0565b611f8c565b5050565b5061226a61226661226160608401516001600160a01b031690565b6134e6565b1590565b61213c565b5060608101516001600160a01b03163b15612135565b5060808101511561212e565b803b1561016757600060405180926308d450a160e01b82528183816122b98a60048301611f7b565b03925af190816122f3575b506122ed57611dd96122d4611f98565b6040516309c2532560e01b815291829160048301611fc8565b38612124565b80612302600061230893610358565b8061015c565b386122c4565b859650602061234a96015161232d60608901516001600160a01b031690565b9061234460208a51016001600160401b0390511690565b926133cd565b9038808080806120a9565b6306e34e6560e31b60005260046000fd5b906040516123738161033d565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106123c35750505090565b82546001600160a01b03168452602090930192600192830192016123b6565b90610388611b81926040519384809261239f565b6123fe613534565b60005b8151811015612242576124148183611a9c565b519061242a60208301516001600160401b031690565b6001600160401b0381169081156126c05761245261217361217386516001600160a01b031690565b1561262b57612474816001600160401b03166000526008602052604060002090565b60808501519060018101926124898454611ab0565b612652576124fc7ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb9916124e284750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b8151801590811561263c575b5061262b5761260c6125d7606060019861254a612622967fbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c986135d6565b6125a061255a6040830151151590565b86547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178655565b6125d06125b482516001600160a01b031690565b86906001600160a01b03166001600160a01b0319825416179055565b0151151590565b82547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560e81b60ff60e81b16178255565b612615846159ce565b50604051918291826136a7565b0390a201612401565b6342bcdf7f60e11b60005260046000fd5b9050602083012061264b613559565b143861250c565b60016001600160401b0361267184546001600160401b039060a81c1690565b161415806126a1575b6126845750612500565b632105803760e11b6000526001600160401b031660045260246000fd5b506126ab84611b6d565b6020815191012083516020850120141561267a565b63c656089560e01b60005260046000fd5b35906001600160e01b038216820361016757565b81601f82011215610167578035906126fc82610771565b9261270a6040519485610358565b82845260208085019360061b8301019181831161016757602001925b828410612734575050505090565b604084830312610167576020604091825161274e81610307565b612757876106e3565b81526127648388016126d1565b83820152815201930192612726565b9190604083820312610167576040519061278c82610307565b819380356001600160401b03811161016757810182601f820112156101675780356127b681610771565b916127c46040519384610358565b81835260208084019260061b8201019085821161016757602001915b81831061280d5750505083526020810135916001600160401b038311610167576020926107e592016126e5565b604083870312610167576020604091825161282781610307565b85356128328161083c565b815261283f8387016126d1565b838201528152019201916127e0565b81601f820112156101675780359061286582610771565b926128736040519485610358565b82845260208085019360051b830101918183116101675760208101935b83851061289f57505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757604051916128cc836102e7565b6128d8602083016106e3565b83526040820135926001600160401b0384116101675760a083612902886020809881980101610821565b85840152612912606082016106e3565b6040840152612923608082016106e3565b606084015201356080820152815201940193612890565b81601f820112156101675780359061295182610771565b9261295f6040519485610358565b82845260208085019360061b8301019181831161016757602001925b828410612989575050505090565b60408483031261016757602060409182516129a381610307565b86358152828701358382015281520193019261297b565b602081830312610167578035906001600160401b0382116101675701608081830312610167576129e8610399565b9181356001600160401b0381116101675781612a05918401612773565b835260208201356001600160401b0381116101675781612a2691840161284e565b602084015260408201356001600160401b0381116101675781612a4a91840161284e565b604084015260608201356001600160401b03811161016757612a6c920161293a565b606082015290565b9080602083519182815201916020808360051b8301019401926000915b838310612aa057505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612ade8585015160a08786015260a085019061041a565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612a91565b916001600160a01b03612b3a92168352606060208401526060830190612a74565b9060408183039101526020808351928381520192019060005b818110612b605750505090565b8251805185526020908101518186015260409094019390920191600101612b53565b6084019081608411611c1f57565b60a001908160a011611c1f57565b91908201809211611c1f57565b906020808351928381520192019060005b818110612bc95750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612bbc565b9190604081019083519160408252825180915260206060830193019060005b818110612c3d57505050602061051693940151906020818403910152612bab565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612c1c565b906020610516928181520190612bfd565b91612cab90612c9d6105169593606086526060860190612a74565b908482036020860152612a74565b916040818403910152612bfd565b9197939796929695909495612cd0818701876129ba565b95602087019788518051612eb3575b5087518051511590811591612ea4575b50612dbf575b60005b89518051821015612d1f5790612d19612d1382600194611a9c565b51613757565b01612cf8565b50509193959799989092949698600099604081019a5b8b518051821015612d5c5790612d56612d5082600194611a9c565b51613a2b565b01612d35565b5050907fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47612db193926103889c612da7612db998999a9b9c9d9f519151925160405193849384612c82565b0390a13691610b92565b943691610b92565b93613eaa565b612dd4602086015b356001600160401b031690565b600b546001600160401b0382811691161015612e7c57612e0a906001600160401b03166001600160401b0319600b541617600b55565b612e226121736121736004546001600160a01b031690565b885190803b1561016757604051633937306f60e01b8152916000918391829084908290612e529060048301612c71565b03925af1801561223d57612e67575b50612cf5565b806123026000612e7693610358565b38612e61565b50612e8f89515160408a01515190612b9e565b612cf557632261116760e01b60005260046000fd5b60209150015151151538612cef565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060608a0151823b1561016757604051633854844f60e11b815292600092849283918291612f0f913060048501612b19565b03915afa801561223d5715612cdf57806123026000612f2d93610358565b38612cdf565b60405190612f42602083610358565b6000808352366020840137565b612f57613534565b60005b815181101561224257612f6d8183611a9c565b51906040820160ff612f80825160ff1690565b161561322257602083015160ff1692612fa68460ff166000526002602052604060002090565b9160018301918254612fc1612fbb8260ff1690565b60ff1690565b6131e75750612fee612fd66060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a0810191825161010081511161318f578051156131d1576003860161301c613016826123e2565b8a61501a565b60608401516130ac575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946002946130886130786130a69a966130718760019f9c61306c61309e9a8f615188565b6140eb565b5160ff1690565b845460ff191660ff821617909455565b5190818555519060405195869501908886614171565b0390a161520a565b01612f5a565b979460028793959701966130c86130c2896123e2565b8861501a565b6080850151946101008651116131bb5785516130f0612fbb6130eb8a5160ff1690565b6140d7565b10156131a557855184511161318f576130886130787fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547986130718760019f61306c6130a69f9a8f61317760029f61317161309e9f8f9061306c8492613156845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b826150ae565b505050979c9f50975050969a50505094509450613026565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff166132026131fd6060840151151590565b151590565b90151514612fee576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b906001600160401b03613278921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036132a75750565b630f01ce8560e01b6000526004524660245260446000fd5b9190918051156133615782511592602091604051926132de8185610358565b60008452601f19810160005b81811061333d5750505060005b8151811015613335578061331e61331060019385611a9c565b5188156133245786906142b0565b016132f7565b61332e8387611a9c565b51906142b0565b505050509050565b829060405161334b81610307565b60008152606083820152828289010152016132ea565b63c2e5347d60e01b60005260046000fd5b9190811015611a975760051b0190565b3561051681610858565b9190811015611a975760051b81013590601e19813603018212156101675701908135916001600160401b038311610167576020018236038113610167579190565b909294919397968151966133e088610771565b976133ee604051998a610358565b8089526133fd601f1991610771565b0160005b8181106134cf57505060005b83518110156134c257806134548c8a8a8a61344e613447878d613440828f8f9d8f9e60019f81613470575b505050611a9c565b519761338c565b36916107ea565b93614b14565b61345e828c611a9c565b52613469818b611a9c565b500161340d565b63ffffffff613488613483858585613372565b613382565b1615613438576134b89261349f9261348392613372565b60406134ab8585611a9c565b51019063ffffffff169052565b8f8f908391613438565b5096985050505050505050565b6020906134da611e8d565b82828d01015201613401565b6134f76385572ffb60e01b82614e77565b9081613511575b81613507575090565b6105169150614e49565b905061351c81614dce565b15906134fe565b6134f763aff2afbf60e01b82614e77565b6001600160a01b0360015416330361354857565b6315ae3a6f60e11b60005260046000fd5b60405160208101906000825260208152613574604082610358565b51902090565b818110613585575050565b6000815560010161357a565b9190601f81116135a057505050565b610388926000526020600020906020601f840160051c830193106135cc575b601f0160051c019061357a565b90915081906135bf565b91909182516001600160401b038111610302576135fd816135f78454611ab0565b84613591565b6020601f821160011461363e57819061362f939495600092613633575b50508160011b916000199060031b1c19161790565b9055565b01519050388061361a565b601f1982169061365384600052602060002090565b9160005b81811061368f57509583600195969710613676575b505050811b019055565b015160001960f88460031b161c1916905538808061366c565b9192602060018192868b015181550194019201613657565b90600160c0610516936020815260ff84546001600160a01b0381166020840152818160a01c16151560408401526001600160401b038160a81c16606084015260e81c161515608082015260a080820152019101611aea565b90816020910312610167575161051681611452565b909161372b6105169360408452604084019061041a565b916020818403910152611aea565b6001600160401b036001911601906001600160401b038211611c1f57565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d576000916139fc575b506139de576137d982614ea7565b805460ff60e882901c1615156001146139b3576020830180516020815191012090600184019161380883611b6d565b602081519101200361399657505060408301516001600160401b039081169160a81c16811480159061396e575b61392d5750608082015191821561391c5761387683613867866001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b546138f9576138f6929161389f61389a60606138d89401516001600160401b031690565b613739565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b61386742936001600160401b0316600052600a602052604060002090565b55565b6332cf0cbf60e01b6000526001600160401b038416600452602483905260446000fd5b63504570e360e01b60005260046000fd5b83611e2f9161394660608601516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b5061398661063860608501516001600160401b031690565b6001600160401b03821611613835565b51611dd960405192839263b80d8fa960e01b845260048401613714565b60808301516348e2b93360e11b6000526001600160401b038516600452602452600160445260646000fd5b637edeb53960e11b6000526001600160401b03821660045260246000fd5b613a1e915060203d602011613a24575b613a168183610358565b8101906136ff565b386137cb565b503d613a0c565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d57600091613b06575b506139de57613aad82614ea7565b805460ff60e882901c1615613ad8576020830180516020815191012090600184019161380883611b6d565b60808301516348e2b93360e11b60009081526001600160401b03861660045260249190915260445260646000fd5b613b1f915060203d602011613a2457613a168183610358565b38613a9f565b6003111561071757565b60038210156107175752565b90610388604051613b4b81610307565b602060ff829554818116845260081c169101613b2f565b8054821015611a975760005260206000200190600090565b60ff60019116019060ff8211611c1f57565b60ff601b9116019060ff8211611c1f57565b90606092604091835260208301370190565b6001600052600260205293613be47fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612366565b93853594613bf185612b82565b6060820190613c008251151590565b613e7c575b803603613e6457508151878103613e4b5750613c1f61327c565b60016000526003602052613c6e613c697fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b613b3b565b60026020820151613c7e81613b25565b613c8781613b25565b149081613de3575b5015613db7575b51613cee575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613cd2612dc760019460200190565b604080519283526001600160401b0391909116602083015290a2565b613d0f612fbb613d0a602085969799989a955194015160ff1690565b613b7a565b03613da6578151835103613d9557613d8d6000613cd294612dc794613d597f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b36916107ea565b60208151910120604051613d8481613d7689602083019586613b9e565b03601f198101835282610358565b5190208a614ee4565b948394613c9c565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613c9657631b41e11d60e31b60005260046000fd5b60016000526002602052613e43915061217390613e3090613e2a60037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b90613b62565b90546001600160a01b039160031b1c1690565b331438613c8f565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613ea590613e9f613e95613e908751611c09565b612b90565b613e9f8851611c09565b90612b9e565b613c05565b60008052600260205294909390929091613ee37fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612366565b94863595613ef083612b82565b6060820190613eff8251151590565b6140b4575b803603613e645750815188810361409b5750613f1e61327c565b600080526003602052613f53613c697f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613c51565b60026020820151613f6381613b25565b613f6c81613b25565b149081614052575b5015614026575b51613fb8575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613cd2612dc760009460200190565b613fd4612fbb613d0a602087989a999b96975194015160ff1690565b03613da6578351865103613d95576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613cd295613d5961401d94612dc79736916107ea565b94839438613f81565b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613f7b57631b41e11d60e31b60005260046000fd5b600080526002602052614093915061217390613e3090613e2a60037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613e21565b331438613f74565b6324f7d61360e21b600052600452602488905260446000fd5b6140d290613e9f6140c8613e908951611c09565b613e9f8a51611c09565b613f04565b60ff166003029060ff8216918203611c1f57565b8151916001600160401b03831161030257680100000000000000008311610302576020908254848455808510614154575b500190600052602060002060005b8381106141375750505050565b60019060206001600160a01b03855116940193818401550161412a565b61416b90846000528584600020918201910161357a565b3861411c565b95949392909160ff61419693168752602087015260a0604087015260a086019061239f565b84810360608601526020808351928381520192019060005b8181106141c9575050509060806103889294019060ff169052565b82516001600160a01b03168452602093840193909201916001016141ae565b600654811015611a975760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b03610516949381606094168352166020820152816040820152019061041a565b60409061051693928152816020820152019061041a565b9291906001600160401b0390816064951660045216602452600481101561071757604452565b94939261429a6060936142ab938852602088019061071c565b60806040870152608086019061041a565b930152565b906142c282516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d576000916149fd575b5061499e57602083019182515194851561496e5760408501805151870361495d5761436487611a42565b957f000000000000000000000000000000000000000000000000000000000000000061439460016116ef87614ea7565b602081519101206040516143f481613d766020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a81106148c5575050508060806060614424930151910151908886615436565b9788156148a75760005b8881106144415750505050505050505050565b5a614456614450838a51611a9c565b51615468565b80516060015161446f906001600160401b031688611c31565b6144788161070d565b8015908d8283159384614894575b1561485157606088156147d457506144ad60206144a3898d611a9c565b5101519242611c24565b6004546144c29060a01c63ffffffff16611d5f565b1080156147c1575b156147a3576144d9878b611a9c565b515161478d575b8451608001516144f8906001600160401b0316610638565b6146d5575b50614509868951611a9c565b5160a085015151815103614699579361456e9695938c938f9661454e8e958c9261454861454260608951016001600160401b0390511690565b896154b2565b8661576a565b9a90809661456860608851016001600160401b0390511690565b90615537565b614647575b505061457e8261070d565b600282036145ff575b6001966145f57f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b039351926145e66145dd8b6145d560608801516001600160401b031690565b96519b611a9c565b51985a90611c24565b91604051958695169885614281565b0390a45b0161442e565b9150919394925061460f8261070d565b60038203614623578b929493918a91614587565b51606001516349362d1f60e11b600052611e2f91906001600160401b03168961425b565b6146508461070d565b6003840361457357909294955061466891935061070d565b614678578b92918a913880614573565b5151604051632b11b8d960e01b8152908190611dd990879060048401614244565b611e2f8b6146b360608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b6146de8361070d565b6146e9575b386144fd565b8351608001516001600160401b0316602080860151918c61471e60405194859384936370701e5760e11b85526004850161421d565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561223d5760009161476f575b506146e35750505050506001906145f9565b614787915060203d8111613a2457613a168183610358565b3861475d565b614797878b611a9c565b515160808601526144e0565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b506147cb8361070d565b600383146144ca565b9150836147e08461070d565b156144e057506001959450614849925061482791507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a16145f9565b50505050600192915061484961482760607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b5061489e8361070d565b60038314614486565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b6148d0818a51611a9c565b518051604001516001600160401b031683810361494057508051602001516001600160401b031689810361491d57509061490c8460019361532e565b614916828d611a9c565b5201614404565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611e2f61498286516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b50929150506149e0576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b637edeb53960e11b6000526001600160401b031660045260246000fd5b614a16915060203d602011613a2457613a168183610358565b3861433a565b9081602091031261016757516105168161083c565b90610516916020815260e0614acf614aba614a5a8551610100602087015261012086019061041a565b60208601516001600160401b0316604086015260408601516001600160a01b0316606086015260608601516080860152614aa4608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c087015261041a565b60c0850151848203601f19018486015261041a565b92015190610100601f198285030191015261041a565b6040906001600160a01b036105169493168152816020820152019061041a565b90816020910312610167575190565b91939293614b20611e8d565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa93841561223d57600094614d9d575b506001600160a01b0384169586158015614d8b575b614d6d57614c52614c7b92613d7692614bd6614bcf611d5f60408c015163ffffffff1690565b8c89615883565b9690996080810151614c046060835193015193614bf16103a8565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b602082015292839160248301614a31565b82857f000000000000000000000000000000000000000000000000000000000000000092615911565b94909115614d515750805160208103614d38575090614ca4826020808a95518301019101614b05565b956001600160a01b03841603614cdc575b5050505050614cd4614cc56103b8565b6001600160a01b039093168352565b602082015290565b614cef93614ce991611c24565b91615883565b50908082108015614d25575b614d0757808481614cb5565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614d318284611c24565b1415614cfb565b631e3be00960e21b600052602060045260245260446000fd5b611dd9604051928392634ff17cad60e11b845260048401614ae5565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614d9861226686613523565b614ba9565b614dc091945060203d602011614dc7575b614db88183610358565b810190614a1c565b9238614b94565b503d614dae565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614dfc604483610358565b6179185a10614e38576020926000925191617530fa6000513d82614e2c575b5081614e25575090565b9050151590565b60201115915038614e1b565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614dfc604483610358565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614dfc604483610358565b6001600160401b031680600052600860205260406000209060ff825460a01c1615614ed0575090565b63ed053c5960e01b60005260045260246000fd5b919390926000948051946000965b868810614f03575050505050505050565b6020881015611a975760206000614f1b878b1a613b8c565b614f258b87611a9c565b5190614f5c614f348d8a611a9c565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561223d57614fa2613c69600051614f8a8960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b9060016020830151614fb381613b25565b614fbc81613b25565b0361500957614fd9614fcf835160ff1690565b60ff600191161b90565b8116614ff857614fef614fcf6001935160ff1690565b17970196614ef2565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b83518110156150735760019060ff83166000526003602052600061506c604082206001600160a01b03615053858a611a9c565b51166001600160a01b0316600052602052604060002090565b5501615020565b50509050565b8151815460ff191660ff919091161781559060200151600381101561071757815461ff00191660089190911b61ff0016179055565b919060005b8151811015615073576150d66150c98284611a9c565b516001600160a01b031690565b906150ff6150f583614f8a8860ff166000526003602052604060002090565b5460081c60ff1690565b61510881613b25565b615173576001600160a01b038216156151625761515c60019261515761512c6103b8565b60ff85168152916151408660208501613b2f565b614f8a8960ff166000526003602052604060002090565b615079565b016150b3565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015615073576151a36150c98284611a9c565b906151c26150f583614f8a8860ff166000526003602052604060002090565b6151cb81613b25565b615173576001600160a01b03821615615162576152046001926151576151ef6103b8565b60ff8516815291615140600260208501613b2f565b0161518d565b60ff1680600052600260205260ff60016040600020015460101c16908015600014615258575015615247576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146152625750565b61526857565b6307b8c74d60e51b60005260046000fd5b9080602083519182815201916020808360051b8301019401926000915b8383106152a557505050505090565b9091929394602080600192601f198582030186528851906080806153086152d5855160a0865260a086019061041a565b6001600160a01b0387870151168786015263ffffffff60408701511660408601526060860151858203606087015261041a565b93015191015297019301930191939290615296565b906020610516928181520190615279565b61357481518051906153c261534d60608601516001600160a01b031690565b613d7661536460608501516001600160401b031690565b9361537d6080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613d766020840151602081519101209360a06040820151602081519101209101516040516153fb81613d7660208201948561531d565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b039261544992615a52565b9116600052600a60205260406000209060005260205260406000205490565b60405160c081018181106001600160401b038211176103025760609160a0916040526154926119e9565b815282602082015282604082015260008382015260006080820152015290565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611c1f576138f6916001600160401b036154f58584613238565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611c1f5761556f8484613238565b6004831015610717576001600160401b036138f69416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b9080602083519182815201916020808360051b8301019401926000915b8383106155ef57505050505090565b909192939460208061560d600193601f19868203018752895161041a565b970193019301919392906155e0565b906020808351928381520192019060005b81811061563a5750505090565b825163ffffffff1684526020938401939092019160010161562d565b9161571f906157116105169593606086526001600160401b0360808251805160608a015282602082015116828a01528260408201511660a08a01528260608201511660c08a015201511660e087015260a06156dd6156c660208401516101406101008b01526101a08a019061041a565b6040840151898203605f19016101208b015261041a565b60608301516001600160a01b03166101408901529160808101516101608901520151868203605f1901610180880152615279565b9084820360208601526155c3565b91604081840391015261561c565b80516020909101516001600160e01b031981169291906004821061574f575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b15610167576000916157936040519485938493630304c3e160e51b855260048501615656565b038183305af1908161586e575b50615863576157ad611f98565b9072c11c11c11c11c11c11c11c11c11c11c11c11c133146157cf575b60039190565b6157e86157db8361572d565b6001600160e01b03191690565b6337c3be2960e01b148015615848575b801561582d575b156157c957611e2f6158108361572d565b632882569d60e01b6000526001600160e01b031916600452602490565b5061583a6157db8361572d565b63753fa58960e11b146157ff565b506158556157db8361572d565b632be8ca8b60e21b146157f8565b6002906105166103e2565b80612302600061587d93610358565b386157a0565b6040516370a0823160e01b60208201526001600160a01b0390911660248201529192916158e0906158b78160448101613d76565b84837f000000000000000000000000000000000000000000000000000000000000000092615911565b92909115614d515750805160208103614d3857509061590b8260208061051695518301019101614b05565b93611c24565b93919361591e60846103c7565b9461592c6040519687610358565b6084865261593a60846103c7565b602087019590601f1901368737833b156159bd575a908082106159ac578291038060061c9003111561599b576000918291825a9560208451940192f1905a9003923d9060848211615992575b6000908287523e929190565b60849150615986565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b80600052600760205260406000205415600014615a4c576006546801000000000000000081101561030257600181016006556000600654821015611a9757600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b8051928251908415615bae5761010185111580615ba2575b15615ad157818501946000198601956101008711615ad1578615615b9257615a9187611a42565b9660009586978795885b848110615af6575050505050600119018095149384615aec575b505082615ae2575b505015615ad157615acd91611a9c565b5190565b6309bde33960e01b60005260046000fd5b1490503880615abd565b1492503880615ab5565b6001811b82811603615b8457868a1015615b6f57615b1860018b019a85611a9c565b51905b8c888c1015615b5b5750615b3360018c019b86611a9c565b515b818d11615ad157615b54828f92615b4e90600196615bbf565b92611a9c565b5201615a9b565b60018d019c615b6991611a9c565b51615b35565b615b7d60018c019b8d611a9c565b5190615b1b565b615b7d600189019884611a9c565b505050509050615acd9150611a8a565b50610101821115615a6a565b630469ac9960e21b60005260046000fd5b81811015615bd1579061051691615bd6565b610516915b9060405190602082019260018452604083015260608201526060815261357460808261035856fea164736f6c634300081a000abd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c", + Bin: "0x610140806040523461084b57616654803803809161001d8285610881565b8339810190808203610120811261084b5760a0811261084b5760405161004281610866565b61004b836108a4565b8152602083015161ffff8116810361084b57602082019081526040840151906001600160a01b038216820361084b576040830191825261008d606086016108b8565b926060810193845260606100a3608088016108b8565b6080830190815295609f19011261084b5760405194606086016001600160401b03811187821017610850576040526100dd60a088016108b8565b865260c08701519463ffffffff8616860361084b576020870195865261010560e089016108b8565b6040880190815261010089015190986001600160401b03821161084b570189601f8201121561084b578051996001600160401b038b11610850578a60051b916040519b6101568d6020860190610881565b8c526020808d01938201019082821161084b5760208101935b82851061073a575050505050331561072957600180546001600160a01b031916331790554660805284516001600160a01b0316158015610717575b8015610705575b6106e35782516001600160401b0316156106f45782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a181516001600160a01b0316156106e357905160048054835163ffffffff60a01b60a09190911b166001600160a01b039384166001600160c01b03199092168217179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff166020820152925116908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d90606090a160005b8151811015610656576020600582901b8301810151908101516001600160401b031690600082156106475781516001600160a01b0316156105ae57828152600860205260408120916080810151600184019261035384546108d9565b6105e8578454600160a81b600160e81b031916600160a81b1785556040518681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b815180159081156105bd575b506105ae578151916001600160401b03831161059a576103c785546108d9565b601f8111610555575b50602091601f84116001146104d65760ff948460019a9998956104c2956000805160206166348339815191529995606095926104cb575b5050600019600383901b1c1916908b1b1783555b604081015115158554908760a01b9060a01b16908760a01b1916178555898060a01b038151168a8060a01b0319865416178555015115158354908560e81b9060e81b16908560e81b191617835561047186610996565b506040519384936020855254898060a01b0381166020860152818160a01c1615156040860152898060401b038160a81c16606086015260e81c161515608084015260a08084015260c0830190610913565b0390a2016102f7565b015190503880610407565b9190601f198416868452828420935b81811061053d5750946001856104c2956000805160206166348339815191529995606095849e9d9c9960ff9b10610524575b505050811b01835561041b565b015160001960f88460031b161c19169055388080610517565b929360206001819287860151815501950193016104e5565b85835260208320601f850160051c81019160208610610590575b601f0160051c01905b81811061058557506103d0565b838155600101610578565b909150819061056f565b634e487b7160e01b82526041600452602482fd5b6342bcdf7f60e11b8152600490fd5b905060208301206040516020810190838252602081526105de604082610881565b51902014386103a7565b845460a81c6001600160401b03166001141580610619575b1561039b57632105803760e11b81526004869052602490fd5b506040516106328161062b8188610913565b0382610881565b60208151910120825160208401201415610600565b63c656089560e01b8152600490fd5b604051615c0a9081610a2a82396080518161327e015260a05181818161019f0152614367015260c0518181816101f501528181612ebd0152818161379201528181613a660152614301015260e0518181816102240152614b63015261010051818181610253015261472c0152610120518181816101c6015281816121b101528181614c5601526158bb0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101b1565b5080516001600160a01b0316156101aa565b639b15e16f60e01b60005260046000fd5b84516001600160401b03811161084b57820160a0818603601f19011261084b576040519061076782610866565b60208101516001600160a01b038116810361084b57825261078a604082016108a4565b602083015261079b606082016108cc565b60408301526107ac608082016108cc565b606083015260a08101516001600160401b03811161084b57602091010185601f8201121561084b5780516001600160401b03811161085057604051916107fc601f8301601f191660200184610881565b818352876020838301011161084b5760005b828110610836575050918160006020809694958196010152608082015281520194019361016f565b8060208092840101518282870101520161080e565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761085057604052565b601f909101601f19168101906001600160401b0382119082101761085057604052565b51906001600160401b038216820361084b57565b51906001600160a01b038216820361084b57565b5190811515820361084b57565b90600182811c92168015610909575b60208310146108f357565b634e487b7160e01b600052602260045260246000fd5b91607f16916108e8565b60009291815491610923836108d9565b8083529260018116908115610979575060011461093f57505050565b60009081526020812093945091925b83831061095f575060209250010190565b60018160209294939454838587010152019101919061094e565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a235760065468010000000000000000811015610850576001810180600655811015610a0d577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806306285c6914610157578063181f5a77146101525780633f4b04aa1461014d5780635215505b146101485780635e36480c146101435780635e7bb0081461013e57806360987c20146101395780636f9e320f146101345780637437ff9f1461012f57806379ba50971461012a57806385572ffb146101255780638da5cb5b14610120578063c673e5841461011b578063ccd37ba314610116578063cd19723714610111578063de5e0b9a1461010c578063e9d68a8e14610107578063f2fde38b14610102578063f58e03fc146100fd5763f716f99f146100f857600080fd5b6118ae565b611791565b611706565b611661565b6115c5565b611467565b611408565b611343565b61125b565b611225565b6111a5565b611105565b610f90565b610f15565b610d0e565b610729565b6105ba565b61049e565b61043f565b61016c565b600091031261016757565b600080fd5b34610167576000366003190112610167576101856119e9565b506102cd604051610195816102e7565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761030257604052565b6102d1565b604081019081106001600160401b0382111761030257604052565b606081019081106001600160401b0382111761030257604052565b608081019081106001600160401b0382111761030257604052565b90601f801991011681019081106001600160401b0382111761030257604052565b6040519061038860c083610358565b565b6040519061038860a083610358565b60405190610388608083610358565b6040519061038861010083610358565b60405190610388604083610358565b6001600160401b03811161030257601f01601f191660200190565b604051906103f1602083610358565b60008252565b60005b83811061040a5750506000910152565b81810151838201526020016103fa565b90602091610433815180928185528580860191016103f7565b601f01601f1916010190565b34610167576000366003190112610167576102cd60408051906104628183610358565b600d82527f4f666652616d7020312e362e300000000000000000000000000000000000000060208301525191829160208352602083019061041a565b346101675760003660031901126101675760206001600160401b03600b5416604051908152f35b9060a06080610516936001600160a01b0381511684526020810151151560208501526001600160401b036040820151166040850152606081015115156060850152015191816080820152019061041a565b90565b6040810160408252825180915260206060830193019060005b81811061059b575050506020818303910152815180825260208201916020808360051b8301019401926000915b83831061056e57505050505090565b909192939460208061058c600193601f1986820301875289516104c5565b9701930193019193929061055f565b82516001600160401b0316855260209485019490920191600101610532565b34610167576000366003190112610167576006546105d781610771565b906105e56040519283610358565b808252601f196105f482610771565b0160005b8181106106b657505061060a81611a42565b9060005b8181106106265750506102cd60405192839283610519565b8061065c6106446106386001946141e8565b6001600160401b031690565b61064e8387611a9c565b906001600160401b03169052565b61069a61069561067c61066f8488611a9c565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611b88565b6106a48287611a9c565b526106af8186611a9c565b500161060e565b6020906106c1611a14565b828287010152016105f8565b600435906001600160401b038216820361016757565b35906001600160401b038216820361016757565b634e487b7160e01b600052602160045260246000fd5b6004111561071757565b6106f7565b9060048210156107175752565b34610167576040366003190112610167576107426106cd565b602435906001600160401b03821682036101675760209161076291611c31565b61076f604051809261071c565bf35b6001600160401b0381116103025760051b60200190565b91908260a0910312610167576040516107a0816102e7565b60806107e5818395803585526107b8602082016106e3565b60208601526107c9604082016106e3565b60408601526107da606082016106e3565b6060860152016106e3565b910152565b9291926107f6826103c7565b916108046040519384610358565b829481845281830111610167578281602093846000960137010152565b9080601f8301121561016757816020610516933591016107ea565b6001600160a01b0381160361016757565b35906103888261083c565b63ffffffff81160361016757565b359061038882610858565b81601f820112156101675780359061088882610771565b926108966040519485610358565b82845260208085019360051b830101918183116101675760208101935b8385106108c257505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757604051916108ef836102e7565b60208201356001600160401b0381116101675785602061091192850101610821565b835260408201356109218161083c565b602084015261093260608301610866565b60408401526080820135926001600160401b0384116101675760a08361095f886020809881980101610821565b6060840152013560808201528152019401936108b3565b919091610140818403126101675761098c610379565b926109978183610788565b845260a08201356001600160401b03811161016757816109b8918401610821565b602085015260c08201356001600160401b03811161016757816109dc918401610821565b60408501526109ed60e0830161084d565b606085015261010082013560808501526101208201356001600160401b03811161016757610a1b9201610871565b60a0830152565b9080601f83011215610167578135610a3981610771565b92610a476040519485610358565b81845260208085019260051b820101918383116101675760208201905b838210610a7357505050505090565b81356001600160401b03811161016757602091610a9587848094880101610976565b815201910190610a64565b81601f8201121561016757803590610ab782610771565b92610ac56040519485610358565b82845260208085019360051b830101918183116101675760208101935b838510610af157505050505090565b84356001600160401b03811161016757820183603f82011215610167576020810135610b1c81610771565b91610b2a6040519384610358565b8183526020808085019360051b83010101918683116101675760408201905b838210610b63575050509082525060209485019401610ae2565b81356001600160401b03811161016757602091610b878a8480809589010101610821565b815201910190610b49565b929190610b9e81610771565b93610bac6040519586610358565b602085838152019160051b810192831161016757905b828210610bce57505050565b8135815260209182019101610bc2565b9080601f830112156101675781602061051693359101610b92565b81601f8201121561016757803590610c1082610771565b92610c1e6040519485610358565b82845260208085019360051b830101918183116101675760208101935b838510610c4a57505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757610c7261038a565b91610c7f602083016106e3565b835260408201356001600160401b03811161016757856020610ca392850101610a22565b602084015260608201356001600160401b03811161016757856020610cca92850101610aa0565b60408401526080820135926001600160401b0384116101675760a083610cf7886020809881980101610bde565b606084015201356080820152815201940193610c3b565b34610167576040366003190112610167576004356001600160401b03811161016757610d3e903690600401610bf9565b6024356001600160401b038111610167573660238201121561016757806004013591610d6983610771565b91610d776040519384610358565b8383526024602084019460051b820101903682116101675760248101945b828610610da857610da68585611c79565b005b85356001600160401b03811161016757820136604382011215610167576024810135610dd381610771565b91610de16040519384610358565b818352602060248185019360051b83010101903682116101675760448101925b828410610e1b575050509082525060209586019501610d95565b83356001600160401b038111610167576024908301016040601f1982360301126101675760405190610e4c82610307565b6020810135825260408101356001600160401b03811161016757602091010136601f8201121561016757803590610e8282610771565b91610e906040519384610358565b80835260208084019160051b8301019136831161016757602001905b828210610ecb5750505091816020938480940152815201930192610e01565b602080918335610eda81610858565b815201910190610eac565b9181601f84011215610167578235916001600160401b038311610167576020808501948460051b01011161016757565b34610167576060366003190112610167576004356001600160401b03811161016757610f45903690600401610976565b6024356001600160401b03811161016757610f64903690600401610ee5565b91604435926001600160401b03841161016757610f88610da6943690600401610ee5565b939092612089565b34610167576060366003190112610167576000604051610faf81610322565b600435610fbb8161083c565b8152602435610fc981610858565b6020820190815260443590610fdd8261083c565b60408301918252610fec613534565b6001600160a01b03835116156110f657916110b86001600160a01b036110f0937fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d95611051838651166001600160a01b03166001600160a01b03196004541617600455565b517fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006004549260a01b1691161760045551166001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b0390a180f35b6342bcdf7f60e11b8452600484fd5b346101675760003660031901126101675760006040805161112581610322565b82815282602082015201526102cd60405161113f81610322565b63ffffffff6004546001600160a01b038116835260a01c1660208201526001600160a01b036005541660408201526040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b34610167576000366003190112610167576000546001600160a01b0381163303611214576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b34610167576020366003190112610167576004356001600160401b0381116101675760a090600319903603011261016757600080fd5b346101675760003660031901126101675760206001600160a01b0360015416604051908152f35b6004359060ff8216820361016757565b359060ff8216820361016757565b906020808351928381520192019060005b8181106112be5750505090565b82516001600160a01b03168452602093840193909201916001016112b1565b906105169160208152606082518051602084015260ff602082015116604084015260ff60408201511682840152015115156080820152604061132e602084015160c060a085015260e08401906112a0565b9201519060c0601f19828503019101526112a0565b346101675760203660031901126101675760ff61135e611282565b60606040805161136d81610322565b81516113788161033d565b6000815260006020820152600083820152600084820152815282602082015201521660005260026020526102cd604060002060036113f7604051926113bc84610322565b6113c581612366565b84526040516113e2816113db816002860161239f565b0382610358565b60208501526113db604051809481930161239f565b6040820152604051918291826112dd565b34610167576040366003190112610167576114216106cd565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b8015150361016757565b359061038882611452565b34610167576020366003190112610167576004356001600160401b0381116101675736602382011215610167578060040135906114a382610771565b906114b16040519283610358565b8282526024602083019360051b820101903682116101675760248101935b8285106114df57610da6846123f6565b84356001600160401b03811161016757820160a06023198236030112610167576040519161150c836102e7565b602482013561151a8161083c565b8352611528604483016106e3565b6020840152606482013561153b81611452565b6040840152608482013561154e81611452565b606084015260a4820135926001600160401b0384116101675761157b602094936024869536920101610821565b60808201528152019401936114cf565b9060049160441161016757565b9181601f84011215610167578235916001600160401b038311610167576020838186019501011161016757565b346101675760c0366003190112610167576115df3661158b565b6044356001600160401b038111610167576115fe903690600401611598565b6064929192356001600160401b03811161016757611620903690600401610ee5565b60843594916001600160401b03861161016757611644610da6963690600401610ee5565b94909360a43596612cb9565b9060206105169281815201906104c5565b34610167576020366003190112610167576001600160401b036116826106cd565b61168a611a14565b501660005260086020526102cd60406000206116f56001604051926116ae846102e7565b6116ef60ff82546001600160a01b0381168752818160a01c16151560208801526001600160401b038160a81c16604088015260e81c16606086019015159052565b01611b6d565b608082015260405191829182611650565b34610167576020366003190112610167576001600160a01b0360043561172b8161083c565b611733613534565b1633811461178057806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b34610167576060366003190112610167576117ab3661158b565b6044356001600160401b038111610167576117ca903690600401611598565b91828201602083820312610167578235906001600160401b038211610167576117f4918401610bf9565b6040519060206118048184610358565b60008352601f19810160005b81811061183857505050610da69491611828916132bf565b611830612f33565b928392613bb0565b60608582018401528201611810565b9080601f8301121561016757813561185e81610771565b9261186c6040519485610358565b81845260208085019260051b82010192831161016757602001905b8282106118945750505090565b6020809183356118a38161083c565b815201910190611887565b34610167576020366003190112610167576004356001600160401b0381116101675736602382011215610167578060040135906118ea82610771565b906118f86040519283610358565b8282526024602083019360051b820101903682116101675760248101935b82851061192657610da684612f4f565b84356001600160401b03811161016757820160c060231982360301126101675761194e610379565b916024820135835261196260448301611292565b602084015261197360648301611292565b60408401526119846084830161145c565b606084015260a48201356001600160401b038111610167576119ac9060243691850101611847565b608084015260c4820135926001600160401b038411610167576119d9602094936024869536920101611847565b60a0820152815201940193611916565b604051906119f6826102e7565b60006080838281528260208201528260408201528260608201520152565b60405190611a21826102e7565b60606080836000815260006020820152600060408201526000838201520152565b90611a4c82610771565b611a596040519182610358565b8281528092611a6a601f1991610771565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611a975760200190565b611a74565b8051821015611a975760209160051b010190565b90600182811c92168015611ae0575b6020831014611aca57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611abf565b60009291815491611afa83611ab0565b8083529260018116908115611b505750600114611b1657505050565b60009081526020812093945091925b838310611b36575060209250010190565b600181602092949394548385870101520191019190611b25565b915050602093945060ff929192191683830152151560051b010190565b90610388611b819260405193848092611aea565b0383610358565b9060016080604051611b99816102e7565b611bef819560ff81546001600160a01b0381168552818160a01c16151560208601526001600160401b038160a81c16604086015260e81c1615156060840152611be86040518096819301611aea565b0384610358565b0152565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611c1f57565b611bf3565b91908203918211611c1f57565b611c3d82607f92613238565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611c1f576003911c1660048110156107175790565b611c8161327c565b805182518103611e7c5760005b818110611ca157505090610388916132bf565b611cab8184611a9c565b516020810190815151611cbe8488611a9c565b519283518203611e7c5790916000925b808410611ce2575050505050600101611c8e565b91949398611cf4848b98939598611a9c565b515198611d02888851611a9c565b519980611e33575b5060a08a01988b6020611d208b8d515193611a9c565b5101515103611df25760005b8a5151811015611ddd57611d68611d5f611d558f6020611d4d8f8793611a9c565b510151611a9c565b5163ffffffff1690565b63ffffffff1690565b8b81611d79575b5050600101611d2c565b611d5f6040611d8c85611d989451611a9c565b51015163ffffffff1690565b90818110611da757508b611d6f565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611cce565b611e2f8b51611e0d606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b6000fd5b60808b0151811015611d0a57611e2f908b611e5588516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190611e9a82610307565b60006020838281520152565b60405190611eb5602083610358565b600080835282815b828110611ec957505050565b602090611ed4611e8d565b82828501015201611ebd565b805182526001600160401b0360208201511660208301526080611f27611f15604084015160a0604087015260a086019061041a565b6060840151858203606087015261041a565b9101519160808183039101526020808351928381520192019060005b818110611f505750505090565b825180516001600160a01b031685526020908101518186015260409094019390920191600101611f43565b906020610516928181520190611ee0565b6040513d6000823e3d90fd5b3d15611fc3573d90611fa9826103c7565b91611fb76040519384610358565b82523d6000602084013e565b606090565b90602061051692818152019061041a565b9091606082840312610167578151611ff081611452565b9260208301516001600160401b0381116101675783019080601f830112156101675781519161201e836103c7565b9161202c6040519384610358565b838352602084830101116101675760409261204d91602080850191016103f7565b92015190565b9293606092959461ffff6120776001600160a01b0394608088526080880190611ee0565b97166020860152604085015216910152565b929093913033036123555761209c611ea6565b9460a0850151805161230e575b50505050508051916120c7602084519401516001600160401b031690565b9060208301519160408401926120f48451926120e161038a565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b0361211d6005546001600160a01b031690565b1680612291575b5051511580612285575b801561226f575b8015612246575b612242576121da918161217f61217361216661067c602060009751016001600160401b0390511690565b546001600160a01b031690565b6001600160a01b031690565b908361219a606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f00000000000000000000000000000000000000000000000000000000000000009060048601612053565b03925af190811561223d57600090600092612216575b50156121f95750565b6040516302a35ba360e21b8152908190611dd99060048301611fc8565b905061223591503d806000833e61222d8183610358565b810190611fd9565b5090386121f0565b611f8c565b5050565b5061226a61226661226160608401516001600160a01b031690565b6134e6565b1590565b61213c565b5060608101516001600160a01b03163b15612135565b5060808101511561212e565b803b1561016757600060405180926308d450a160e01b82528183816122b98a60048301611f7b565b03925af190816122f3575b506122ed57611dd96122d4611f98565b6040516309c2532560e01b815291829160048301611fc8565b38612124565b80612302600061230893610358565b8061015c565b386122c4565b859650602061234a96015161232d60608901516001600160a01b031690565b9061234460208a51016001600160401b0390511690565b926133cd565b9038808080806120a9565b6306e34e6560e31b60005260046000fd5b906040516123738161033d565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106123c35750505090565b82546001600160a01b03168452602090930192600192830192016123b6565b90610388611b81926040519384809261239f565b6123fe613534565b60005b8151811015612242576124148183611a9c565b519061242a60208301516001600160401b031690565b6001600160401b0381169081156126c05761245261217361217386516001600160a01b031690565b1561262b57612474816001600160401b03166000526008602052604060002090565b60808501519060018101926124898454611ab0565b612652576124fc7ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb9916124e284750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b8151801590811561263c575b5061262b5761260c6125d7606060019861254a612622967fbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c986135d6565b6125a061255a6040830151151590565b86547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178655565b6125d06125b482516001600160a01b031690565b86906001600160a01b03166001600160a01b0319825416179055565b0151151590565b82547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560e81b60ff60e81b16178255565b612615846159ce565b50604051918291826136a7565b0390a201612401565b6342bcdf7f60e11b60005260046000fd5b9050602083012061264b613559565b143861250c565b60016001600160401b0361267184546001600160401b039060a81c1690565b161415806126a1575b6126845750612500565b632105803760e11b6000526001600160401b031660045260246000fd5b506126ab84611b6d565b6020815191012083516020850120141561267a565b63c656089560e01b60005260046000fd5b35906001600160e01b038216820361016757565b81601f82011215610167578035906126fc82610771565b9261270a6040519485610358565b82845260208085019360061b8301019181831161016757602001925b828410612734575050505090565b604084830312610167576020604091825161274e81610307565b612757876106e3565b81526127648388016126d1565b83820152815201930192612726565b9190604083820312610167576040519061278c82610307565b819380356001600160401b03811161016757810182601f820112156101675780356127b681610771565b916127c46040519384610358565b81835260208084019260061b8201019085821161016757602001915b81831061280d5750505083526020810135916001600160401b038311610167576020926107e592016126e5565b604083870312610167576020604091825161282781610307565b85356128328161083c565b815261283f8387016126d1565b838201528152019201916127e0565b81601f820112156101675780359061286582610771565b926128736040519485610358565b82845260208085019360051b830101918183116101675760208101935b83851061289f57505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757604051916128cc836102e7565b6128d8602083016106e3565b83526040820135926001600160401b0384116101675760a083612902886020809881980101610821565b85840152612912606082016106e3565b6040840152612923608082016106e3565b606084015201356080820152815201940193612890565b81601f820112156101675780359061295182610771565b9261295f6040519485610358565b82845260208085019360061b8301019181831161016757602001925b828410612989575050505090565b60408483031261016757602060409182516129a381610307565b86358152828701358382015281520193019261297b565b602081830312610167578035906001600160401b0382116101675701608081830312610167576129e8610399565b9181356001600160401b0381116101675781612a05918401612773565b835260208201356001600160401b0381116101675781612a2691840161284e565b602084015260408201356001600160401b0381116101675781612a4a91840161284e565b604084015260608201356001600160401b03811161016757612a6c920161293a565b606082015290565b9080602083519182815201916020808360051b8301019401926000915b838310612aa057505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612ade8585015160a08786015260a085019061041a565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612a91565b916001600160a01b03612b3a92168352606060208401526060830190612a74565b9060408183039101526020808351928381520192019060005b818110612b605750505090565b8251805185526020908101518186015260409094019390920191600101612b53565b6084019081608411611c1f57565b60a001908160a011611c1f57565b91908201809211611c1f57565b906020808351928381520192019060005b818110612bc95750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612bbc565b9190604081019083519160408252825180915260206060830193019060005b818110612c3d57505050602061051693940151906020818403910152612bab565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612c1c565b906020610516928181520190612bfd565b91612cab90612c9d6105169593606086526060860190612a74565b908482036020860152612a74565b916040818403910152612bfd565b9197939796929695909495612cd0818701876129ba565b95602087019788518051612eb3575b5087518051511590811591612ea4575b50612dbf575b60005b89518051821015612d1f5790612d19612d1382600194611a9c565b51613757565b01612cf8565b50509193959799989092949698600099604081019a5b8b518051821015612d5c5790612d56612d5082600194611a9c565b51613a2b565b01612d35565b5050907fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47612db193926103889c612da7612db998999a9b9c9d9f519151925160405193849384612c82565b0390a13691610b92565b943691610b92565b93613eaa565b612dd4602086015b356001600160401b031690565b600b546001600160401b0382811691161015612e7c57612e0a906001600160401b03166001600160401b0319600b541617600b55565b612e226121736121736004546001600160a01b031690565b885190803b1561016757604051633937306f60e01b8152916000918391829084908290612e529060048301612c71565b03925af1801561223d57612e67575b50612cf5565b806123026000612e7693610358565b38612e61565b50612e8f89515160408a01515190612b9e565b612cf557632261116760e01b60005260046000fd5b60209150015151151538612cef565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060608a0151823b1561016757604051633854844f60e11b815292600092849283918291612f0f913060048501612b19565b03915afa801561223d5715612cdf57806123026000612f2d93610358565b38612cdf565b60405190612f42602083610358565b6000808352366020840137565b612f57613534565b60005b815181101561224257612f6d8183611a9c565b51906040820160ff612f80825160ff1690565b161561322257602083015160ff1692612fa68460ff166000526002602052604060002090565b9160018301918254612fc1612fbb8260ff1690565b60ff1690565b6131e75750612fee612fd66060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a0810191825161010081511161318f578051156131d1576003860161301c613016826123e2565b8a61501a565b60608401516130ac575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946002946130886130786130a69a966130718760019f9c61306c61309e9a8f615188565b6140eb565b5160ff1690565b845460ff191660ff821617909455565b5190818555519060405195869501908886614171565b0390a161520a565b01612f5a565b979460028793959701966130c86130c2896123e2565b8861501a565b6080850151946101008651116131bb5785516130f0612fbb6130eb8a5160ff1690565b6140d7565b10156131a557855184511161318f576130886130787fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547986130718760019f61306c6130a69f9a8f61317760029f61317161309e9f8f9061306c8492613156845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b826150ae565b505050979c9f50975050969a50505094509450613026565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff166132026131fd6060840151151590565b151590565b90151514612fee576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b906001600160401b03613278921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036132a75750565b630f01ce8560e01b6000526004524660245260446000fd5b9190918051156133615782511592602091604051926132de8185610358565b60008452601f19810160005b81811061333d5750505060005b8151811015613335578061331e61331060019385611a9c565b5188156133245786906142b0565b016132f7565b61332e8387611a9c565b51906142b0565b505050509050565b829060405161334b81610307565b60008152606083820152828289010152016132ea565b63c2e5347d60e01b60005260046000fd5b9190811015611a975760051b0190565b3561051681610858565b9190811015611a975760051b81013590601e19813603018212156101675701908135916001600160401b038311610167576020018236038113610167579190565b909294919397968151966133e088610771565b976133ee604051998a610358565b8089526133fd601f1991610771565b0160005b8181106134cf57505060005b83518110156134c257806134548c8a8a8a61344e613447878d613440828f8f9d8f9e60019f81613470575b505050611a9c565b519761338c565b36916107ea565b93614b14565b61345e828c611a9c565b52613469818b611a9c565b500161340d565b63ffffffff613488613483858585613372565b613382565b1615613438576134b89261349f9261348392613372565b60406134ab8585611a9c565b51019063ffffffff169052565b8f8f908391613438565b5096985050505050505050565b6020906134da611e8d565b82828d01015201613401565b6134f76385572ffb60e01b82614e77565b9081613511575b81613507575090565b6105169150614e49565b905061351c81614dce565b15906134fe565b6134f763aff2afbf60e01b82614e77565b6001600160a01b0360015416330361354857565b6315ae3a6f60e11b60005260046000fd5b60405160208101906000825260208152613574604082610358565b51902090565b818110613585575050565b6000815560010161357a565b9190601f81116135a057505050565b610388926000526020600020906020601f840160051c830193106135cc575b601f0160051c019061357a565b90915081906135bf565b91909182516001600160401b038111610302576135fd816135f78454611ab0565b84613591565b6020601f821160011461363e57819061362f939495600092613633575b50508160011b916000199060031b1c19161790565b9055565b01519050388061361a565b601f1982169061365384600052602060002090565b9160005b81811061368f57509583600195969710613676575b505050811b019055565b015160001960f88460031b161c1916905538808061366c565b9192602060018192868b015181550194019201613657565b90600160c0610516936020815260ff84546001600160a01b0381166020840152818160a01c16151560408401526001600160401b038160a81c16606084015260e81c161515608082015260a080820152019101611aea565b90816020910312610167575161051681611452565b909161372b6105169360408452604084019061041a565b916020818403910152611aea565b6001600160401b036001911601906001600160401b038211611c1f57565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d576000916139fc575b506139de576137d982614ea7565b805460ff60e882901c1615156001146139b3576020830180516020815191012090600184019161380883611b6d565b602081519101200361399657505060408301516001600160401b039081169160a81c16811480159061396e575b61392d5750608082015191821561391c5761387683613867866001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b546138f9576138f6929161389f61389a60606138d89401516001600160401b031690565b613739565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b61386742936001600160401b0316600052600a602052604060002090565b55565b6332cf0cbf60e01b6000526001600160401b038416600452602483905260446000fd5b63504570e360e01b60005260046000fd5b83611e2f9161394660608601516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b5061398661063860608501516001600160401b031690565b6001600160401b03821611613835565b51611dd960405192839263b80d8fa960e01b845260048401613714565b60808301516348e2b93360e11b6000526001600160401b038516600452602452600160445260646000fd5b637edeb53960e11b6000526001600160401b03821660045260246000fd5b613a1e915060203d602011613a24575b613a168183610358565b8101906136ff565b386137cb565b503d613a0c565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d57600091613b06575b506139de57613aad82614ea7565b805460ff60e882901c1615613ad8576020830180516020815191012090600184019161380883611b6d565b60808301516348e2b93360e11b60009081526001600160401b03861660045260249190915260445260646000fd5b613b1f915060203d602011613a2457613a168183610358565b38613a9f565b6003111561071757565b60038210156107175752565b90610388604051613b4b81610307565b602060ff829554818116845260081c169101613b2f565b8054821015611a975760005260206000200190600090565b60ff60019116019060ff8211611c1f57565b60ff601b9116019060ff8211611c1f57565b90606092604091835260208301370190565b6001600052600260205293613be47fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612366565b93853594613bf185612b82565b6060820190613c008251151590565b613e7c575b803603613e6457508151878103613e4b5750613c1f61327c565b60016000526003602052613c6e613c697fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b613b3b565b60026020820151613c7e81613b25565b613c8781613b25565b149081613de3575b5015613db7575b51613cee575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613cd2612dc760019460200190565b604080519283526001600160401b0391909116602083015290a2565b613d0f612fbb613d0a602085969799989a955194015160ff1690565b613b7a565b03613da6578151835103613d9557613d8d6000613cd294612dc794613d597f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b36916107ea565b60208151910120604051613d8481613d7689602083019586613b9e565b03601f198101835282610358565b5190208a614ee4565b948394613c9c565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613c9657631b41e11d60e31b60005260046000fd5b60016000526002602052613e43915061217390613e3090613e2a60037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b90613b62565b90546001600160a01b039160031b1c1690565b331438613c8f565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613ea590613e9f613e95613e908751611c09565b612b90565b613e9f8851611c09565b90612b9e565b613c05565b60008052600260205294909390929091613ee37fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612366565b94863595613ef083612b82565b6060820190613eff8251151590565b6140b4575b803603613e645750815188810361409b5750613f1e61327c565b600080526003602052613f53613c697f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613c51565b60026020820151613f6381613b25565b613f6c81613b25565b149081614052575b5015614026575b51613fb8575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613cd2612dc760009460200190565b613fd4612fbb613d0a602087989a999b96975194015160ff1690565b03613da6578351865103613d95576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613cd295613d5961401d94612dc79736916107ea565b94839438613f81565b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613f7b57631b41e11d60e31b60005260046000fd5b600080526002602052614093915061217390613e3090613e2a60037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613e21565b331438613f74565b6324f7d61360e21b600052600452602488905260446000fd5b6140d290613e9f6140c8613e908951611c09565b613e9f8a51611c09565b613f04565b60ff166003029060ff8216918203611c1f57565b8151916001600160401b03831161030257680100000000000000008311610302576020908254848455808510614154575b500190600052602060002060005b8381106141375750505050565b60019060206001600160a01b03855116940193818401550161412a565b61416b90846000528584600020918201910161357a565b3861411c565b95949392909160ff61419693168752602087015260a0604087015260a086019061239f565b84810360608601526020808351928381520192019060005b8181106141c9575050509060806103889294019060ff169052565b82516001600160a01b03168452602093840193909201916001016141ae565b600654811015611a975760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b03610516949381606094168352166020820152816040820152019061041a565b60409061051693928152816020820152019061041a565b9291906001600160401b0390816064951660045216602452600481101561071757604452565b94939261429a6060936142ab938852602088019061071c565b60806040870152608086019061041a565b930152565b906142c282516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d576000916149fd575b5061499e57602083019182515194851561496e5760408501805151870361495d5761436487611a42565b957f000000000000000000000000000000000000000000000000000000000000000061439460016116ef87614ea7565b602081519101206040516143f481613d766020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a81106148c5575050508060806060614424930151910151908886615436565b9788156148a75760005b8881106144415750505050505050505050565b5a614456614450838a51611a9c565b51615468565b80516060015161446f906001600160401b031688611c31565b6144788161070d565b8015908d8283159384614894575b1561485157606088156147d457506144ad60206144a3898d611a9c565b5101519242611c24565b6004546144c29060a01c63ffffffff16611d5f565b1080156147c1575b156147a3576144d9878b611a9c565b515161478d575b8451608001516144f8906001600160401b0316610638565b6146d5575b50614509868951611a9c565b5160a085015151815103614699579361456e9695938c938f9661454e8e958c9261454861454260608951016001600160401b0390511690565b896154b2565b8661576a565b9a90809661456860608851016001600160401b0390511690565b90615537565b614647575b505061457e8261070d565b600282036145ff575b6001966145f57f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b039351926145e66145dd8b6145d560608801516001600160401b031690565b96519b611a9c565b51985a90611c24565b91604051958695169885614281565b0390a45b0161442e565b9150919394925061460f8261070d565b60038203614623578b929493918a91614587565b51606001516349362d1f60e11b600052611e2f91906001600160401b03168961425b565b6146508461070d565b6003840361457357909294955061466891935061070d565b614678578b92918a913880614573565b5151604051632b11b8d960e01b8152908190611dd990879060048401614244565b611e2f8b6146b360608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b6146de8361070d565b6146e9575b386144fd565b8351608001516001600160401b0316602080860151918c61471e60405194859384936370701e5760e11b85526004850161421d565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561223d5760009161476f575b506146e35750505050506001906145f9565b614787915060203d8111613a2457613a168183610358565b3861475d565b614797878b611a9c565b515160808601526144e0565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b506147cb8361070d565b600383146144ca565b9150836147e08461070d565b156144e057506001959450614849925061482791507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a16145f9565b50505050600192915061484961482760607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b5061489e8361070d565b60038314614486565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b6148d0818a51611a9c565b518051604001516001600160401b031683810361494057508051602001516001600160401b031689810361491d57509061490c8460019361532e565b614916828d611a9c565b5201614404565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611e2f61498286516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b50929150506149e0576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b637edeb53960e11b6000526001600160401b031660045260246000fd5b614a16915060203d602011613a2457613a168183610358565b3861433a565b9081602091031261016757516105168161083c565b90610516916020815260e0614acf614aba614a5a8551610100602087015261012086019061041a565b60208601516001600160401b0316604086015260408601516001600160a01b0316606086015260608601516080860152614aa4608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c087015261041a565b60c0850151848203601f19018486015261041a565b92015190610100601f198285030191015261041a565b6040906001600160a01b036105169493168152816020820152019061041a565b90816020910312610167575190565b91939293614b20611e8d565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa93841561223d57600094614d9d575b506001600160a01b0384169586158015614d8b575b614d6d57614c52614c7b92613d7692614bd6614bcf611d5f60408c015163ffffffff1690565b8c89615883565b9690996080810151614c046060835193015193614bf16103a8565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b602082015292839160248301614a31565b82857f000000000000000000000000000000000000000000000000000000000000000092615911565b94909115614d515750805160208103614d38575090614ca4826020808a95518301019101614b05565b956001600160a01b03841603614cdc575b5050505050614cd4614cc56103b8565b6001600160a01b039093168352565b602082015290565b614cef93614ce991611c24565b91615883565b50908082108015614d25575b614d0757808481614cb5565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614d318284611c24565b1415614cfb565b631e3be00960e21b600052602060045260245260446000fd5b611dd9604051928392634ff17cad60e11b845260048401614ae5565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614d9861226686613523565b614ba9565b614dc091945060203d602011614dc7575b614db88183610358565b810190614a1c565b9238614b94565b503d614dae565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614dfc604483610358565b6179185a10614e38576020926000925191617530fa6000513d82614e2c575b5081614e25575090565b9050151590565b60201115915038614e1b565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614dfc604483610358565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614dfc604483610358565b6001600160401b031680600052600860205260406000209060ff825460a01c1615614ed0575090565b63ed053c5960e01b60005260045260246000fd5b919390926000948051946000965b868810614f03575050505050505050565b6020881015611a975760206000614f1b878b1a613b8c565b614f258b87611a9c565b5190614f5c614f348d8a611a9c565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561223d57614fa2613c69600051614f8a8960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b9060016020830151614fb381613b25565b614fbc81613b25565b0361500957614fd9614fcf835160ff1690565b60ff600191161b90565b8116614ff857614fef614fcf6001935160ff1690565b17970196614ef2565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b83518110156150735760019060ff83166000526003602052600061506c604082206001600160a01b03615053858a611a9c565b51166001600160a01b0316600052602052604060002090565b5501615020565b50509050565b8151815460ff191660ff919091161781559060200151600381101561071757815461ff00191660089190911b61ff0016179055565b919060005b8151811015615073576150d66150c98284611a9c565b516001600160a01b031690565b906150ff6150f583614f8a8860ff166000526003602052604060002090565b5460081c60ff1690565b61510881613b25565b615173576001600160a01b038216156151625761515c60019261515761512c6103b8565b60ff85168152916151408660208501613b2f565b614f8a8960ff166000526003602052604060002090565b615079565b016150b3565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015615073576151a36150c98284611a9c565b906151c26150f583614f8a8860ff166000526003602052604060002090565b6151cb81613b25565b615173576001600160a01b03821615615162576152046001926151576151ef6103b8565b60ff8516815291615140600260208501613b2f565b0161518d565b60ff1680600052600260205260ff60016040600020015460101c16908015600014615258575015615247576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146152625750565b61526857565b6307b8c74d60e51b60005260046000fd5b9080602083519182815201916020808360051b8301019401926000915b8383106152a557505050505090565b9091929394602080600192601f198582030186528851906080806153086152d5855160a0865260a086019061041a565b6001600160a01b0387870151168786015263ffffffff60408701511660408601526060860151858203606087015261041a565b93015191015297019301930191939290615296565b906020610516928181520190615279565b61357481518051906153c261534d60608601516001600160a01b031690565b613d7661536460608501516001600160401b031690565b9361537d6080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613d766020840151602081519101209360a06040820151602081519101209101516040516153fb81613d7660208201948561531d565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b039261544992615a52565b9116600052600a60205260406000209060005260205260406000205490565b60405160c081018181106001600160401b038211176103025760609160a0916040526154926119e9565b815282602082015282604082015260008382015260006080820152015290565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611c1f576138f6916001600160401b036154f58584613238565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611c1f5761556f8484613238565b6004831015610717576001600160401b036138f69416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b9080602083519182815201916020808360051b8301019401926000915b8383106155ef57505050505090565b909192939460208061560d600193601f19868203018752895161041a565b970193019301919392906155e0565b906020808351928381520192019060005b81811061563a5750505090565b825163ffffffff1684526020938401939092019160010161562d565b9161571f906157116105169593606086526001600160401b0360808251805160608a015282602082015116828a01528260408201511660a08a01528260608201511660c08a015201511660e087015260a06156dd6156c660208401516101406101008b01526101a08a019061041a565b6040840151898203605f19016101208b015261041a565b60608301516001600160a01b03166101408901529160808101516101608901520151868203605f1901610180880152615279565b9084820360208601526155c3565b91604081840391015261561c565b80516020909101516001600160e01b031981169291906004821061574f575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b15610167576000916157936040519485938493630304c3e160e51b855260048501615656565b038183305af1908161586e575b50615863576157ad611f98565b9072c11c11c11c11c11c11c11c11c11c11c11c11c133146157cf575b60039190565b6157e86157db8361572d565b6001600160e01b03191690565b6337c3be2960e01b148015615848575b801561582d575b156157c957611e2f6158108361572d565b632882569d60e01b6000526001600160e01b031916600452602490565b5061583a6157db8361572d565b63753fa58960e11b146157ff565b506158556157db8361572d565b632be8ca8b60e21b146157f8565b6002906105166103e2565b80612302600061587d93610358565b386157a0565b6040516370a0823160e01b60208201526001600160a01b0390911660248201529192916158e0906158b78160448101613d76565b84837f000000000000000000000000000000000000000000000000000000000000000092615911565b92909115614d515750805160208103614d3857509061590b8260208061051695518301019101614b05565b93611c24565b93919361591e60846103c7565b9461592c6040519687610358565b6084865261593a60846103c7565b602087019590601f1901368737833b156159bd575a908082106159ac578291038060061c9003111561599b576000918291825a9560208451940192f1905a9003923d9060848211615992575b6000908287523e929190565b60849150615986565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b80600052600760205260406000205415600014615a4c576006546801000000000000000081101561030257600181016006556000600654821015611a9757600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b8051928251908415615bae5761010185111580615ba2575b15615ad157818501946000198601956101008711615ad1578615615b9257615a9187611a42565b9660009586978795885b848110615af6575050505050600119018095149384615aec575b505082615ae2575b505015615ad157615acd91611a9c565b5190565b6309bde33960e01b60005260046000fd5b1490503880615abd565b1492503880615ab5565b6001811b82811603615b8457868a1015615b6f57615b1860018b019a85611a9c565b51905b8c888c1015615b5b5750615b3360018c019b86611a9c565b515b818d11615ad157615b54828f92615b4e90600196615bbf565b92611a9c565b5201615a9b565b60018d019c615b6991611a9c565b51615b35565b615b7d60018c019b8d611a9c565b5190615b1b565b615b7d600189019884611a9c565b505050509050615acd9150611a8a565b50610101821115615a6a565b630469ac9960e21b60005260046000fd5b81811015615bd1579061051691615bd6565b610516915b9060405190602082019260018452604083015260608201526060815261357460808261035856fea164736f6c634300081a000abd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c", } var OffRampABI = OffRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go b/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go index 3103c3889d0..4dec8c4b794 100644 --- a/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go +++ b/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go @@ -158,7 +158,7 @@ type OffRampStaticConfig struct { var OffRampWithMessageTransformerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"messageTransformerAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applySourceChainConfigUpdates\",\"inputs\":[{\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"commit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"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\":\"execute\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeSingleMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllSourceChainConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExecutionState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMerkleRoot\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMessageTransformer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyExecute\",\"inputs\":[{\"name\":\"reports\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\",\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"components\":[{\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMessageTransformer\",\"inputs\":[{\"name\":\"messageTransformerAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AlreadyAttempted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RootRemoved\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedAlreadyExecutedMessage\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedReportExecution\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainConfigSet\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sourceConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainSelectorAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaticConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CommitOnRampMismatch\",\"inputs\":[{\"name\":\"reportOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"configOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"EmptyBatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyReport\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientGasToCompleteTx\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"InvalidDataLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInterval\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"min\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"max\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionGasLimit\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"newLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionTokenGasOverride\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"oldLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverride\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageDestChainSelector\",\"inputs\":[{\"name\":\"messageDestChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNewState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newState\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}]},{\"type\":\"error\",\"name\":\"InvalidOnRampUpdate\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionGasAmountCountMismatch\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ManualExecutionGasLimitMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionNotYetEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageTransformError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotACompatiblePool\",\"inputs\":[{\"name\":\"notPool\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReceiverError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReleaseOrMintBalanceMismatch\",\"inputs\":[{\"name\":\"amountReleased\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePre\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePost\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RootAlreadyCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"RootBlessingMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"isBlessed\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"RootNotCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SourceChainNotEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SourceChainSelectorMismatch\",\"inputs\":[{\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"StaleCommitReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"TokenDataMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"TokenHandlingError\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedTokenData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", - Bin: "0x61014080604052346108a157616a6b803803809161001d82856108d7565b83398101908082039061014082126108a15760a082126108a157604051610043816108bc565b61004c826108fa565b815260208201519261ffff841684036108a1576020820193845260408301516001600160a01b03811681036108a1576040830190815261008e6060850161090e565b946060840195865260606100a46080870161090e565b6080860190815293609f1901126108a15760405193606085016001600160401b038111868210176108a6576040526100de60a0870161090e565b855260c08601519363ffffffff851685036108a1576020860194855261010660e0880161090e565b604087019081526101008801519097906001600160401b0381116108a15781018a601f820112156108a15780519a6001600160401b038c116108a6578b60051b916020806040519e8f9061015c838801836108d7565b81520193820101908282116108a15760208101935b82851061079057505050505061012061018a910161090e565b97331561077f57600180546001600160a01b031916331790554660805284516001600160a01b031615801561076d575b801561075b575b6107395782516001600160401b03161561074a5782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a181516001600160a01b03161561073957905160048054835163ffffffff60a01b60a09190911b166001600160a01b039384166001600160c01b03199092168217179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff1660208201529251169082015282907fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d90606090a16000915b815183101561067a5760009260208160051b8401015160018060401b0360208201511690811561066b5780516001600160a01b03161561065c57818652600860205260408620906080810151906001830191610366835461092f565b6105fd578354600160a81b600160e81b031916600160a81b1784556040518581527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b805180159081156105d2575b506105c3578051906001600160401b0382116105af576103da845461092f565b601f811161056a575b50602090601f83116001146104eb57600080516020616a4b8339815191529593836104d59460ff979460609460019d9e9f926104e0575b5050600019600383901b1c1916908b1b1783555b604081015115158554908760a01b9060a01b16908760a01b1916178555898060a01b038151168a8060a01b0319865416178555015115158354908560e81b9060e81b16908560e81b1916178355610484866109ec565b506040519384936020855254898060a01b0381166020860152818160a01c1615156040860152898060401b038160a81c16606086015260e81c161515608084015260a08084015260c0830190610969565b0390a201919061030a565b015190508e8061041a565b848b52818b20919a601f198416905b81811061055257509360018460ff9794829c9d9e6060956104d598600080516020616a4b8339815191529c9a10610539575b505050811b01835561042e565b015160001960f88460031b161c191690558e808061052c565b828d0151845560209c8d019c600190940193016104fa565b848b5260208b20601f840160051c810191602085106105a5575b601f0160051c01905b81811061059a57506103e3565b8b815560010161058d565b9091508190610584565b634e487b7160e01b8a52604160045260248afd5b6342bcdf7f60e11b8952600489fd5b9050602082012060405160208101908b8252602081526105f36040826108d7565b519020148a6103ba565b835460a81c6001600160401b0316600114158061062e575b156103ae57632105803760e11b89526004859052602489fd5b50604051610647816106408187610969565b03826108d7565b60208151910120815160208301201415610615565b6342bcdf7f60e11b8652600486fd5b63c656089560e01b8652600486fd5b6001600160a01b0381161561073957600b8054600160401b600160e01b031916604092831b600160401b600160e01b031617905551615fcb9081610a80823960805181613377015260a0518181816101bf0152614460015260c05181818161021501528181612fb60152818161388b01528181613b5f01526143fa015260e0518181816102440152614c6701526101005181818161027301526148250152610120518181816101e6015281816122ae01528181614d5a0152615c7c0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101c1565b5080516001600160a01b0316156101ba565b639b15e16f60e01b60005260046000fd5b84516001600160401b0381116108a157820160a0818603601f1901126108a157604051906107bd826108bc565b60208101516001600160a01b03811681036108a15782526107e0604082016108fa565b60208301526107f160608201610922565b604083015261080260808201610922565b606083015260a08101516001600160401b0381116108a157602091010185601f820112156108a15780516001600160401b0381116108a65760405191610852601f8301601f1916602001846108d7565b81835287602083830101116108a15760005b82811061088c5750509181600060208096949581960101526080820152815201940193610171565b80602080928401015182828701015201610864565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b038211176108a657604052565b601f909101601f19168101906001600160401b038211908210176108a657604052565b51906001600160401b03821682036108a157565b51906001600160a01b03821682036108a157565b519081151582036108a157565b90600182811c9216801561095f575b602083101461094957565b634e487b7160e01b600052602260045260246000fd5b91607f169161093e565b600092918154916109798361092f565b80835292600181169081156109cf575060011461099557505050565b60009081526020812093945091925b8383106109b5575060209250010190565b6001816020929493945483858701015201910191906109a4565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a7957600654680100000000000000008110156108a6576001810180600655811015610a63577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806306285c691461017757806315777ab214610172578063181f5a771461016d5780633f4b04aa146101685780635215505b146101635780635e36480c1461015e5780635e7bb0081461015957806360987c201461015457806365b81aab1461014f5780636f9e320f1461014a5780637437ff9f1461014557806379ba50971461014057806385572ffb1461013b5780638da5cb5b14610136578063c673e58414610131578063ccd37ba31461012c578063cd19723714610127578063de5e0b9a14610122578063e9d68a8e1461011d578063f2fde38b14610118578063f58e03fc146101135763f716f99f1461010e57600080fd5b6119a8565b61188b565b611800565b611757565b6116bb565b61155b565b6114f8565b611433565b61134b565b611315565b611295565b6111f5565b611080565b610fea565b610f6f565b610d68565b610780565b61061f565b610503565b6104a4565b6102f1565b61018c565b600091031261018757565b600080fd5b34610187576000366003190112610187576101a5611ae3565b506102ed6040516101b581610331565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b346101875760003660031901126101875760206001600160a01b03600b5460401c16604051908152f35b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761034c57604052565b61031b565b604081019081106001600160401b0382111761034c57604052565b606081019081106001600160401b0382111761034c57604052565b608081019081106001600160401b0382111761034c57604052565b60c081019081106001600160401b0382111761034c57604052565b90601f801991011681019081106001600160401b0382111761034c57604052565b604051906103ed60c0836103bd565b565b604051906103ed60a0836103bd565b604051906103ed6080836103bd565b604051906103ed610100836103bd565b604051906103ed6040836103bd565b6001600160401b03811161034c57601f01601f191660200190565b604051906104566020836103bd565b60008252565b60005b83811061046f5750506000910152565b818101518382015260200161045f565b906020916104988151809281855285808601910161045c565b601f01601f1916010190565b34610187576000366003190112610187576102ed60408051906104c781836103bd565b601182527f4f666652616d7020312e362e302d64657600000000000000000000000000000060208301525191829160208352602083019061047f565b346101875760003660031901126101875760206001600160401b03600b5416604051908152f35b9060a0608061057b936001600160a01b0381511684526020810151151560208501526001600160401b036040820151166040850152606081015115156060850152015191816080820152019061047f565b90565b6040810160408252825180915260206060830193019060005b818110610600575050506020818303910152815180825260208201916020808360051b8301019401926000915b8383106105d357505050505090565b90919293946020806105f1600193601f19868203018752895161052a565b970193019301919392906105c4565b82516001600160401b0316855260209485019490920191600101610597565b346101875760003660031901126101875760065461063c816107c3565b9061064a60405192836103bd565b808252601f19610659826107c3565b0160005b81811061071b57505061066f81611b3c565b9060005b81811061068b5750506102ed6040519283928361057e565b806106c16106a961069d6001946142e1565b6001600160401b031690565b6106b38387611b96565b906001600160401b03169052565b6106ff6106fa6106e16106d48488611b96565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611c82565b6107098287611b96565b526107148186611b96565b5001610673565b602090610726611b0e565b8282870101520161065d565b6001600160401b0381160361018757565b35906103ed82610732565b634e487b7160e01b600052602160045260246000fd5b6004111561076e57565b61074e565b90600482101561076e5752565b346101875760403660031901126101875760206107b46004356107a281610732565b602435906107af82610732565b611d27565b6107c16040518092610773565bf35b6001600160401b03811161034c5760051b60200190565b91908260a0910312610187576040516107f281610331565b608080829480358452602081013561080981610732565b6020850152604081013561081c81610732565b6040850152606081013561082f81610732565b606085015201359161084083610732565b0152565b9291926108508261042c565b9161085e60405193846103bd565b829481845281830111610187578281602093846000960137010152565b9080601f830112156101875781602061057b93359101610844565b6001600160a01b0381160361018757565b35906103ed82610896565b63ffffffff81160361018757565b35906103ed826108b2565b81601f82011215610187578035906108e2826107c3565b926108f060405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061091c57505050505090565b84356001600160401b03811161018757820160a0818503601f190112610187576040519161094983610331565b60208201356001600160401b0381116101875785602061096b9285010161087b565b8352604082013561097b81610896565b602084015261098c606083016108c0565b60408401526080820135926001600160401b0384116101875760a0836109b988602080988198010161087b565b60608401520135608082015281520194019361090d565b91909161014081840312610187576109e66103de565b926109f181836107da565b845260a08201356001600160401b0381116101875781610a1291840161087b565b602085015260c08201356001600160401b0381116101875781610a3691840161087b565b6040850152610a4760e083016108a7565b606085015261010082013560808501526101208201356001600160401b03811161018757610a7592016108cb565b60a0830152565b9080601f83011215610187578135610a93816107c3565b92610aa160405194856103bd565b81845260208085019260051b820101918383116101875760208201905b838210610acd57505050505090565b81356001600160401b03811161018757602091610aef878480948801016109d0565b815201910190610abe565b81601f8201121561018757803590610b11826107c3565b92610b1f60405194856103bd565b82845260208085019360051b830101918183116101875760208101935b838510610b4b57505050505090565b84356001600160401b03811161018757820183603f82011215610187576020810135610b76816107c3565b91610b8460405193846103bd565b8183526020808085019360051b83010101918683116101875760408201905b838210610bbd575050509082525060209485019401610b3c565b81356001600160401b03811161018757602091610be18a848080958901010161087b565b815201910190610ba3565b929190610bf8816107c3565b93610c0660405195866103bd565b602085838152019160051b810192831161018757905b828210610c2857505050565b8135815260209182019101610c1c565b9080601f830112156101875781602061057b93359101610bec565b81601f8201121561018757803590610c6a826107c3565b92610c7860405194856103bd565b82845260208085019360051b830101918183116101875760208101935b838510610ca457505050505090565b84356001600160401b03811161018757820160a0818503601f19011261018757610ccc6103ef565b91610cd960208301610743565b835260408201356001600160401b03811161018757856020610cfd92850101610a7c565b602084015260608201356001600160401b03811161018757856020610d2492850101610afa565b60408401526080820135926001600160401b0384116101875760a083610d51886020809881980101610c38565b606084015201356080820152815201940193610c95565b34610187576040366003190112610187576004356001600160401b03811161018757610d98903690600401610c53565b6024356001600160401b038111610187573660238201121561018757806004013591610dc3836107c3565b91610dd160405193846103bd565b8383526024602084019460051b820101903682116101875760248101945b828610610e0257610e008585611d6f565b005b85356001600160401b03811161018757820136604382011215610187576024810135610e2d816107c3565b91610e3b60405193846103bd565b818352602060248185019360051b83010101903682116101875760448101925b828410610e75575050509082525060209586019501610def565b83356001600160401b038111610187576024908301016040601f1982360301126101875760405190610ea682610351565b6020810135825260408101356001600160401b03811161018757602091010136601f8201121561018757803590610edc826107c3565b91610eea60405193846103bd565b80835260208084019160051b8301019136831161018757602001905b828210610f255750505091816020938480940152815201930192610e5b565b602080918335610f34816108b2565b815201910190610f06565b9181601f84011215610187578235916001600160401b038311610187576020808501948460051b01011161018757565b34610187576060366003190112610187576004356001600160401b03811161018757610f9f9036906004016109d0565b6024356001600160401b03811161018757610fbe903690600401610f3f565b91604435926001600160401b03841161018757610fe2610e00943690600401610f3f565b939092612186565b346101875760203660031901126101875760043561100781610896565b61100f61362d565b6001600160a01b0381161561106f577fffffffff0000000000000000000000000000000000000000ffffffffffffffff7bffffffffffffffffffffffffffffffffffffffff0000000000000000600b549260401b16911617600b55600080f35b6342bcdf7f60e11b60005260046000fd5b3461018757606036600319011261018757600060405161109f8161036c565b6004356110ab81610896565b81526024356110b9816108b2565b60208201908152604435906110cd82610896565b604083019182526110dc61362d565b6001600160a01b03835116156111e657916111a86001600160a01b036111e0937fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d95611141838651166001600160a01b03166001600160a01b03196004541617600455565b517fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006004549260a01b1691161760045551166001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b0390a180f35b6342bcdf7f60e11b8452600484fd5b34610187576000366003190112610187576000604080516112158161036c565b82815282602082015201526102ed60405161122f8161036c565b63ffffffff6004546001600160a01b038116835260a01c1660208201526001600160a01b036005541660408201526040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b34610187576000366003190112610187576000546001600160a01b0381163303611304576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b34610187576020366003190112610187576004356001600160401b0381116101875760a090600319903603011261018757600080fd5b346101875760003660031901126101875760206001600160a01b0360015416604051908152f35b6004359060ff8216820361018757565b359060ff8216820361018757565b906020808351928381520192019060005b8181106113ae5750505090565b82516001600160a01b03168452602093840193909201916001016113a1565b9061057b9160208152606082518051602084015260ff602082015116604084015260ff60408201511682840152015115156080820152604061141e602084015160c060a085015260e0840190611390565b9201519060c0601f1982850301910152611390565b346101875760203660031901126101875760ff61144e611372565b60606040805161145d8161036c565b815161146881610387565b6000815260006020820152600083820152600084820152815282602082015201521660005260026020526102ed604060002060036114e7604051926114ac8461036c565b6114b581612463565b84526040516114d2816114cb816002860161249c565b03826103bd565b60208501526114cb604051809481930161249c565b6040820152604051918291826113cd565b346101875760403660031901126101875760043561151581610732565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b8015150361018757565b35906103ed82611546565b34610187576020366003190112610187576004356001600160401b038111610187573660238201121561018757806004013590611597826107c3565b906115a560405192836103bd565b8282526024602083019360051b820101903682116101875760248101935b8285106115d357610e00846124f3565b84356001600160401b03811161018757820160a06023198236030112610187576040519161160083610331565b602482013561160e81610896565b8352604482013561161e81610732565b6020840152606482013561163181611546565b6040840152608482013561164481611546565b606084015260a4820135926001600160401b0384116101875761167160209493602486953692010161087b565b60808201528152019401936115c3565b9060049160441161018757565b9181601f84011215610187578235916001600160401b038311610187576020838186019501011161018757565b346101875760c0366003190112610187576116d536611681565b6044356001600160401b038111610187576116f490369060040161168e565b6064929192356001600160401b03811161018757611716903690600401610f3f565b60843594916001600160401b0386116101875761173a610e00963690600401610f3f565b94909360a43596612db2565b90602061057b92818152019061052a565b34610187576020366003190112610187576001600160401b0360043561177c81610732565b611784611b0e565b501660005260086020526102ed60406000206117ef6001604051926117a884610331565b6117e960ff82546001600160a01b0381168752818160a01c16151560208801526001600160401b038160a81c16604088015260e81c16606086019015159052565b01611c67565b608082015260405191829182611746565b34610187576020366003190112610187576001600160a01b0360043561182581610896565b61182d61362d565b1633811461187a57806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b34610187576060366003190112610187576118a536611681565b6044356001600160401b038111610187576118c490369060040161168e565b91828201602083820312610187578235906001600160401b038211610187576118ee918401610c53565b6040519060206118fe81846103bd565b60008352601f19810160005b81811061193257505050610e009491611922916133b8565b61192a61302c565b928392613ca9565b6060858201840152820161190a565b9080601f83011215610187578135611958816107c3565b9261196660405194856103bd565b81845260208085019260051b82010192831161018757602001905b82821061198e5750505090565b60208091833561199d81610896565b815201910190611981565b34610187576020366003190112610187576004356001600160401b0381116101875736602382011215610187578060040135906119e4826107c3565b906119f260405192836103bd565b8282526024602083019360051b820101903682116101875760248101935b828510611a2057610e0084613048565b84356001600160401b03811161018757820160c0602319823603011261018757611a486103de565b9160248201358352611a5c60448301611382565b6020840152611a6d60648301611382565b6040840152611a7e60848301611550565b606084015260a48201356001600160401b03811161018757611aa69060243691850101611941565b608084015260c4820135926001600160401b03841161018757611ad3602094936024869536920101611941565b60a0820152815201940193611a10565b60405190611af082610331565b60006080838281528260208201528260408201528260608201520152565b60405190611b1b82610331565b60606080836000815260006020820152600060408201526000838201520152565b90611b46826107c3565b611b5360405191826103bd565b8281528092611b64601f19916107c3565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611b915760200190565b611b6e565b8051821015611b915760209160051b010190565b90600182811c92168015611bda575b6020831014611bc457565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bb9565b60009291815491611bf483611baa565b8083529260018116908115611c4a5750600114611c1057505050565b60009081526020812093945091925b838310611c30575060209250010190565b600181602092949394548385870101520191019190611c1f565b915050602093945060ff929192191683830152151560051b010190565b906103ed611c7b9260405193848092611be4565b03836103bd565b9060016080604051611c9381610331565b610840819560ff81546001600160a01b0381168552818160a01c16151560208601526001600160401b038160a81c16604086015260e81c1615156060840152611ce26040518096819301611be4565b03846103bd565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611d1557565b611ce9565b91908203918211611d1557565b611d3382607f92613331565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611d15576003911c16600481101561076e5790565b611d77613375565b805182518103611f725760005b818110611d97575050906103ed916133b8565b611da18184611b96565b516020810190815151611db48488611b96565b519283518203611f725790916000925b808410611dd8575050505050600101611d84565b91949398611dea848b98939598611b96565b515198611df8888851611b96565b519980611f29575b5060a08a01988b6020611e168b8d515193611b96565b5101515103611ee85760005b8a5151811015611ed357611e5e611e55611e4b8f6020611e438f8793611b96565b510151611b96565b5163ffffffff1690565b63ffffffff1690565b8b81611e6f575b5050600101611e22565b611e556040611e8285611e8e9451611b96565b51015163ffffffff1690565b90818110611e9d57508b611e65565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611dc4565b611f258b51611f03606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b6000fd5b60808b0151811015611e0057611f25908b611f4b88516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190611f9082610351565b60006020838281520152565b60405190611fab6020836103bd565b600080835282815b828110611fbf57505050565b602090611fca611f83565b82828501015201611fb3565b805182526001600160401b036020820151166020830152608061201d61200b604084015160a0604087015260a086019061047f565b6060840151858203606087015261047f565b9101519160808183039101526020808351928381520192019060005b8181106120465750505090565b825180516001600160a01b031685526020908101518186015260409094019390920191600101612039565b90602061057b928181520190611fd6565b6040513d6000823e3d90fd5b3d156120b9573d9061209f8261042c565b916120ad60405193846103bd565b82523d6000602084013e565b606090565b90602061057b92818152019061047f565b81601f820112156101875780516120e58161042c565b926120f360405194856103bd565b818452602082840101116101875761057b916020808501910161045c565b909160608284031261018757815161212881611546565b9260208301516001600160401b0381116101875760409161214a9185016120cf565b92015190565b9293606092959461ffff6121746001600160a01b0394608088526080880190611fd6565b97166020860152604085015216910152565b9290939130330361245257612199611f9c565b9460a0850151805161240b575b50505050508051916121c4602084519401516001600160401b031690565b9060208301519160408401926121f18451926121de6103ef565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b0361221a6005546001600160a01b031690565b168061238e575b5051511580612382575b801561236c575b8015612343575b61233f576122d7918161227c6122706122636106e1602060009751016001600160401b0390511690565b546001600160a01b031690565b6001600160a01b031690565b9083612297606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f00000000000000000000000000000000000000000000000000000000000000009060048601612150565b03925af190811561233a57600090600092612313575b50156122f65750565b6040516302a35ba360e21b8152908190611ecf90600483016120be565b905061233291503d806000833e61232a81836103bd565b810190612111565b5090386122ed565b612082565b5050565b5061236761236361235e60608401516001600160a01b031690565b6135df565b1590565b612239565b5060608101516001600160a01b03163b15612232565b5060808101511561222b565b803b1561018757600060405180926308d450a160e01b82528183816123b68a60048301612071565b03925af190816123f0575b506123ea57611ecf6123d161208e565b6040516309c2532560e01b8152918291600483016120be565b38612221565b806123ff6000612405936103bd565b8061017c565b386123c1565b859650602061244796015161242a60608901516001600160a01b031690565b9061244160208a51016001600160401b0390511690565b926134c6565b9038808080806121a6565b6306e34e6560e31b60005260046000fd5b9060405161247081610387565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106124c05750505090565b82546001600160a01b03168452602090930192600192830192016124b3565b906103ed611c7b926040519384809261249c565b6124fb61362d565b60005b815181101561233f576125118183611b96565b519061252760208301516001600160401b031690565b6001600160401b0381169081156127ac5761254f61227061227086516001600160a01b031690565b1561106f57612571816001600160401b03166000526008602052604060002090565b60808501519060018101926125868454611baa565b61273e576125f97ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb9916125df84750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b81518015908115612728575b5061106f576127096126d4606060019861264761271f967fbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c986136cf565b61269d6126576040830151151590565b86547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178655565b6126cd6126b182516001600160a01b031690565b86906001600160a01b03166001600160a01b0319825416179055565b0151151590565b82547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560e81b60ff60e81b16178255565b61271284615d8f565b50604051918291826137a0565b0390a2016124fe565b90506020830120612737613652565b1438612609565b60016001600160401b0361275d84546001600160401b039060a81c1690565b1614158061278d575b61277057506125fd565b632105803760e11b6000526001600160401b031660045260246000fd5b5061279784611c67565b60208151910120835160208501201415612766565b63c656089560e01b60005260046000fd5b35906001600160e01b038216820361018757565b81601f82011215610187578035906127e8826107c3565b926127f660405194856103bd565b82845260208085019360061b8301019181831161018757602001925b828410612820575050505090565b604084830312610187576020604091825161283a81610351565b863561284581610732565b81526128528388016127bd565b83820152815201930192612812565b9190604083820312610187576040519061287a82610351565b819380356001600160401b03811161018757810182601f820112156101875780356128a4816107c3565b916128b260405193846103bd565b81835260208084019260061b8201019085821161018757602001915b8183106129005750505083526020810135916001600160401b038311610187576020926128fb92016127d1565b910152565b604083870312610187576020604091825161291a81610351565b853561292581610896565b81526129328387016127bd565b838201528152019201916128ce565b81601f8201121561018757803590612958826107c3565b9261296660405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061299257505050505090565b84356001600160401b03811161018757820160a0818503601f19011261018757604051916129bf83610331565b60208201356129cd81610732565b83526040820135926001600160401b0384116101875760a0836129f788602080988198010161087b565b858401526060810135612a0981610732565b60408401526080810135612a1c81610732565b606084015201356080820152815201940193612983565b81601f8201121561018757803590612a4a826107c3565b92612a5860405194856103bd565b82845260208085019360061b8301019181831161018757602001925b828410612a82575050505090565b6040848303126101875760206040918251612a9c81610351565b863581528287013583820152815201930192612a74565b602081830312610187578035906001600160401b038211610187570160808183031261018757612ae16103fe565b9181356001600160401b0381116101875781612afe918401612861565b835260208201356001600160401b0381116101875781612b1f918401612941565b602084015260408201356001600160401b0381116101875781612b43918401612941565b604084015260608201356001600160401b03811161018757612b659201612a33565b606082015290565b9080602083519182815201916020808360051b8301019401926000915b838310612b9957505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612bd78585015160a08786015260a085019061047f565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612b8a565b916001600160a01b03612c3392168352606060208401526060830190612b6d565b9060408183039101526020808351928381520192019060005b818110612c595750505090565b8251805185526020908101518186015260409094019390920191600101612c4c565b6084019081608411611d1557565b60a001908160a011611d1557565b91908201809211611d1557565b906020808351928381520192019060005b818110612cc25750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612cb5565b9190604081019083519160408252825180915260206060830193019060005b818110612d3657505050602061057b93940151906020818403910152612ca4565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612d15565b90602061057b928181520190612cf6565b91612da490612d9661057b9593606086526060860190612b6d565b908482036020860152612b6d565b916040818403910152612cf6565b9197939796929695909495612dc981870187612ab3565b95602087019788518051612fac575b5087518051511590811591612f9d575b50612eb8575b60005b89518051821015612e185790612e12612e0c82600194611b96565b51613850565b01612df1565b50509193959799989092949698600099604081019a5b8b518051821015612e555790612e4f612e4982600194611b96565b51613b24565b01612e2e565b5050907fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47612eaa93926103ed9c612ea0612eb298999a9b9c9d9f519151925160405193849384612d7b565b0390a13691610bec565b943691610bec565b93613fa3565b612ecd602086015b356001600160401b031690565b600b546001600160401b0382811691161015612f7557612f03906001600160401b03166001600160401b0319600b541617600b55565b612f1b6122706122706004546001600160a01b031690565b885190803b1561018757604051633937306f60e01b8152916000918391829084908290612f4b9060048301612d6a565b03925af1801561233a57612f60575b50612dee565b806123ff6000612f6f936103bd565b38612f5a565b50612f8889515160408a01515190612c97565b612dee57632261116760e01b60005260046000fd5b60209150015151151538612de8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060608a0151823b1561018757604051633854844f60e11b815292600092849283918291613008913060048501612c12565b03915afa801561233a5715612dd857806123ff6000613026936103bd565b38612dd8565b6040519061303b6020836103bd565b6000808352366020840137565b61305061362d565b60005b815181101561233f576130668183611b96565b51906040820160ff613079825160ff1690565b161561331b57602083015160ff169261309f8460ff166000526002602052604060002090565b91600183019182546130ba6130b48260ff1690565b60ff1690565b6132e057506130e76130cf6060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a08101918251610100815111613288578051156132ca576003860161311561310f826124df565b8a61511e565b60608401516131a5575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479460029461318161317161319f9a9661316a8760019f9c6131656131979a8f61528c565b6141e4565b5160ff1690565b845460ff191660ff821617909455565b519081855551906040519586950190888661426a565b0390a161530e565b01613053565b979460028793959701966131c16131bb896124df565b8861511e565b6080850151946101008651116132b45785516131e96130b46131e48a5160ff1690565b6141d0565b101561329e578551845111613288576131816131717fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479861316a8760019f61316561319f9f9a8f61327060029f61326a6131979f8f90613165849261324f845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b826151b2565b505050979c9f50975050969a5050509450945061311f565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff166132fb6132f66060840151151590565b151590565b901515146130e7576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b906001600160401b03613371921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036133a05750565b630f01ce8560e01b6000526004524660245260446000fd5b91909180511561345a5782511592602091604051926133d781856103bd565b60008452601f19810160005b8181106134365750505060005b815181101561342e578061341761340960019385611b96565b51881561341d5786906143a9565b016133f0565b6134278387611b96565b51906143a9565b505050509050565b829060405161344481610351565b60008152606083820152828289010152016133e3565b63c2e5347d60e01b60005260046000fd5b9190811015611b915760051b0190565b3561057b816108b2565b9190811015611b915760051b81013590601e19813603018212156101875701908135916001600160401b038311610187576020018236038113610187579190565b909294919397968151966134d9886107c3565b976134e7604051998a6103bd565b8089526134f6601f19916107c3565b0160005b8181106135c857505060005b83518110156135bb578061354d8c8a8a8a613547613540878d613539828f8f9d8f9e60019f81613569575b505050611b96565b5197613485565b3691610844565b93614c18565b613557828c611b96565b52613562818b611b96565b5001613506565b63ffffffff61358161357c85858561346b565b61347b565b1615613531576135b1926135989261357c9261346b565b60406135a48585611b96565b51019063ffffffff169052565b8f8f908391613531565b5096985050505050505050565b6020906135d3611f83565b82828d010152016134fa565b6135f06385572ffb60e01b82614f7b565b908161360a575b81613600575090565b61057b9150614f4d565b905061361581614ed2565b15906135f7565b6135f063aff2afbf60e01b82614f7b565b6001600160a01b0360015416330361364157565b6315ae3a6f60e11b60005260046000fd5b6040516020810190600082526020815261366d6040826103bd565b51902090565b81811061367e575050565b60008155600101613673565b9190601f811161369957505050565b6103ed926000526020600020906020601f840160051c830193106136c5575b601f0160051c0190613673565b90915081906136b8565b91909182516001600160401b03811161034c576136f6816136f08454611baa565b8461368a565b6020601f821160011461373757819061372893949560009261372c575b50508160011b916000199060031b1c19161790565b9055565b015190503880613713565b601f1982169061374c84600052602060002090565b9160005b8181106137885750958360019596971061376f575b505050811b019055565b015160001960f88460031b161c19169055388080613765565b9192602060018192868b015181550194019201613750565b90600160c061057b936020815260ff84546001600160a01b0381166020840152818160a01c16151560408401526001600160401b038160a81c16606084015260e81c161515608082015260a080820152019101611be4565b90816020910312610187575161057b81611546565b909161382461057b9360408452604084019061047f565b916020818403910152611be4565b6001600160401b036001911601906001600160401b038211611d1557565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091613af5575b50613ad7576138d282614fab565b805460ff60e882901c161515600114613aac576020830180516020815191012090600184019161390183611c67565b6020815191012003613a8f57505060408301516001600160401b039081169160a81c168114801590613a67575b613a2657506080820151918215613a155761396f83613960866001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b546139f2576139ef929161399861399360606139d19401516001600160401b031690565b613832565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b61396042936001600160401b0316600052600a602052604060002090565b55565b6332cf0cbf60e01b6000526001600160401b038416600452602483905260446000fd5b63504570e360e01b60005260046000fd5b83611f2591613a3f60608601516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b50613a7f61069d60608501516001600160401b031690565b6001600160401b0382161161392e565b51611ecf60405192839263b80d8fa960e01b84526004840161380d565b60808301516348e2b93360e11b6000526001600160401b038516600452602452600160445260646000fd5b637edeb53960e11b6000526001600160401b03821660045260246000fd5b613b17915060203d602011613b1d575b613b0f81836103bd565b8101906137f8565b386138c4565b503d613b05565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091613bff575b50613ad757613ba682614fab565b805460ff60e882901c1615613bd1576020830180516020815191012090600184019161390183611c67565b60808301516348e2b93360e11b60009081526001600160401b03861660045260249190915260445260646000fd5b613c18915060203d602011613b1d57613b0f81836103bd565b38613b98565b6003111561076e57565b600382101561076e5752565b906103ed604051613c4481610351565b602060ff829554818116845260081c169101613c28565b8054821015611b915760005260206000200190600090565b60ff60019116019060ff8211611d1557565b60ff601b9116019060ff8211611d1557565b90606092604091835260208301370190565b6001600052600260205293613cdd7fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612463565b93853594613cea85612c7b565b6060820190613cf98251151590565b613f75575b803603613f5d57508151878103613f445750613d18613375565b60016000526003602052613d67613d627fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b613c34565b60026020820151613d7781613c1e565b613d8081613c1e565b149081613edc575b5015613eb0575b51613de7575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613dcb612ec060019460200190565b604080519283526001600160401b0391909116602083015290a2565b613e086130b4613e03602085969799989a955194015160ff1690565b613c73565b03613e9f578151835103613e8e57613e866000613dcb94612ec094613e527f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b3691610844565b60208151910120604051613e7d81613e6f89602083019586613c97565b03601f1981018352826103bd565b5190208a614fe8565b948394613d95565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613d8f57631b41e11d60e31b60005260046000fd5b60016000526002602052613f3c915061227090613f2990613f2360037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b90613c5b565b90546001600160a01b039160031b1c1690565b331438613d88565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613f9e90613f98613f8e613f898751611cff565b612c89565b613f988851611cff565b90612c97565b613cfe565b60008052600260205294909390929091613fdc7fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612463565b94863595613fe983612c7b565b6060820190613ff88251151590565b6141ad575b803603613f5d575081518881036141945750614017613375565b60008052600360205261404c613d627f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613d4a565b6002602082015161405c81613c1e565b61406581613c1e565b14908161414b575b501561411f575b516140b1575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613dcb612ec060009460200190565b6140cd6130b4613e03602087989a999b96975194015160ff1690565b03613e9f578351865103613e8e576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613dcb95613e5261411694612ec0973691610844565b9483943861407a565b72c11c11c11c11c11c11c11c11c11c11c11c11c133031561407457631b41e11d60e31b60005260046000fd5b60008052600260205261418c915061227090613f2990613f2360037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613f1a565b33143861406d565b6324f7d61360e21b600052600452602488905260446000fd5b6141cb90613f986141c1613f898951611cff565b613f988a51611cff565b613ffd565b60ff166003029060ff8216918203611d1557565b8151916001600160401b03831161034c5768010000000000000000831161034c57602090825484845580851061424d575b500190600052602060002060005b8381106142305750505050565b60019060206001600160a01b038551169401938184015501614223565b614264908460005285846000209182019101613673565b38614215565b95949392909160ff61428f93168752602087015260a0604087015260a086019061249c565b84810360608601526020808351928381520192019060005b8181106142c2575050509060806103ed9294019060ff169052565b82516001600160a01b03168452602093840193909201916001016142a7565b600654811015611b915760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b0361057b949381606094168352166020820152816040820152019061047f565b60409061057b93928152816020820152019061047f565b9291906001600160401b0390816064951660045216602452600481101561076e57604452565b9493926143936060936143a49388526020880190610773565b60806040870152608086019061047f565b930152565b906143bb82516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091614af6575b50614a97576020830191825151948515614a6757604085018051518703614a565761445d87611b3c565b957f000000000000000000000000000000000000000000000000000000000000000061448d60016117e987614fab565b602081519101206040516144ed81613e6f6020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a81106149be57505050806080606061451d93015191015190888661553a565b9788156149a05760005b88811061453a5750505050505050505050565b5a61454f614549838a51611b96565b5161585a565b805160600151614568906001600160401b031688611d27565b61457181610764565b8015908d828315938461498d575b1561494a57606088156148cd57506145a6602061459c898d611b96565b5101519242611d1a565b6004546145bb9060a01c63ffffffff16611e55565b1080156148ba575b1561489c576145d2878b611b96565b5151614886575b8451608001516145f1906001600160401b031661069d565b6147ce575b50614602868951611b96565b5160a08501515181510361479257936146679695938c938f966146478e958c9261464161463b60608951016001600160401b0390511690565b8961592d565b86615b2b565b9a90809661466160608851016001600160401b0390511690565b906159b2565b614740575b505061467782610764565b600282036146f8575b6001966146ee7f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b039351926146df6146d68b6146ce60608801516001600160401b031690565b96519b611b96565b51985a90611d1a565b9160405195869516988561437a565b0390a45b01614527565b9150919394925061470882610764565b6003820361471c578b929493918a91614680565b51606001516349362d1f60e11b600052611f2591906001600160401b031689614354565b61474984610764565b6003840361466c579092949550614761919350610764565b614771578b92918a91388061466c565b5151604051632b11b8d960e01b8152908190611ecf9087906004840161433d565b611f258b6147ac60608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b6147d783610764565b6147e2575b386145f6565b8351608001516001600160401b0316602080860151918c61481760405194859384936370701e5760e11b855260048501614316565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561233a57600091614868575b506147dc5750505050506001906146f2565b614880915060203d8111613b1d57613b0f81836103bd565b38614856565b614890878b611b96565b515160808601526145d9565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b506148c483610764565b600383146145c3565b9150836148d984610764565b156145d957506001959450614942925061492091507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a16146f2565b50505050600192915061494261492060607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b5061499783610764565b6003831461457f565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b6149c9818a51611b96565b518051604001516001600160401b0316838103614a3957508051602001516001600160401b0316898103614a16575090614a0584600193615432565b614a0f828d611b96565b52016144fd565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611f25614a7b86516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b5092915050614ad9576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b637edeb53960e11b6000526001600160401b031660045260246000fd5b614b0f915060203d602011613b1d57613b0f81836103bd565b38614433565b51906103ed82610896565b90816020910312610187575161057b81610896565b9061057b916020815260e0614bd3614bbe614b5e8551610100602087015261012086019061047f565b60208601516001600160401b0316604086015260408601516001600160a01b0316606086015260608601516080860152614ba8608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c087015261047f565b60c0850151848203601f19018486015261047f565b92015190610100601f198285030191015261047f565b6040906001600160a01b0361057b9493168152816020820152019061047f565b90816020910312610187575190565b91939293614c24611f83565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa93841561233a57600094614ea1575b506001600160a01b0384169586158015614e8f575b614e7157614d56614d7f92613e6f92614cda614cd3611e5560408c015163ffffffff1690565b8c89615c44565b9690996080810151614d086060835193015193614cf561040d565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b602082015292839160248301614b35565b82857f000000000000000000000000000000000000000000000000000000000000000092615cd2565b94909115614e555750805160208103614e3c575090614da8826020808a95518301019101614c09565b956001600160a01b03841603614de0575b5050505050614dd8614dc961041d565b6001600160a01b039093168352565b602082015290565b614df393614ded91611d1a565b91615c44565b50908082108015614e29575b614e0b57808481614db9565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614e358284611d1a565b1415614dff565b631e3be00960e21b600052602060045260245260446000fd5b611ecf604051928392634ff17cad60e11b845260048401614be9565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614e9c6123638661361c565b614cad565b614ec491945060203d602011614ecb575b614ebc81836103bd565b810190614b20565b9238614c98565b503d614eb2565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614f006044836103bd565b6179185a10614f3c576020926000925191617530fa6000513d82614f30575b5081614f29575090565b9050151590565b60201115915038614f1f565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614f006044836103bd565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614f006044836103bd565b6001600160401b031680600052600860205260406000209060ff825460a01c1615614fd4575090565b63ed053c5960e01b60005260045260246000fd5b919390926000948051946000965b868810615007575050505050505050565b6020881015611b91576020600061501f878b1a613c85565b6150298b87611b96565b51906150606150388d8a611b96565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561233a576150a6613d6260005161508e8960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b90600160208301516150b781613c1e565b6150c081613c1e565b0361510d576150dd6150d3835160ff1690565b60ff600191161b90565b81166150fc576150f36150d36001935160ff1690565b17970196614ff6565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b83518110156151775760019060ff831660005260036020526000615170604082206001600160a01b03615157858a611b96565b51166001600160a01b0316600052602052604060002090565b5501615124565b50509050565b8151815460ff191660ff919091161781559060200151600381101561076e57815461ff00191660089190911b61ff0016179055565b919060005b8151811015615177576151da6151cd8284611b96565b516001600160a01b031690565b906152036151f98361508e8860ff166000526003602052604060002090565b5460081c60ff1690565b61520c81613c1e565b615277576001600160a01b038216156152665761526060019261525b61523061041d565b60ff85168152916152448660208501613c28565b61508e8960ff166000526003602052604060002090565b61517d565b016151b7565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015615177576152a76151cd8284611b96565b906152c66151f98361508e8860ff166000526003602052604060002090565b6152cf81613c1e565b615277576001600160a01b038216156152665761530860019261525b6152f361041d565b60ff8516815291615244600260208501613c28565b01615291565b60ff1680600052600260205260ff60016040600020015460101c1690801560001461535c57501561534b576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146153665750565b61536c57565b6307b8c74d60e51b60005260046000fd5b9080602083519182815201916020808360051b8301019401926000915b8383106153a957505050505090565b9091929394602080600192601f1985820301865288519060808061540c6153d9855160a0865260a086019061047f565b6001600160a01b0387870151168786015263ffffffff60408701511660408601526060860151858203606087015261047f565b9301519101529701930193019193929061539a565b90602061057b92818152019061537d565b61366d81518051906154c661545160608601516001600160a01b031690565b613e6f61546860608501516001600160401b031690565b936154816080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613e6f6020840151602081519101209360a06040820151602081519101209101516040516154ff81613e6f602082019485615421565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b039261554d92615e13565b9116600052600a60205260406000209060005260205260406000205490565b91908260a09103126101875760405161558481610331565b608080829480518452602081015161559b81610732565b602085015260408101516155ae81610732565b604085015260608101516155c181610732565b606085015201519161084083610732565b51906103ed826108b2565b81601f82011215610187578051906155f4826107c3565b9261560260405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061562e57505050505090565b84516001600160401b03811161018757820160a0818503601f190112610187576040519161565b83610331565b60208201516001600160401b0381116101875785602061567d928501016120cf565b8352604082015161568d81610896565b602084015261569e606083016155d2565b60408401526080820151926001600160401b0384116101875760a0836156cb8860208098819801016120cf565b60608401520151608082015281520194019361561f565b602081830312610187578051906001600160401b038211610187570161014081830312610187576157116103de565b9161571c818361556c565b835260a08201516001600160401b038111610187578161573d9184016120cf565b602084015260c08201516001600160401b03811161018757816157619184016120cf565b604084015261577260e08301614b15565b606084015261010082015160808401526101208201516001600160401b038111610187576157a092016155dd565b60a082015290565b61057b916001600160401b036080835180518452826020820151166020850152826040820151166040850152826060820151166060850152015116608082015260a061581961580760208501516101408486015261014085019061047f565b604085015184820360c086015261047f565b60608401516001600160a01b031660e084015292608081015161010084015201519061012081840391015261537d565b90602061057b9281815201906157a8565b60006158d2819260405161586d816103a2565b615875611ae3565b81526060602082015260606040820152836060820152836080820152606060a0820152506158b5612270612270600b546001600160a01b039060401c1690565b90604051948580948193634546c6e560e01b835260048301615849565b03925af160009181615908575b5061057b57611ecf6158ef61208e565b60405163828ebdfb60e01b8152918291600483016120be565b6159269192503d806000833e61591e81836103bd565b8101906156e2565b90386158df565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611d15576139ef916001600160401b036159708584613331565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611d15576159ea8484613331565b600483101561076e576001600160401b036139ef9416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b90615a51906060835260608301906157a8565b8181036020830152825180825260208201916020808360051b8301019501926000915b838310615ac157505050505060408183039101526020808351928381520192019060005b818110615aa55750505090565b825163ffffffff16845260209384019390920191600101615a98565b9091929395602080615adf600193601f198682030187528a5161047f565b98019301930191939290615a74565b80516020909101516001600160e01b0319811692919060048210615b10575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b1561018757600091615b546040519485938493630304c3e160e51b855260048501615a3e565b038183305af19081615c2f575b50615c2457615b6e61208e565b9072c11c11c11c11c11c11c11c11c11c11c11c11c13314615b90575b60039190565b615ba9615b9c83615aee565b6001600160e01b03191690565b6337c3be2960e01b148015615c09575b8015615bee575b15615b8a57611f25615bd183615aee565b632882569d60e01b6000526001600160e01b031916600452602490565b50615bfb615b9c83615aee565b63753fa58960e11b14615bc0565b50615c16615b9c83615aee565b632be8ca8b60e21b14615bb9565b60029061057b610447565b806123ff6000615c3e936103bd565b38615b61565b6040516370a0823160e01b60208201526001600160a01b039091166024820152919291615ca190615c788160448101613e6f565b84837f000000000000000000000000000000000000000000000000000000000000000092615cd2565b92909115614e555750805160208103614e3c575090615ccc8260208061057b95518301019101614c09565b93611d1a565b939193615cdf608461042c565b94615ced60405196876103bd565b60848652615cfb608461042c565b602087019590601f1901368737833b15615d7e575a90808210615d6d578291038060061c90031115615d5c576000918291825a9560208451940192f1905a9003923d9060848211615d53575b6000908287523e929190565b60849150615d47565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b80600052600760205260406000205415600014615e0d576006546801000000000000000081101561034c57600181016006556000600654821015611b9157600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b8051928251908415615f6f5761010185111580615f63575b15615e9257818501946000198601956101008711615e92578615615f5357615e5287611b3c565b9660009586978795885b848110615eb7575050505050600119018095149384615ead575b505082615ea3575b505015615e9257615e8e91611b96565b5190565b6309bde33960e01b60005260046000fd5b1490503880615e7e565b1492503880615e76565b6001811b82811603615f4557868a1015615f3057615ed960018b019a85611b96565b51905b8c888c1015615f1c5750615ef460018c019b86611b96565b515b818d11615e9257615f15828f92615f0f90600196615f80565b92611b96565b5201615e5c565b60018d019c615f2a91611b96565b51615ef6565b615f3e60018c019b8d611b96565b5190615edc565b615f3e600189019884611b96565b505050509050615e8e9150611b84565b50610101821115615e2b565b630469ac9960e21b60005260046000fd5b81811015615f92579061057b91615f97565b61057b915b9060405190602082019260018452604083015260608201526060815261366d6080826103bd56fea164736f6c634300081a000abd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c", + Bin: "0x61014080604052346108a157616a6b803803809161001d82856108d7565b83398101908082039061014082126108a15760a082126108a157604051610043816108bc565b61004c826108fa565b815260208201519261ffff841684036108a1576020820193845260408301516001600160a01b03811681036108a1576040830190815261008e6060850161090e565b946060840195865260606100a46080870161090e565b6080860190815293609f1901126108a15760405193606085016001600160401b038111868210176108a6576040526100de60a0870161090e565b855260c08601519363ffffffff851685036108a1576020860194855261010660e0880161090e565b604087019081526101008801519097906001600160401b0381116108a15781018a601f820112156108a15780519a6001600160401b038c116108a6578b60051b916020806040519e8f9061015c838801836108d7565b81520193820101908282116108a15760208101935b82851061079057505050505061012061018a910161090e565b97331561077f57600180546001600160a01b031916331790554660805284516001600160a01b031615801561076d575b801561075b575b6107395782516001600160401b03161561074a5782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a181516001600160a01b03161561073957905160048054835163ffffffff60a01b60a09190911b166001600160a01b039384166001600160c01b03199092168217179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff1660208201529251169082015282907fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d90606090a16000915b815183101561067a5760009260208160051b8401015160018060401b0360208201511690811561066b5780516001600160a01b03161561065c57818652600860205260408620906080810151906001830191610366835461092f565b6105fd578354600160a81b600160e81b031916600160a81b1784556040518581527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b805180159081156105d2575b506105c3578051906001600160401b0382116105af576103da845461092f565b601f811161056a575b50602090601f83116001146104eb57600080516020616a4b8339815191529593836104d59460ff979460609460019d9e9f926104e0575b5050600019600383901b1c1916908b1b1783555b604081015115158554908760a01b9060a01b16908760a01b1916178555898060a01b038151168a8060a01b0319865416178555015115158354908560e81b9060e81b16908560e81b1916178355610484866109ec565b506040519384936020855254898060a01b0381166020860152818160a01c1615156040860152898060401b038160a81c16606086015260e81c161515608084015260a08084015260c0830190610969565b0390a201919061030a565b015190508e8061041a565b848b52818b20919a601f198416905b81811061055257509360018460ff9794829c9d9e6060956104d598600080516020616a4b8339815191529c9a10610539575b505050811b01835561042e565b015160001960f88460031b161c191690558e808061052c565b828d0151845560209c8d019c600190940193016104fa565b848b5260208b20601f840160051c810191602085106105a5575b601f0160051c01905b81811061059a57506103e3565b8b815560010161058d565b9091508190610584565b634e487b7160e01b8a52604160045260248afd5b6342bcdf7f60e11b8952600489fd5b9050602082012060405160208101908b8252602081526105f36040826108d7565b519020148a6103ba565b835460a81c6001600160401b0316600114158061062e575b156103ae57632105803760e11b89526004859052602489fd5b50604051610647816106408187610969565b03826108d7565b60208151910120815160208301201415610615565b6342bcdf7f60e11b8652600486fd5b63c656089560e01b8652600486fd5b6001600160a01b0381161561073957600b8054600160401b600160e01b031916604092831b600160401b600160e01b031617905551615fcb9081610a80823960805181613377015260a0518181816101bf0152614460015260c05181818161021501528181612fb60152818161388b01528181613b5f01526143fa015260e0518181816102440152614c6701526101005181818161027301526148250152610120518181816101e6015281816122ae01528181614d5a0152615c7c0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101c1565b5080516001600160a01b0316156101ba565b639b15e16f60e01b60005260046000fd5b84516001600160401b0381116108a157820160a0818603601f1901126108a157604051906107bd826108bc565b60208101516001600160a01b03811681036108a15782526107e0604082016108fa565b60208301526107f160608201610922565b604083015261080260808201610922565b606083015260a08101516001600160401b0381116108a157602091010185601f820112156108a15780516001600160401b0381116108a65760405191610852601f8301601f1916602001846108d7565b81835287602083830101116108a15760005b82811061088c5750509181600060208096949581960101526080820152815201940193610171565b80602080928401015182828701015201610864565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b038211176108a657604052565b601f909101601f19168101906001600160401b038211908210176108a657604052565b51906001600160401b03821682036108a157565b51906001600160a01b03821682036108a157565b519081151582036108a157565b90600182811c9216801561095f575b602083101461094957565b634e487b7160e01b600052602260045260246000fd5b91607f169161093e565b600092918154916109798361092f565b80835292600181169081156109cf575060011461099557505050565b60009081526020812093945091925b8383106109b5575060209250010190565b6001816020929493945483858701015201910191906109a4565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a7957600654680100000000000000008110156108a6576001810180600655811015610a63577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806306285c691461017757806315777ab214610172578063181f5a771461016d5780633f4b04aa146101685780635215505b146101635780635e36480c1461015e5780635e7bb0081461015957806360987c201461015457806365b81aab1461014f5780636f9e320f1461014a5780637437ff9f1461014557806379ba50971461014057806385572ffb1461013b5780638da5cb5b14610136578063c673e58414610131578063ccd37ba31461012c578063cd19723714610127578063de5e0b9a14610122578063e9d68a8e1461011d578063f2fde38b14610118578063f58e03fc146101135763f716f99f1461010e57600080fd5b6119a8565b61188b565b611800565b611757565b6116bb565b61155b565b6114f8565b611433565b61134b565b611315565b611295565b6111f5565b611080565b610fea565b610f6f565b610d68565b610780565b61061f565b610503565b6104a4565b6102f1565b61018c565b600091031261018757565b600080fd5b34610187576000366003190112610187576101a5611ae3565b506102ed6040516101b581610331565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b346101875760003660031901126101875760206001600160a01b03600b5460401c16604051908152f35b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761034c57604052565b61031b565b604081019081106001600160401b0382111761034c57604052565b606081019081106001600160401b0382111761034c57604052565b608081019081106001600160401b0382111761034c57604052565b60c081019081106001600160401b0382111761034c57604052565b90601f801991011681019081106001600160401b0382111761034c57604052565b604051906103ed60c0836103bd565b565b604051906103ed60a0836103bd565b604051906103ed6080836103bd565b604051906103ed610100836103bd565b604051906103ed6040836103bd565b6001600160401b03811161034c57601f01601f191660200190565b604051906104566020836103bd565b60008252565b60005b83811061046f5750506000910152565b818101518382015260200161045f565b906020916104988151809281855285808601910161045c565b601f01601f1916010190565b34610187576000366003190112610187576102ed60408051906104c781836103bd565b600d82527f4f666652616d7020312e362e300000000000000000000000000000000000000060208301525191829160208352602083019061047f565b346101875760003660031901126101875760206001600160401b03600b5416604051908152f35b9060a0608061057b936001600160a01b0381511684526020810151151560208501526001600160401b036040820151166040850152606081015115156060850152015191816080820152019061047f565b90565b6040810160408252825180915260206060830193019060005b818110610600575050506020818303910152815180825260208201916020808360051b8301019401926000915b8383106105d357505050505090565b90919293946020806105f1600193601f19868203018752895161052a565b970193019301919392906105c4565b82516001600160401b0316855260209485019490920191600101610597565b346101875760003660031901126101875760065461063c816107c3565b9061064a60405192836103bd565b808252601f19610659826107c3565b0160005b81811061071b57505061066f81611b3c565b9060005b81811061068b5750506102ed6040519283928361057e565b806106c16106a961069d6001946142e1565b6001600160401b031690565b6106b38387611b96565b906001600160401b03169052565b6106ff6106fa6106e16106d48488611b96565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611c82565b6107098287611b96565b526107148186611b96565b5001610673565b602090610726611b0e565b8282870101520161065d565b6001600160401b0381160361018757565b35906103ed82610732565b634e487b7160e01b600052602160045260246000fd5b6004111561076e57565b61074e565b90600482101561076e5752565b346101875760403660031901126101875760206107b46004356107a281610732565b602435906107af82610732565b611d27565b6107c16040518092610773565bf35b6001600160401b03811161034c5760051b60200190565b91908260a0910312610187576040516107f281610331565b608080829480358452602081013561080981610732565b6020850152604081013561081c81610732565b6040850152606081013561082f81610732565b606085015201359161084083610732565b0152565b9291926108508261042c565b9161085e60405193846103bd565b829481845281830111610187578281602093846000960137010152565b9080601f830112156101875781602061057b93359101610844565b6001600160a01b0381160361018757565b35906103ed82610896565b63ffffffff81160361018757565b35906103ed826108b2565b81601f82011215610187578035906108e2826107c3565b926108f060405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061091c57505050505090565b84356001600160401b03811161018757820160a0818503601f190112610187576040519161094983610331565b60208201356001600160401b0381116101875785602061096b9285010161087b565b8352604082013561097b81610896565b602084015261098c606083016108c0565b60408401526080820135926001600160401b0384116101875760a0836109b988602080988198010161087b565b60608401520135608082015281520194019361090d565b91909161014081840312610187576109e66103de565b926109f181836107da565b845260a08201356001600160401b0381116101875781610a1291840161087b565b602085015260c08201356001600160401b0381116101875781610a3691840161087b565b6040850152610a4760e083016108a7565b606085015261010082013560808501526101208201356001600160401b03811161018757610a7592016108cb565b60a0830152565b9080601f83011215610187578135610a93816107c3565b92610aa160405194856103bd565b81845260208085019260051b820101918383116101875760208201905b838210610acd57505050505090565b81356001600160401b03811161018757602091610aef878480948801016109d0565b815201910190610abe565b81601f8201121561018757803590610b11826107c3565b92610b1f60405194856103bd565b82845260208085019360051b830101918183116101875760208101935b838510610b4b57505050505090565b84356001600160401b03811161018757820183603f82011215610187576020810135610b76816107c3565b91610b8460405193846103bd565b8183526020808085019360051b83010101918683116101875760408201905b838210610bbd575050509082525060209485019401610b3c565b81356001600160401b03811161018757602091610be18a848080958901010161087b565b815201910190610ba3565b929190610bf8816107c3565b93610c0660405195866103bd565b602085838152019160051b810192831161018757905b828210610c2857505050565b8135815260209182019101610c1c565b9080601f830112156101875781602061057b93359101610bec565b81601f8201121561018757803590610c6a826107c3565b92610c7860405194856103bd565b82845260208085019360051b830101918183116101875760208101935b838510610ca457505050505090565b84356001600160401b03811161018757820160a0818503601f19011261018757610ccc6103ef565b91610cd960208301610743565b835260408201356001600160401b03811161018757856020610cfd92850101610a7c565b602084015260608201356001600160401b03811161018757856020610d2492850101610afa565b60408401526080820135926001600160401b0384116101875760a083610d51886020809881980101610c38565b606084015201356080820152815201940193610c95565b34610187576040366003190112610187576004356001600160401b03811161018757610d98903690600401610c53565b6024356001600160401b038111610187573660238201121561018757806004013591610dc3836107c3565b91610dd160405193846103bd565b8383526024602084019460051b820101903682116101875760248101945b828610610e0257610e008585611d6f565b005b85356001600160401b03811161018757820136604382011215610187576024810135610e2d816107c3565b91610e3b60405193846103bd565b818352602060248185019360051b83010101903682116101875760448101925b828410610e75575050509082525060209586019501610def565b83356001600160401b038111610187576024908301016040601f1982360301126101875760405190610ea682610351565b6020810135825260408101356001600160401b03811161018757602091010136601f8201121561018757803590610edc826107c3565b91610eea60405193846103bd565b80835260208084019160051b8301019136831161018757602001905b828210610f255750505091816020938480940152815201930192610e5b565b602080918335610f34816108b2565b815201910190610f06565b9181601f84011215610187578235916001600160401b038311610187576020808501948460051b01011161018757565b34610187576060366003190112610187576004356001600160401b03811161018757610f9f9036906004016109d0565b6024356001600160401b03811161018757610fbe903690600401610f3f565b91604435926001600160401b03841161018757610fe2610e00943690600401610f3f565b939092612186565b346101875760203660031901126101875760043561100781610896565b61100f61362d565b6001600160a01b0381161561106f577fffffffff0000000000000000000000000000000000000000ffffffffffffffff7bffffffffffffffffffffffffffffffffffffffff0000000000000000600b549260401b16911617600b55600080f35b6342bcdf7f60e11b60005260046000fd5b3461018757606036600319011261018757600060405161109f8161036c565b6004356110ab81610896565b81526024356110b9816108b2565b60208201908152604435906110cd82610896565b604083019182526110dc61362d565b6001600160a01b03835116156111e657916111a86001600160a01b036111e0937fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d95611141838651166001600160a01b03166001600160a01b03196004541617600455565b517fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006004549260a01b1691161760045551166001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b0390a180f35b6342bcdf7f60e11b8452600484fd5b34610187576000366003190112610187576000604080516112158161036c565b82815282602082015201526102ed60405161122f8161036c565b63ffffffff6004546001600160a01b038116835260a01c1660208201526001600160a01b036005541660408201526040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b34610187576000366003190112610187576000546001600160a01b0381163303611304576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b34610187576020366003190112610187576004356001600160401b0381116101875760a090600319903603011261018757600080fd5b346101875760003660031901126101875760206001600160a01b0360015416604051908152f35b6004359060ff8216820361018757565b359060ff8216820361018757565b906020808351928381520192019060005b8181106113ae5750505090565b82516001600160a01b03168452602093840193909201916001016113a1565b9061057b9160208152606082518051602084015260ff602082015116604084015260ff60408201511682840152015115156080820152604061141e602084015160c060a085015260e0840190611390565b9201519060c0601f1982850301910152611390565b346101875760203660031901126101875760ff61144e611372565b60606040805161145d8161036c565b815161146881610387565b6000815260006020820152600083820152600084820152815282602082015201521660005260026020526102ed604060002060036114e7604051926114ac8461036c565b6114b581612463565b84526040516114d2816114cb816002860161249c565b03826103bd565b60208501526114cb604051809481930161249c565b6040820152604051918291826113cd565b346101875760403660031901126101875760043561151581610732565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b8015150361018757565b35906103ed82611546565b34610187576020366003190112610187576004356001600160401b038111610187573660238201121561018757806004013590611597826107c3565b906115a560405192836103bd565b8282526024602083019360051b820101903682116101875760248101935b8285106115d357610e00846124f3565b84356001600160401b03811161018757820160a06023198236030112610187576040519161160083610331565b602482013561160e81610896565b8352604482013561161e81610732565b6020840152606482013561163181611546565b6040840152608482013561164481611546565b606084015260a4820135926001600160401b0384116101875761167160209493602486953692010161087b565b60808201528152019401936115c3565b9060049160441161018757565b9181601f84011215610187578235916001600160401b038311610187576020838186019501011161018757565b346101875760c0366003190112610187576116d536611681565b6044356001600160401b038111610187576116f490369060040161168e565b6064929192356001600160401b03811161018757611716903690600401610f3f565b60843594916001600160401b0386116101875761173a610e00963690600401610f3f565b94909360a43596612db2565b90602061057b92818152019061052a565b34610187576020366003190112610187576001600160401b0360043561177c81610732565b611784611b0e565b501660005260086020526102ed60406000206117ef6001604051926117a884610331565b6117e960ff82546001600160a01b0381168752818160a01c16151560208801526001600160401b038160a81c16604088015260e81c16606086019015159052565b01611c67565b608082015260405191829182611746565b34610187576020366003190112610187576001600160a01b0360043561182581610896565b61182d61362d565b1633811461187a57806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b34610187576060366003190112610187576118a536611681565b6044356001600160401b038111610187576118c490369060040161168e565b91828201602083820312610187578235906001600160401b038211610187576118ee918401610c53565b6040519060206118fe81846103bd565b60008352601f19810160005b81811061193257505050610e009491611922916133b8565b61192a61302c565b928392613ca9565b6060858201840152820161190a565b9080601f83011215610187578135611958816107c3565b9261196660405194856103bd565b81845260208085019260051b82010192831161018757602001905b82821061198e5750505090565b60208091833561199d81610896565b815201910190611981565b34610187576020366003190112610187576004356001600160401b0381116101875736602382011215610187578060040135906119e4826107c3565b906119f260405192836103bd565b8282526024602083019360051b820101903682116101875760248101935b828510611a2057610e0084613048565b84356001600160401b03811161018757820160c0602319823603011261018757611a486103de565b9160248201358352611a5c60448301611382565b6020840152611a6d60648301611382565b6040840152611a7e60848301611550565b606084015260a48201356001600160401b03811161018757611aa69060243691850101611941565b608084015260c4820135926001600160401b03841161018757611ad3602094936024869536920101611941565b60a0820152815201940193611a10565b60405190611af082610331565b60006080838281528260208201528260408201528260608201520152565b60405190611b1b82610331565b60606080836000815260006020820152600060408201526000838201520152565b90611b46826107c3565b611b5360405191826103bd565b8281528092611b64601f19916107c3565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611b915760200190565b611b6e565b8051821015611b915760209160051b010190565b90600182811c92168015611bda575b6020831014611bc457565b634e487b7160e01b600052602260045260246000fd5b91607f1691611bb9565b60009291815491611bf483611baa565b8083529260018116908115611c4a5750600114611c1057505050565b60009081526020812093945091925b838310611c30575060209250010190565b600181602092949394548385870101520191019190611c1f565b915050602093945060ff929192191683830152151560051b010190565b906103ed611c7b9260405193848092611be4565b03836103bd565b9060016080604051611c9381610331565b610840819560ff81546001600160a01b0381168552818160a01c16151560208601526001600160401b038160a81c16604086015260e81c1615156060840152611ce26040518096819301611be4565b03846103bd565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611d1557565b611ce9565b91908203918211611d1557565b611d3382607f92613331565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611d15576003911c16600481101561076e5790565b611d77613375565b805182518103611f725760005b818110611d97575050906103ed916133b8565b611da18184611b96565b516020810190815151611db48488611b96565b519283518203611f725790916000925b808410611dd8575050505050600101611d84565b91949398611dea848b98939598611b96565b515198611df8888851611b96565b519980611f29575b5060a08a01988b6020611e168b8d515193611b96565b5101515103611ee85760005b8a5151811015611ed357611e5e611e55611e4b8f6020611e438f8793611b96565b510151611b96565b5163ffffffff1690565b63ffffffff1690565b8b81611e6f575b5050600101611e22565b611e556040611e8285611e8e9451611b96565b51015163ffffffff1690565b90818110611e9d57508b611e65565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611dc4565b611f258b51611f03606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b6000fd5b60808b0151811015611e0057611f25908b611f4b88516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190611f9082610351565b60006020838281520152565b60405190611fab6020836103bd565b600080835282815b828110611fbf57505050565b602090611fca611f83565b82828501015201611fb3565b805182526001600160401b036020820151166020830152608061201d61200b604084015160a0604087015260a086019061047f565b6060840151858203606087015261047f565b9101519160808183039101526020808351928381520192019060005b8181106120465750505090565b825180516001600160a01b031685526020908101518186015260409094019390920191600101612039565b90602061057b928181520190611fd6565b6040513d6000823e3d90fd5b3d156120b9573d9061209f8261042c565b916120ad60405193846103bd565b82523d6000602084013e565b606090565b90602061057b92818152019061047f565b81601f820112156101875780516120e58161042c565b926120f360405194856103bd565b818452602082840101116101875761057b916020808501910161045c565b909160608284031261018757815161212881611546565b9260208301516001600160401b0381116101875760409161214a9185016120cf565b92015190565b9293606092959461ffff6121746001600160a01b0394608088526080880190611fd6565b97166020860152604085015216910152565b9290939130330361245257612199611f9c565b9460a0850151805161240b575b50505050508051916121c4602084519401516001600160401b031690565b9060208301519160408401926121f18451926121de6103ef565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b0361221a6005546001600160a01b031690565b168061238e575b5051511580612382575b801561236c575b8015612343575b61233f576122d7918161227c6122706122636106e1602060009751016001600160401b0390511690565b546001600160a01b031690565b6001600160a01b031690565b9083612297606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f00000000000000000000000000000000000000000000000000000000000000009060048601612150565b03925af190811561233a57600090600092612313575b50156122f65750565b6040516302a35ba360e21b8152908190611ecf90600483016120be565b905061233291503d806000833e61232a81836103bd565b810190612111565b5090386122ed565b612082565b5050565b5061236761236361235e60608401516001600160a01b031690565b6135df565b1590565b612239565b5060608101516001600160a01b03163b15612232565b5060808101511561222b565b803b1561018757600060405180926308d450a160e01b82528183816123b68a60048301612071565b03925af190816123f0575b506123ea57611ecf6123d161208e565b6040516309c2532560e01b8152918291600483016120be565b38612221565b806123ff6000612405936103bd565b8061017c565b386123c1565b859650602061244796015161242a60608901516001600160a01b031690565b9061244160208a51016001600160401b0390511690565b926134c6565b9038808080806121a6565b6306e34e6560e31b60005260046000fd5b9060405161247081610387565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106124c05750505090565b82546001600160a01b03168452602090930192600192830192016124b3565b906103ed611c7b926040519384809261249c565b6124fb61362d565b60005b815181101561233f576125118183611b96565b519061252760208301516001600160401b031690565b6001600160401b0381169081156127ac5761254f61227061227086516001600160a01b031690565b1561106f57612571816001600160401b03166000526008602052604060002090565b60808501519060018101926125868454611baa565b61273e576125f97ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb9916125df84750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b81518015908115612728575b5061106f576127096126d4606060019861264761271f967fbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c986136cf565b61269d6126576040830151151590565b86547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178655565b6126cd6126b182516001600160a01b031690565b86906001600160a01b03166001600160a01b0319825416179055565b0151151590565b82547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560e81b60ff60e81b16178255565b61271284615d8f565b50604051918291826137a0565b0390a2016124fe565b90506020830120612737613652565b1438612609565b60016001600160401b0361275d84546001600160401b039060a81c1690565b1614158061278d575b61277057506125fd565b632105803760e11b6000526001600160401b031660045260246000fd5b5061279784611c67565b60208151910120835160208501201415612766565b63c656089560e01b60005260046000fd5b35906001600160e01b038216820361018757565b81601f82011215610187578035906127e8826107c3565b926127f660405194856103bd565b82845260208085019360061b8301019181831161018757602001925b828410612820575050505090565b604084830312610187576020604091825161283a81610351565b863561284581610732565b81526128528388016127bd565b83820152815201930192612812565b9190604083820312610187576040519061287a82610351565b819380356001600160401b03811161018757810182601f820112156101875780356128a4816107c3565b916128b260405193846103bd565b81835260208084019260061b8201019085821161018757602001915b8183106129005750505083526020810135916001600160401b038311610187576020926128fb92016127d1565b910152565b604083870312610187576020604091825161291a81610351565b853561292581610896565b81526129328387016127bd565b838201528152019201916128ce565b81601f8201121561018757803590612958826107c3565b9261296660405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061299257505050505090565b84356001600160401b03811161018757820160a0818503601f19011261018757604051916129bf83610331565b60208201356129cd81610732565b83526040820135926001600160401b0384116101875760a0836129f788602080988198010161087b565b858401526060810135612a0981610732565b60408401526080810135612a1c81610732565b606084015201356080820152815201940193612983565b81601f8201121561018757803590612a4a826107c3565b92612a5860405194856103bd565b82845260208085019360061b8301019181831161018757602001925b828410612a82575050505090565b6040848303126101875760206040918251612a9c81610351565b863581528287013583820152815201930192612a74565b602081830312610187578035906001600160401b038211610187570160808183031261018757612ae16103fe565b9181356001600160401b0381116101875781612afe918401612861565b835260208201356001600160401b0381116101875781612b1f918401612941565b602084015260408201356001600160401b0381116101875781612b43918401612941565b604084015260608201356001600160401b03811161018757612b659201612a33565b606082015290565b9080602083519182815201916020808360051b8301019401926000915b838310612b9957505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612bd78585015160a08786015260a085019061047f565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612b8a565b916001600160a01b03612c3392168352606060208401526060830190612b6d565b9060408183039101526020808351928381520192019060005b818110612c595750505090565b8251805185526020908101518186015260409094019390920191600101612c4c565b6084019081608411611d1557565b60a001908160a011611d1557565b91908201809211611d1557565b906020808351928381520192019060005b818110612cc25750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612cb5565b9190604081019083519160408252825180915260206060830193019060005b818110612d3657505050602061057b93940151906020818403910152612ca4565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612d15565b90602061057b928181520190612cf6565b91612da490612d9661057b9593606086526060860190612b6d565b908482036020860152612b6d565b916040818403910152612cf6565b9197939796929695909495612dc981870187612ab3565b95602087019788518051612fac575b5087518051511590811591612f9d575b50612eb8575b60005b89518051821015612e185790612e12612e0c82600194611b96565b51613850565b01612df1565b50509193959799989092949698600099604081019a5b8b518051821015612e555790612e4f612e4982600194611b96565b51613b24565b01612e2e565b5050907fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47612eaa93926103ed9c612ea0612eb298999a9b9c9d9f519151925160405193849384612d7b565b0390a13691610bec565b943691610bec565b93613fa3565b612ecd602086015b356001600160401b031690565b600b546001600160401b0382811691161015612f7557612f03906001600160401b03166001600160401b0319600b541617600b55565b612f1b6122706122706004546001600160a01b031690565b885190803b1561018757604051633937306f60e01b8152916000918391829084908290612f4b9060048301612d6a565b03925af1801561233a57612f60575b50612dee565b806123ff6000612f6f936103bd565b38612f5a565b50612f8889515160408a01515190612c97565b612dee57632261116760e01b60005260046000fd5b60209150015151151538612de8565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060608a0151823b1561018757604051633854844f60e11b815292600092849283918291613008913060048501612c12565b03915afa801561233a5715612dd857806123ff6000613026936103bd565b38612dd8565b6040519061303b6020836103bd565b6000808352366020840137565b61305061362d565b60005b815181101561233f576130668183611b96565b51906040820160ff613079825160ff1690565b161561331b57602083015160ff169261309f8460ff166000526002602052604060002090565b91600183019182546130ba6130b48260ff1690565b60ff1690565b6132e057506130e76130cf6060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a08101918251610100815111613288578051156132ca576003860161311561310f826124df565b8a61511e565b60608401516131a5575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479460029461318161317161319f9a9661316a8760019f9c6131656131979a8f61528c565b6141e4565b5160ff1690565b845460ff191660ff821617909455565b519081855551906040519586950190888661426a565b0390a161530e565b01613053565b979460028793959701966131c16131bb896124df565b8861511e565b6080850151946101008651116132b45785516131e96130b46131e48a5160ff1690565b6141d0565b101561329e578551845111613288576131816131717fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479861316a8760019f61316561319f9f9a8f61327060029f61326a6131979f8f90613165849261324f845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b826151b2565b505050979c9f50975050969a5050509450945061311f565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff166132fb6132f66060840151151590565b151590565b901515146130e7576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b906001600160401b03613371921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036133a05750565b630f01ce8560e01b6000526004524660245260446000fd5b91909180511561345a5782511592602091604051926133d781856103bd565b60008452601f19810160005b8181106134365750505060005b815181101561342e578061341761340960019385611b96565b51881561341d5786906143a9565b016133f0565b6134278387611b96565b51906143a9565b505050509050565b829060405161344481610351565b60008152606083820152828289010152016133e3565b63c2e5347d60e01b60005260046000fd5b9190811015611b915760051b0190565b3561057b816108b2565b9190811015611b915760051b81013590601e19813603018212156101875701908135916001600160401b038311610187576020018236038113610187579190565b909294919397968151966134d9886107c3565b976134e7604051998a6103bd565b8089526134f6601f19916107c3565b0160005b8181106135c857505060005b83518110156135bb578061354d8c8a8a8a613547613540878d613539828f8f9d8f9e60019f81613569575b505050611b96565b5197613485565b3691610844565b93614c18565b613557828c611b96565b52613562818b611b96565b5001613506565b63ffffffff61358161357c85858561346b565b61347b565b1615613531576135b1926135989261357c9261346b565b60406135a48585611b96565b51019063ffffffff169052565b8f8f908391613531565b5096985050505050505050565b6020906135d3611f83565b82828d010152016134fa565b6135f06385572ffb60e01b82614f7b565b908161360a575b81613600575090565b61057b9150614f4d565b905061361581614ed2565b15906135f7565b6135f063aff2afbf60e01b82614f7b565b6001600160a01b0360015416330361364157565b6315ae3a6f60e11b60005260046000fd5b6040516020810190600082526020815261366d6040826103bd565b51902090565b81811061367e575050565b60008155600101613673565b9190601f811161369957505050565b6103ed926000526020600020906020601f840160051c830193106136c5575b601f0160051c0190613673565b90915081906136b8565b91909182516001600160401b03811161034c576136f6816136f08454611baa565b8461368a565b6020601f821160011461373757819061372893949560009261372c575b50508160011b916000199060031b1c19161790565b9055565b015190503880613713565b601f1982169061374c84600052602060002090565b9160005b8181106137885750958360019596971061376f575b505050811b019055565b015160001960f88460031b161c19169055388080613765565b9192602060018192868b015181550194019201613750565b90600160c061057b936020815260ff84546001600160a01b0381166020840152818160a01c16151560408401526001600160401b038160a81c16606084015260e81c161515608082015260a080820152019101611be4565b90816020910312610187575161057b81611546565b909161382461057b9360408452604084019061047f565b916020818403910152611be4565b6001600160401b036001911601906001600160401b038211611d1557565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091613af5575b50613ad7576138d282614fab565b805460ff60e882901c161515600114613aac576020830180516020815191012090600184019161390183611c67565b6020815191012003613a8f57505060408301516001600160401b039081169160a81c168114801590613a67575b613a2657506080820151918215613a155761396f83613960866001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b546139f2576139ef929161399861399360606139d19401516001600160401b031690565b613832565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b61396042936001600160401b0316600052600a602052604060002090565b55565b6332cf0cbf60e01b6000526001600160401b038416600452602483905260446000fd5b63504570e360e01b60005260046000fd5b83611f2591613a3f60608601516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b50613a7f61069d60608501516001600160401b031690565b6001600160401b0382161161392e565b51611ecf60405192839263b80d8fa960e01b84526004840161380d565b60808301516348e2b93360e11b6000526001600160401b038516600452602452600160445260646000fd5b637edeb53960e11b6000526001600160401b03821660045260246000fd5b613b17915060203d602011613b1d575b613b0f81836103bd565b8101906137f8565b386138c4565b503d613b05565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091613bff575b50613ad757613ba682614fab565b805460ff60e882901c1615613bd1576020830180516020815191012090600184019161390183611c67565b60808301516348e2b93360e11b60009081526001600160401b03861660045260249190915260445260646000fd5b613c18915060203d602011613b1d57613b0f81836103bd565b38613b98565b6003111561076e57565b600382101561076e5752565b906103ed604051613c4481610351565b602060ff829554818116845260081c169101613c28565b8054821015611b915760005260206000200190600090565b60ff60019116019060ff8211611d1557565b60ff601b9116019060ff8211611d1557565b90606092604091835260208301370190565b6001600052600260205293613cdd7fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612463565b93853594613cea85612c7b565b6060820190613cf98251151590565b613f75575b803603613f5d57508151878103613f445750613d18613375565b60016000526003602052613d67613d627fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b613c34565b60026020820151613d7781613c1e565b613d8081613c1e565b149081613edc575b5015613eb0575b51613de7575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613dcb612ec060019460200190565b604080519283526001600160401b0391909116602083015290a2565b613e086130b4613e03602085969799989a955194015160ff1690565b613c73565b03613e9f578151835103613e8e57613e866000613dcb94612ec094613e527f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b3691610844565b60208151910120604051613e7d81613e6f89602083019586613c97565b03601f1981018352826103bd565b5190208a614fe8565b948394613d95565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613d8f57631b41e11d60e31b60005260046000fd5b60016000526002602052613f3c915061227090613f2990613f2360037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b90613c5b565b90546001600160a01b039160031b1c1690565b331438613d88565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613f9e90613f98613f8e613f898751611cff565b612c89565b613f988851611cff565b90612c97565b613cfe565b60008052600260205294909390929091613fdc7fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612463565b94863595613fe983612c7b565b6060820190613ff88251151590565b6141ad575b803603613f5d575081518881036141945750614017613375565b60008052600360205261404c613d627f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613d4a565b6002602082015161405c81613c1e565b61406581613c1e565b14908161414b575b501561411f575b516140b1575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613dcb612ec060009460200190565b6140cd6130b4613e03602087989a999b96975194015160ff1690565b03613e9f578351865103613e8e576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613dcb95613e5261411694612ec0973691610844565b9483943861407a565b72c11c11c11c11c11c11c11c11c11c11c11c11c133031561407457631b41e11d60e31b60005260046000fd5b60008052600260205261418c915061227090613f2990613f2360037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613f1a565b33143861406d565b6324f7d61360e21b600052600452602488905260446000fd5b6141cb90613f986141c1613f898951611cff565b613f988a51611cff565b613ffd565b60ff166003029060ff8216918203611d1557565b8151916001600160401b03831161034c5768010000000000000000831161034c57602090825484845580851061424d575b500190600052602060002060005b8381106142305750505050565b60019060206001600160a01b038551169401938184015501614223565b614264908460005285846000209182019101613673565b38614215565b95949392909160ff61428f93168752602087015260a0604087015260a086019061249c565b84810360608601526020808351928381520192019060005b8181106142c2575050509060806103ed9294019060ff169052565b82516001600160a01b03168452602093840193909201916001016142a7565b600654811015611b915760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b0361057b949381606094168352166020820152816040820152019061047f565b60409061057b93928152816020820152019061047f565b9291906001600160401b0390816064951660045216602452600481101561076e57604452565b9493926143936060936143a49388526020880190610773565b60806040870152608086019061047f565b930152565b906143bb82516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561233a57600091614af6575b50614a97576020830191825151948515614a6757604085018051518703614a565761445d87611b3c565b957f000000000000000000000000000000000000000000000000000000000000000061448d60016117e987614fab565b602081519101206040516144ed81613e6f6020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a81106149be57505050806080606061451d93015191015190888661553a565b9788156149a05760005b88811061453a5750505050505050505050565b5a61454f614549838a51611b96565b5161585a565b805160600151614568906001600160401b031688611d27565b61457181610764565b8015908d828315938461498d575b1561494a57606088156148cd57506145a6602061459c898d611b96565b5101519242611d1a565b6004546145bb9060a01c63ffffffff16611e55565b1080156148ba575b1561489c576145d2878b611b96565b5151614886575b8451608001516145f1906001600160401b031661069d565b6147ce575b50614602868951611b96565b5160a08501515181510361479257936146679695938c938f966146478e958c9261464161463b60608951016001600160401b0390511690565b8961592d565b86615b2b565b9a90809661466160608851016001600160401b0390511690565b906159b2565b614740575b505061467782610764565b600282036146f8575b6001966146ee7f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b039351926146df6146d68b6146ce60608801516001600160401b031690565b96519b611b96565b51985a90611d1a565b9160405195869516988561437a565b0390a45b01614527565b9150919394925061470882610764565b6003820361471c578b929493918a91614680565b51606001516349362d1f60e11b600052611f2591906001600160401b031689614354565b61474984610764565b6003840361466c579092949550614761919350610764565b614771578b92918a91388061466c565b5151604051632b11b8d960e01b8152908190611ecf9087906004840161433d565b611f258b6147ac60608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b6147d783610764565b6147e2575b386145f6565b8351608001516001600160401b0316602080860151918c61481760405194859384936370701e5760e11b855260048501614316565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561233a57600091614868575b506147dc5750505050506001906146f2565b614880915060203d8111613b1d57613b0f81836103bd565b38614856565b614890878b611b96565b515160808601526145d9565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b506148c483610764565b600383146145c3565b9150836148d984610764565b156145d957506001959450614942925061492091507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a16146f2565b50505050600192915061494261492060607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b5061499783610764565b6003831461457f565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b6149c9818a51611b96565b518051604001516001600160401b0316838103614a3957508051602001516001600160401b0316898103614a16575090614a0584600193615432565b614a0f828d611b96565b52016144fd565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611f25614a7b86516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b5092915050614ad9576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b637edeb53960e11b6000526001600160401b031660045260246000fd5b614b0f915060203d602011613b1d57613b0f81836103bd565b38614433565b51906103ed82610896565b90816020910312610187575161057b81610896565b9061057b916020815260e0614bd3614bbe614b5e8551610100602087015261012086019061047f565b60208601516001600160401b0316604086015260408601516001600160a01b0316606086015260608601516080860152614ba8608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c087015261047f565b60c0850151848203601f19018486015261047f565b92015190610100601f198285030191015261047f565b6040906001600160a01b0361057b9493168152816020820152019061047f565b90816020910312610187575190565b91939293614c24611f83565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa93841561233a57600094614ea1575b506001600160a01b0384169586158015614e8f575b614e7157614d56614d7f92613e6f92614cda614cd3611e5560408c015163ffffffff1690565b8c89615c44565b9690996080810151614d086060835193015193614cf561040d565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b602082015292839160248301614b35565b82857f000000000000000000000000000000000000000000000000000000000000000092615cd2565b94909115614e555750805160208103614e3c575090614da8826020808a95518301019101614c09565b956001600160a01b03841603614de0575b5050505050614dd8614dc961041d565b6001600160a01b039093168352565b602082015290565b614df393614ded91611d1a565b91615c44565b50908082108015614e29575b614e0b57808481614db9565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614e358284611d1a565b1415614dff565b631e3be00960e21b600052602060045260245260446000fd5b611ecf604051928392634ff17cad60e11b845260048401614be9565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614e9c6123638661361c565b614cad565b614ec491945060203d602011614ecb575b614ebc81836103bd565b810190614b20565b9238614c98565b503d614eb2565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614f006044836103bd565b6179185a10614f3c576020926000925191617530fa6000513d82614f30575b5081614f29575090565b9050151590565b60201115915038614f1f565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614f006044836103bd565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614f006044836103bd565b6001600160401b031680600052600860205260406000209060ff825460a01c1615614fd4575090565b63ed053c5960e01b60005260045260246000fd5b919390926000948051946000965b868810615007575050505050505050565b6020881015611b91576020600061501f878b1a613c85565b6150298b87611b96565b51906150606150388d8a611b96565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561233a576150a6613d6260005161508e8960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b90600160208301516150b781613c1e565b6150c081613c1e565b0361510d576150dd6150d3835160ff1690565b60ff600191161b90565b81166150fc576150f36150d36001935160ff1690565b17970196614ff6565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b83518110156151775760019060ff831660005260036020526000615170604082206001600160a01b03615157858a611b96565b51166001600160a01b0316600052602052604060002090565b5501615124565b50509050565b8151815460ff191660ff919091161781559060200151600381101561076e57815461ff00191660089190911b61ff0016179055565b919060005b8151811015615177576151da6151cd8284611b96565b516001600160a01b031690565b906152036151f98361508e8860ff166000526003602052604060002090565b5460081c60ff1690565b61520c81613c1e565b615277576001600160a01b038216156152665761526060019261525b61523061041d565b60ff85168152916152448660208501613c28565b61508e8960ff166000526003602052604060002090565b61517d565b016151b7565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015615177576152a76151cd8284611b96565b906152c66151f98361508e8860ff166000526003602052604060002090565b6152cf81613c1e565b615277576001600160a01b038216156152665761530860019261525b6152f361041d565b60ff8516815291615244600260208501613c28565b01615291565b60ff1680600052600260205260ff60016040600020015460101c1690801560001461535c57501561534b576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146153665750565b61536c57565b6307b8c74d60e51b60005260046000fd5b9080602083519182815201916020808360051b8301019401926000915b8383106153a957505050505090565b9091929394602080600192601f1985820301865288519060808061540c6153d9855160a0865260a086019061047f565b6001600160a01b0387870151168786015263ffffffff60408701511660408601526060860151858203606087015261047f565b9301519101529701930193019193929061539a565b90602061057b92818152019061537d565b61366d81518051906154c661545160608601516001600160a01b031690565b613e6f61546860608501516001600160401b031690565b936154816080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613e6f6020840151602081519101209360a06040820151602081519101209101516040516154ff81613e6f602082019485615421565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b039261554d92615e13565b9116600052600a60205260406000209060005260205260406000205490565b91908260a09103126101875760405161558481610331565b608080829480518452602081015161559b81610732565b602085015260408101516155ae81610732565b604085015260608101516155c181610732565b606085015201519161084083610732565b51906103ed826108b2565b81601f82011215610187578051906155f4826107c3565b9261560260405194856103bd565b82845260208085019360051b830101918183116101875760208101935b83851061562e57505050505090565b84516001600160401b03811161018757820160a0818503601f190112610187576040519161565b83610331565b60208201516001600160401b0381116101875785602061567d928501016120cf565b8352604082015161568d81610896565b602084015261569e606083016155d2565b60408401526080820151926001600160401b0384116101875760a0836156cb8860208098819801016120cf565b60608401520151608082015281520194019361561f565b602081830312610187578051906001600160401b038211610187570161014081830312610187576157116103de565b9161571c818361556c565b835260a08201516001600160401b038111610187578161573d9184016120cf565b602084015260c08201516001600160401b03811161018757816157619184016120cf565b604084015261577260e08301614b15565b606084015261010082015160808401526101208201516001600160401b038111610187576157a092016155dd565b60a082015290565b61057b916001600160401b036080835180518452826020820151166020850152826040820151166040850152826060820151166060850152015116608082015260a061581961580760208501516101408486015261014085019061047f565b604085015184820360c086015261047f565b60608401516001600160a01b031660e084015292608081015161010084015201519061012081840391015261537d565b90602061057b9281815201906157a8565b60006158d2819260405161586d816103a2565b615875611ae3565b81526060602082015260606040820152836060820152836080820152606060a0820152506158b5612270612270600b546001600160a01b039060401c1690565b90604051948580948193634546c6e560e01b835260048301615849565b03925af160009181615908575b5061057b57611ecf6158ef61208e565b60405163828ebdfb60e01b8152918291600483016120be565b6159269192503d806000833e61591e81836103bd565b8101906156e2565b90386158df565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611d15576139ef916001600160401b036159708584613331565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611d15576159ea8484613331565b600483101561076e576001600160401b036139ef9416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b90615a51906060835260608301906157a8565b8181036020830152825180825260208201916020808360051b8301019501926000915b838310615ac157505050505060408183039101526020808351928381520192019060005b818110615aa55750505090565b825163ffffffff16845260209384019390920191600101615a98565b9091929395602080615adf600193601f198682030187528a5161047f565b98019301930191939290615a74565b80516020909101516001600160e01b0319811692919060048210615b10575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b1561018757600091615b546040519485938493630304c3e160e51b855260048501615a3e565b038183305af19081615c2f575b50615c2457615b6e61208e565b9072c11c11c11c11c11c11c11c11c11c11c11c11c13314615b90575b60039190565b615ba9615b9c83615aee565b6001600160e01b03191690565b6337c3be2960e01b148015615c09575b8015615bee575b15615b8a57611f25615bd183615aee565b632882569d60e01b6000526001600160e01b031916600452602490565b50615bfb615b9c83615aee565b63753fa58960e11b14615bc0565b50615c16615b9c83615aee565b632be8ca8b60e21b14615bb9565b60029061057b610447565b806123ff6000615c3e936103bd565b38615b61565b6040516370a0823160e01b60208201526001600160a01b039091166024820152919291615ca190615c788160448101613e6f565b84837f000000000000000000000000000000000000000000000000000000000000000092615cd2565b92909115614e555750805160208103614e3c575090615ccc8260208061057b95518301019101614c09565b93611d1a565b939193615cdf608461042c565b94615ced60405196876103bd565b60848652615cfb608461042c565b602087019590601f1901368737833b15615d7e575a90808210615d6d578291038060061c90031115615d5c576000918291825a9560208451940192f1905a9003923d9060848211615d53575b6000908287523e929190565b60849150615d47565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b80600052600760205260406000205415600014615e0d576006546801000000000000000081101561034c57600181016006556000600654821015611b9157600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b8051928251908415615f6f5761010185111580615f63575b15615e9257818501946000198601956101008711615e92578615615f5357615e5287611b3c565b9660009586978795885b848110615eb7575050505050600119018095149384615ead575b505082615ea3575b505015615e9257615e8e91611b96565b5190565b6309bde33960e01b60005260046000fd5b1490503880615e7e565b1492503880615e76565b6001811b82811603615f4557868a1015615f3057615ed960018b019a85611b96565b51905b8c888c1015615f1c5750615ef460018c019b86611b96565b515b818d11615e9257615f15828f92615f0f90600196615f80565b92611b96565b5201615e5c565b60018d019c615f2a91611b96565b51615ef6565b615f3e60018c019b8d611b96565b5190615edc565b615f3e600189019884611b96565b505050509050615e8e9150611b84565b50610101821115615e2b565b630469ac9960e21b60005260046000fd5b81811015615f92579061057b91615f97565b61057b915b9060405190602082019260018452604083015260608201526060815261366d6080826103bd56fea164736f6c634300081a000abd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c", } var OffRampWithMessageTransformerABI = OffRampWithMessageTransformerMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/onramp/onramp.go index efcbd3f8298..27fcbadf3e2 100644 --- a/core/gethwrappers/ccip/generated/onramp/onramp.go +++ b/core/gethwrappers/ccip/generated/onramp/onramp.go @@ -101,7 +101,7 @@ type OnRampStaticConfig struct { var OnRampMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowlistUpdates\",\"inputs\":[{\"name\":\"allowlistConfigArgsItems\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.AllowlistConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forwardFromRouter\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowedSendersList\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"configuredAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExpectedNextSequenceNumber\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPoolBySourceToken\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPoolV1\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedTokens\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawFeeTokens\",\"inputs\":[{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdminSet\",\"inputs\":[{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListSendersAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"senders\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListSendersRemoved\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"senders\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigSet\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenWithdrawn\",\"inputs\":[{\"name\":\"feeAggregator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"error\",\"name\":\"CannotSendZeroTokens\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAllowListRequest\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MustBeCalledByRouter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RouterMustSetOriginalSender\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x6101006040523461055f57613ce88038038061001a81610599565b92833981019080820390610140821261055f576080821261055f5761003d61057a565b90610047816105be565b82526020810151906001600160a01b038216820361055f5760208301918252610072604082016105d2565b926040810193845260a0610088606084016105d2565b6060830190815295607f19011261055f5760405160a081016001600160401b03811182821017610564576040526100c1608084016105d2565b81526100cf60a084016105e6565b602082019081526100e260c085016105d2565b91604081019283526100f660e086016105d2565b936060820194855261010b61010087016105d2565b6080830190815261012087015190966001600160401b03821161055f57018a601f8201121561055f578051906001600160401b0382116105645760209b8c6060610159828660051b01610599565b9e8f8681520194028301019181831161055f57602001925b8284106104f1575050505033156104e057600180546001600160a01b0319163317905580516001600160401b03161580156104ce575b80156104bc575b80156104aa575b61047d57516001600160401b0316608081905295516001600160a01b0390811660a08190529751811660c08190529851811660e08190528251909116158015610498575b801561048e575b61047d57815160028054855160ff60a01b90151560a01b166001600160a01b039384166001600160a81b0319909216919091171790558451600380549183166001600160a01b03199283161790558651600480549184169183169190911790558751600580549190931691161790557fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19861012098606061029f61057a565b8a8152602080820193845260408083019586529290910194855281519a8b5291516001600160a01b03908116928b019290925291518116918901919091529051811660608801529051811660808701529051151560a08601529051811660c08501529051811660e0840152905116610100820152a16000905b805182101561040b5761032b82826105f3565b51916001600160401b0361033f82846105f3565b5151169283156103f65760008481526006602090815260409182902081840151815494840151600160401b600160e81b03198616604883901b600160481b600160e81b031617901515851b68ff000000000000000016179182905583516001600160401b0390951685526001600160a01b031691840191909152811c60ff1615159082015291926001927fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef590606090a20190610318565b8363c35aa79d60e01b60005260045260246000fd5b6040516136ca908161061e82396080518181816103e301528181610bd901528181612163015261290a015260a05181818161219c015281816126bd0152612943015260c051818181610f9c015281816121d8015261297f015260e051818181612214015281816129bb0152612f990152f35b6306b7c75960e31b60005260046000fd5b5082511515610200565b5084516001600160a01b0316156101f9565b5088516001600160a01b0316156101b5565b5087516001600160a01b0316156101ae565b5086516001600160a01b0316156101a7565b639b15e16f60e01b60005260046000fd5b60608483031261055f5760405190606082016001600160401b0381118382101761056457604052610521856105be565b82526020850151906001600160a01b038216820361055f578260209283606095015261054f604088016105e6565b6040820152815201930192610171565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190608082016001600160401b0381118382101761056457604052565b6040519190601f01601f191682016001600160401b0381118382101761056457604052565b51906001600160401b038216820361055f57565b51906001600160a01b038216820361055f57565b5190811515820361055f57565b80518210156106075760209160051b010190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816306285c69146128a457508063181f5a771461282557806320487ded146125e15780632716072b1461233157806327e936f114611f2757806348a98aa414611ea45780635cb80c5d14611bbc5780636def4ce714611b2d5780637437ff9f14611a1057806379ba50971461192b5780638da5cb5b146118d95780639041be3d1461182c578063972b46121461175e578063c9b146b314611391578063df0aa9e91461022c578063f2fde38b1461013f5763fbca3b74146100dc57600080fd5b3461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57600490610116612bb0565b507f9e7177c8000000000000000000000000000000000000000000000000000000008152fd5b80fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5773ffffffffffffffffffffffffffffffffffffffff61018c612c06565b610194613367565b1633811461020457807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b503461013c5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57610264612bb0565b67ffffffffffffffff6024351161138d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6024353603011261138d576102ab612c29565b60025460ff8160a01c16611365577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001760025567ffffffffffffffff8216835260066020526040832073ffffffffffffffffffffffffffffffffffffffff82161561133d57805460ff8160401c166112cf575b60481c73ffffffffffffffffffffffffffffffffffffffff1633036112a75773ffffffffffffffffffffffffffffffffffffffff600354168061123e575b50805467ffffffffffffffff811667ffffffffffffffff8114611211579067ffffffffffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009493011692839116179055604051906103d582612a7a565b84825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602083015267ffffffffffffffff8416604083015260608201528360808201526104366024803501602435600401613147565b61044560046024350180613147565b610453606460243501613053565b93610468604460243501602435600401613198565b9490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06104ae61049887612be1565b966104a66040519889612acf565b808852612be1565b018a5b8181106111fa575050604051966104c788612a96565b875273ffffffffffffffffffffffffffffffffffffffff8816602088015236906104f092613218565b6040860152369061050092613218565b60608401526020916040516105158482612acf565b878152608085015273ffffffffffffffffffffffffffffffffffffffff1660a084015260443560c08401528560e084015261010083015260025473ffffffffffffffffffffffffffffffffffffffff16938560243560640161057690613053565b9561058a6024356084810190600401613147565b90919061059c60046024350180613147565b99906040519a8b95869485947f3a49bb4900000000000000000000000000000000000000000000000000000000865267ffffffffffffffff8b16600487015273ffffffffffffffffffffffffffffffffffffffff16602486015260443560448601526064850160a0905260a485019061061492612d45565b908382037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01608485015261064892612d45565b03915afa80156110f85786879688908993611179575b50608086015260e085015261067d604460243501602435600401613198565b909661068882612be1565b916106966040519384612acf565b8083528583018099368360061b8201116111755780915b8360061b8201831061113e5750505050885b6106d3604460243501602435600401613198565b9050811015610a3b576106e68184613104565b51906106f06131ec565b508682015115610a135773ffffffffffffffffffffffffffffffffffffffff61071b81845116612f3a565b169182158015610970575b61092e57808c878a8a73ffffffffffffffffffffffffffffffffffffffff8f836107d39801518280895116926040519761075f89612a7a565b885267ffffffffffffffff87890196168652816040890191168152606088019283526080880193845267ffffffffffffffff6040519b8c998a997f9a4575b9000000000000000000000000000000000000000000000000000000008b5260048b01525160a060248b015260c48a0190612b6d565b965116604488015251166064860152516084850152511660a4830152038183885af1918215610923578d809361086b575b50506001938284928b806108649651930151910151916040519361082785612a7a565b84528c840152604083015260608201528d604051906108468c83612acf565b815260808201526101008b01519061085e8383613104565b52613104565b50016106bf565b9250933d8093863e61087d8386612acf565b8985848101031261091f5784519167ffffffffffffffff831161091b576040838701858801031261091b576040516108b481612ab3565b8387015167ffffffffffffffff8111610916576108d89086890190868a010161324f565b81528b84880101519467ffffffffffffffff861161091657876108649688966109079360019b0192010161324f565b8c82015293509150938d610804565b508f80fd5b8e80fd5b8d80fd5b6040513d8f823e3d90fd5b517fbf16aab6000000000000000000000000000000000000000000000000000000008c5273ffffffffffffffffffffffffffffffffffffffff1660045260248bfd5b506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201528881602481875afa908115610923578d916109da575b5015610726565b90508881813d8311610a0c575b6109f18183612acf565b81010312610a0857610a0290612ce8565b386109d3565b8c80fd5b503d6109e7565b60048b7f5cf04449000000000000000000000000000000000000000000000000000000008152fd5b5090889692508690610ab39873ffffffffffffffffffffffffffffffffffffffff600254169061010089015192886040519c8d957f01447eaa00000000000000000000000000000000000000000000000000000000875267ffffffffffffffff8b166004880152606060248801526064870190613291565b917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8684030160448701525191828152019190855b8a828210611103575050505082809103915afa9687156110f857869761101f575b5015610f2d5750835b67ffffffffffffffff608085510191169052835b61010084015151811015610b5c5780610b4160019288613104565b516080610b5383610100890151613104565b51015201610b26565b5090926060610100604051610b7081612a96565b610b78613074565b8152838782015282604082015282808201528260808201528360a08201528360c08201528360e08201520152604051848101907f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015267ffffffffffffffff8416606082015230608082015260808152610c2360a082612acf565b51902073ffffffffffffffffffffffffffffffffffffffff602085015116845167ffffffffffffffff6080816060840151169201511673ffffffffffffffffffffffffffffffffffffffff60a08801511660c088015191604051938a850195865260408501526060840152608083015260a082015260a08152610ca760c082612acf565b51902060608501518681519101206040860151878151910120610100870151604051610d0d81610ce18c8201948d86526040830190613291565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612acf565b51902091608088015189815191012093604051958a870197885260408701526060860152608085015260a084015260c083015260e082015260e08152610d5561010082612acf565b51902082515267ffffffffffffffff60608351015116907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f3260405185815267ffffffffffffffff608086518051898501528289820151166040850152826040820151166060850152826060820151168285015201511660a082015273ffffffffffffffffffffffffffffffffffffffff60208601511660c082015280610ef8610e7f610e4a610e1560408a01516101a060e08701526101c0860190612b6d565b60608a01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086830301610100870152612b6d565b60808901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301610120860152612b6d565b73ffffffffffffffffffffffffffffffffffffffff60a08901511661014084015260c088015161016084015260e088015161018084015267ffffffffffffffff610100890151967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403016101a08601521695613291565b0390a37fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002555151604051908152f35b73ffffffffffffffffffffffffffffffffffffffff604051917fea458c0c00000000000000000000000000000000000000000000000000000000835267ffffffffffffffff8416600484015216602482015282816044818873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115611014578591610fd2575b50610b12565b90508281813d831161100d575b610fe98183612acf565b81010312611009575167ffffffffffffffff811681036110095786610fcc565b8480fd5b503d610fdf565b6040513d87823e3d90fd5b9096503d908187823e6110328282612acf565b848183810103126110f45780519167ffffffffffffffff83116110f057808201601f8484010112156110f057828201519161106c83612be1565b9361107a6040519586612acf565b83855287850192808301898660051b8486010101116110ec578882840101935b898660051b848601010185106110b7575050505050509587610b09565b845167ffffffffffffffff8111610a08578a80926110df829383878a0191898b01010161324f565b815201950194905061109a565b8a80fd5b8780fd5b8680fd5b6040513d88823e3d90fd5b8351805173ffffffffffffffffffffffffffffffffffffffff168652810151818601528d97508e965060409094019390920191600101610ae8565b604083360312610a085788604091825161115781612ab3565b61116086612c4c565b815282860135838201528152019201916106ad565b8b80fd5b97505050503d8087873e61118d8187612acf565b60808682810103126110f4578551906111a7848801612ce8565b90604088015167ffffffffffffffff81116111f6576111cb90828a01908a0161324f565b97606081015167ffffffffffffffff81116110ec576111ed928201910161324f565b9190963861065e565b8980fd5b6020906112056131ec565b82828a010152016104b1565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b803b15611009578460405180927fe0a0e5060000000000000000000000000000000000000000000000000000000082528183816112846024356004018b60048401612d84565b03925af18015611014571561037357846112a091959295612acf565b9238610373565b6004847f1c0a3529000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526002830160205260409020546103355760248573ffffffffffffffffffffffffffffffffffffffff857fd0d2597600000000000000000000000000000000000000000000000000000000835216600452fd5b6004847fa4ec7479000000000000000000000000000000000000000000000000000000008152fd5b6004847f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5760043567ffffffffffffffff811161138d576113e1903690600401612c6d565b73ffffffffffffffffffffffffffffffffffffffff600154163303611716575b919081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301915b84811015611712578060051b8201358381121561100957820191608083360312611009576040519461145d86612a2f565b61146684612bcc565b865261147460208501612bf9565b9660208701978852604085013567ffffffffffffffff811161170e5761149d903690870161309f565b9460408801958652606081013567ffffffffffffffff811161170a576114c59136910161309f565b60608801908152875167ffffffffffffffff1683526006602052604080842099518a547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169015159182901b68ff000000000000000016178a559095908151516115e2575b5095976001019550815b85518051821015611573579061156c73ffffffffffffffffffffffffffffffffffffffff61156483600195613104565b51168961345b565b5001611534565b50509590969450600192919351908151611593575b50500193929361142c565b6115d867ffffffffffffffff7fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158692511692604051918291602083526020830190612c9e565b0390a23880611588565b989395929691909497986000146116d357600184019591875b86518051821015611678576116258273ffffffffffffffffffffffffffffffffffffffff92613104565b51168015611641579061163a6001928a6133ca565b50016115fb565b60248a67ffffffffffffffff8e51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b50509692955090929796937f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc32816116c967ffffffffffffffff8a51169251604051918291602083526020830190612c9e565b0390a2388061152a565b60248767ffffffffffffffff8b51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b8380fd5b8280fd5b8380f35b73ffffffffffffffffffffffffffffffffffffffff60055416330315611401576004837f905d7d9b000000000000000000000000000000000000000000000000000000008152fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5767ffffffffffffffff61179f612bb0565b16808252600660205260ff604083205460401c16908252600660205260016040832001916040518093849160208254918281520191845260208420935b8181106118135750506117f192500383612acf565b61180f60405192839215158352604060208401526040830190612c9e565b0390f35b84548352600194850194879450602090930192016117dc565b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5767ffffffffffffffff61186d612bb0565b1681526006602052600167ffffffffffffffff604083205416019067ffffffffffffffff82116118ac5760208267ffffffffffffffff60405191168152f35b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57805473ffffffffffffffffffffffffffffffffffffffff811633036119e8577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57611a47613074565b5060a0604051611a5681612a7a565b60ff60025473ffffffffffffffffffffffffffffffffffffffff81168352831c161515602082015273ffffffffffffffffffffffffffffffffffffffff60035416604082015273ffffffffffffffffffffffffffffffffffffffff60045416606082015273ffffffffffffffffffffffffffffffffffffffff600554166080820152611b2b604051809273ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565bf35b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57604060609167ffffffffffffffff611b73612bb0565b1681526006602052205473ffffffffffffffffffffffffffffffffffffffff6040519167ffffffffffffffff8116835260ff8160401c161515602084015260481c166040820152f35b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5760043567ffffffffffffffff811161138d57611c0c903690600401612c6d565b9073ffffffffffffffffffffffffffffffffffffffff6004541690835b83811015611ea05773ffffffffffffffffffffffffffffffffffffffff611c548260051b8401613053565b1690604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481845afa928315611e95578793611e62575b5082611cac575b506001915001611c29565b8460405193611d6760208601957fa9059cbb00000000000000000000000000000000000000000000000000000000875283602482015282604482015260448152611cf7606482612acf565b8a80604098895193611d098b86612acf565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082895af13d15611e5a573d90611d4a82612b10565b91611d578a519384612acf565b82523d8d602084013e5b866135ed565b805180611da3575b505060207f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e9160019651908152a338611ca1565b819294959693509060209181010312611e56576020611dc29101612ce8565b15611dd35792919085903880611d6f565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b8880fd5b606090611d61565b9092506020813d8211611e8d575b81611e7d60209383612acf565b810103126110f457519138611c9a565b3d9150611e70565b6040513d89823e3d90fd5b8480f35b503461013c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57611edc612bb0565b506024359073ffffffffffffffffffffffffffffffffffffffff8216820361013c576020611f0983612f3a565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b503461013c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57604051611f6381612a7a565b611f6b612c06565b8152602435801515810361170e576020820190815260443573ffffffffffffffffffffffffffffffffffffffff8116810361170a5760408301908152611faf612c29565b90606084019182526084359273ffffffffffffffffffffffffffffffffffffffff8416840361232d5760808501938452611fe7613367565b73ffffffffffffffffffffffffffffffffffffffff85511615801561230e575b8015612304575b6122dc579273ffffffffffffffffffffffffffffffffffffffff859381809461012097827fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19a51167fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006002549260a01b1691161760025551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600354161760035551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600454161760045551167fffffffffffffffffffffffff000000000000000000000000000000000000000060055416176005556122d86040519161215883612a2f565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016835273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602084015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604084015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060840152612288604051809473ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b608083019073ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565ba180f35b6004867f35be3ac8000000000000000000000000000000000000000000000000000000008152fd5b508051151561200e565b5073ffffffffffffffffffffffffffffffffffffffff83511615612007565b8580fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c576004359067ffffffffffffffff821161013c573660238301121561013c57816004013561238d81612be1565b9261239b6040519485612acf565b818452602460606020860193028201019036821161170a57602401915b818310612539575050506123ca613367565b805b8251811015612535576123df8184613104565b5167ffffffffffffffff6123f38386613104565b51511690811561250957907fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5606060019493838752600660205260ff604088206124ca604060208501519483547fffffff0000000000000000000000000000000000000000ffffffffffffffffff7cffffffffffffffffffffffffffffffffffffffff0000000000000000008860481b1691161784550151151582907fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff68ff0000000000000000835492151560401b169116179055565b5473ffffffffffffffffffffffffffffffffffffffff6040519367ffffffffffffffff8316855216602084015260401c1615156040820152a2016123cc565b602484837fc35aa79d000000000000000000000000000000000000000000000000000000008252600452fd5b5080f35b60608336031261170a576040516060810181811067ffffffffffffffff8211176125b45760405261256984612bcc565b8152602084013573ffffffffffffffffffffffffffffffffffffffff8116810361232d5791816060936020809401526125a460408701612bf9565b60408201528152019201916123b8565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503461013c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57612619612bb0565b60243567ffffffffffffffff811161170e5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261170e576040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff000000000000000000000000000000008360801b16600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561281a5784916127e0575b506127aa5761274c9160209173ffffffffffffffffffffffffffffffffffffffff60025416906040518095819482937fd8694ccd0000000000000000000000000000000000000000000000000000000084526004019060048401612d84565b03915afa90811561279f578291612769575b602082604051908152f35b90506020813d602011612797575b8161278460209383612acf565b8101031261138d5760209150513861275e565b3d9150612777565b6040513d84823e3d90fd5b60248367ffffffffffffffff847ffdbd6a7200000000000000000000000000000000000000000000000000000000835216600452fd5b90506020813d602011612812575b816127fb60209383612acf565b8101031261170a5761280c90612ce8565b386126ed565b3d91506127ee565b6040513d86823e3d90fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c575061180f604051612866604082612acf565b601081527f4f6e52616d7020312e362e302d646576000000000000000000000000000000006020820152604051918291602083526020830190612b6d565b90503461138d57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261138d57806128e0606092612a2f565b828152826020820152826040820152015260806040516128ff81612a2f565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060820152611b2b604051809273ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b6080810190811067ffffffffffffffff821117612a4b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff821117612a4b57604052565b610120810190811067ffffffffffffffff821117612a4b57604052565b6040810190811067ffffffffffffffff821117612a4b57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612a4b57604052565b67ffffffffffffffff8111612a4b57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110612b5d5750506000910152565b8181015183820152602001612b4d565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612ba981518092818752878088019101612b4a565b0116010190565b6004359067ffffffffffffffff82168203612bc757565b600080fd5b359067ffffffffffffffff82168203612bc757565b67ffffffffffffffff8111612a4b5760051b60200190565b35908115158203612bc757565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b6064359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b9181601f84011215612bc75782359167ffffffffffffffff8311612bc7576020808501948460051b010111612bc757565b906020808351928381520192019060005b818110612cbc5750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612caf565b51908115158203612bc757565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215612bc757016020813591019167ffffffffffffffff8211612bc7578136038313612bc757565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9067ffffffffffffffff9093929316815260406020820152612dfa612dbd612dac8580612cf5565b60a0604086015260e0850191612d45565b612dca6020860186612cf5565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0858403016060860152612d45565b9060408401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811215612bc75784016020813591019267ffffffffffffffff8211612bc7578160061b36038413612bc7578281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0016080840152818152602001929060005b818110612efb57505050612ec88473ffffffffffffffffffffffffffffffffffffffff612eb86060612ef8979801612c4c565b1660a08401526080810190612cf5565b9160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082860301910152612d45565b90565b90919360408060019273ffffffffffffffffffffffffffffffffffffffff612f2289612c4c565b16815260208881013590820152019501929101612e85565b73ffffffffffffffffffffffffffffffffffffffff604051917fbbe4f6db00000000000000000000000000000000000000000000000000000000835216600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561304757600091612fe4575b5073ffffffffffffffffffffffffffffffffffffffff1690565b6020813d60201161303f575b81612ffd60209383612acf565b8101031261138d57519073ffffffffffffffffffffffffffffffffffffffff8216820361013c575073ffffffffffffffffffffffffffffffffffffffff612fca565b3d9150612ff0565b6040513d6000823e3d90fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612bc75790565b6040519061308182612a7a565b60006080838281528260208201528260408201528260608201520152565b9080601f83011215612bc75781356130b681612be1565b926130c46040519485612acf565b81845260208085019260051b820101928311612bc757602001905b8282106130ec5750505090565b602080916130f984612c4c565b8152019101906130df565b80518210156131185760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612bc7570180359067ffffffffffffffff8211612bc757602001918136038313612bc757565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612bc7570180359067ffffffffffffffff8211612bc757602001918160061b36038313612bc757565b604051906131f982612a7a565b6060608083600081528260208201528260408201526000838201520152565b92919261322482612b10565b916132326040519384612acf565b829481845281830111612bc7578281602093846000960137010152565b81601f82011215612bc757805161326581612b10565b926132736040519485612acf565b81845260208284010111612bc757612ef89160208085019101612b4a565b9080602083519182815201916020808360051b8301019401926000915b8383106132bd57505050505090565b9091929394602080613358837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301875289519073ffffffffffffffffffffffffffffffffffffffff8251168152608061333d61332b8685015160a08886015260a0850190612b6d565b60408501518482036040860152612b6d565b92606081015160608401520151906080818403910152612b6d565b970193019301919392906132ae565b73ffffffffffffffffffffffffffffffffffffffff60015416330361338857565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b80548210156131185760005260206000200190600090565b60008281526001820160205260409020546134545780549068010000000000000000821015612a4b578261343d6134088460018096018555846133b2565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905580549260005201602052604060002055600190565b5050600090565b90600182019181600052826020526040600020548015156000146135e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116135b5578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116135b55781810361357e575b5050508054801561354f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061351082826133b2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61359e61358e61340893866133b2565b90549060031b1c928392866133b2565b9055600052836020526040600020553880806134d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50505050600090565b919290156136685750815115613601575090565b3b1561360a5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561367b5750805190602001fd5b6136b9906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612b6d565b0390fdfea164736f6c634300081a000a", + Bin: "0x6101006040523461055f57613ce88038038061001a81610599565b92833981019080820390610140821261055f576080821261055f5761003d61057a565b90610047816105be565b82526020810151906001600160a01b038216820361055f5760208301918252610072604082016105d2565b926040810193845260a0610088606084016105d2565b6060830190815295607f19011261055f5760405160a081016001600160401b03811182821017610564576040526100c1608084016105d2565b81526100cf60a084016105e6565b602082019081526100e260c085016105d2565b91604081019283526100f660e086016105d2565b936060820194855261010b61010087016105d2565b6080830190815261012087015190966001600160401b03821161055f57018a601f8201121561055f578051906001600160401b0382116105645760209b8c6060610159828660051b01610599565b9e8f8681520194028301019181831161055f57602001925b8284106104f1575050505033156104e057600180546001600160a01b0319163317905580516001600160401b03161580156104ce575b80156104bc575b80156104aa575b61047d57516001600160401b0316608081905295516001600160a01b0390811660a08190529751811660c08190529851811660e08190528251909116158015610498575b801561048e575b61047d57815160028054855160ff60a01b90151560a01b166001600160a01b039384166001600160a81b0319909216919091171790558451600380549183166001600160a01b03199283161790558651600480549184169183169190911790558751600580549190931691161790557fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19861012098606061029f61057a565b8a8152602080820193845260408083019586529290910194855281519a8b5291516001600160a01b03908116928b019290925291518116918901919091529051811660608801529051811660808701529051151560a08601529051811660c08501529051811660e0840152905116610100820152a16000905b805182101561040b5761032b82826105f3565b51916001600160401b0361033f82846105f3565b5151169283156103f65760008481526006602090815260409182902081840151815494840151600160401b600160e81b03198616604883901b600160481b600160e81b031617901515851b68ff000000000000000016179182905583516001600160401b0390951685526001600160a01b031691840191909152811c60ff1615159082015291926001927fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef590606090a20190610318565b8363c35aa79d60e01b60005260045260246000fd5b6040516136ca908161061e82396080518181816103e301528181610bd901528181612163015261290a015260a05181818161219c015281816126bd0152612943015260c051818181610f9c015281816121d8015261297f015260e051818181612214015281816129bb0152612f990152f35b6306b7c75960e31b60005260046000fd5b5082511515610200565b5084516001600160a01b0316156101f9565b5088516001600160a01b0316156101b5565b5087516001600160a01b0316156101ae565b5086516001600160a01b0316156101a7565b639b15e16f60e01b60005260046000fd5b60608483031261055f5760405190606082016001600160401b0381118382101761056457604052610521856105be565b82526020850151906001600160a01b038216820361055f578260209283606095015261054f604088016105e6565b6040820152815201930192610171565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190608082016001600160401b0381118382101761056457604052565b6040519190601f01601f191682016001600160401b0381118382101761056457604052565b51906001600160401b038216820361055f57565b51906001600160a01b038216820361055f57565b5190811515820361055f57565b80518210156106075760209160051b010190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816306285c69146128a457508063181f5a771461282557806320487ded146125e15780632716072b1461233157806327e936f114611f2757806348a98aa414611ea45780635cb80c5d14611bbc5780636def4ce714611b2d5780637437ff9f14611a1057806379ba50971461192b5780638da5cb5b146118d95780639041be3d1461182c578063972b46121461175e578063c9b146b314611391578063df0aa9e91461022c578063f2fde38b1461013f5763fbca3b74146100dc57600080fd5b3461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57600490610116612bb0565b507f9e7177c8000000000000000000000000000000000000000000000000000000008152fd5b80fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5773ffffffffffffffffffffffffffffffffffffffff61018c612c06565b610194613367565b1633811461020457807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b503461013c5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57610264612bb0565b67ffffffffffffffff6024351161138d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6024353603011261138d576102ab612c29565b60025460ff8160a01c16611365577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001760025567ffffffffffffffff8216835260066020526040832073ffffffffffffffffffffffffffffffffffffffff82161561133d57805460ff8160401c166112cf575b60481c73ffffffffffffffffffffffffffffffffffffffff1633036112a75773ffffffffffffffffffffffffffffffffffffffff600354168061123e575b50805467ffffffffffffffff811667ffffffffffffffff8114611211579067ffffffffffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009493011692839116179055604051906103d582612a7a565b84825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602083015267ffffffffffffffff8416604083015260608201528360808201526104366024803501602435600401613147565b61044560046024350180613147565b610453606460243501613053565b93610468604460243501602435600401613198565b9490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06104ae61049887612be1565b966104a66040519889612acf565b808852612be1565b018a5b8181106111fa575050604051966104c788612a96565b875273ffffffffffffffffffffffffffffffffffffffff8816602088015236906104f092613218565b6040860152369061050092613218565b60608401526020916040516105158482612acf565b878152608085015273ffffffffffffffffffffffffffffffffffffffff1660a084015260443560c08401528560e084015261010083015260025473ffffffffffffffffffffffffffffffffffffffff16938560243560640161057690613053565b9561058a6024356084810190600401613147565b90919061059c60046024350180613147565b99906040519a8b95869485947f3a49bb4900000000000000000000000000000000000000000000000000000000865267ffffffffffffffff8b16600487015273ffffffffffffffffffffffffffffffffffffffff16602486015260443560448601526064850160a0905260a485019061061492612d45565b908382037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01608485015261064892612d45565b03915afa80156110f85786879688908993611179575b50608086015260e085015261067d604460243501602435600401613198565b909661068882612be1565b916106966040519384612acf565b8083528583018099368360061b8201116111755780915b8360061b8201831061113e5750505050885b6106d3604460243501602435600401613198565b9050811015610a3b576106e68184613104565b51906106f06131ec565b508682015115610a135773ffffffffffffffffffffffffffffffffffffffff61071b81845116612f3a565b169182158015610970575b61092e57808c878a8a73ffffffffffffffffffffffffffffffffffffffff8f836107d39801518280895116926040519761075f89612a7a565b885267ffffffffffffffff87890196168652816040890191168152606088019283526080880193845267ffffffffffffffff6040519b8c998a997f9a4575b9000000000000000000000000000000000000000000000000000000008b5260048b01525160a060248b015260c48a0190612b6d565b965116604488015251166064860152516084850152511660a4830152038183885af1918215610923578d809361086b575b50506001938284928b806108649651930151910151916040519361082785612a7a565b84528c840152604083015260608201528d604051906108468c83612acf565b815260808201526101008b01519061085e8383613104565b52613104565b50016106bf565b9250933d8093863e61087d8386612acf565b8985848101031261091f5784519167ffffffffffffffff831161091b576040838701858801031261091b576040516108b481612ab3565b8387015167ffffffffffffffff8111610916576108d89086890190868a010161324f565b81528b84880101519467ffffffffffffffff861161091657876108649688966109079360019b0192010161324f565b8c82015293509150938d610804565b508f80fd5b8e80fd5b8d80fd5b6040513d8f823e3d90fd5b517fbf16aab6000000000000000000000000000000000000000000000000000000008c5273ffffffffffffffffffffffffffffffffffffffff1660045260248bfd5b506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201528881602481875afa908115610923578d916109da575b5015610726565b90508881813d8311610a0c575b6109f18183612acf565b81010312610a0857610a0290612ce8565b386109d3565b8c80fd5b503d6109e7565b60048b7f5cf04449000000000000000000000000000000000000000000000000000000008152fd5b5090889692508690610ab39873ffffffffffffffffffffffffffffffffffffffff600254169061010089015192886040519c8d957f01447eaa00000000000000000000000000000000000000000000000000000000875267ffffffffffffffff8b166004880152606060248801526064870190613291565b917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8684030160448701525191828152019190855b8a828210611103575050505082809103915afa9687156110f857869761101f575b5015610f2d5750835b67ffffffffffffffff608085510191169052835b61010084015151811015610b5c5780610b4160019288613104565b516080610b5383610100890151613104565b51015201610b26565b5090926060610100604051610b7081612a96565b610b78613074565b8152838782015282604082015282808201528260808201528360a08201528360c08201528360e08201520152604051848101907f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015267ffffffffffffffff8416606082015230608082015260808152610c2360a082612acf565b51902073ffffffffffffffffffffffffffffffffffffffff602085015116845167ffffffffffffffff6080816060840151169201511673ffffffffffffffffffffffffffffffffffffffff60a08801511660c088015191604051938a850195865260408501526060840152608083015260a082015260a08152610ca760c082612acf565b51902060608501518681519101206040860151878151910120610100870151604051610d0d81610ce18c8201948d86526040830190613291565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612acf565b51902091608088015189815191012093604051958a870197885260408701526060860152608085015260a084015260c083015260e082015260e08152610d5561010082612acf565b51902082515267ffffffffffffffff60608351015116907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f3260405185815267ffffffffffffffff608086518051898501528289820151166040850152826040820151166060850152826060820151168285015201511660a082015273ffffffffffffffffffffffffffffffffffffffff60208601511660c082015280610ef8610e7f610e4a610e1560408a01516101a060e08701526101c0860190612b6d565b60608a01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086830301610100870152612b6d565b60808901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301610120860152612b6d565b73ffffffffffffffffffffffffffffffffffffffff60a08901511661014084015260c088015161016084015260e088015161018084015267ffffffffffffffff610100890151967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403016101a08601521695613291565b0390a37fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002555151604051908152f35b73ffffffffffffffffffffffffffffffffffffffff604051917fea458c0c00000000000000000000000000000000000000000000000000000000835267ffffffffffffffff8416600484015216602482015282816044818873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115611014578591610fd2575b50610b12565b90508281813d831161100d575b610fe98183612acf565b81010312611009575167ffffffffffffffff811681036110095786610fcc565b8480fd5b503d610fdf565b6040513d87823e3d90fd5b9096503d908187823e6110328282612acf565b848183810103126110f45780519167ffffffffffffffff83116110f057808201601f8484010112156110f057828201519161106c83612be1565b9361107a6040519586612acf565b83855287850192808301898660051b8486010101116110ec578882840101935b898660051b848601010185106110b7575050505050509587610b09565b845167ffffffffffffffff8111610a08578a80926110df829383878a0191898b01010161324f565b815201950194905061109a565b8a80fd5b8780fd5b8680fd5b6040513d88823e3d90fd5b8351805173ffffffffffffffffffffffffffffffffffffffff168652810151818601528d97508e965060409094019390920191600101610ae8565b604083360312610a085788604091825161115781612ab3565b61116086612c4c565b815282860135838201528152019201916106ad565b8b80fd5b97505050503d8087873e61118d8187612acf565b60808682810103126110f4578551906111a7848801612ce8565b90604088015167ffffffffffffffff81116111f6576111cb90828a01908a0161324f565b97606081015167ffffffffffffffff81116110ec576111ed928201910161324f565b9190963861065e565b8980fd5b6020906112056131ec565b82828a010152016104b1565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b803b15611009578460405180927fe0a0e5060000000000000000000000000000000000000000000000000000000082528183816112846024356004018b60048401612d84565b03925af18015611014571561037357846112a091959295612acf565b9238610373565b6004847f1c0a3529000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526002830160205260409020546103355760248573ffffffffffffffffffffffffffffffffffffffff857fd0d2597600000000000000000000000000000000000000000000000000000000835216600452fd5b6004847fa4ec7479000000000000000000000000000000000000000000000000000000008152fd5b6004847f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5760043567ffffffffffffffff811161138d576113e1903690600401612c6d565b73ffffffffffffffffffffffffffffffffffffffff600154163303611716575b919081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301915b84811015611712578060051b8201358381121561100957820191608083360312611009576040519461145d86612a2f565b61146684612bcc565b865261147460208501612bf9565b9660208701978852604085013567ffffffffffffffff811161170e5761149d903690870161309f565b9460408801958652606081013567ffffffffffffffff811161170a576114c59136910161309f565b60608801908152875167ffffffffffffffff1683526006602052604080842099518a547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169015159182901b68ff000000000000000016178a559095908151516115e2575b5095976001019550815b85518051821015611573579061156c73ffffffffffffffffffffffffffffffffffffffff61156483600195613104565b51168961345b565b5001611534565b50509590969450600192919351908151611593575b50500193929361142c565b6115d867ffffffffffffffff7fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158692511692604051918291602083526020830190612c9e565b0390a23880611588565b989395929691909497986000146116d357600184019591875b86518051821015611678576116258273ffffffffffffffffffffffffffffffffffffffff92613104565b51168015611641579061163a6001928a6133ca565b50016115fb565b60248a67ffffffffffffffff8e51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b50509692955090929796937f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc32816116c967ffffffffffffffff8a51169251604051918291602083526020830190612c9e565b0390a2388061152a565b60248767ffffffffffffffff8b51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b8380fd5b8280fd5b8380f35b73ffffffffffffffffffffffffffffffffffffffff60055416330315611401576004837f905d7d9b000000000000000000000000000000000000000000000000000000008152fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5767ffffffffffffffff61179f612bb0565b16808252600660205260ff604083205460401c16908252600660205260016040832001916040518093849160208254918281520191845260208420935b8181106118135750506117f192500383612acf565b61180f60405192839215158352604060208401526040830190612c9e565b0390f35b84548352600194850194879450602090930192016117dc565b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5767ffffffffffffffff61186d612bb0565b1681526006602052600167ffffffffffffffff604083205416019067ffffffffffffffff82116118ac5760208267ffffffffffffffff60405191168152f35b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57805473ffffffffffffffffffffffffffffffffffffffff811633036119e8577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57611a47613074565b5060a0604051611a5681612a7a565b60ff60025473ffffffffffffffffffffffffffffffffffffffff81168352831c161515602082015273ffffffffffffffffffffffffffffffffffffffff60035416604082015273ffffffffffffffffffffffffffffffffffffffff60045416606082015273ffffffffffffffffffffffffffffffffffffffff600554166080820152611b2b604051809273ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565bf35b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57604060609167ffffffffffffffff611b73612bb0565b1681526006602052205473ffffffffffffffffffffffffffffffffffffffff6040519167ffffffffffffffff8116835260ff8160401c161515602084015260481c166040820152f35b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5760043567ffffffffffffffff811161138d57611c0c903690600401612c6d565b9073ffffffffffffffffffffffffffffffffffffffff6004541690835b83811015611ea05773ffffffffffffffffffffffffffffffffffffffff611c548260051b8401613053565b1690604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481845afa928315611e95578793611e62575b5082611cac575b506001915001611c29565b8460405193611d6760208601957fa9059cbb00000000000000000000000000000000000000000000000000000000875283602482015282604482015260448152611cf7606482612acf565b8a80604098895193611d098b86612acf565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082895af13d15611e5a573d90611d4a82612b10565b91611d578a519384612acf565b82523d8d602084013e5b866135ed565b805180611da3575b505060207f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e9160019651908152a338611ca1565b819294959693509060209181010312611e56576020611dc29101612ce8565b15611dd35792919085903880611d6f565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b8880fd5b606090611d61565b9092506020813d8211611e8d575b81611e7d60209383612acf565b810103126110f457519138611c9a565b3d9150611e70565b6040513d89823e3d90fd5b8480f35b503461013c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57611edc612bb0565b506024359073ffffffffffffffffffffffffffffffffffffffff8216820361013c576020611f0983612f3a565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b503461013c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57604051611f6381612a7a565b611f6b612c06565b8152602435801515810361170e576020820190815260443573ffffffffffffffffffffffffffffffffffffffff8116810361170a5760408301908152611faf612c29565b90606084019182526084359273ffffffffffffffffffffffffffffffffffffffff8416840361232d5760808501938452611fe7613367565b73ffffffffffffffffffffffffffffffffffffffff85511615801561230e575b8015612304575b6122dc579273ffffffffffffffffffffffffffffffffffffffff859381809461012097827fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19a51167fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006002549260a01b1691161760025551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600354161760035551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600454161760045551167fffffffffffffffffffffffff000000000000000000000000000000000000000060055416176005556122d86040519161215883612a2f565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016835273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602084015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604084015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060840152612288604051809473ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b608083019073ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565ba180f35b6004867f35be3ac8000000000000000000000000000000000000000000000000000000008152fd5b508051151561200e565b5073ffffffffffffffffffffffffffffffffffffffff83511615612007565b8580fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c576004359067ffffffffffffffff821161013c573660238301121561013c57816004013561238d81612be1565b9261239b6040519485612acf565b818452602460606020860193028201019036821161170a57602401915b818310612539575050506123ca613367565b805b8251811015612535576123df8184613104565b5167ffffffffffffffff6123f38386613104565b51511690811561250957907fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5606060019493838752600660205260ff604088206124ca604060208501519483547fffffff0000000000000000000000000000000000000000ffffffffffffffffff7cffffffffffffffffffffffffffffffffffffffff0000000000000000008860481b1691161784550151151582907fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff68ff0000000000000000835492151560401b169116179055565b5473ffffffffffffffffffffffffffffffffffffffff6040519367ffffffffffffffff8316855216602084015260401c1615156040820152a2016123cc565b602484837fc35aa79d000000000000000000000000000000000000000000000000000000008252600452fd5b5080f35b60608336031261170a576040516060810181811067ffffffffffffffff8211176125b45760405261256984612bcc565b8152602084013573ffffffffffffffffffffffffffffffffffffffff8116810361232d5791816060936020809401526125a460408701612bf9565b60408201528152019201916123b8565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503461013c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57612619612bb0565b60243567ffffffffffffffff811161170e5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261170e576040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff000000000000000000000000000000008360801b16600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561281a5784916127e0575b506127aa5761274c9160209173ffffffffffffffffffffffffffffffffffffffff60025416906040518095819482937fd8694ccd0000000000000000000000000000000000000000000000000000000084526004019060048401612d84565b03915afa90811561279f578291612769575b602082604051908152f35b90506020813d602011612797575b8161278460209383612acf565b8101031261138d5760209150513861275e565b3d9150612777565b6040513d84823e3d90fd5b60248367ffffffffffffffff847ffdbd6a7200000000000000000000000000000000000000000000000000000000835216600452fd5b90506020813d602011612812575b816127fb60209383612acf565b8101031261170a5761280c90612ce8565b386126ed565b3d91506127ee565b6040513d86823e3d90fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c575061180f604051612866604082612acf565b600c81527f4f6e52616d7020312e362e3000000000000000000000000000000000000000006020820152604051918291602083526020830190612b6d565b90503461138d57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261138d57806128e0606092612a2f565b828152826020820152826040820152015260806040516128ff81612a2f565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060820152611b2b604051809273ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b6080810190811067ffffffffffffffff821117612a4b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff821117612a4b57604052565b610120810190811067ffffffffffffffff821117612a4b57604052565b6040810190811067ffffffffffffffff821117612a4b57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612a4b57604052565b67ffffffffffffffff8111612a4b57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110612b5d5750506000910152565b8181015183820152602001612b4d565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612ba981518092818752878088019101612b4a565b0116010190565b6004359067ffffffffffffffff82168203612bc757565b600080fd5b359067ffffffffffffffff82168203612bc757565b67ffffffffffffffff8111612a4b5760051b60200190565b35908115158203612bc757565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b6064359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b9181601f84011215612bc75782359167ffffffffffffffff8311612bc7576020808501948460051b010111612bc757565b906020808351928381520192019060005b818110612cbc5750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612caf565b51908115158203612bc757565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215612bc757016020813591019167ffffffffffffffff8211612bc7578136038313612bc757565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9067ffffffffffffffff9093929316815260406020820152612dfa612dbd612dac8580612cf5565b60a0604086015260e0850191612d45565b612dca6020860186612cf5565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0858403016060860152612d45565b9060408401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811215612bc75784016020813591019267ffffffffffffffff8211612bc7578160061b36038413612bc7578281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0016080840152818152602001929060005b818110612efb57505050612ec88473ffffffffffffffffffffffffffffffffffffffff612eb86060612ef8979801612c4c565b1660a08401526080810190612cf5565b9160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082860301910152612d45565b90565b90919360408060019273ffffffffffffffffffffffffffffffffffffffff612f2289612c4c565b16815260208881013590820152019501929101612e85565b73ffffffffffffffffffffffffffffffffffffffff604051917fbbe4f6db00000000000000000000000000000000000000000000000000000000835216600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561304757600091612fe4575b5073ffffffffffffffffffffffffffffffffffffffff1690565b6020813d60201161303f575b81612ffd60209383612acf565b8101031261138d57519073ffffffffffffffffffffffffffffffffffffffff8216820361013c575073ffffffffffffffffffffffffffffffffffffffff612fca565b3d9150612ff0565b6040513d6000823e3d90fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612bc75790565b6040519061308182612a7a565b60006080838281528260208201528260408201528260608201520152565b9080601f83011215612bc75781356130b681612be1565b926130c46040519485612acf565b81845260208085019260051b820101928311612bc757602001905b8282106130ec5750505090565b602080916130f984612c4c565b8152019101906130df565b80518210156131185760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612bc7570180359067ffffffffffffffff8211612bc757602001918136038313612bc757565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612bc7570180359067ffffffffffffffff8211612bc757602001918160061b36038313612bc757565b604051906131f982612a7a565b6060608083600081528260208201528260408201526000838201520152565b92919261322482612b10565b916132326040519384612acf565b829481845281830111612bc7578281602093846000960137010152565b81601f82011215612bc757805161326581612b10565b926132736040519485612acf565b81845260208284010111612bc757612ef89160208085019101612b4a565b9080602083519182815201916020808360051b8301019401926000915b8383106132bd57505050505090565b9091929394602080613358837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301875289519073ffffffffffffffffffffffffffffffffffffffff8251168152608061333d61332b8685015160a08886015260a0850190612b6d565b60408501518482036040860152612b6d565b92606081015160608401520151906080818403910152612b6d565b970193019301919392906132ae565b73ffffffffffffffffffffffffffffffffffffffff60015416330361338857565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b80548210156131185760005260206000200190600090565b60008281526001820160205260409020546134545780549068010000000000000000821015612a4b578261343d6134088460018096018555846133b2565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905580549260005201602052604060002055600190565b5050600090565b90600182019181600052826020526040600020548015156000146135e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116135b5578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116135b55781810361357e575b5050508054801561354f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061351082826133b2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61359e61358e61340893866133b2565b90549060031b1c928392866133b2565b9055600052836020526040600020553880806134d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50505050600090565b919290156136685750815115613601575090565b3b1561360a5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561367b5750805190602001fd5b6136b9906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612b6d565b0390fdfea164736f6c634300081a000a", } var OnRampABI = OnRampMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/onramp_with_message_transformer/onramp_with_message_transformer.go b/core/gethwrappers/ccip/generated/onramp_with_message_transformer/onramp_with_message_transformer.go index 5683e4efa37..c0264e394bb 100644 --- a/core/gethwrappers/ccip/generated/onramp_with_message_transformer/onramp_with_message_transformer.go +++ b/core/gethwrappers/ccip/generated/onramp_with_message_transformer/onramp_with_message_transformer.go @@ -101,7 +101,7 @@ type OnRampStaticConfig struct { var OnRampWithMessageTransformerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"destChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"messageTransformerAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowlistUpdates\",\"inputs\":[{\"name\":\"allowlistConfigArgsItems\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.AllowlistConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forwardFromRouter\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowedSendersList\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"configuredAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExpectedNextSequenceNumber\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMessageTransformer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPoolBySourceToken\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPoolV1\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedTokens\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMessageTransformer\",\"inputs\":[{\"name\":\"messageTransformerAddr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawFeeTokens\",\"inputs\":[{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdminSet\",\"inputs\":[{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListSendersAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"senders\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListSendersRemoved\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"senders\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigSet\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenWithdrawn\",\"inputs\":[{\"name\":\"feeAggregator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"error\",\"name\":\"CannotSendZeroTokens\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAllowListRequest\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageTransformError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeCalledByRouter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RouterMustSetOriginalSender\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", - Bin: "0x610100604052346105a15761418b8038038061001a816105db565b92833981019080820361016081126105a157608081126105a15761003c6105bc565b9161004681610600565b835260208101516001600160a01b03811681036105a1576020840190815261007060408301610614565b916040850192835260a061008660608301610614565b6060870190815294607f1901126105a15760405160a081016001600160401b038111828210176105a6576040526100bf60808301610614565b81526100cd60a08301610628565b602082019081526100e060c08401610614565b90604083019182526100f460e08501610614565b92606081019384526101096101008601610614565b608082019081526101208601519095906001600160401b0381116105a15781018b601f820112156105a1578051906001600160401b0382116105a6578160051b602001610155906105db565b9c8d838152602001926060028201602001918183116105a157602001925b828410610533575050505061014061018b9101610614565b98331561052257600180546001600160a01b0319163317905580516001600160401b0316158015610510575b80156104fe575b80156104ec575b6104bf57516001600160401b0316608081905295516001600160a01b0390811660a08190529751811660c08190529851811660e081905282519091161580156104da575b80156104d0575b6104bf57815160028054855160ff60a01b90151560a01b166001600160a01b039384166001600160a81b0319909216919091171790558451600380549183166001600160a01b03199283161790558651600480549184169183169190911790558751600580549190931691161790557fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f1986101209860606102af6105bc565b8a8152602080820193845260408083019586529290910194855281519a8b5291516001600160a01b03908116928b019290925291518116918901919091529051811660608801529051811660808701529051151560a08601529051811660c08501529051811660e0840152905116610100820152a160005b82518110156104185761033a8184610635565b516001600160401b0361034d8386610635565b5151169081156104035760008281526006602090815260409182902081840151815494840151600160401b600160e81b03198616604883901b600160481b600160e81b031617901515851b68ff000000000000000016179182905583516001600160401b0390951685526001600160a01b031691840191909152811c60ff1615159082015260019291907fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef590606090a201610327565b5063c35aa79d60e01b60005260045260246000fd5b506001600160a01b031680156104ae57600780546001600160a01b031916919091179055604051613b2b908161066082396080518181816103f901528181610b83015281816120260152612814015260a05181818161205f01528181612580015261284d015260c051818181610df40152818161209b0152612889015260e0518181816120d7015281816128c50152612ec40152f35b6342bcdf7f60e11b60005260046000fd5b6306b7c75960e31b60005260046000fd5b5082511515610210565b5084516001600160a01b031615610209565b5088516001600160a01b0316156101c5565b5087516001600160a01b0316156101be565b5086516001600160a01b0316156101b7565b639b15e16f60e01b60005260046000fd5b6060848303126105a15760405190606082016001600160401b038111838210176105a65760405261056385610600565b82526020850151906001600160a01b03821682036105a1578260209283606095015261059160408801610628565b6040820152815201930192610173565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190608082016001600160401b038111838210176105a657604052565b6040519190601f01601f191682016001600160401b038111838210176105a657604052565b51906001600160401b03821682036105a157565b51906001600160a01b03821682036105a157565b519081151582036105a157565b80518210156106495760209160051b010190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816306285c69146127ae5750806315777ab21461275c578063181f5a77146126dd57806320487ded146124a45780632716072b146121f457806327e936f114611dea57806348a98aa414611d675780635cb80c5d14611aaa57806365b81aab146119fa5780636def4ce71461196b5780637437ff9f1461184e57806379ba5097146117695780638da5cb5b146117175780639041be3d1461166a578063972b46121461159c578063c9b146b3146111d3578063df0aa9e914610242578063f2fde38b146101555763fbca3b74146100f257600080fd5b346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525760049061012c612aba565b507f9e7177c8000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525773ffffffffffffffffffffffffffffffffffffffff6101a2612b10565b6101aa6133f0565b1633811461021a57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b50346101525760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761027a612aba565b67ffffffffffffffff60243511610e585760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60243536030112610e58576102c1612b33565b60025460ff8160a01c166111ab577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001760025567ffffffffffffffff8216835260066020526040832073ffffffffffffffffffffffffffffffffffffffff82161561118357805460ff8160401c16611115575b60481c73ffffffffffffffffffffffffffffffffffffffff1633036110ed5773ffffffffffffffffffffffffffffffffffffffff6003541680611079575b50805467ffffffffffffffff811667ffffffffffffffff811461104c579067ffffffffffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009493011692839116179055604051906103eb82612984565b84825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602083015267ffffffffffffffff84166040830152606082015283608082015261044c602480350160243560040161305c565b909361045d6004602435018061305c565b61046b606460243501612f68565b966104806044602435016024356004016130ad565b9590507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06104c66104b088612aeb565b976104be604051998a6129d9565b808952612aeb565b018a5b81811061103557505061051a93929161050e91604051986104e98a6129a0565b895273ffffffffffffffffffffffffffffffffffffffff8a1660208a0152369161312d565b6040870152369161312d565b606084015260209173ffffffffffffffffffffffffffffffffffffffff6040519661054585896129d9565b888852608086019788521660a085015260443560c085015260e084019087825261010085015273ffffffffffffffffffffffffffffffffffffffff878160025416610594606460243501612f68565b9067ffffffffffffffff8661064e6105b660846024350160243560040161305c565b9061061e6105c96004602435018061305c565b9290936040519b8c9a8b998a997f3a49bb49000000000000000000000000000000000000000000000000000000008b521660048a0152166024880152604435604488015260a0606488015260a4870191612c4f565b917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858403016084860152612c4f565b03915afa91821561102a57889189988a918b95610faf575b50525261067d6044602435016024356004016130ad565b9661068788612aeb565b9161069560405193846129d9565b888352858301809960061b820191368311610fab57905b828210610f7457505050885b6106cc6044602435016024356004016130ad565b9050811015610a21576106df8184613019565b51906106e9613101565b5086820151156109f95773ffffffffffffffffffffffffffffffffffffffff61071481845116612e65565b169182158015610956575b61091457808c878a8a73ffffffffffffffffffffffffffffffffffffffff8f836107cc9801518280895116926040519761075889612984565b885267ffffffffffffffff87890196168652816040890191168152606088019283526080880193845267ffffffffffffffff6040519b8c998a997f9a4575b9000000000000000000000000000000000000000000000000000000008b5260048b01525160a060248b015260c48a0190612a77565b965116604488015251166064860152516084850152511660a4830152038183885af1918215610909578d92610862575b506001938284928b8061085b9651930151910151916040519361081e85612984565b84528c840152604083015260608201528d6040519061083d8c836129d9565b815260808201526101008b0151906108558383613019565b52613019565b50016106b8565b91503d808e843e61087381846129d9565b82019189818403126109015780519067ffffffffffffffff821161090557019360408584031261090157604051916108aa836129bd565b855167ffffffffffffffff81116108fd57846108c7918801613164565b83528a8601519267ffffffffffffffff84116108fd576108ef61085b95879560019901613164565b8c82015293509150936107fc565b8f80fd5b8d80fd5b8e80fd5b6040513d8f823e3d90fd5b517fbf16aab6000000000000000000000000000000000000000000000000000000008c5273ffffffffffffffffffffffffffffffffffffffff1660045260248bfd5b506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201528881602481875afa908115610909578d916109c0575b501561071f565b90508881813d83116109f2575b6109d781836129d9565b810103126109ee576109e890612bf2565b386109b9565b8c80fd5b503d6109cd565b60048b7f5cf04449000000000000000000000000000000000000000000000000000000008152fd5b868567ffffffffffffffff888d8c878f868885928d88610a9961010073ffffffffffffffffffffffffffffffffffffffff600254169501516040519c8d977f01447eaa0000000000000000000000000000000000000000000000000000000089521660048801526060602488015260648701906131a6565b917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8684030160448701525191828152019190855b8a828210610f39575050505082809103915afa948515610f2e578395610e6e575b5015610d855750805b67ffffffffffffffff608087510191169052805b61010086015151811015610b425780610b2760019286613019565b516080610b39836101008b0151613019565b51015201610b0c565b5083610b4d8661346b565b91604051848101907f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015267ffffffffffffffff8416606082015230608082015260808152610bcd60a0826129d9565b51902073ffffffffffffffffffffffffffffffffffffffff8585015116845167ffffffffffffffff6080816060840151169201511673ffffffffffffffffffffffffffffffffffffffff60a08801511660c088015191604051938a850195865260408501526060840152608083015260a082015260a08152610c5060c0826129d9565b51902060608501518681519101206040860151878151910120610100870151604051610cb681610c8a8c8201948d865260408301906131a6565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826129d9565b51902091608088015189815191012093604051958a870197885260408701526060860152608085015260a084015260c083015260e082015260e08152610cfe610100826129d9565b51902082515267ffffffffffffffff60608351015116907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f3267ffffffffffffffff60405192169180610d508682613291565b0390a37fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002555151604051908152f35b73ffffffffffffffffffffffffffffffffffffffff604051917fea458c0c00000000000000000000000000000000000000000000000000000000835267ffffffffffffffff8716600484015216602482015282816044818573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115610e63578291610e2a575b50610af8565b90508281813d8311610e5c575b610e4181836129d9565b81010312610e5857610e529061327c565b86610e24565b5080fd5b503d610e37565b6040513d84823e3d90fd5b9094503d8084833e610e8081836129d9565b8101908481830312610f265780519067ffffffffffffffff8211610f2a570181601f82011215610f26578051610eb581612aeb565b92610ec360405194856129d9565b818452868085019260051b84010192818411610f2257878101925b848410610ef15750505050509387610aef565b835167ffffffffffffffff8111610f1e578991610f1385848094870101613164565b815201930192610ede565b8880fd5b8680fd5b8380fd5b8480fd5b6040513d85823e3d90fd5b8351805173ffffffffffffffffffffffffffffffffffffffff168652810151818601528a97508c965060409094019390920191600101610ace565b604082360312610fab57876040918251610f8d816129bd565b610f9685612b56565b815282850135838201528152019101906106ac565b8b80fd5b935093505096503d8089833e610fc581836129d9565b810196608082890312610f1e578151610fdf868401612bf2565b92604081015167ffffffffffffffff8111610fab578a611000918301613164565b99606082015167ffffffffffffffff81116109ee5761101f9201613164565b909298909338610666565b6040513d8a823e3d90fd5b602090611040613101565b82828b010152016104c9565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b803b15610f2a578460405180927fe0a0e5060000000000000000000000000000000000000000000000000000000082528183816110bf6024356004018b60048401612c8e565b03925af180156110e2571561038957846110db919592956129d9565b9238610389565b6040513d87823e3d90fd5b6004847f1c0a3529000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260028301602052604090205461034b5760248573ffffffffffffffffffffffffffffffffffffffff857fd0d2597600000000000000000000000000000000000000000000000000000000835216600452fd5b6004847fa4ec7479000000000000000000000000000000000000000000000000000000008152fd5b6004847f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525760043567ffffffffffffffff8111610e5857611223903690600401612b77565b73ffffffffffffffffffffffffffffffffffffffff600154163303611554575b919081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301915b84811015611550578060051b82013583811215610f2a57820191608083360312610f2a576040519461129f86612939565b6112a884612ad6565b86526112b660208501612b03565b9660208701978852604085013567ffffffffffffffff811161154c576112df9036908701612fb4565b9460408801958652606081013567ffffffffffffffff8111610f265761130791369101612fb4565b60608801908152875167ffffffffffffffff1683526006602052604080842099518a547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169015159182901b68ff000000000000000016178a55909590815151611424575b5095976001019550815b855180518210156113b557906113ae73ffffffffffffffffffffffffffffffffffffffff6113a683600195613019565b5116896138c0565b5001611376565b505095909694506001929193519081516113d5575b50500193929361126e565b61141a67ffffffffffffffff7fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158692511692604051918291602083526020830190612ba8565b0390a238806113ca565b9893959296919094979860001461151557600184019591875b865180518210156114ba576114678273ffffffffffffffffffffffffffffffffffffffff92613019565b51168015611483579061147c6001928a61382f565b500161143d565b60248a67ffffffffffffffff8e51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b50509692955090929796937f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc328161150b67ffffffffffffffff8a51169251604051918291602083526020830190612ba8565b0390a2388061136c565b60248767ffffffffffffffff8b51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b8280fd5b8380f35b73ffffffffffffffffffffffffffffffffffffffff60055416330315611243576004837f905d7d9b000000000000000000000000000000000000000000000000000000008152fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525767ffffffffffffffff6115dd612aba565b16808252600660205260ff604083205460401c16908252600660205260016040832001916040518093849160208254918281520191845260208420935b81811061165157505061162f925003836129d9565b61164d60405192839215158352604060208401526040830190612ba8565b0390f35b845483526001948501948794506020909301920161161a565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525767ffffffffffffffff6116ab612aba565b1681526006602052600167ffffffffffffffff604083205416019067ffffffffffffffff82116116ea5760208267ffffffffffffffff60405191168152f35b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257805473ffffffffffffffffffffffffffffffffffffffff81163303611826577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257611885612f89565b5060a060405161189481612984565b60ff60025473ffffffffffffffffffffffffffffffffffffffff81168352831c161515602082015273ffffffffffffffffffffffffffffffffffffffff60035416604082015273ffffffffffffffffffffffffffffffffffffffff60045416606082015273ffffffffffffffffffffffffffffffffffffffff600554166080820152611969604051809273ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565bf35b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257604060609167ffffffffffffffff6119b1612aba565b1681526006602052205473ffffffffffffffffffffffffffffffffffffffff6040519167ffffffffffffffff8116835260ff8160401c161515602084015260481c166040820152f35b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525773ffffffffffffffffffffffffffffffffffffffff611a47612b10565b611a4f6133f0565b168015611a82577fffffffffffffffffffffffff0000000000000000000000000000000000000000600754161760075580f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525760043567ffffffffffffffff8111610e5857611afa903690600401612b77565b9073ffffffffffffffffffffffffffffffffffffffff6004541690835b83811015611d635773ffffffffffffffffffffffffffffffffffffffff611b428260051b8401612f68565b1690604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481845afa928315611d58578793611d25575b5082611b9a575b506001915001611b17565b8460405193611c3660208601957fa9059cbb00000000000000000000000000000000000000000000000000000000875283602482015282604482015260448152611be56064826129d9565b8a80604098895193611bf78b866129d9565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082895af1611c2f61343b565b9086613a52565b805180611c72575b505060207f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e9160019651908152a338611b8f565b819294959693509060209181010312610f1e576020611c919101612bf2565b15611ca25792919085903880611c3e565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9092506020813d8211611d50575b81611d40602093836129d9565b81010312610f2257519138611b88565b3d9150611d33565b6040513d89823e3d90fd5b8480f35b50346101525760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257611d9f612aba565b506024359073ffffffffffffffffffffffffffffffffffffffff82168203610152576020611dcc83612e65565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b50346101525760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257604051611e2681612984565b611e2e612b10565b8152602435801515810361154c576020820190815260443573ffffffffffffffffffffffffffffffffffffffff81168103610f265760408301908152611e72612b33565b90606084019182526084359273ffffffffffffffffffffffffffffffffffffffff841684036121f05760808501938452611eaa6133f0565b73ffffffffffffffffffffffffffffffffffffffff8551161580156121d1575b80156121c7575b61219f579273ffffffffffffffffffffffffffffffffffffffff859381809461012097827fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19a51167fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006002549260a01b1691161760025551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600354161760035551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600454161760045551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600554161760055561219b6040519161201b83612939565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016835273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602084015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604084015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606084015261214b604051809473ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b608083019073ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565ba180f35b6004867f35be3ac8000000000000000000000000000000000000000000000000000000008152fd5b5080511515611ed1565b5073ffffffffffffffffffffffffffffffffffffffff83511615611eca565b8580fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576004359067ffffffffffffffff8211610152573660238301121561015257816004013561225081612aeb565b9261225e60405194856129d9565b8184526024606060208601930282010190368211610f2657602401915b8183106123fc5750505061228d6133f0565b805b82518110156123f8576122a28184613019565b5167ffffffffffffffff6122b68386613019565b5151169081156123cc57907fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5606060019493838752600660205260ff6040882061238d604060208501519483547fffffff0000000000000000000000000000000000000000ffffffffffffffffff7cffffffffffffffffffffffffffffffffffffffff0000000000000000008860481b1691161784550151151582907fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff68ff0000000000000000835492151560401b169116179055565b5473ffffffffffffffffffffffffffffffffffffffff6040519367ffffffffffffffff8316855216602084015260401c1615156040820152a20161228f565b602484837fc35aa79d000000000000000000000000000000000000000000000000000000008252600452fd5b5080f35b606083360312610f26576040516060810181811067ffffffffffffffff8211176124775760405261242c84612ad6565b8152602084013573ffffffffffffffffffffffffffffffffffffffff811681036121f057918160609360208094015261246760408701612b03565b604082015281520192019161227b565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50346101525760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576124dc612aba565b60243567ffffffffffffffff811161154c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261154c576040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff000000000000000000000000000000008360801b16600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156126d2578491612698575b506126625761260f9160209173ffffffffffffffffffffffffffffffffffffffff60025416906040518095819482937fd8694ccd0000000000000000000000000000000000000000000000000000000084526004019060048401612c8e565b03915afa908115610e6357829161262c575b602082604051908152f35b90506020813d60201161265a575b81612647602093836129d9565b81010312610e5857602091505138612621565b3d915061263a565b60248367ffffffffffffffff847ffdbd6a7200000000000000000000000000000000000000000000000000000000835216600452fd5b90506020813d6020116126ca575b816126b3602093836129d9565b81010312610f26576126c490612bf2565b386125b0565b3d91506126a6565b6040513d86823e3d90fd5b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152575061164d60405161271e6040826129d9565b601081527f4f6e52616d7020312e362e302d646576000000000000000000000000000000006020820152604051918291602083526020830190612a77565b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b905034610e5857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5857806127ea606092612939565b8281528260208201528260408201520152608060405161280981612939565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060820152611969604051809273ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b6080810190811067ffffffffffffffff82111761295557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761295557604052565b610120810190811067ffffffffffffffff82111761295557604052565b6040810190811067ffffffffffffffff82111761295557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761295557604052565b67ffffffffffffffff811161295557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110612a675750506000910152565b8181015183820152602001612a57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612ab381518092818752878088019101612a54565b0116010190565b6004359067ffffffffffffffff82168203612ad157565b600080fd5b359067ffffffffffffffff82168203612ad157565b67ffffffffffffffff81116129555760051b60200190565b35908115158203612ad157565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612ad157565b6064359073ffffffffffffffffffffffffffffffffffffffff82168203612ad157565b359073ffffffffffffffffffffffffffffffffffffffff82168203612ad157565b9181601f84011215612ad15782359167ffffffffffffffff8311612ad1576020808501948460051b010111612ad157565b906020808351928381520192019060005b818110612bc65750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612bb9565b51908115158203612ad157565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215612ad157016020813591019167ffffffffffffffff8211612ad1578136038313612ad157565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9067ffffffffffffffff9093929316815260406020820152612d04612cc7612cb68580612bff565b60a0604086015260e0850191612c4f565b612cd46020860186612bff565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0858403016060860152612c4f565b9060408401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811215612ad15784016020813591019267ffffffffffffffff8211612ad1578160061b36038413612ad1578281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0016080840152818152602001929060005b818110612e0557505050612dd28473ffffffffffffffffffffffffffffffffffffffff612dc26060612e02979801612b56565b1660a08401526080810190612bff565b9160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082860301910152612c4f565b90565b90919360408060019273ffffffffffffffffffffffffffffffffffffffff612e2c89612b56565b16815260208881013590820152019501929101612d8f565b519073ffffffffffffffffffffffffffffffffffffffff82168203612ad157565b73ffffffffffffffffffffffffffffffffffffffff604051917fbbe4f6db00000000000000000000000000000000000000000000000000000000835216600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015612f5c57600090612f0f575b73ffffffffffffffffffffffffffffffffffffffff91501690565b506020813d602011612f54575b81612f29602093836129d9565b81010312612ad157612f4f73ffffffffffffffffffffffffffffffffffffffff91612e44565b612ef4565b3d9150612f1c565b6040513d6000823e3d90fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612ad15790565b60405190612f9682612984565b60006080838281528260208201528260408201528260608201520152565b9080601f83011215612ad1578135612fcb81612aeb565b92612fd960405194856129d9565b81845260208085019260051b820101928311612ad157602001905b8282106130015750505090565b6020809161300e84612b56565b815201910190612ff4565b805182101561302d5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612ad1570180359067ffffffffffffffff8211612ad157602001918136038313612ad157565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612ad1570180359067ffffffffffffffff8211612ad157602001918160061b36038313612ad157565b6040519061310e82612984565b6060608083600081528260208201528260408201526000838201520152565b92919261313982612a1a565b9161314760405193846129d9565b829481845281830111612ad1578281602093846000960137010152565b81601f82011215612ad157805161317a81612a1a565b9261318860405194856129d9565b81845260208284010111612ad157612e029160208085019101612a54565b9080602083519182815201916020808360051b8301019401926000915b8383106131d257505050505090565b909192939460208061326d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301875289519073ffffffffffffffffffffffffffffffffffffffff825116815260806132526132408685015160a08886015260a0850190612a77565b60408501518482036040860152612a77565b92606081015160608401520151906080818403910152612a77565b970193019301919392906131c3565b519067ffffffffffffffff82168203612ad157565b90612e02916020815267ffffffffffffffff6080835180516020850152826020820151166040850152826040820151166060850152826060820151168285015201511660a082015273ffffffffffffffffffffffffffffffffffffffff60208301511660c082015261010061338561335061331d60408601516101a060e08701526101c0860190612a77565b60608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08683030185870152612a77565b60808501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301610120860152612a77565b9273ffffffffffffffffffffffffffffffffffffffff60a08201511661014084015260c081015161016084015260e08101516101808401520151906101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828503019101526131a6565b73ffffffffffffffffffffffffffffffffffffffff60015416330361341157565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b3d15613466573d9061344c82612a1a565b9161345a60405193846129d9565b82523d6000602084013e565b606090565b600061350c819260405161347e816129a0565b613486612f89565b815283602082015260606040820152606080820152606060808201528360a08201528360c08201528360e082015260606101008201525073ffffffffffffffffffffffffffffffffffffffff60075416906040519485809481937f8a06fadb00000000000000000000000000000000000000000000000000000000835260048301613291565b03925af18091600091613569575b5090612e025761356561352b61343b565b6040519182917f828ebdfb000000000000000000000000000000000000000000000000000000008352602060048401526024830190612a77565b0390fd5b3d8083833e61357881836129d9565b81019060208183031261154c5780519067ffffffffffffffff8211610f26570191828203926101a08412610e585760a0604051946135b5866129a0565b12610e58576040516135c681612984565b815181526135d66020830161327c565b60208201526135e76040830161327c565b60408201526135f86060830161327c565b60608201526136096080830161327c565b6080820152845261361c60a08201612e44565b602085015260c081015167ffffffffffffffff811161154c5783613641918301613164565b604085015260e081015167ffffffffffffffff811161154c5783613666918301613164565b606085015261010081015167ffffffffffffffff811161154c578361368c918301613164565b608085015261369e6101208201612e44565b60a085015261014081015160c085015261016081015160e08501526101808101519067ffffffffffffffff821161154c570182601f82011215610e58578051916136e783612aeb565b936136f560405195866129d9565b83855260208086019460051b8401019281841161154c5760208101945b84861061372b575050505050506101008201523861351a565b855167ffffffffffffffff8111610f2a57820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08286030112610f2a576040519061377782612984565b61378360208201612e44565b8252604081015167ffffffffffffffff8111610f22578560206137a892840101613164565b6020830152606081015167ffffffffffffffff8111610f22578560206137d092840101613164565b60408301526080810151606083015260a08101519067ffffffffffffffff8211610f22579161380786602080969481960101613164565b6080820152815201950194613712565b805482101561302d5760005260206000200190600090565b60008281526001820160205260409020546138b9578054906801000000000000000082101561295557826138a261386d846001809601855584613817565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905580549260005201602052604060002055600190565b5050600090565b9060018201918160005282602052604060002054801515600014613a49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613a1a578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613a1a578181036139e3575b505050805480156139b4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906139758282613817565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613a036139f361386d9386613817565b90549060031b1c92839286613817565b90556000528360205260406000205538808061393d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50505050600090565b91929015613acd5750815115613a66575090565b3b15613a6f5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015613ae05750805190602001fd5b613565906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612a7756fea164736f6c634300081a000a", + Bin: "0x610100604052346105a15761418b8038038061001a816105db565b92833981019080820361016081126105a157608081126105a15761003c6105bc565b9161004681610600565b835260208101516001600160a01b03811681036105a1576020840190815261007060408301610614565b916040850192835260a061008660608301610614565b6060870190815294607f1901126105a15760405160a081016001600160401b038111828210176105a6576040526100bf60808301610614565b81526100cd60a08301610628565b602082019081526100e060c08401610614565b90604083019182526100f460e08501610614565b92606081019384526101096101008601610614565b608082019081526101208601519095906001600160401b0381116105a15781018b601f820112156105a1578051906001600160401b0382116105a6578160051b602001610155906105db565b9c8d838152602001926060028201602001918183116105a157602001925b828410610533575050505061014061018b9101610614565b98331561052257600180546001600160a01b0319163317905580516001600160401b0316158015610510575b80156104fe575b80156104ec575b6104bf57516001600160401b0316608081905295516001600160a01b0390811660a08190529751811660c08190529851811660e081905282519091161580156104da575b80156104d0575b6104bf57815160028054855160ff60a01b90151560a01b166001600160a01b039384166001600160a81b0319909216919091171790558451600380549183166001600160a01b03199283161790558651600480549184169183169190911790558751600580549190931691161790557fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f1986101209860606102af6105bc565b8a8152602080820193845260408083019586529290910194855281519a8b5291516001600160a01b03908116928b019290925291518116918901919091529051811660608801529051811660808701529051151560a08601529051811660c08501529051811660e0840152905116610100820152a160005b82518110156104185761033a8184610635565b516001600160401b0361034d8386610635565b5151169081156104035760008281526006602090815260409182902081840151815494840151600160401b600160e81b03198616604883901b600160481b600160e81b031617901515851b68ff000000000000000016179182905583516001600160401b0390951685526001600160a01b031691840191909152811c60ff1615159082015260019291907fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef590606090a201610327565b5063c35aa79d60e01b60005260045260246000fd5b506001600160a01b031680156104ae57600780546001600160a01b031916919091179055604051613b2b908161066082396080518181816103f901528181610b83015281816120260152612814015260a05181818161205f01528181612580015261284d015260c051818181610df40152818161209b0152612889015260e0518181816120d7015281816128c50152612ec40152f35b6342bcdf7f60e11b60005260046000fd5b6306b7c75960e31b60005260046000fd5b5082511515610210565b5084516001600160a01b031615610209565b5088516001600160a01b0316156101c5565b5087516001600160a01b0316156101be565b5086516001600160a01b0316156101b7565b639b15e16f60e01b60005260046000fd5b6060848303126105a15760405190606082016001600160401b038111838210176105a65760405261056385610600565b82526020850151906001600160a01b03821682036105a1578260209283606095015261059160408801610628565b6040820152815201930192610173565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190608082016001600160401b038111838210176105a657604052565b6040519190601f01601f191682016001600160401b038111838210176105a657604052565b51906001600160401b03821682036105a157565b51906001600160a01b03821682036105a157565b519081151582036105a157565b80518210156106495760209160051b010190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816306285c69146127ae5750806315777ab21461275c578063181f5a77146126dd57806320487ded146124a45780632716072b146121f457806327e936f114611dea57806348a98aa414611d675780635cb80c5d14611aaa57806365b81aab146119fa5780636def4ce71461196b5780637437ff9f1461184e57806379ba5097146117695780638da5cb5b146117175780639041be3d1461166a578063972b46121461159c578063c9b146b3146111d3578063df0aa9e914610242578063f2fde38b146101555763fbca3b74146100f257600080fd5b346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525760049061012c612aba565b507f9e7177c8000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525773ffffffffffffffffffffffffffffffffffffffff6101a2612b10565b6101aa6133f0565b1633811461021a57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b50346101525760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525761027a612aba565b67ffffffffffffffff60243511610e585760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60243536030112610e58576102c1612b33565b60025460ff8160a01c166111ab577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001760025567ffffffffffffffff8216835260066020526040832073ffffffffffffffffffffffffffffffffffffffff82161561118357805460ff8160401c16611115575b60481c73ffffffffffffffffffffffffffffffffffffffff1633036110ed5773ffffffffffffffffffffffffffffffffffffffff6003541680611079575b50805467ffffffffffffffff811667ffffffffffffffff811461104c579067ffffffffffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009493011692839116179055604051906103eb82612984565b84825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602083015267ffffffffffffffff84166040830152606082015283608082015261044c602480350160243560040161305c565b909361045d6004602435018061305c565b61046b606460243501612f68565b966104806044602435016024356004016130ad565b9590507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06104c66104b088612aeb565b976104be604051998a6129d9565b808952612aeb565b018a5b81811061103557505061051a93929161050e91604051986104e98a6129a0565b895273ffffffffffffffffffffffffffffffffffffffff8a1660208a0152369161312d565b6040870152369161312d565b606084015260209173ffffffffffffffffffffffffffffffffffffffff6040519661054585896129d9565b888852608086019788521660a085015260443560c085015260e084019087825261010085015273ffffffffffffffffffffffffffffffffffffffff878160025416610594606460243501612f68565b9067ffffffffffffffff8661064e6105b660846024350160243560040161305c565b9061061e6105c96004602435018061305c565b9290936040519b8c9a8b998a997f3a49bb49000000000000000000000000000000000000000000000000000000008b521660048a0152166024880152604435604488015260a0606488015260a4870191612c4f565b917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc858403016084860152612c4f565b03915afa91821561102a57889189988a918b95610faf575b50525261067d6044602435016024356004016130ad565b9661068788612aeb565b9161069560405193846129d9565b888352858301809960061b820191368311610fab57905b828210610f7457505050885b6106cc6044602435016024356004016130ad565b9050811015610a21576106df8184613019565b51906106e9613101565b5086820151156109f95773ffffffffffffffffffffffffffffffffffffffff61071481845116612e65565b169182158015610956575b61091457808c878a8a73ffffffffffffffffffffffffffffffffffffffff8f836107cc9801518280895116926040519761075889612984565b885267ffffffffffffffff87890196168652816040890191168152606088019283526080880193845267ffffffffffffffff6040519b8c998a997f9a4575b9000000000000000000000000000000000000000000000000000000008b5260048b01525160a060248b015260c48a0190612a77565b965116604488015251166064860152516084850152511660a4830152038183885af1918215610909578d92610862575b506001938284928b8061085b9651930151910151916040519361081e85612984565b84528c840152604083015260608201528d6040519061083d8c836129d9565b815260808201526101008b0151906108558383613019565b52613019565b50016106b8565b91503d808e843e61087381846129d9565b82019189818403126109015780519067ffffffffffffffff821161090557019360408584031261090157604051916108aa836129bd565b855167ffffffffffffffff81116108fd57846108c7918801613164565b83528a8601519267ffffffffffffffff84116108fd576108ef61085b95879560019901613164565b8c82015293509150936107fc565b8f80fd5b8d80fd5b8e80fd5b6040513d8f823e3d90fd5b517fbf16aab6000000000000000000000000000000000000000000000000000000008c5273ffffffffffffffffffffffffffffffffffffffff1660045260248bfd5b506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201528881602481875afa908115610909578d916109c0575b501561071f565b90508881813d83116109f2575b6109d781836129d9565b810103126109ee576109e890612bf2565b386109b9565b8c80fd5b503d6109cd565b60048b7f5cf04449000000000000000000000000000000000000000000000000000000008152fd5b868567ffffffffffffffff888d8c878f868885928d88610a9961010073ffffffffffffffffffffffffffffffffffffffff600254169501516040519c8d977f01447eaa0000000000000000000000000000000000000000000000000000000089521660048801526060602488015260648701906131a6565b917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8684030160448701525191828152019190855b8a828210610f39575050505082809103915afa948515610f2e578395610e6e575b5015610d855750805b67ffffffffffffffff608087510191169052805b61010086015151811015610b425780610b2760019286613019565b516080610b39836101008b0151613019565b51015201610b0c565b5083610b4d8661346b565b91604051848101907f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015267ffffffffffffffff8416606082015230608082015260808152610bcd60a0826129d9565b51902073ffffffffffffffffffffffffffffffffffffffff8585015116845167ffffffffffffffff6080816060840151169201511673ffffffffffffffffffffffffffffffffffffffff60a08801511660c088015191604051938a850195865260408501526060840152608083015260a082015260a08152610c5060c0826129d9565b51902060608501518681519101206040860151878151910120610100870151604051610cb681610c8a8c8201948d865260408301906131a6565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081018352826129d9565b51902091608088015189815191012093604051958a870197885260408701526060860152608085015260a084015260c083015260e082015260e08152610cfe610100826129d9565b51902082515267ffffffffffffffff60608351015116907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f3267ffffffffffffffff60405192169180610d508682613291565b0390a37fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002555151604051908152f35b73ffffffffffffffffffffffffffffffffffffffff604051917fea458c0c00000000000000000000000000000000000000000000000000000000835267ffffffffffffffff8716600484015216602482015282816044818573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115610e63578291610e2a575b50610af8565b90508281813d8311610e5c575b610e4181836129d9565b81010312610e5857610e529061327c565b86610e24565b5080fd5b503d610e37565b6040513d84823e3d90fd5b9094503d8084833e610e8081836129d9565b8101908481830312610f265780519067ffffffffffffffff8211610f2a570181601f82011215610f26578051610eb581612aeb565b92610ec360405194856129d9565b818452868085019260051b84010192818411610f2257878101925b848410610ef15750505050509387610aef565b835167ffffffffffffffff8111610f1e578991610f1385848094870101613164565b815201930192610ede565b8880fd5b8680fd5b8380fd5b8480fd5b6040513d85823e3d90fd5b8351805173ffffffffffffffffffffffffffffffffffffffff168652810151818601528a97508c965060409094019390920191600101610ace565b604082360312610fab57876040918251610f8d816129bd565b610f9685612b56565b815282850135838201528152019101906106ac565b8b80fd5b935093505096503d8089833e610fc581836129d9565b810196608082890312610f1e578151610fdf868401612bf2565b92604081015167ffffffffffffffff8111610fab578a611000918301613164565b99606082015167ffffffffffffffff81116109ee5761101f9201613164565b909298909338610666565b6040513d8a823e3d90fd5b602090611040613101565b82828b010152016104c9565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b803b15610f2a578460405180927fe0a0e5060000000000000000000000000000000000000000000000000000000082528183816110bf6024356004018b60048401612c8e565b03925af180156110e2571561038957846110db919592956129d9565b9238610389565b6040513d87823e3d90fd5b6004847f1c0a3529000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260028301602052604090205461034b5760248573ffffffffffffffffffffffffffffffffffffffff857fd0d2597600000000000000000000000000000000000000000000000000000000835216600452fd5b6004847fa4ec7479000000000000000000000000000000000000000000000000000000008152fd5b6004847f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525760043567ffffffffffffffff8111610e5857611223903690600401612b77565b73ffffffffffffffffffffffffffffffffffffffff600154163303611554575b919081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301915b84811015611550578060051b82013583811215610f2a57820191608083360312610f2a576040519461129f86612939565b6112a884612ad6565b86526112b660208501612b03565b9660208701978852604085013567ffffffffffffffff811161154c576112df9036908701612fb4565b9460408801958652606081013567ffffffffffffffff8111610f265761130791369101612fb4565b60608801908152875167ffffffffffffffff1683526006602052604080842099518a547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169015159182901b68ff000000000000000016178a55909590815151611424575b5095976001019550815b855180518210156113b557906113ae73ffffffffffffffffffffffffffffffffffffffff6113a683600195613019565b5116896138c0565b5001611376565b505095909694506001929193519081516113d5575b50500193929361126e565b61141a67ffffffffffffffff7fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158692511692604051918291602083526020830190612ba8565b0390a238806113ca565b9893959296919094979860001461151557600184019591875b865180518210156114ba576114678273ffffffffffffffffffffffffffffffffffffffff92613019565b51168015611483579061147c6001928a61382f565b500161143d565b60248a67ffffffffffffffff8e51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b50509692955090929796937f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc328161150b67ffffffffffffffff8a51169251604051918291602083526020830190612ba8565b0390a2388061136c565b60248767ffffffffffffffff8b51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b8280fd5b8380f35b73ffffffffffffffffffffffffffffffffffffffff60055416330315611243576004837f905d7d9b000000000000000000000000000000000000000000000000000000008152fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525767ffffffffffffffff6115dd612aba565b16808252600660205260ff604083205460401c16908252600660205260016040832001916040518093849160208254918281520191845260208420935b81811061165157505061162f925003836129d9565b61164d60405192839215158352604060208401526040830190612ba8565b0390f35b845483526001948501948794506020909301920161161a565b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525767ffffffffffffffff6116ab612aba565b1681526006602052600167ffffffffffffffff604083205416019067ffffffffffffffff82116116ea5760208267ffffffffffffffff60405191168152f35b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257805473ffffffffffffffffffffffffffffffffffffffff81163303611826577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257611885612f89565b5060a060405161189481612984565b60ff60025473ffffffffffffffffffffffffffffffffffffffff81168352831c161515602082015273ffffffffffffffffffffffffffffffffffffffff60035416604082015273ffffffffffffffffffffffffffffffffffffffff60045416606082015273ffffffffffffffffffffffffffffffffffffffff600554166080820152611969604051809273ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565bf35b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257604060609167ffffffffffffffff6119b1612aba565b1681526006602052205473ffffffffffffffffffffffffffffffffffffffff6040519167ffffffffffffffff8116835260ff8160401c161515602084015260481c166040820152f35b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525773ffffffffffffffffffffffffffffffffffffffff611a47612b10565b611a4f6133f0565b168015611a82577fffffffffffffffffffffffff0000000000000000000000000000000000000000600754161760075580f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101525760043567ffffffffffffffff8111610e5857611afa903690600401612b77565b9073ffffffffffffffffffffffffffffffffffffffff6004541690835b83811015611d635773ffffffffffffffffffffffffffffffffffffffff611b428260051b8401612f68565b1690604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481845afa928315611d58578793611d25575b5082611b9a575b506001915001611b17565b8460405193611c3660208601957fa9059cbb00000000000000000000000000000000000000000000000000000000875283602482015282604482015260448152611be56064826129d9565b8a80604098895193611bf78b866129d9565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082895af1611c2f61343b565b9086613a52565b805180611c72575b505060207f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e9160019651908152a338611b8f565b819294959693509060209181010312610f1e576020611c919101612bf2565b15611ca25792919085903880611c3e565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b9092506020813d8211611d50575b81611d40602093836129d9565b81010312610f2257519138611b88565b3d9150611d33565b6040513d89823e3d90fd5b8480f35b50346101525760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257611d9f612aba565b506024359073ffffffffffffffffffffffffffffffffffffffff82168203610152576020611dcc83612e65565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b50346101525760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257604051611e2681612984565b611e2e612b10565b8152602435801515810361154c576020820190815260443573ffffffffffffffffffffffffffffffffffffffff81168103610f265760408301908152611e72612b33565b90606084019182526084359273ffffffffffffffffffffffffffffffffffffffff841684036121f05760808501938452611eaa6133f0565b73ffffffffffffffffffffffffffffffffffffffff8551161580156121d1575b80156121c7575b61219f579273ffffffffffffffffffffffffffffffffffffffff859381809461012097827fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19a51167fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006002549260a01b1691161760025551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600354161760035551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600454161760045551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600554161760055561219b6040519161201b83612939565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016835273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602084015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604084015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606084015261214b604051809473ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b608083019073ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565ba180f35b6004867f35be3ac8000000000000000000000000000000000000000000000000000000008152fd5b5080511515611ed1565b5073ffffffffffffffffffffffffffffffffffffffff83511615611eca565b8580fd5b50346101525760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576004359067ffffffffffffffff8211610152573660238301121561015257816004013561225081612aeb565b9261225e60405194856129d9565b8184526024606060208601930282010190368211610f2657602401915b8183106123fc5750505061228d6133f0565b805b82518110156123f8576122a28184613019565b5167ffffffffffffffff6122b68386613019565b5151169081156123cc57907fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5606060019493838752600660205260ff6040882061238d604060208501519483547fffffff0000000000000000000000000000000000000000ffffffffffffffffff7cffffffffffffffffffffffffffffffffffffffff0000000000000000008860481b1691161784550151151582907fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff68ff0000000000000000835492151560401b169116179055565b5473ffffffffffffffffffffffffffffffffffffffff6040519367ffffffffffffffff8316855216602084015260401c1615156040820152a20161228f565b602484837fc35aa79d000000000000000000000000000000000000000000000000000000008252600452fd5b5080f35b606083360312610f26576040516060810181811067ffffffffffffffff8211176124775760405261242c84612ad6565b8152602084013573ffffffffffffffffffffffffffffffffffffffff811681036121f057918160609360208094015261246760408701612b03565b604082015281520192019161227b565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50346101525760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152576124dc612aba565b60243567ffffffffffffffff811161154c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261154c576040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff000000000000000000000000000000008360801b16600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156126d2578491612698575b506126625761260f9160209173ffffffffffffffffffffffffffffffffffffffff60025416906040518095819482937fd8694ccd0000000000000000000000000000000000000000000000000000000084526004019060048401612c8e565b03915afa908115610e6357829161262c575b602082604051908152f35b90506020813d60201161265a575b81612647602093836129d9565b81010312610e5857602091505138612621565b3d915061263a565b60248367ffffffffffffffff847ffdbd6a7200000000000000000000000000000000000000000000000000000000835216600452fd5b90506020813d6020116126ca575b816126b3602093836129d9565b81010312610f26576126c490612bf2565b386125b0565b3d91506126a6565b6040513d86823e3d90fd5b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610152575061164d60405161271e6040826129d9565b600c81527f4f6e52616d7020312e362e3000000000000000000000000000000000000000006020820152604051918291602083526020830190612a77565b503461015257807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015257602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b905034610e5857817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610e5857806127ea606092612939565b8281528260208201528260408201520152608060405161280981612939565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060820152611969604051809273ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b6080810190811067ffffffffffffffff82111761295557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761295557604052565b610120810190811067ffffffffffffffff82111761295557604052565b6040810190811067ffffffffffffffff82111761295557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761295557604052565b67ffffffffffffffff811161295557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110612a675750506000910152565b8181015183820152602001612a57565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612ab381518092818752878088019101612a54565b0116010190565b6004359067ffffffffffffffff82168203612ad157565b600080fd5b359067ffffffffffffffff82168203612ad157565b67ffffffffffffffff81116129555760051b60200190565b35908115158203612ad157565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612ad157565b6064359073ffffffffffffffffffffffffffffffffffffffff82168203612ad157565b359073ffffffffffffffffffffffffffffffffffffffff82168203612ad157565b9181601f84011215612ad15782359167ffffffffffffffff8311612ad1576020808501948460051b010111612ad157565b906020808351928381520192019060005b818110612bc65750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612bb9565b51908115158203612ad157565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215612ad157016020813591019167ffffffffffffffff8211612ad1578136038313612ad157565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9067ffffffffffffffff9093929316815260406020820152612d04612cc7612cb68580612bff565b60a0604086015260e0850191612c4f565b612cd46020860186612bff565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0858403016060860152612c4f565b9060408401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811215612ad15784016020813591019267ffffffffffffffff8211612ad1578160061b36038413612ad1578281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0016080840152818152602001929060005b818110612e0557505050612dd28473ffffffffffffffffffffffffffffffffffffffff612dc26060612e02979801612b56565b1660a08401526080810190612bff565b9160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082860301910152612c4f565b90565b90919360408060019273ffffffffffffffffffffffffffffffffffffffff612e2c89612b56565b16815260208881013590820152019501929101612d8f565b519073ffffffffffffffffffffffffffffffffffffffff82168203612ad157565b73ffffffffffffffffffffffffffffffffffffffff604051917fbbe4f6db00000000000000000000000000000000000000000000000000000000835216600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015612f5c57600090612f0f575b73ffffffffffffffffffffffffffffffffffffffff91501690565b506020813d602011612f54575b81612f29602093836129d9565b81010312612ad157612f4f73ffffffffffffffffffffffffffffffffffffffff91612e44565b612ef4565b3d9150612f1c565b6040513d6000823e3d90fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612ad15790565b60405190612f9682612984565b60006080838281528260208201528260408201528260608201520152565b9080601f83011215612ad1578135612fcb81612aeb565b92612fd960405194856129d9565b81845260208085019260051b820101928311612ad157602001905b8282106130015750505090565b6020809161300e84612b56565b815201910190612ff4565b805182101561302d5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612ad1570180359067ffffffffffffffff8211612ad157602001918136038313612ad157565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612ad1570180359067ffffffffffffffff8211612ad157602001918160061b36038313612ad157565b6040519061310e82612984565b6060608083600081528260208201528260408201526000838201520152565b92919261313982612a1a565b9161314760405193846129d9565b829481845281830111612ad1578281602093846000960137010152565b81601f82011215612ad157805161317a81612a1a565b9261318860405194856129d9565b81845260208284010111612ad157612e029160208085019101612a54565b9080602083519182815201916020808360051b8301019401926000915b8383106131d257505050505090565b909192939460208061326d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301875289519073ffffffffffffffffffffffffffffffffffffffff825116815260806132526132408685015160a08886015260a0850190612a77565b60408501518482036040860152612a77565b92606081015160608401520151906080818403910152612a77565b970193019301919392906131c3565b519067ffffffffffffffff82168203612ad157565b90612e02916020815267ffffffffffffffff6080835180516020850152826020820151166040850152826040820151166060850152826060820151168285015201511660a082015273ffffffffffffffffffffffffffffffffffffffff60208301511660c082015261010061338561335061331d60408601516101a060e08701526101c0860190612a77565b60608601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08683030185870152612a77565b60808501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301610120860152612a77565b9273ffffffffffffffffffffffffffffffffffffffff60a08201511661014084015260c081015161016084015260e08101516101808401520151906101a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828503019101526131a6565b73ffffffffffffffffffffffffffffffffffffffff60015416330361341157565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b3d15613466573d9061344c82612a1a565b9161345a60405193846129d9565b82523d6000602084013e565b606090565b600061350c819260405161347e816129a0565b613486612f89565b815283602082015260606040820152606080820152606060808201528360a08201528360c08201528360e082015260606101008201525073ffffffffffffffffffffffffffffffffffffffff60075416906040519485809481937f8a06fadb00000000000000000000000000000000000000000000000000000000835260048301613291565b03925af18091600091613569575b5090612e025761356561352b61343b565b6040519182917f828ebdfb000000000000000000000000000000000000000000000000000000008352602060048401526024830190612a77565b0390fd5b3d8083833e61357881836129d9565b81019060208183031261154c5780519067ffffffffffffffff8211610f26570191828203926101a08412610e585760a0604051946135b5866129a0565b12610e58576040516135c681612984565b815181526135d66020830161327c565b60208201526135e76040830161327c565b60408201526135f86060830161327c565b60608201526136096080830161327c565b6080820152845261361c60a08201612e44565b602085015260c081015167ffffffffffffffff811161154c5783613641918301613164565b604085015260e081015167ffffffffffffffff811161154c5783613666918301613164565b606085015261010081015167ffffffffffffffff811161154c578361368c918301613164565b608085015261369e6101208201612e44565b60a085015261014081015160c085015261016081015160e08501526101808101519067ffffffffffffffff821161154c570182601f82011215610e58578051916136e783612aeb565b936136f560405195866129d9565b83855260208086019460051b8401019281841161154c5760208101945b84861061372b575050505050506101008201523861351a565b855167ffffffffffffffff8111610f2a57820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08286030112610f2a576040519061377782612984565b61378360208201612e44565b8252604081015167ffffffffffffffff8111610f22578560206137a892840101613164565b6020830152606081015167ffffffffffffffff8111610f22578560206137d092840101613164565b60408301526080810151606083015260a08101519067ffffffffffffffff8211610f22579161380786602080969481960101613164565b6080820152815201950194613712565b805482101561302d5760005260206000200190600090565b60008281526001820160205260409020546138b9578054906801000000000000000082101561295557826138a261386d846001809601855584613817565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905580549260005201602052604060002055600190565b5050600090565b9060018201918160005282602052604060002054801515600014613a49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613a1a578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613a1a578181036139e3575b505050805480156139b4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906139758282613817565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613a036139f361386d9386613817565b90549060031b1c92839286613817565b90556000528360205260406000205538808061393d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50505050600090565b91929015613acd5750815115613a66575090565b3b15613a6f5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015613ae05750805190602001fd5b613565906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612a7756fea164736f6c634300081a000a", } var OnRampWithMessageTransformerABI = OnRampWithMessageTransformerMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go b/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go index 2f479d2968e..af27055a53f 100644 --- a/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go +++ b/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go @@ -60,7 +60,7 @@ type RMNHomeVersionedConfig struct { var RMNHomeMetaData = &bind.MetaData{ ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveDigest\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"activeConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"candidateConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCandidateDigest\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"versionedConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"ok\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfigDigests\",\"inputs\":[],\"outputs\":[{\"name\":\"activeConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"promoteCandidateAndRevokeActive\",\"inputs\":[{\"name\":\"digestToPromote\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestToRevoke\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeCandidate\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCandidate\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"digestToOverwrite\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"newConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"newDynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"currentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ActiveConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CandidateConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigPromoted\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"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\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"gotConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DigestNotFound\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DuplicateOffchainPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicatePeerId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateSourceChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoOpStateTransitionNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughObservers\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBoundsNodesLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBoundsObserverNodeIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RevokingZeroDigestNotAllowed\",\"inputs\":[]}]", - Bin: "0x60808060405234604d573315603c57600180546001600160a01b03191633179055600e80546001600160401b031916905561262690816100538239f35b639b15e16f60e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063118dbac514610904578063123e65db146108ae578063181f5a77146108315780633567e6b4146107b757806338354c5c1461077657806363507956146106985780636dd5b69d1461063b578063736be802146105b457806379ba5097146104cb5780638c76967f146103255780638da5cb5b146102d3578063f2fde38b146101e05763fb4022d4146100ab57600080fd5b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576004356100e56123b4565b80156101b15763ffffffff610105600163ffffffff600e5460201c161890565b1660028110159081610152576006600391020191825481810361018157507f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b600080a26101525760009055005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f0849d8cc0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043573ffffffffffffffffffffffffffffffffffffffff81168091036101db576102386123b4565b3381146102a957807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576004356024356103626123b4565b8115806104c3575b6104995763ffffffff610388600163ffffffff600e5460201c161890565b1660028110156101525760060260030154828103610467575063ffffffff600e5460201c166002811015610152576006026003018054828103610467575060009055600e547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff67ffffffff00000000600163ffffffff8460201c161860201b16911617600e558061043c575b507ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e600080a2005b7f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8600080a281610414565b90507f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f7b4d1e4f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50801561036a565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760005473ffffffffffffffffffffffffffffffffffffffff8116330361058a577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043567ffffffffffffffff81116101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101db576106399061062d6123b4565b60243590600401611f4a565b005b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5761068c610678600435611eea565b6040519283926040845260408401906116d2565b90151560208301520390f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576106cf611ca0565b6106d7611ca0565b9063ffffffff600e5460201c1660028110156101525760066106fc9102600201611d92565b602081015161076e575b50600e5460201c63ffffffff166001186002811015610152576107549261073560066107629302600201611d92565b6020810151610766575b506040519384936040855260408501906116d2565b9083820360208501526116d2565b0390f35b90508461073f565b905082610706565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760206107af611c65565b604051908152f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5763ffffffff600e5460201c1660028110156101525760060260030154600e5460201c63ffffffff16600118906002821015610152576003600660409302015482519182526020820152f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576107626040805190610872818361162b565b601182527f524d4e486f6d6520312e362e302d64657600000000000000000000000000000060208301525191829160208352602083019061168f565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5763ffffffff600e5460201c1660028110156101525760036006602092020154604051908152f35b346101db5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043567ffffffffffffffff81116101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101db5767ffffffffffffffff602435116101db57602435360360407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101db576109b96123b4565b6040516000916109c8826115a8565b67ffffffffffffffff8460040135116115a4578360040135840190366023830112156115a0576109fb600483013561180a565b610a08604051918261162b565b6004830135808252602082019060061b84016024013681116112ad5760248501915b81831061156f575050508352602485013567ffffffffffffffff811161156b57610a5a9060043691880101611822565b6020840152610a6e366024356004016118ac565b94610100845151116115435790919484955b845151871015610b765760018701808811610b49575b85518051821015610b3c5788610aab916123ff565b5151610ab88288516123ff565b515114610b14576020610acc8988516123ff565b5101516020610adc8389516123ff565b51015114610aec57600101610a96565b6004877fae00651d000000000000000000000000000000000000000000000000000000008152fd5b6004877f221a8ae8000000000000000000000000000000000000000000000000000000008152fd5b5050600190960195610a80565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b949390610b8591515190612413565b610b8d611c65565b6044358103611513576114e7575b600e549363ffffffff85169463ffffffff86146114ba5763ffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000095969701169384911617600e557dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610ccc610cfa6020830160208152610c5784610c2b604082018a600401611a26565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810186528561162b565b602060405191818301957f45564d000000000000000000000000000000000000000000000000000000000087524660408501523060608501528a608085015260808452610ca560a08561162b565b604051958694610cbd858701998a925192839161166c565b8501915180938584019061166c565b0101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261162b565b519020167e0b0000000000000000000000000000000000000000000000000000000000001793610d35600163ffffffff600e5460201c161890565b600281101561148d576006029182600201866003850155857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055600483017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd85360301856004013512156112a95767ffffffffffffffff6004830135116112a957600482013560061b360360248301136112a9576801000000000000000060048301351161127c578054600483013580835581116113ff575b508752602087208790602483015b600484013583106113db575050505060058201610e246024850185600401611ad9565b9067ffffffffffffffff82116113ae578190610e408454611b2a565b601f811161135e575b508990601f83116001146112bc578a926112b1575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b60068201907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd6024356004013591018112156112ad57602435019060048201359167ffffffffffffffff83116112a95760240160608302360381136112a95768010000000000000000831161127c5781548383558084106111ca575b509087526020872087915b838310611150575050505060070191610f396024803501602435600401611ad9565b67ffffffffffffffff819592951161112357610f558254611b2a565b601f81116110de575b5090859392918760209890601f831160011461101a57907ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf096978361100f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b611004610ff160405193849384526060898501526060840190600401611a26565b8281036040840152602435600401611b92565b0390a2604051908152f35b013590508980610f9e565b96907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083168489528a8920985b8181106110c45750917ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf097989184600195941061108c575b505050811b019055610fd0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905589808061107f565b828401358a556001909901988a9850918b01918b01611047565b82885260208820601f830160051c81019160208410611119575b601f0160051c01905b81811061110e5750610f5e565b888155600101611101565b90915081906110f8565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600260608267ffffffffffffffff611169600195611b7d565b168554907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff00000000000000006111ab60208601611b7d565b60401b1692161717855560408101358486015501920192019190610f17565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116810361124f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416840361124f57828952602089209060011b8101908460011b015b81811061123d5750610f0c565b808a600292558a600182015501611230565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8780fd5b8680fd5b013590508980610e5e565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01691848b5260208b20928b5b818110611346575090846001959493921061130e575b505050811b019055610e90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055898080611301565b919360206001819287870135815501950192016112eb565b909150838a5260208a20601f840160051c810191602085106113a4575b90601f859493920160051c01905b8181106113965750610e49565b8b8155849350600101611389565b909150819061137b565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60016002604083600494358655602081013584870155019301930192919050610e01565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116810361124f5760048301357f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116900361124f57818952602089209060011b810190600484013560011b015b81811061147b5750610df3565b6002908a81558a60018201550161146e565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6044357f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b8480a2610b9b565b7f93df584c0000000000000000000000000000000000000000000000000000000084526004526044803560245283fd5b6004857faf26d5e3000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b6040833603126112a95760206040918251611589816115a8565b853581528286013583820152815201920191610a2a565b8380fd5b8280fd5b6040810190811067ffffffffffffffff8211176115c457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176115c457604052565b6080810190811067ffffffffffffffff8211176115c457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176115c457604052565b60005b83811061167f5750506000910152565b818101518382015260200161166f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936116cb8151809281875287808801910161166c565b0116010190565b91909163ffffffff81511683526020810151602084015260408101516080604085015260c0840190805191604060808701528251809152602060e0870193019060005b8181106117e85750505060609160206117599201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808783030160a088015261168f565b910151926060818303910152604081019083519160408252825180915260206060830193019060005b8181106117a65750505060206117a39394015190602081840391015261168f565b90565b909193602060606001926040885167ffffffffffffffff815116835267ffffffffffffffff858201511685840152015160408201520195019101919091611782565b8251805186526020908101518187015260409095019490920191600101611715565b67ffffffffffffffff81116115c45760051b60200190565b81601f820112156101db5780359067ffffffffffffffff82116115c45760405192611875601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018561162b565b828452602083830101116101db57816000926020809301838601378301015290565b359067ffffffffffffffff821682036101db57565b91906040838203126101db57604051906118c5826115a8565b8193803567ffffffffffffffff81116101db57810182601f820112156101db5780356118f08161180a565b916118fe604051938461162b565b818352602060608185019302820101908582116101db57602001915b81831061194d57505050835260208101359167ffffffffffffffff83116101db576020926119489201611822565b910152565b6060838703126101db576020606091604051611968816115f3565b61197186611897565b815261197e838701611897565b838201526040860135604082015281520192019161191a565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156101db57016020813591019167ffffffffffffffff82116101db5781360383136101db57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9190604081019083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156101db5784016020813591019267ffffffffffffffff82116101db578160061b360384136101db578190604084525260608201929060005b818110611ab957505050611aab8460206117a395960190611997565b9160208185039101526119e7565b823585526020808401359086015260409485019490920191600101611a8f565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101db570180359067ffffffffffffffff82116101db576020019181360383136101db57565b90600182811c92168015611b73575b6020831014611b4457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611b39565b3567ffffffffffffffff811681036101db5790565b9190604081019083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156101db5784016020813591019267ffffffffffffffff82116101db5760608202360384136101db578190604084525260608201929060005b818110611c1757505050611aab8460206117a395960190611997565b90919360608060019267ffffffffffffffff611c3289611897565b16815267ffffffffffffffff611c4a60208a01611897565b16602082015260408881013590820152019501929101611bfb565b600e5460201c63ffffffff166001186002811015610152576006026003015490565b60405190611c94826115a8565b60606020838281520152565b60405190611cad8261160f565b816000815260006020820152611cc1611c87565b60408201526060611948611c87565b9060405191826000825492611ce484611b2a565b8084529360018116908115611d525750600114611d0b575b50611d099250038361162b565b565b90506000929192526020600020906000915b818310611d36575050906020611d099282010138611cfc565b6020919350806001915483858901015201910190918492611d1d565b60209350611d099592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611cfc565b9060405191611da08361160f565b8263ffffffff8254168152600182015460208201526002820160405190611dc6826115a8565b8054611dd18161180a565b91611ddf604051938461162b565b818352602083019060005260206000206000915b838310611ebd57505050508152611e0c60038401611cd0565b60208201526040820152600482019160405192611e28846115a8565b8054611e338161180a565b91611e41604051938461162b565b818352602083019060005260206000206000915b838310611e7b5750505050600560609392611e7292865201611cd0565b60208401520152565b60026020600192604051611e8e816115f3565b67ffffffffffffffff8654818116835260401c1683820152848601546040820152815201920192019190611e55565b60026020600192604051611ed0816115a8565b855481528486015483820152815201920192019190611df3565b611ef2611ca0565b9060005b6002811015611f4257600060068202908360038301541480611f39575b611f21575050600101611ef6565b91509150611f33925050600201611d92565b90600190565b50831515611f13565b505090600090565b9060005b60028110156123865760006006820290836003830154148061237d575b611f79575050600101611f4e565b90915092919250611f976004820154611f9236856118ac565b612413565b6000906006810183357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156115a05784019081359167ffffffffffffffff831161156b57602001606083023603811361156b5768010000000000000000831161235057815483835580841061229e575b509084526020842084915b8383106122245750505050600701906120346020840184611ad9565b919067ffffffffffffffff83116121f75761204f8454611b2a565b601f81116121b2575b5081601f84116001146120ec57926120dc949281927f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e62949795926120e1575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b604051918291602083526020830190611b92565b0390a2565b013590503880612096565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841685845260208420935b81811061219a57509260019285927f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e629498966120dc989610612162575b505050811b0190556120c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080612155565b91936020600181928787013581550195019201612119565b84835260208320601f850160051c810191602086106121ed575b601f0160051c01905b8181106121e25750612058565b8381556001016121d5565b90915081906121cc565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600260608267ffffffffffffffff61223d600195611b7d565b168554907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff000000000000000061227f60208601611b7d565b60401b1692161717855560408101358486015501920192019190612018565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103612323577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416840361232357828652602086209060011b8101908460011b015b818110612311575061200d565b80876002925587600182015501612304565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50831515611f6b565b507fd0b2c0310000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff6001541633036123d557565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b80518210156101525760209160051b010190565b908151519160005b8381106124285750505050565b6124338183516123ff565b5160018201808311612508575b8581106125bf575060408101519084610100036101008111612508577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83911c81160361259557816000925b61253757506020015160011b6801fffffffffffffffe67fffffffffffffffe8216911681036125085760010167ffffffffffffffff81116125085767ffffffffffffffff16116124de5760010161241b565b7fa804bcb30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908082116125085716917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461250857600101918061248c565b7f2847b6060000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff82511667ffffffffffffffff6125df8387516123ff565b515116146125ef57600101612440565b7f3857f84d0000000000000000000000000000000000000000000000000000000060005260046000fdfea164736f6c634300081a000a", + Bin: "0x60808060405234604d573315603c57600180546001600160a01b03191633179055600e80546001600160401b031916905561262690816100538239f35b639b15e16f60e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063118dbac514610904578063123e65db146108ae578063181f5a77146108315780633567e6b4146107b757806338354c5c1461077657806363507956146106985780636dd5b69d1461063b578063736be802146105b457806379ba5097146104cb5780638c76967f146103255780638da5cb5b146102d3578063f2fde38b146101e05763fb4022d4146100ab57600080fd5b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576004356100e56123b4565b80156101b15763ffffffff610105600163ffffffff600e5460201c161890565b1660028110159081610152576006600391020191825481810361018157507f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b600080a26101525760009055005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f0849d8cc0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043573ffffffffffffffffffffffffffffffffffffffff81168091036101db576102386123b4565b3381146102a957807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576004356024356103626123b4565b8115806104c3575b6104995763ffffffff610388600163ffffffff600e5460201c161890565b1660028110156101525760060260030154828103610467575063ffffffff600e5460201c166002811015610152576006026003018054828103610467575060009055600e547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff67ffffffff00000000600163ffffffff8460201c161860201b16911617600e558061043c575b507ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e600080a2005b7f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8600080a281610414565b90507f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f7b4d1e4f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50801561036a565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760005473ffffffffffffffffffffffffffffffffffffffff8116330361058a577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043567ffffffffffffffff81116101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101db576106399061062d6123b4565b60243590600401611f4a565b005b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5761068c610678600435611eea565b6040519283926040845260408401906116d2565b90151560208301520390f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576106cf611ca0565b6106d7611ca0565b9063ffffffff600e5460201c1660028110156101525760066106fc9102600201611d92565b602081015161076e575b50600e5460201c63ffffffff166001186002811015610152576107549261073560066107629302600201611d92565b6020810151610766575b506040519384936040855260408501906116d2565b9083820360208501526116d2565b0390f35b90508461073f565b905082610706565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760206107af611c65565b604051908152f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5763ffffffff600e5460201c1660028110156101525760060260030154600e5460201c63ffffffff16600118906002821015610152576003600660409302015482519182526020820152f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576107626040805190610872818361162b565b600d82527f524d4e486f6d6520312e362e300000000000000000000000000000000000000060208301525191829160208352602083019061168f565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5763ffffffff600e5460201c1660028110156101525760036006602092020154604051908152f35b346101db5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043567ffffffffffffffff81116101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101db5767ffffffffffffffff602435116101db57602435360360407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101db576109b96123b4565b6040516000916109c8826115a8565b67ffffffffffffffff8460040135116115a4578360040135840190366023830112156115a0576109fb600483013561180a565b610a08604051918261162b565b6004830135808252602082019060061b84016024013681116112ad5760248501915b81831061156f575050508352602485013567ffffffffffffffff811161156b57610a5a9060043691880101611822565b6020840152610a6e366024356004016118ac565b94610100845151116115435790919484955b845151871015610b765760018701808811610b49575b85518051821015610b3c5788610aab916123ff565b5151610ab88288516123ff565b515114610b14576020610acc8988516123ff565b5101516020610adc8389516123ff565b51015114610aec57600101610a96565b6004877fae00651d000000000000000000000000000000000000000000000000000000008152fd5b6004877f221a8ae8000000000000000000000000000000000000000000000000000000008152fd5b5050600190960195610a80565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b949390610b8591515190612413565b610b8d611c65565b6044358103611513576114e7575b600e549363ffffffff85169463ffffffff86146114ba5763ffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000095969701169384911617600e557dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610ccc610cfa6020830160208152610c5784610c2b604082018a600401611a26565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810186528561162b565b602060405191818301957f45564d000000000000000000000000000000000000000000000000000000000087524660408501523060608501528a608085015260808452610ca560a08561162b565b604051958694610cbd858701998a925192839161166c565b8501915180938584019061166c565b0101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261162b565b519020167e0b0000000000000000000000000000000000000000000000000000000000001793610d35600163ffffffff600e5460201c161890565b600281101561148d576006029182600201866003850155857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055600483017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd85360301856004013512156112a95767ffffffffffffffff6004830135116112a957600482013560061b360360248301136112a9576801000000000000000060048301351161127c578054600483013580835581116113ff575b508752602087208790602483015b600484013583106113db575050505060058201610e246024850185600401611ad9565b9067ffffffffffffffff82116113ae578190610e408454611b2a565b601f811161135e575b508990601f83116001146112bc578a926112b1575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b60068201907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd6024356004013591018112156112ad57602435019060048201359167ffffffffffffffff83116112a95760240160608302360381136112a95768010000000000000000831161127c5781548383558084106111ca575b509087526020872087915b838310611150575050505060070191610f396024803501602435600401611ad9565b67ffffffffffffffff819592951161112357610f558254611b2a565b601f81116110de575b5090859392918760209890601f831160011461101a57907ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf096978361100f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b611004610ff160405193849384526060898501526060840190600401611a26565b8281036040840152602435600401611b92565b0390a2604051908152f35b013590508980610f9e565b96907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083168489528a8920985b8181106110c45750917ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf097989184600195941061108c575b505050811b019055610fd0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905589808061107f565b828401358a556001909901988a9850918b01918b01611047565b82885260208820601f830160051c81019160208410611119575b601f0160051c01905b81811061110e5750610f5e565b888155600101611101565b90915081906110f8565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600260608267ffffffffffffffff611169600195611b7d565b168554907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff00000000000000006111ab60208601611b7d565b60401b1692161717855560408101358486015501920192019190610f17565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116810361124f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416840361124f57828952602089209060011b8101908460011b015b81811061123d5750610f0c565b808a600292558a600182015501611230565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8780fd5b8680fd5b013590508980610e5e565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01691848b5260208b20928b5b818110611346575090846001959493921061130e575b505050811b019055610e90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055898080611301565b919360206001819287870135815501950192016112eb565b909150838a5260208a20601f840160051c810191602085106113a4575b90601f859493920160051c01905b8181106113965750610e49565b8b8155849350600101611389565b909150819061137b565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60016002604083600494358655602081013584870155019301930192919050610e01565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116810361124f5760048301357f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116900361124f57818952602089209060011b810190600484013560011b015b81811061147b5750610df3565b6002908a81558a60018201550161146e565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6044357f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b8480a2610b9b565b7f93df584c0000000000000000000000000000000000000000000000000000000084526004526044803560245283fd5b6004857faf26d5e3000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b6040833603126112a95760206040918251611589816115a8565b853581528286013583820152815201920191610a2a565b8380fd5b8280fd5b6040810190811067ffffffffffffffff8211176115c457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176115c457604052565b6080810190811067ffffffffffffffff8211176115c457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176115c457604052565b60005b83811061167f5750506000910152565b818101518382015260200161166f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936116cb8151809281875287808801910161166c565b0116010190565b91909163ffffffff81511683526020810151602084015260408101516080604085015260c0840190805191604060808701528251809152602060e0870193019060005b8181106117e85750505060609160206117599201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808783030160a088015261168f565b910151926060818303910152604081019083519160408252825180915260206060830193019060005b8181106117a65750505060206117a39394015190602081840391015261168f565b90565b909193602060606001926040885167ffffffffffffffff815116835267ffffffffffffffff858201511685840152015160408201520195019101919091611782565b8251805186526020908101518187015260409095019490920191600101611715565b67ffffffffffffffff81116115c45760051b60200190565b81601f820112156101db5780359067ffffffffffffffff82116115c45760405192611875601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018561162b565b828452602083830101116101db57816000926020809301838601378301015290565b359067ffffffffffffffff821682036101db57565b91906040838203126101db57604051906118c5826115a8565b8193803567ffffffffffffffff81116101db57810182601f820112156101db5780356118f08161180a565b916118fe604051938461162b565b818352602060608185019302820101908582116101db57602001915b81831061194d57505050835260208101359167ffffffffffffffff83116101db576020926119489201611822565b910152565b6060838703126101db576020606091604051611968816115f3565b61197186611897565b815261197e838701611897565b838201526040860135604082015281520192019161191a565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156101db57016020813591019167ffffffffffffffff82116101db5781360383136101db57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9190604081019083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156101db5784016020813591019267ffffffffffffffff82116101db578160061b360384136101db578190604084525260608201929060005b818110611ab957505050611aab8460206117a395960190611997565b9160208185039101526119e7565b823585526020808401359086015260409485019490920191600101611a8f565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101db570180359067ffffffffffffffff82116101db576020019181360383136101db57565b90600182811c92168015611b73575b6020831014611b4457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611b39565b3567ffffffffffffffff811681036101db5790565b9190604081019083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156101db5784016020813591019267ffffffffffffffff82116101db5760608202360384136101db578190604084525260608201929060005b818110611c1757505050611aab8460206117a395960190611997565b90919360608060019267ffffffffffffffff611c3289611897565b16815267ffffffffffffffff611c4a60208a01611897565b16602082015260408881013590820152019501929101611bfb565b600e5460201c63ffffffff166001186002811015610152576006026003015490565b60405190611c94826115a8565b60606020838281520152565b60405190611cad8261160f565b816000815260006020820152611cc1611c87565b60408201526060611948611c87565b9060405191826000825492611ce484611b2a565b8084529360018116908115611d525750600114611d0b575b50611d099250038361162b565b565b90506000929192526020600020906000915b818310611d36575050906020611d099282010138611cfc565b6020919350806001915483858901015201910190918492611d1d565b60209350611d099592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611cfc565b9060405191611da08361160f565b8263ffffffff8254168152600182015460208201526002820160405190611dc6826115a8565b8054611dd18161180a565b91611ddf604051938461162b565b818352602083019060005260206000206000915b838310611ebd57505050508152611e0c60038401611cd0565b60208201526040820152600482019160405192611e28846115a8565b8054611e338161180a565b91611e41604051938461162b565b818352602083019060005260206000206000915b838310611e7b5750505050600560609392611e7292865201611cd0565b60208401520152565b60026020600192604051611e8e816115f3565b67ffffffffffffffff8654818116835260401c1683820152848601546040820152815201920192019190611e55565b60026020600192604051611ed0816115a8565b855481528486015483820152815201920192019190611df3565b611ef2611ca0565b9060005b6002811015611f4257600060068202908360038301541480611f39575b611f21575050600101611ef6565b91509150611f33925050600201611d92565b90600190565b50831515611f13565b505090600090565b9060005b60028110156123865760006006820290836003830154148061237d575b611f79575050600101611f4e565b90915092919250611f976004820154611f9236856118ac565b612413565b6000906006810183357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156115a05784019081359167ffffffffffffffff831161156b57602001606083023603811361156b5768010000000000000000831161235057815483835580841061229e575b509084526020842084915b8383106122245750505050600701906120346020840184611ad9565b919067ffffffffffffffff83116121f75761204f8454611b2a565b601f81116121b2575b5081601f84116001146120ec57926120dc949281927f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e62949795926120e1575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b604051918291602083526020830190611b92565b0390a2565b013590503880612096565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841685845260208420935b81811061219a57509260019285927f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e629498966120dc989610612162575b505050811b0190556120c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080612155565b91936020600181928787013581550195019201612119565b84835260208320601f850160051c810191602086106121ed575b601f0160051c01905b8181106121e25750612058565b8381556001016121d5565b90915081906121cc565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600260608267ffffffffffffffff61223d600195611b7d565b168554907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff000000000000000061227f60208601611b7d565b60401b1692161717855560408101358486015501920192019190612018565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103612323577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416840361232357828652602086209060011b8101908460011b015b818110612311575061200d565b80876002925587600182015501612304565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50831515611f6b565b507fd0b2c0310000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff6001541633036123d557565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b80518210156101525760209160051b010190565b908151519160005b8381106124285750505050565b6124338183516123ff565b5160018201808311612508575b8581106125bf575060408101519084610100036101008111612508577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83911c81160361259557816000925b61253757506020015160011b6801fffffffffffffffe67fffffffffffffffe8216911681036125085760010167ffffffffffffffff81116125085767ffffffffffffffff16116124de5760010161241b565b7fa804bcb30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908082116125085716917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461250857600101918061248c565b7f2847b6060000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff82511667ffffffffffffffff6125df8387516123ff565b515116146125ef57600101612440565b7f3857f84d0000000000000000000000000000000000000000000000000000000060005260046000fdfea164736f6c634300081a000a", } var RMNHomeABI = RMNHomeMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go b/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go index 301f508b3b6..e48d47ad1c8 100644 --- a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go +++ b/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go @@ -61,7 +61,7 @@ type RMNRemoteSigner struct { var RMNRemoteMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"localChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"legacyRMN\",\"type\":\"address\",\"internalType\":\"contractIRMN\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"curse\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"curse\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCursedSubjects\",\"inputs\":[],\"outputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLocalChainSelector\",\"inputs\":[],\"outputs\":[{\"name\":\"localChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReportDigestHeader\",\"inputs\":[],\"outputs\":[{\"name\":\"digestHeader\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getVersionedConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"fSign\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isBlessed\",\"inputs\":[{\"name\":\"taggedRoot\",\"type\":\"tuple\",\"internalType\":\"structIRMN.TaggedRoot\",\"components\":[{\"name\":\"commitStore\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isCursed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setConfig\",\"inputs\":[{\"name\":\"newConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"fSign\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"uncurse\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"uncurse\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verify\",\"inputs\":[{\"name\":\"offRampAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"signatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"fSign\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Cursed\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"indexed\":false,\"internalType\":\"bytes16[]\"}],\"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\":\"Uncursed\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"indexed\":false,\"internalType\":\"bytes16[]\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateOnchainPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignerOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IsBlessedNotAvailable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}]},{\"type\":\"error\",\"name\":\"NotEnoughSigners\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfOrderSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThresholdNotMet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroValueNotAllowed\",\"inputs\":[]}]", - Bin: "0x60c0346100d357601f6121f938819003918201601f19168301916001600160401b038311848410176100d85780849260409485528339810103126100d35780516001600160401b038116918282036100d35760200151916001600160a01b03831683036100d35733156100c257600180546001600160a01b03191633179055156100b15760805260a05260405161210a90816100ef82396080518181816102fe0152610712015260a05181610f7d0152f35b63273e150360e21b60005260046000fd5b639b15e16f60e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063181f5a77146119ce578063198f0f77146112df5780631add205f146111145780632cbc26bb146110d3578063397796f7146110905780634d61677114610f3557806362eed41514610e155780636509a95414610dbc5780636d2d399314610c9c57806370a9089e146105f057806379ba5097146105075780638da5cb5b146104b55780639a19b329146103c7578063d881e09214610322578063eaa83ddd146102bf578063f2fde38b146101cf5763f8bb876e146100d757600080fd5b346101ca576100e536611b71565b6100ed611ec2565b60005b81518110156101955761012e7fffffffffffffffffffffffffffffffff000000000000000000000000000000006101278385611eae565b51166120a3565b1561013b576001016100f0565b610166907fffffffffffffffffffffffffffffffff0000000000000000000000000000000092611eae565b51167f19d5c79b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040517f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7490806101c58582611c38565b0390a1005b600080fd5b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5773ffffffffffffffffffffffffffffffffffffffff61021b611b36565b610223611ec2565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760405180602060065491828152019060066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9060005b8181106103b1576103ad856103a181870382611a67565b60405191829182611c38565b0390f35b825484526020909301926001928301920161038a565b346101ca576103d536611b71565b6103dd611ec2565b60005b81518110156104855761041e7fffffffffffffffffffffffffffffffff000000000000000000000000000000006104178385611eae565b5116611f0d565b1561042b576001016103e0565b610456907fffffffffffffffffffffffffffffffff0000000000000000000000000000000092611eae565b51167f73281fa10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040517f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba190806101c58582611c38565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760005473ffffffffffffffffffffffffffffffffffffffff811633036105c6577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610627611b36565b67ffffffffffffffff602435116101ca573660236024350112156101ca57602435600401359067ffffffffffffffff82116101ca573660248360051b81350101116101ca576044359067ffffffffffffffff82116101ca57366023830112156101ca5767ffffffffffffffff8260040135116101ca57366024836004013560061b840101116101ca5763ffffffff6005541615610c725767ffffffffffffffff6106d48160045416611d3c565b16826004013510610c485760025460405160c0810181811067ffffffffffffffff821117610c1957604052468152602081019267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168452604082019230845273ffffffffffffffffffffffffffffffffffffffff60608401921682526080830190815261076987611b59565b916107776040519384611a67565b8783526000976024803501602085015b60248360051b813501018210610a61575050509073ffffffffffffffffffffffffffffffffffffffff8095939260a0860193845260405196879567ffffffffffffffff602088019a7f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538c526040808a01526101208901995160608a015251166080880152511660a0860152511660c08401525160e08301525160c0610100830152805180935261014082019260206101408260051b85010192019388905b8282106109c8575050506108809250037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611a67565b5190208290815b83600401358310610896578480f35b60208560806108ad86886004013560248a01611ce8565b35836108c1888a6004013560248c01611ce8565b013560405191878352601b868401526040830152606082015282805260015afa156109bd5784519073ffffffffffffffffffffffffffffffffffffffff82169081156109955773ffffffffffffffffffffffffffffffffffffffff829116101561096d578552600860205260ff604086205416156109455760019290920191610887565b6004857faaaa9141000000000000000000000000000000000000000000000000000000008152fd5b6004867fbbe15e7f000000000000000000000000000000000000000000000000000000008152fd5b6004877f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d86823e3d90fd5b91936020847ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec08293600195970301855287519067ffffffffffffffff8251168152608080610a238585015160a08786015260a0850190611aa8565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff606082015116606085015201519101529601920192018593919492610845565b81359067ffffffffffffffff8211610c155760a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc836024350136030112610c15576040519060a0820182811067ffffffffffffffff821117610be457604052610ad060248481350101611d95565b82526044836024350101359167ffffffffffffffff8311610c115736604360243586018501011215610c115767ffffffffffffffff6024848682350101013511610be457908d9160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6024878982350101013501160193610b576040519586611a67565b60248035870182019081013580875236910160440111610be057602495602095869560a49387908a90813586018101808301359060440186850137858235010101358301015285840152610bb060648289350101611d95565b6040840152610bc460848289350101611d95565b6060840152863501013560808201528152019201919050610787565b8380fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8d80fd5b8b80fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f59fa4a930000000000000000000000000000000000000000000000000000000060005260046000fd5b7face124bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610cd3611b07565b604090815190610ce38383611a67565b600182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083013660208401377fffffffffffffffffffffffffffffffff00000000000000000000000000000000610d3a83611ea1565b91169052610d46611ec2565b60005b8151811015610d8d57610d807fffffffffffffffffffffffffffffffff000000000000000000000000000000006104178385611eae565b1561042b57600101610d49565b82517f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba190806101c58582611c38565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206040517f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538152f35b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610e4c611b07565b604090815190610e5c8383611a67565b600182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083013660208401377fffffffffffffffffffffffffffffffff00000000000000000000000000000000610eb383611ea1565b91169052610ebf611ec2565b60005b8151811015610f0657610ef97fffffffffffffffffffffffffffffffff000000000000000000000000000000006101278385611eae565b1561013b57600101610ec2565b82517f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7490806101c58582611c38565b346101ca5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611068576020604491604051928380927f4d61677100000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff610fef611b36565b16600483015260243560248301525afa90811561105d57829161101a575b6020826040519015158152f35b90506020813d602011611055575b8161103560209383611a67565b810103126110515751801515810361105157602091508261100d565b5080fd5b3d9150611028565b6040513d84823e3d90fd5b6004827f0a7c4edd000000000000000000000000000000000000000000000000000000008152fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206110c9611e44565b6040519015158152f35b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206110c961110f611b07565b611daa565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760006040805161115281611a4b565b82815260606020820152015263ffffffff600554166040519061117482611a4b565b60025482526003549161118683611b59565b926111946040519485611a67565b808452600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9190602086015b82821061128057505050506020810192835267ffffffffffffffff6004541692604082019384526040519283526040602084015260a083019151604084015251906060808401528151809152602060c0840192019060005b81811061123e5750505067ffffffffffffffff8293511660808301520390f35b8251805173ffffffffffffffffffffffffffffffffffffffff16855260209081015167ffffffffffffffff16818601526040909401939092019160010161121e565b6040516040810181811067ffffffffffffffff821117610c1957600192839260209260405267ffffffffffffffff885473ffffffffffffffffffffffffffffffffffffffff8116835260a01c16838201528152019401910190926111c6565b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760043567ffffffffffffffff81116101ca57806004018136039160607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8401126101ca5761135a611ec2565b81359081156119a457909260248201919060015b6113788486611c94565b90508110156114595761138b8486611c94565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83019183831161142a576113cc926020926113c692611ce8565b01611d27565b67ffffffffffffffff806113ef60206113c6866113e98b8d611c94565b90611ce8565b16911610156114005760010161136e565b7f448515170000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b508390856114678584611c94565b60448601915061147682611d27565b60011b6801fffffffffffffffe67fffffffffffffffe82169116810361142a576114a867ffffffffffffffff91611d3c565b161161197a57600354805b611877575060005b6114c58786611c94565b905081101561159e5773ffffffffffffffffffffffffffffffffffffffff6114f96114f4836113e98b8a611c94565b611d74565b16600052600860205260ff60406000205416611574578073ffffffffffffffffffffffffffffffffffffffff6115386114f46001946113e98c8b611c94565b1660005260086020526040600020827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055016114bb565b7f28cae27d0000000000000000000000000000000000000000000000000000000060005260046000fd5b50846115b08780959685600255611c94565b90680100000000000000008211610c195760035482600355808310611831575b50600360005260206000206000915b838310611783575050505067ffffffffffffffff6115fc83611d27565b167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060045416176004556005549463ffffffff86169563ffffffff871461142a5763ffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000098011696879116176005557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd6040519560208752608087019560208801523591018112156101ca57016024600482013591019267ffffffffffffffff82116101ca578160061b360384136101ca578190606060408701525260a0840192906000905b80821061173057867f7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c87808867ffffffffffffffff6117258a611d95565b1660608301520390a2005b90919384359073ffffffffffffffffffffffffffffffffffffffff82168092036101ca5760408160019382935267ffffffffffffffff61177260208a01611d95565b1660208201520195019201906116e7565b600160408273ffffffffffffffffffffffffffffffffffffffff6117a78495611d74565b167fffffffffffffffffffffffff00000000000000000000000000000000000000008654161785556117db60208201611d27565b7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff000000000000000000000000000000000000000087549260a01b169116178555019201920191906115df565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9081019083015b81811061186b57506115d0565b6000815560010161185e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161142a57600090600354111561194d57600390527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85a81015473ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055801561142a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01806114b3565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b7f014c50200000000000000000000000000000000000000000000000000000000060005260046000fd5b7f9cf8540c0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca576103ad6040805190611a0f8183611a67565b601382527f524d4e52656d6f746520312e362e302d64657600000000000000000000000000602083015251918291602083526020830190611aa8565b6060810190811067ffffffffffffffff821117610c1957604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610c1957604052565b919082519283825260005b848110611af25750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611ab3565b600435907fffffffffffffffffffffffffffffffff00000000000000000000000000000000821682036101ca57565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101ca57565b67ffffffffffffffff8111610c195760051b60200190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101ca576004359067ffffffffffffffff82116101ca57806023830112156101ca57816004013590611bc882611b59565b92611bd66040519485611a67565b8284526024602085019360051b8201019182116101ca57602401915b818310611bff5750505090565b82357fffffffffffffffffffffffffffffffff00000000000000000000000000000000811681036101ca57815260209283019201611bf2565b602060408183019282815284518094520192019060005b818110611c5c5750505090565b82517fffffffffffffffffffffffffffffffff0000000000000000000000000000000016845260209384019390920191600101611c4f565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101ca570180359067ffffffffffffffff82116101ca57602001918160061b360383136101ca57565b9190811015611cf85760061b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff811681036101ca5790565b67ffffffffffffffff60019116019067ffffffffffffffff821161142a57565b8054821015611cf85760005260206000200190600090565b3573ffffffffffffffffffffffffffffffffffffffff811681036101ca5790565b359067ffffffffffffffff821682036101ca57565b60065415611e3e577fffffffffffffffffffffffffffffffff0000000000000000000000000000000016600052600760205260406000205415801590611ded5790565b507f010000000000000000000000000000010000000000000000000000000000000060005260076020527f70b766b11586b6b505ed3893938b0cc6c6c98bd6f65e969ac311168d34e4f9e254151590565b50600090565b60065415611e9c577f010000000000000000000000000000010000000000000000000000000000000060005260076020527f70b766b11586b6b505ed3893938b0cc6c6c98bd6f65e969ac311168d34e4f9e254151590565b600090565b805115611cf85760200190565b8051821015611cf85760209160051b010190565b73ffffffffffffffffffffffffffffffffffffffff600154163303611ee357565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b600081815260076020526040902054801561209c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161142a57600654907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161142a5781810361202d575b5050506006548015611ffe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611fbb816006611d5c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600655600052600760205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61208461203e61204f936006611d5c565b90549060031b1c9283926006611d5c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526007602052604060002055388080611f82565b5050600090565b80600052600760205260406000205415600014611e3e5760065468010000000000000000811015610c19576120e461204f8260018594016006556006611d5c565b905560065490600052600760205260406000205560019056fea164736f6c634300081a000a", + Bin: "0x60c0346100d357601f6121f938819003918201601f19168301916001600160401b038311848410176100d85780849260409485528339810103126100d35780516001600160401b038116918282036100d35760200151916001600160a01b03831683036100d35733156100c257600180546001600160a01b03191633179055156100b15760805260a05260405161210a90816100ef82396080518181816102fe0152610712015260a05181610f7d0152f35b63273e150360e21b60005260046000fd5b639b15e16f60e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063181f5a77146119ce578063198f0f77146112df5780631add205f146111145780632cbc26bb146110d3578063397796f7146110905780634d61677114610f3557806362eed41514610e155780636509a95414610dbc5780636d2d399314610c9c57806370a9089e146105f057806379ba5097146105075780638da5cb5b146104b55780639a19b329146103c7578063d881e09214610322578063eaa83ddd146102bf578063f2fde38b146101cf5763f8bb876e146100d757600080fd5b346101ca576100e536611b71565b6100ed611ec2565b60005b81518110156101955761012e7fffffffffffffffffffffffffffffffff000000000000000000000000000000006101278385611eae565b51166120a3565b1561013b576001016100f0565b610166907fffffffffffffffffffffffffffffffff0000000000000000000000000000000092611eae565b51167f19d5c79b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040517f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7490806101c58582611c38565b0390a1005b600080fd5b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5773ffffffffffffffffffffffffffffffffffffffff61021b611b36565b610223611ec2565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760405180602060065491828152019060066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9060005b8181106103b1576103ad856103a181870382611a67565b60405191829182611c38565b0390f35b825484526020909301926001928301920161038a565b346101ca576103d536611b71565b6103dd611ec2565b60005b81518110156104855761041e7fffffffffffffffffffffffffffffffff000000000000000000000000000000006104178385611eae565b5116611f0d565b1561042b576001016103e0565b610456907fffffffffffffffffffffffffffffffff0000000000000000000000000000000092611eae565b51167f73281fa10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040517f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba190806101c58582611c38565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760005473ffffffffffffffffffffffffffffffffffffffff811633036105c6577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610627611b36565b67ffffffffffffffff602435116101ca573660236024350112156101ca57602435600401359067ffffffffffffffff82116101ca573660248360051b81350101116101ca576044359067ffffffffffffffff82116101ca57366023830112156101ca5767ffffffffffffffff8260040135116101ca57366024836004013560061b840101116101ca5763ffffffff6005541615610c725767ffffffffffffffff6106d48160045416611d3c565b16826004013510610c485760025460405160c0810181811067ffffffffffffffff821117610c1957604052468152602081019267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168452604082019230845273ffffffffffffffffffffffffffffffffffffffff60608401921682526080830190815261076987611b59565b916107776040519384611a67565b8783526000976024803501602085015b60248360051b813501018210610a61575050509073ffffffffffffffffffffffffffffffffffffffff8095939260a0860193845260405196879567ffffffffffffffff602088019a7f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538c526040808a01526101208901995160608a015251166080880152511660a0860152511660c08401525160e08301525160c0610100830152805180935261014082019260206101408260051b85010192019388905b8282106109c8575050506108809250037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611a67565b5190208290815b83600401358310610896578480f35b60208560806108ad86886004013560248a01611ce8565b35836108c1888a6004013560248c01611ce8565b013560405191878352601b868401526040830152606082015282805260015afa156109bd5784519073ffffffffffffffffffffffffffffffffffffffff82169081156109955773ffffffffffffffffffffffffffffffffffffffff829116101561096d578552600860205260ff604086205416156109455760019290920191610887565b6004857faaaa9141000000000000000000000000000000000000000000000000000000008152fd5b6004867fbbe15e7f000000000000000000000000000000000000000000000000000000008152fd5b6004877f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d86823e3d90fd5b91936020847ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec08293600195970301855287519067ffffffffffffffff8251168152608080610a238585015160a08786015260a0850190611aa8565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff606082015116606085015201519101529601920192018593919492610845565b81359067ffffffffffffffff8211610c155760a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc836024350136030112610c15576040519060a0820182811067ffffffffffffffff821117610be457604052610ad060248481350101611d95565b82526044836024350101359167ffffffffffffffff8311610c115736604360243586018501011215610c115767ffffffffffffffff6024848682350101013511610be457908d9160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6024878982350101013501160193610b576040519586611a67565b60248035870182019081013580875236910160440111610be057602495602095869560a49387908a90813586018101808301359060440186850137858235010101358301015285840152610bb060648289350101611d95565b6040840152610bc460848289350101611d95565b6060840152863501013560808201528152019201919050610787565b8380fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8d80fd5b8b80fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f59fa4a930000000000000000000000000000000000000000000000000000000060005260046000fd5b7face124bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610cd3611b07565b604090815190610ce38383611a67565b600182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083013660208401377fffffffffffffffffffffffffffffffff00000000000000000000000000000000610d3a83611ea1565b91169052610d46611ec2565b60005b8151811015610d8d57610d807fffffffffffffffffffffffffffffffff000000000000000000000000000000006104178385611eae565b1561042b57600101610d49565b82517f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba190806101c58582611c38565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206040517f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538152f35b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610e4c611b07565b604090815190610e5c8383611a67565b600182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083013660208401377fffffffffffffffffffffffffffffffff00000000000000000000000000000000610eb383611ea1565b91169052610ebf611ec2565b60005b8151811015610f0657610ef97fffffffffffffffffffffffffffffffff000000000000000000000000000000006101278385611eae565b1561013b57600101610ec2565b82517f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7490806101c58582611c38565b346101ca5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611068576020604491604051928380927f4d61677100000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff610fef611b36565b16600483015260243560248301525afa90811561105d57829161101a575b6020826040519015158152f35b90506020813d602011611055575b8161103560209383611a67565b810103126110515751801515810361105157602091508261100d565b5080fd5b3d9150611028565b6040513d84823e3d90fd5b6004827f0a7c4edd000000000000000000000000000000000000000000000000000000008152fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206110c9611e44565b6040519015158152f35b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206110c961110f611b07565b611daa565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760006040805161115281611a4b565b82815260606020820152015263ffffffff600554166040519061117482611a4b565b60025482526003549161118683611b59565b926111946040519485611a67565b808452600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9190602086015b82821061128057505050506020810192835267ffffffffffffffff6004541692604082019384526040519283526040602084015260a083019151604084015251906060808401528151809152602060c0840192019060005b81811061123e5750505067ffffffffffffffff8293511660808301520390f35b8251805173ffffffffffffffffffffffffffffffffffffffff16855260209081015167ffffffffffffffff16818601526040909401939092019160010161121e565b6040516040810181811067ffffffffffffffff821117610c1957600192839260209260405267ffffffffffffffff885473ffffffffffffffffffffffffffffffffffffffff8116835260a01c16838201528152019401910190926111c6565b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760043567ffffffffffffffff81116101ca57806004018136039160607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8401126101ca5761135a611ec2565b81359081156119a457909260248201919060015b6113788486611c94565b90508110156114595761138b8486611c94565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83019183831161142a576113cc926020926113c692611ce8565b01611d27565b67ffffffffffffffff806113ef60206113c6866113e98b8d611c94565b90611ce8565b16911610156114005760010161136e565b7f448515170000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b508390856114678584611c94565b60448601915061147682611d27565b60011b6801fffffffffffffffe67fffffffffffffffe82169116810361142a576114a867ffffffffffffffff91611d3c565b161161197a57600354805b611877575060005b6114c58786611c94565b905081101561159e5773ffffffffffffffffffffffffffffffffffffffff6114f96114f4836113e98b8a611c94565b611d74565b16600052600860205260ff60406000205416611574578073ffffffffffffffffffffffffffffffffffffffff6115386114f46001946113e98c8b611c94565b1660005260086020526040600020827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055016114bb565b7f28cae27d0000000000000000000000000000000000000000000000000000000060005260046000fd5b50846115b08780959685600255611c94565b90680100000000000000008211610c195760035482600355808310611831575b50600360005260206000206000915b838310611783575050505067ffffffffffffffff6115fc83611d27565b167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060045416176004556005549463ffffffff86169563ffffffff871461142a5763ffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000098011696879116176005557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd6040519560208752608087019560208801523591018112156101ca57016024600482013591019267ffffffffffffffff82116101ca578160061b360384136101ca578190606060408701525260a0840192906000905b80821061173057867f7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c87808867ffffffffffffffff6117258a611d95565b1660608301520390a2005b90919384359073ffffffffffffffffffffffffffffffffffffffff82168092036101ca5760408160019382935267ffffffffffffffff61177260208a01611d95565b1660208201520195019201906116e7565b600160408273ffffffffffffffffffffffffffffffffffffffff6117a78495611d74565b167fffffffffffffffffffffffff00000000000000000000000000000000000000008654161785556117db60208201611d27565b7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff000000000000000000000000000000000000000087549260a01b169116178555019201920191906115df565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9081019083015b81811061186b57506115d0565b6000815560010161185e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161142a57600090600354111561194d57600390527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85a81015473ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055801561142a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01806114b3565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b7f014c50200000000000000000000000000000000000000000000000000000000060005260046000fd5b7f9cf8540c0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca576103ad6040805190611a0f8183611a67565b600f82527f524d4e52656d6f746520312e362e300000000000000000000000000000000000602083015251918291602083526020830190611aa8565b6060810190811067ffffffffffffffff821117610c1957604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610c1957604052565b919082519283825260005b848110611af25750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611ab3565b600435907fffffffffffffffffffffffffffffffff00000000000000000000000000000000821682036101ca57565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101ca57565b67ffffffffffffffff8111610c195760051b60200190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101ca576004359067ffffffffffffffff82116101ca57806023830112156101ca57816004013590611bc882611b59565b92611bd66040519485611a67565b8284526024602085019360051b8201019182116101ca57602401915b818310611bff5750505090565b82357fffffffffffffffffffffffffffffffff00000000000000000000000000000000811681036101ca57815260209283019201611bf2565b602060408183019282815284518094520192019060005b818110611c5c5750505090565b82517fffffffffffffffffffffffffffffffff0000000000000000000000000000000016845260209384019390920191600101611c4f565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101ca570180359067ffffffffffffffff82116101ca57602001918160061b360383136101ca57565b9190811015611cf85760061b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff811681036101ca5790565b67ffffffffffffffff60019116019067ffffffffffffffff821161142a57565b8054821015611cf85760005260206000200190600090565b3573ffffffffffffffffffffffffffffffffffffffff811681036101ca5790565b359067ffffffffffffffff821682036101ca57565b60065415611e3e577fffffffffffffffffffffffffffffffff0000000000000000000000000000000016600052600760205260406000205415801590611ded5790565b507f010000000000000000000000000000010000000000000000000000000000000060005260076020527f70b766b11586b6b505ed3893938b0cc6c6c98bd6f65e969ac311168d34e4f9e254151590565b50600090565b60065415611e9c577f010000000000000000000000000000010000000000000000000000000000000060005260076020527f70b766b11586b6b505ed3893938b0cc6c6c98bd6f65e969ac311168d34e4f9e254151590565b600090565b805115611cf85760200190565b8051821015611cf85760209160051b010190565b73ffffffffffffffffffffffffffffffffffffffff600154163303611ee357565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b600081815260076020526040902054801561209c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161142a57600654907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161142a5781810361202d575b5050506006548015611ffe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611fbb816006611d5c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600655600052600760205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61208461203e61204f936006611d5c565b90549060031b1c9283926006611d5c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526007602052604060002055388080611f82565b5050600090565b80600052600760205260406000205415600014611e3e5760065468010000000000000000811015610c19576120e461204f8260018594016006556006611d5c565b905560065490600052600760205260406000205560019056fea164736f6c634300081a000a", } var RMNRemoteABI = RMNRemoteMetaData.ABI diff --git a/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go b/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go index 781c4b7650d..6a208909f1f 100644 --- a/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go +++ b/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go @@ -87,7 +87,7 @@ type TokenPoolChainUpdate struct { var SiloedLockReleaseTokenPoolMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAvailableTokens\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"lockedTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChainRebalancer\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRebalancer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUnsiloedLiquidity\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provideLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provideSiloedLiquidity\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRebalancer\",\"inputs\":[{\"name\":\"newRebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSiloRebalancer\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateSiloDesignations\",\"inputs\":[{\"name\":\"removes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"adds\",\"type\":\"tuple[]\",\"internalType\":\"structSiloedLockReleaseTokenPool.SiloConfigUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rebalancer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSiloedLiquidity\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"rebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainUnsiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"amountUnsiloed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SiloRebalancerSet\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"oldRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnsiloedRebalancerSet\",\"inputs\":[{\"name\":\"oldRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InsufficientLiquidity\",\"inputs\":[{\"name\":\"availableLiquidity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requestedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidChainSelector\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"LiquidityAmountCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", - Bin: "0x6101008060405234610377576155fe803803809161001d82856103f6565b833981019060a0818303126103775780516001600160a01b038116918282036103775761004c60208201610419565b60408201519092906001600160401b0381116103775782019480601f87011215610377578551956001600160401b0387116103e0578660051b906020820197610098604051998a6103f6565b885260208089019282010192831161037757602001905b8282106103c8575050506100d160806100ca60608501610427565b9301610427565b9333156103b757600180546001600160a01b03191633179055801580156103a6575b8015610395575b6103845760049260209260805260c0526040519283809263313ce56760e01b82525afa60009181610343575b50610318575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526101fa575b60405161502290816105dc82396080518181816103e4015281816110780152818161188c01528181611a8601528181612a0b01528181612be901528181612fc20152818161301c0152613184015260a051818181611b4601528181612f6b01528181613bfd0152613c80015260c051818181610df9015281816119270152612aa7015260e051818181610da70152818161196b015261280c0152f35b604051602061020981836103f6565b60008252600036813760e051156103075760005b8251811015610284576001906001600160a01b0361023b828661043b565b5116836102478261047d565b610254575b50500161021d565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388361024c565b50905060005b82518110156102fe576001906001600160a01b036102a8828661043b565b511680156102f857836102ba8261057b565b6102c8575b50505b0161028a565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102bf565b506102c2565b5050503861015e565b6335f4a7b360e01b60005260046000fd5b60ff1660ff821681810361032c575061012c565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161037c575b8161035f602093836103f6565b810103126103775761037090610419565b9038610126565b600080fd5b3d9150610352565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038316156100fa565b506001600160a01b038516156100f3565b639b15e16f60e01b60005260046000fd5b602080916103d584610427565b8152019101906100af565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103e057604052565b519060ff8216820361037757565b51906001600160a01b038216820361037757565b805182101561044f5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561044f5760005260206000200190600090565b600081815260036020526040902054801561057457600019810181811161055e5760025460001981019190821161055e5781810361050d575b50505060025480156104f757600019016104d1816002610465565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61054661051e61052f936002610465565b90549060031b1c9283926002610465565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104b6565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105d557600254680100000000000000008110156103e0576105bc61052f8260018594016002556002610465565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146131fa575080630a861f2a146130c6578063181f5a771461304057806321df0da714612fef578063240028e814612f8f57806324f65ee714612f515780632d4a148f14612e1e57806331238ffc14612dd857806339077537146129a1578063432a6ba31461296d5780634c5ef0ed1461295457806354c8a4f3146127da57806362ddd3c4146127575780636600f92c146126395780636cfd15531461257c5780636d3d1a58146125485780636d9d216c1461212557806379ba50971461205a5780637d54534e14611fcd5780638632d5cc14611f8c5780638926f54f14611f475780638da5cb5b14611f13578063962d402014611dbd5780639a4575b914611821578063a42a7b8b146116b3578063a7cd63b7146115ff578063acfecf91146114df578063af0e58b9146114c1578063af58d59f14611477578063b0f479a114611443578063b79465801461140b578063c0d7865514611323578063c4bffe2b146111f3578063c75eea9c1461114a578063ce3c752814610f94578063cf7401f314610e1d578063dc0bd97114610dcc578063e0351e1314610d8f578063e8a1da17146104aa578063eb521a4c146102ef578063f1e73399146102c45763f2fde38b146101ed57600080fd5b346102bf5760206003193601126102bf5773ffffffffffffffffffffffffffffffffffffffff61021b613442565b610223613dec565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102bf5760206003193601126102bf5760206102e76102e2613465565b613aeb565b604051908152f35b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff610328600061381f565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff161561043d57610392828254613802565b90555b6104086040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e2608482613368565b7f0000000000000000000000000000000000000000000000000000000000000000614387565b604051906000825260208201527f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf60403392a2005b5061044a81600a54613802565b600a55610395565b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7fa90c0d190000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576104b836613512565b9190926104c3613dec565b6000905b828210610be65750505060009063ffffffff4216907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee184360301925b81811015610be4576000918160051b86013585811215610be05786019061012082360312610be057604051956105388761334c565b823567ffffffffffffffff81168103610bdc578752602083013567ffffffffffffffff8111610bdc5783019536601f88011215610bdc5786359661057b88613743565b97610589604051998a613368565b8089526020808a019160051b83010190368211610bd85760208301905b828210610ba5575050505060208801968752604084013567ffffffffffffffff8111610ba1576105d99036908601613ad0565b92604089019384526106036105f136606088016135b2565b9560608b0196875260c03691016135b2565b9660808a01978852610615865161422c565b61061f885161422c565b84515115610b795761063b67ffffffffffffffff8b5116614bb2565b15610b425767ffffffffffffffff8a5116815260076020526040812061077b87516fffffffffffffffffffffffffffffffff604082015116906107366fffffffffffffffffffffffffffffffff602083015116915115158360806040516106a18161334c565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b6108a189516fffffffffffffffffffffffffffffffff6040820151169061085c6fffffffffffffffffffffffffffffffff602083015116915115158360806040516107c58161334c565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b6004865191019080519067ffffffffffffffff8211610b15576108c4835461389f565b601f8111610ada575b50602090601f8311600114610a3b5761091b9291859183610a30575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b88518051821015610953579061094d6001926109468367ffffffffffffffff8f51169261388b565b5190613e37565b0161091e565b5050977f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2939199975095610a2167ffffffffffffffff60019796949851169251935191516109ed6109b8604051968796875261010060208801526101008701906133e3565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101939193929092610503565b015190508f806108e9565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b818110610ac25750908460019594939210610a8b575b505050811b01905561091e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080610a7e565b92936020600181928786015181550195019301610a68565b610b059084865260208620601f850160051c81019160208610610b0b575b601f0160051c0190613aa6565b8e6108cd565b9091508190610af8565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff8111610bd457602091610bc98392833691890101613ad0565b8152019101906105a6565b8a80fd5b8880fd5b8580fd5b8380fd5b005b909267ffffffffffffffff610c07610c028686869997996137c3565b613686565b1692610c12846148f3565b15610d6157836000526007602052610c3060056040600020016146fa565b9260005b8451811015610c6c57600190866000526007602052610c656005604060002001610c5e838961388b565b5190614a1e565b5001610c34565b5093909491959250806000526007602052600560406000206000815560006001820155600060028201556000600382015560048101610cab815461389f565b9081610d1e575b5050018054906000815581610cfd575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a10190919392936104c7565b6000526020600020908101905b81811015610cc25760008155600101610d0a565b81601f60009311600114610d365750555b8880610cb2565b81835260208320610d5191601f01861c810190600101613aa6565b8082528160208120915555610d2f565b837f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760e06003193601126102bf57610e36613465565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102bf57604051610e6c81613314565b60243580151581036102bf5781526044356fffffffffffffffffffffffffffffffff811681036102bf5760208201526064356fffffffffffffffffffffffffffffffff811681036102bf57604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c3601126102bf5760405190610ef382613314565b60843580151581036102bf57825260a4356fffffffffffffffffffffffffffffffff811681036102bf57602083015260c4356fffffffffffffffffffffffffffffffff811681036102bf57604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610f72575b61045257610be492614077565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610f65565b346102bf5760406003193601126102bf57610fad613465565b60243567ffffffffffffffff821680600052600c60205260ff60016040600020015460a01c16158015611142575b6111155781156104805773ffffffffffffffffffffffffffffffffffffffff6110038461381f565b16330361045257600052600c602052604060002060ff600182015460a01c168060001461110d5781545b8084116110db5750916110c1917f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e936000146110c65761106e82825461369b565b90555b61109c81337f0000000000000000000000000000000000000000000000000000000000000000613d8a565b6040519182913395836020909392919367ffffffffffffffff60408201951681520152565b0390a2005b506110d381600a5461369b565b600a55611071565b83907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a5461102d565b7f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b508015610fdb565b346102bf5760206003193601126102bf5767ffffffffffffffff61116c613465565b6111746139f3565b501660005260076020526111ef6111966111916040600020613a1e565b6141a7565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b346102bf5760006003193601126102bf576040516005548082528160208101600560005260206000209260005b81811061130a57505061123592500382613368565b80519061125a61124483613743565b926112526040519485613368565b808452613743565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401920136833760005b81518110156112ba578067ffffffffffffffff6112a76001938561388b565b51166112b3828761388b565b5201611288565b5050906040519182916020830190602084525180915260408301919060005b8181106112e7575050500390f35b825167ffffffffffffffff168452859450602093840193909201916001016112d9565b8454835260019485019486945060209093019201611220565b346102bf5760206003193601126102bf5761133c613442565b611344613dec565b73ffffffffffffffffffffffffffffffffffffffff81169081156113e157600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168491819081015b0390a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760206003193601126102bf576111ef61142f61142a613465565b613a84565b6040519182916020835260208301906133e3565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b346102bf5760206003193601126102bf5767ffffffffffffffff611499613465565b6114a16139f3565b501660005260076020526111ef6111966111916002604060002001613a1e565b346102bf5760006003193601126102bf576020600a54604051908152f35b346102bf5767ffffffffffffffff6114f63661347c565b929091611501613dec565b169061151a826000526006602052604060002054151590565b156115d15781600052600760205261154b600560406000200161153e36868561364f565b6020815191012090614a1e565b1561158a577f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691926110c16040519283926020845260208401916139b4565b6115cd906040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501526040602485015260448401916139b4565b0390fd5b507f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760405160025490818152602081018092600260005260206000209060005b81811061169d5750505081611644910382613368565b6040519182916020830190602084525180915260408301919060005b81811061166e575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611660565b825484526020909301926001928301920161162e565b346102bf5760206003193601126102bf5767ffffffffffffffff6116d5613465565b1660005260076020526116ee60056040600020016146fa565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061173461171e84613743565b9361172c6040519586613368565b808552613743565b0160005b81811061181057505060005b815181101561178c578061175a6001928461388b565b51600052600860205261177060406000206138f2565b61177a828661388b565b52611785818561388b565b5001611744565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106117c557505050500390f35b91936020611800827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0600195979984950301865288516133e3565b96019201920185949391926117b6565b806060602080938701015201611738565b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf5760a060031982360301126102bf576060602060405161186281613330565b828152015260848101611874816136d7565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d7157506024810177ffffffffffffffff000000000000000000000000000000006118da82613686565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c8957600091611d42575b50611d1857611969604483016136d7565b7f0000000000000000000000000000000000000000000000000000000000000000611cc2575b5067ffffffffffffffff6119a282613686565b166119ba816000526006602052604060002054151590565b15611c9557602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa908115611c8957600091611c1f575b5073ffffffffffffffffffffffffffffffffffffffff163303611bf15761142a81611bac9367ffffffffffffffff6064611a59611b3c96613686565b92013591166000526007602052611aac60406000208273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614c61565b67ffffffffffffffff611abe83613686565b16600052600c60205260ff60016040600020015460a01c16600014611bdd5767ffffffffffffffff611aef83613686565b16600052600c6020526040600020611b08828254613802565b90555b6040519081527f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860203392a2613686565b6111ef60405160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260208152611b7a604082613368565b60405192611b8784613330565b83526020830190815260405193849360208552516040602086015260608501906133e3565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526133e3565b611be981600a54613802565b600a55611b0b565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6020813d602011611c81575b81611c3860209383613368565b81010312611c7d57519073ffffffffffffffffffffffffffffffffffffffff82168203611c7a575073ffffffffffffffffffffffffffffffffffffffff611a1d565b80fd5b5080fd5b3d9150611c2b565b6040513d6000823e3d90fd5b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff1680600052600360205260406000205461198f577fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b611d64915060203d602011611d6a575b611d5c8183613368565b810190613b72565b83611958565b503d611d52565b611d8f73ffffffffffffffffffffffffffffffffffffffff916136d7565b7f961c9a4f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760606003193601126102bf5760043567ffffffffffffffff81116102bf57611dee9036906004016134e1565b9060243567ffffffffffffffff81116102bf57611e0f903690600401613564565b9060443567ffffffffffffffff81116102bf57611e30903690600401613564565b73ffffffffffffffffffffffffffffffffffffffff6009541633141580611ef1575b61045257838614801590611ee7575b611ebd5760005b868110611e7157005b80611eb7611e85610c026001948b8b6137c3565b611e9083898961387b565b611eb1611ea9611ea186898b61387b565b9236906135b2565b9136906135b2565b91614077565b01611e68565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b5080861415611e61565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611e52565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346102bf5760206003193601126102bf576020611f8267ffffffffffffffff611f6e613465565b166000526006602052604060002054151590565b6040519015158152f35b346102bf5760206003193601126102bf576020611faf611faa613465565b61381f565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346102bf5760206003193601126102bf577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff61201e613442565b612026613dec565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346102bf5760006003193601126102bf5760005473ffffffffffffffffffffffffffffffffffffffff811633036120fb577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760406003193601126102bf5760043567ffffffffffffffff81116102bf576121569036906004016134e1565b6024359167ffffffffffffffff83116102bf57366023840112156102bf5782600401359167ffffffffffffffff83116102bf576024840193602436918560061b0101116102bf576121a5613dec565b60005b81811061241a5750505060005b8181106121be57005b67ffffffffffffffff6121d5610c0283858761380f565b161580156123e5575b80156123c4575b61237f5773ffffffffffffffffffffffffffffffffffffffff612214602061220e84868861380f565b016136d7565b16156113e15780612307612230602061220e600195878961380f565b8573ffffffffffffffffffffffffffffffffffffffff808660405161225481613314565b6000815282602082019616865267ffffffffffffffff61227f610c028a8d6040860199878b5261380f565b16600052600c60205260406000209051815501935116167fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b7f180c6940bd64ba8f75679203ca32f8be2f629477a3307b190656e4b14dd5ddeb612336610c0283868861380f565b612346602061220e85888a61380f565b6040805167ffffffffffffffff93909316835273ffffffffffffffffffffffffffffffffffffffff91909116602083015290a1016121b5565b610c02906123969267ffffffffffffffff9461380f565b7fd9a9cd68000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506123df67ffffffffffffffff611f6e610c0284868861380f565b156121e5565b5067ffffffffffffffff6123fd610c0283858761380f565b16600052600c60205260ff60016040600020015460a01c166121de565b67ffffffffffffffff612431610c028385876137c3565b16600052600c60205260ff60016040600020015460a01c1615612503578067ffffffffffffffff612468610c0260019486886137c3565b16600052600c6020527f7b5efb3f8090c5cfd24e170b667d0e2b6fdc3db6540d75b86d5b6655ba00eb936040600020546124a481600a54613802565b600a5567ffffffffffffffff6124be610c0285888a6137c3565b16600052600c6020526000846040822082815501556124e1610c028487896137c3565b6040805167ffffffffffffffff9290921682526020820192909252a1016121a8565b610c029061251a9267ffffffffffffffff946137c3565b7f46f5f12b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b346102bf5760206003193601126102bf57612595613442565b61259d613dec565b73ffffffffffffffffffffffffffffffffffffffff81169081156113e157600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f66b1c1bdec8b60a3442bb25b5b6cd6fff3d0eceb6f5390be8e2f82a8ad39b23491819081016113dc565b346102bf5760406003193601126102bf57612652613465565b60243573ffffffffffffffffffffffffffffffffffffffff8116918282036102bf5767ffffffffffffffff90612686613dec565b169182600052600c60205260016040600020019081549060ff8260a01c16156127295780156113e15782547fffffffffffffffffffffffff000000000000000000000000000000000000000016179091556040805173ffffffffffffffffffffffffffffffffffffffff92831681529190921660208201527f01efd4cd7dd64263689551000d4359d6559c839f39b773b1df3fd19ff060cf5f91819081016110c1565b847f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf576127653661347c565b612770929192613dec565b67ffffffffffffffff8216612792816000526006602052604060002054151590565b156127ad5750610be4926127a791369161364f565b90613e37565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5761280261280a6127ee36613512565b94916127fb939193613dec565b369161375b565b92369161375b565b7f00000000000000000000000000000000000000000000000000000000000000001561292a5760005b82518110156128a6578073ffffffffffffffffffffffffffffffffffffffff61285e6001938661388b565b51166128698161475d565b612875575b5001612833565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a18461286e565b5060005b8151811015610be4578073ffffffffffffffffffffffffffffffffffffffff6128d56001938561388b565b51168015612924576128e681614b52565b6128f3575b505b016128aa565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1836128eb565b506128ed565b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576020611f826129673661347c565b916136f8565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff600b5416604051908152f35b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf578060040161010060031983360301126102bf5760006040516129e5816132c9565b52608482016129f3816136d7565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d715750602482019177ffffffffffffffff00000000000000000000000000000000612a5a84613686565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c8957600091612db9575b50611d1857612ae683613686565b67ffffffffffffffff8116612b08816000526006602052604060002054151590565b15611c955750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff93909316918301919091523360248301526020908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115611c8957600091612d9a575b5015611bf157612b9283613686565b612ba460a483019161296783866135fe565b15612d53575067ffffffffffffffff612c49612c43612bc286613686565b83606486013591166000526007602052612c3d612c38612c31600260406000200198612c277f00000000000000000000000000000000000000000000000000000000000000009a8673ffffffffffffffffffffffffffffffffffffffff8d1691614c61565b60c48901906135fe565b369161364f565b613b8a565b90613c7d565b94613686565b16600052600c602052604060002060ff600182015460a01c1680600014612d4b5781545b808611612d195760208673ffffffffffffffffffffffffffffffffffffffff612cc288612cbd8460448b8b8b15612d0457612ca984825461369b565b90555b0192612cb7846136d7565b90613d8a565b6136d7565b166040518281527f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52843392a380604051612cfb816132c9565b52604051908152f35b50612d1183600a5461369b565b600a55612cac565b85907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a54612c6d565b612d5d90836135fe565b6115cd6040519283927f24eb47e50000000000000000000000000000000000000000000000000000000084526020600485015260248401916139b4565b612db3915060203d602011611d6a57611d5c8183613368565b84612b83565b612dd2915060203d602011611d6a57611d5c8183613368565b84612ad8565b346102bf5760206003193601126102bf5767ffffffffffffffff612dfa613465565b16600052600c602052602060ff60016040600020015460a01c166040519015158152f35b346102bf5760406003193601126102bf57612e37613465565b60243567ffffffffffffffff821680600052600c60205260ff60016040600020015460a01c16158015612f49575b6111155781156104805773ffffffffffffffffffffffffffffffffffffffff612e8d8461381f565b163303610452577f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf916110c191600052600c602052604060002060ff600182015460a01c16600014612f3457612ee4828254613802565b90555b61109c6040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e2608482613368565b50612f4181600a54613802565b600a55612ee7565b508015612e65565b346102bf5760006003193601126102bf57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760206003193601126102bf576020612faa613442565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760006003193601126102bf576111ef604051613062606082613368565b602481527f53696c6f65644c6f636b52656c65617365546f6b656e506f6f6c20312e362e3060208201527f2d6465760000000000000000000000000000000000000000000000000000000060408201526040519182916020835260208301906133e3565b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff6130ff600061381f565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff1680156131f25781545b8084116110db5750156131dd5761317a82825461369b565b90555b6131a881337f0000000000000000000000000000000000000000000000000000000000000000613d8a565b604051906000825260208201527f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e60403392a2005b506131ea81600a5461369b565b600a5561317d565b600a54613162565b346102bf5760206003193601126102bf57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036102bf57817faff2afbf000000000000000000000000000000000000000000000000000000006020931490811561329f575b8115613275575b5015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148361326e565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150613267565b6020810190811067ffffffffffffffff8211176132e557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176132e557604052565b6040810190811067ffffffffffffffff8211176132e557604052565b60a0810190811067ffffffffffffffff8211176132e557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176132e557604052565b67ffffffffffffffff81116132e557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b84811061342d5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016133ee565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bf57565b6004359067ffffffffffffffff821682036102bf57565b60406003198201126102bf5760043567ffffffffffffffff811681036102bf579160243567ffffffffffffffff81116102bf57826023820112156102bf5780600401359267ffffffffffffffff84116102bf57602484830101116102bf576024019190565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf576020808501948460051b0101116102bf57565b60406003198201126102bf5760043567ffffffffffffffff81116102bf578161353d916004016134e1565b929092916024359067ffffffffffffffff82116102bf57613560916004016134e1565b9091565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf57602080850194606085020101116102bf57565b35906fffffffffffffffffffffffffffffffff821682036102bf57565b91908260609103126102bf576040516135ca81613314565b809280359081151582036102bf5760406135f991819385526135ee60208201613595565b602086015201613595565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102bf570180359067ffffffffffffffff82116102bf576020019181360383136102bf57565b92919261365b826133a9565b916136696040519384613368565b8294818452818301116102bf578281602093846000960137010152565b3567ffffffffffffffff811681036102bf5790565b919082039182116136a857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bf5790565b613740929167ffffffffffffffff61372392166000526007602052600560406000200192369161364f565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff81116132e55760051b60200190565b929161376682613743565b936137746040519586613368565b602085848152019260051b81019182116102bf57915b81831061379657505050565b823573ffffffffffffffffffffffffffffffffffffffff811681036102bf5781526020928301920161378a565b91908110156137d35760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919082018092116136a857565b91908110156137d35760061b0190565b67ffffffffffffffff16600052600c60205260016040600020015460ff8160a01c16613862575073ffffffffffffffffffffffffffffffffffffffff600b541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b91908110156137d3576060020190565b80518210156137d35760209160051b010190565b90600182811c921680156138e8575b60208310146138b957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916138ae565b90604051918260008254926139068461389f565b8084529360018116908115613974575060011461392d575b5061392b92500383613368565b565b90506000929192526020600020906000915b81831061395857505090602061392b928201013861391e565b602091935080600191548385890101520191019091849261393f565b6020935061392b9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b8201013861391e565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60405190613a008261334c565b60006080838281528260208201528260408201528260608201520152565b90604051613a2b8161334c565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff16600052600760205261374060046040600020016138f2565b818110613ab1575050565b60008155600101613aa6565b818102929181159184041417156136a857565b9080601f830112156102bf578160206137409335910161364f565b67ffffffffffffffff16613b0c816000526006602052604060002054151590565b15613b455780600052600c60205260ff60016040600020015460a01c16613b345750600a5490565b600052600c60205260406000205490565b7fd9a9cd680000000000000000000000000000000000000000000000000000000060005260045260246000fd5b908160209103126102bf575180151581036102bf5790565b80518015613bf957602003613bbb576020818051810103126102bf5760208101519060ff8211613bbb575060ff1690565b6115cd906040519182917f953576f70000000000000000000000000000000000000000000000000000000083526020600484015260248301906133e3565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff82116136a857565b60ff16604d81116136a857600a0a90565b8115613c4e570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff811692828414613d8357828411613d595790613cc291613c1f565b91604d60ff8416118015613d20575b613cea57505090613ce461374092613c33565b90613abd565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50613d2a83613c33565b8015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613cd1565b613d6291613c1f565b91604d60ff841611613cea57505090613d7d61374092613c33565b90613c44565b5050505090565b61392b9273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252613de7606483613368565b614387565b73ffffffffffffffffffffffffffffffffffffffff600154163303613e0d57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156113e15767ffffffffffffffff81516020830120921691826000526007602052613e6c816005604060002001614c0c565b156140335760005260086020526040600020815167ffffffffffffffff81116132e557613e99825461389f565b601f8111614001575b506020601f8211600114613f3b5791613f15827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9593613f2b95600091613f30575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90556040519182916020835260208301906133e3565b0390a2565b905084015138613ee4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110613fe9575092613f2b9492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea989610613fb2575b5050811b01905561142f565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880613fa6565b9192602060018192868a015181550194019201613f6b565b61402d90836000526020600020601f840160051c81019160208510610b0b57601f0160051c0190613aa6565b38613ea2565b50906115cd6040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401526040602484015260448301906133e3565b67ffffffffffffffff166000818152600660205260409020549092919015614179579161417660e092614142856140ce7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761422c565b8460005260076020526140e58160406000206144c7565b6140ee8361422c565b8460005260076020526141088360026040600020016144c7565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6141af6139f3565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161420c60208501936142066141f963ffffffff8751164261369b565b8560808901511690613abd565b90613802565b8082101561422557505b16825263ffffffff4216905290565b9050614216565b8051156142e0576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff6020830151168110908115916142d7575b506142745750565b6064906142d5604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b9050153861426c565b6fffffffffffffffffffffffffffffffff60408201511615801590614368575b6143075750565b6064906142d5604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515614300565b73ffffffffffffffffffffffffffffffffffffffff6144169116916040926000808551936143b58786613368565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d156144bf573d916143fa836133a9565b9261440787519485613368565b83523d6000602085013e614f49565b8051908161442357505050565b602080614434938301019101613b72565b1561443c5750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b606091614f49565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1991614600606092805461450463ffffffff8260801c164261369b565b908161463f575b50506fffffffffffffffffffffffffffffffff600181602086015116928281541680851060001461463757508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556145b48651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b61417660405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161453b565b6fffffffffffffffffffffffffffffffff9161467483928361466d6001880154948286169560801c90613abd565b9116613802565b808210156146f357505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff0000000000000000000000000000000016178155388061450b565b905061467e565b906040519182815491828252602082019060005260206000209260005b81811061472c57505061392b92500383613368565b8454835260019485019487945060209093019201614717565b80548210156137d35760005260206000200190600090565b60008181526003602052604090205480156148ec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116136a857600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116136a85781810361487d575b505050600254801561484e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161480b816002614745565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6148d461488e61489f936002614745565b90549060031b1c9283926002614745565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806147d2565b5050600090565b60008181526006602052604090205480156148ec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116136a857600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116136a8578181036149e4575b505050600554801561484e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016149a1816005614745565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b614a066149f561489f936005614745565b90549060031b1c9283926005614745565b90556000526006602052604060002055388080614968565b9060018201918160005282602052604060002054801515600014614b49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116136a8578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116136a857818103614b12575b5050508054801561484e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614ad38282614745565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b614b32614b2261489f9386614745565b90549060031b1c92839286614745565b905560005283602052604060002055388080614a9b565b50505050600090565b80600052600360205260406000205415600014614bac57600254680100000000000000008110156132e557614b9361489f8260018594016002556002614745565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014614bac57600554680100000000000000008110156132e557614bf361489f8260018594016005556005614745565b9055600554906000526006602052604060002055600190565b60008281526001820160205260409020546148ec57805490680100000000000000008210156132e55782614c4a61489f846001809601855584614745565b905580549260005201602052604060002055600190565b929192805460ff8160a01c16158015614f41575b614f3a576fffffffffffffffffffffffffffffffff81169060018301908154614cba63ffffffff6fffffffffffffffffffffffffffffffff83169360801c164261369b565b9081614e9c575b5050848110614e1a5750838210614d4957507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff80614d17856020969561369b565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b819450614d5b92505460801c9261369b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908082116136a857614da9614dae9273ffffffffffffffffffffffffffffffffffffffff94613802565b613c44565b9216918215614dea577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614e6c577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b828592939511614f1057614eb7926142069160801c90613abd565b80831015614f0b5750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178455913880614cc1565b614ec2565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b508215614c75565b91929015614fc45750815115614f5d575090565b3b15614f665790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015614fd75750805190602001fd5b6115cd906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906133e356fea164736f6c634300081a000a", + Bin: "0x6101008060405234610377576155d7803803809161001d82856103f6565b833981019060a0818303126103775780516001600160a01b038116918282036103775761004c60208201610419565b60408201519092906001600160401b0381116103775782019480601f87011215610377578551956001600160401b0387116103e0578660051b906020820197610098604051998a6103f6565b885260208089019282010192831161037757602001905b8282106103c8575050506100d160806100ca60608501610427565b9301610427565b9333156103b757600180546001600160a01b03191633179055801580156103a6575b8015610395575b6103845760049260209260805260c0526040519283809263313ce56760e01b82525afa60009181610343575b50610318575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526101fa575b604051614ffb90816105dc82396080518181816103e4015281816110780152818161188c01528181611a8601528181612a0b01528181612be901528181612fc20152818161301c015261315d015260a051818181611b4601528181612f6b01528181613bd60152613c59015260c051818181610df9015281816119270152612aa7015260e051818181610da70152818161196b015261280c0152f35b604051602061020981836103f6565b60008252600036813760e051156103075760005b8251811015610284576001906001600160a01b0361023b828661043b565b5116836102478261047d565b610254575b50500161021d565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388361024c565b50905060005b82518110156102fe576001906001600160a01b036102a8828661043b565b511680156102f857836102ba8261057b565b6102c8575b50505b0161028a565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102bf565b506102c2565b5050503861015e565b6335f4a7b360e01b60005260046000fd5b60ff1660ff821681810361032c575061012c565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161037c575b8161035f602093836103f6565b810103126103775761037090610419565b9038610126565b600080fd5b3d9150610352565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038316156100fa565b506001600160a01b038516156100f3565b639b15e16f60e01b60005260046000fd5b602080916103d584610427565b8152019101906100af565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103e057604052565b519060ff8216820361037757565b51906001600160a01b038216820361037757565b805182101561044f5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561044f5760005260206000200190600090565b600081815260036020526040902054801561057457600019810181811161055e5760025460001981019190821161055e5781810361050d575b50505060025480156104f757600019016104d1816002610465565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61054661051e61052f936002610465565b90549060031b1c9283926002610465565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104b6565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105d557600254680100000000000000008110156103e0576105bc61052f8260018594016002556002610465565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146131d3575080630a861f2a1461309f578063181f5a771461304057806321df0da714612fef578063240028e814612f8f57806324f65ee714612f515780632d4a148f14612e1e57806331238ffc14612dd857806339077537146129a1578063432a6ba31461296d5780634c5ef0ed1461295457806354c8a4f3146127da57806362ddd3c4146127575780636600f92c146126395780636cfd15531461257c5780636d3d1a58146125485780636d9d216c1461212557806379ba50971461205a5780637d54534e14611fcd5780638632d5cc14611f8c5780638926f54f14611f475780638da5cb5b14611f13578063962d402014611dbd5780639a4575b914611821578063a42a7b8b146116b3578063a7cd63b7146115ff578063acfecf91146114df578063af0e58b9146114c1578063af58d59f14611477578063b0f479a114611443578063b79465801461140b578063c0d7865514611323578063c4bffe2b146111f3578063c75eea9c1461114a578063ce3c752814610f94578063cf7401f314610e1d578063dc0bd97114610dcc578063e0351e1314610d8f578063e8a1da17146104aa578063eb521a4c146102ef578063f1e73399146102c45763f2fde38b146101ed57600080fd5b346102bf5760206003193601126102bf5773ffffffffffffffffffffffffffffffffffffffff61021b61341b565b610223613dc5565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102bf5760206003193601126102bf5760206102e76102e261343e565b613ac4565b604051908152f35b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff61032860006137f8565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff161561043d576103928282546137db565b90555b6104086040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e2608482613341565b7f0000000000000000000000000000000000000000000000000000000000000000614360565b604051906000825260208201527f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf60403392a2005b5061044a81600a546137db565b600a55610395565b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7fa90c0d190000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576104b8366134eb565b9190926104c3613dc5565b6000905b828210610be65750505060009063ffffffff4216907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee184360301925b81811015610be4576000918160051b86013585811215610be05786019061012082360312610be0576040519561053887613325565b823567ffffffffffffffff81168103610bdc578752602083013567ffffffffffffffff8111610bdc5783019536601f88011215610bdc5786359661057b8861371c565b97610589604051998a613341565b8089526020808a019160051b83010190368211610bd85760208301905b828210610ba5575050505060208801968752604084013567ffffffffffffffff8111610ba1576105d99036908601613aa9565b92604089019384526106036105f1366060880161358b565b9560608b0196875260c036910161358b565b9660808a019788526106158651614205565b61061f8851614205565b84515115610b795761063b67ffffffffffffffff8b5116614b8b565b15610b425767ffffffffffffffff8a5116815260076020526040812061077b87516fffffffffffffffffffffffffffffffff604082015116906107366fffffffffffffffffffffffffffffffff602083015116915115158360806040516106a181613325565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b6108a189516fffffffffffffffffffffffffffffffff6040820151169061085c6fffffffffffffffffffffffffffffffff602083015116915115158360806040516107c581613325565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b6004865191019080519067ffffffffffffffff8211610b15576108c48354613878565b601f8111610ada575b50602090601f8311600114610a3b5761091b9291859183610a30575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b88518051821015610953579061094d6001926109468367ffffffffffffffff8f511692613864565b5190613e10565b0161091e565b5050977f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2939199975095610a2167ffffffffffffffff60019796949851169251935191516109ed6109b8604051968796875261010060208801526101008701906133bc565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101939193929092610503565b015190508f806108e9565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b818110610ac25750908460019594939210610a8b575b505050811b01905561091e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080610a7e565b92936020600181928786015181550195019301610a68565b610b059084865260208620601f850160051c81019160208610610b0b575b601f0160051c0190613a7f565b8e6108cd565b9091508190610af8565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff8111610bd457602091610bc98392833691890101613aa9565b8152019101906105a6565b8a80fd5b8880fd5b8580fd5b8380fd5b005b909267ffffffffffffffff610c07610c0286868699979961379c565b61365f565b1692610c12846148cc565b15610d6157836000526007602052610c3060056040600020016146d3565b9260005b8451811015610c6c57600190866000526007602052610c656005604060002001610c5e8389613864565b51906149f7565b5001610c34565b5093909491959250806000526007602052600560406000206000815560006001820155600060028201556000600382015560048101610cab8154613878565b9081610d1e575b5050018054906000815581610cfd575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a10190919392936104c7565b6000526020600020908101905b81811015610cc25760008155600101610d0a565b81601f60009311600114610d365750555b8880610cb2565b81835260208320610d5191601f01861c810190600101613a7f565b8082528160208120915555610d2f565b837f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760e06003193601126102bf57610e3661343e565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102bf57604051610e6c816132ed565b60243580151581036102bf5781526044356fffffffffffffffffffffffffffffffff811681036102bf5760208201526064356fffffffffffffffffffffffffffffffff811681036102bf57604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c3601126102bf5760405190610ef3826132ed565b60843580151581036102bf57825260a4356fffffffffffffffffffffffffffffffff811681036102bf57602083015260c4356fffffffffffffffffffffffffffffffff811681036102bf57604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610f72575b61045257610be492614050565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610f65565b346102bf5760406003193601126102bf57610fad61343e565b60243567ffffffffffffffff821680600052600c60205260ff60016040600020015460a01c16158015611142575b6111155781156104805773ffffffffffffffffffffffffffffffffffffffff611003846137f8565b16330361045257600052600c602052604060002060ff600182015460a01c168060001461110d5781545b8084116110db5750916110c1917f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e936000146110c65761106e828254613674565b90555b61109c81337f0000000000000000000000000000000000000000000000000000000000000000613d63565b6040519182913395836020909392919367ffffffffffffffff60408201951681520152565b0390a2005b506110d381600a54613674565b600a55611071565b83907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a5461102d565b7f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b508015610fdb565b346102bf5760206003193601126102bf5767ffffffffffffffff61116c61343e565b6111746139cc565b501660005260076020526111ef61119661119160406000206139f7565b614180565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b346102bf5760006003193601126102bf576040516005548082528160208101600560005260206000209260005b81811061130a57505061123592500382613341565b80519061125a6112448361371c565b926112526040519485613341565b80845261371c565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401920136833760005b81518110156112ba578067ffffffffffffffff6112a760019385613864565b51166112b38287613864565b5201611288565b5050906040519182916020830190602084525180915260408301919060005b8181106112e7575050500390f35b825167ffffffffffffffff168452859450602093840193909201916001016112d9565b8454835260019485019486945060209093019201611220565b346102bf5760206003193601126102bf5761133c61341b565b611344613dc5565b73ffffffffffffffffffffffffffffffffffffffff81169081156113e157600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168491819081015b0390a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760206003193601126102bf576111ef61142f61142a61343e565b613a5d565b6040519182916020835260208301906133bc565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b346102bf5760206003193601126102bf5767ffffffffffffffff61149961343e565b6114a16139cc565b501660005260076020526111ef61119661119160026040600020016139f7565b346102bf5760006003193601126102bf576020600a54604051908152f35b346102bf5767ffffffffffffffff6114f636613455565b929091611501613dc5565b169061151a826000526006602052604060002054151590565b156115d15781600052600760205261154b600560406000200161153e368685613628565b60208151910120906149f7565b1561158a577f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691926110c160405192839260208452602084019161398d565b6115cd906040519384937f74f23c7c000000000000000000000000000000000000000000000000000000008552600485015260406024850152604484019161398d565b0390fd5b507f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760405160025490818152602081018092600260005260206000209060005b81811061169d5750505081611644910382613341565b6040519182916020830190602084525180915260408301919060005b81811061166e575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611660565b825484526020909301926001928301920161162e565b346102bf5760206003193601126102bf5767ffffffffffffffff6116d561343e565b1660005260076020526116ee60056040600020016146d3565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061173461171e8461371c565b9361172c6040519586613341565b80855261371c565b0160005b81811061181057505060005b815181101561178c578061175a60019284613864565b51600052600860205261177060406000206138cb565b61177a8286613864565b526117858185613864565b5001611744565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106117c557505050500390f35b91936020611800827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0600195979984950301865288516133bc565b96019201920185949391926117b6565b806060602080938701015201611738565b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf5760a060031982360301126102bf576060602060405161186281613309565b828152015260848101611874816136b0565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d7157506024810177ffffffffffffffff000000000000000000000000000000006118da8261365f565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c8957600091611d42575b50611d1857611969604483016136b0565b7f0000000000000000000000000000000000000000000000000000000000000000611cc2575b5067ffffffffffffffff6119a28261365f565b166119ba816000526006602052604060002054151590565b15611c9557602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa908115611c8957600091611c1f575b5073ffffffffffffffffffffffffffffffffffffffff163303611bf15761142a81611bac9367ffffffffffffffff6064611a59611b3c9661365f565b92013591166000526007602052611aac60406000208273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614c3a565b67ffffffffffffffff611abe8361365f565b16600052600c60205260ff60016040600020015460a01c16600014611bdd5767ffffffffffffffff611aef8361365f565b16600052600c6020526040600020611b088282546137db565b90555b6040519081527f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860203392a261365f565b6111ef60405160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260208152611b7a604082613341565b60405192611b8784613309565b83526020830190815260405193849360208552516040602086015260608501906133bc565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526133bc565b611be981600a546137db565b600a55611b0b565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6020813d602011611c81575b81611c3860209383613341565b81010312611c7d57519073ffffffffffffffffffffffffffffffffffffffff82168203611c7a575073ffffffffffffffffffffffffffffffffffffffff611a1d565b80fd5b5080fd5b3d9150611c2b565b6040513d6000823e3d90fd5b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff1680600052600360205260406000205461198f577fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b611d64915060203d602011611d6a575b611d5c8183613341565b810190613b4b565b83611958565b503d611d52565b611d8f73ffffffffffffffffffffffffffffffffffffffff916136b0565b7f961c9a4f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760606003193601126102bf5760043567ffffffffffffffff81116102bf57611dee9036906004016134ba565b9060243567ffffffffffffffff81116102bf57611e0f90369060040161353d565b9060443567ffffffffffffffff81116102bf57611e3090369060040161353d565b73ffffffffffffffffffffffffffffffffffffffff6009541633141580611ef1575b61045257838614801590611ee7575b611ebd5760005b868110611e7157005b80611eb7611e85610c026001948b8b61379c565b611e90838989613854565b611eb1611ea9611ea186898b613854565b92369061358b565b91369061358b565b91614050565b01611e68565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b5080861415611e61565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611e52565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346102bf5760206003193601126102bf576020611f8267ffffffffffffffff611f6e61343e565b166000526006602052604060002054151590565b6040519015158152f35b346102bf5760206003193601126102bf576020611faf611faa61343e565b6137f8565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346102bf5760206003193601126102bf577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff61201e61341b565b612026613dc5565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346102bf5760006003193601126102bf5760005473ffffffffffffffffffffffffffffffffffffffff811633036120fb577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760406003193601126102bf5760043567ffffffffffffffff81116102bf576121569036906004016134ba565b6024359167ffffffffffffffff83116102bf57366023840112156102bf5782600401359167ffffffffffffffff83116102bf576024840193602436918560061b0101116102bf576121a5613dc5565b60005b81811061241a5750505060005b8181106121be57005b67ffffffffffffffff6121d5610c028385876137e8565b161580156123e5575b80156123c4575b61237f5773ffffffffffffffffffffffffffffffffffffffff612214602061220e8486886137e8565b016136b0565b16156113e15780612307612230602061220e60019587896137e8565b8573ffffffffffffffffffffffffffffffffffffffff8086604051612254816132ed565b6000815282602082019616865267ffffffffffffffff61227f610c028a8d6040860199878b526137e8565b16600052600c60205260406000209051815501935116167fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b7f180c6940bd64ba8f75679203ca32f8be2f629477a3307b190656e4b14dd5ddeb612336610c028386886137e8565b612346602061220e85888a6137e8565b6040805167ffffffffffffffff93909316835273ffffffffffffffffffffffffffffffffffffffff91909116602083015290a1016121b5565b610c02906123969267ffffffffffffffff946137e8565b7fd9a9cd68000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506123df67ffffffffffffffff611f6e610c028486886137e8565b156121e5565b5067ffffffffffffffff6123fd610c028385876137e8565b16600052600c60205260ff60016040600020015460a01c166121de565b67ffffffffffffffff612431610c0283858761379c565b16600052600c60205260ff60016040600020015460a01c1615612503578067ffffffffffffffff612468610c02600194868861379c565b16600052600c6020527f7b5efb3f8090c5cfd24e170b667d0e2b6fdc3db6540d75b86d5b6655ba00eb936040600020546124a481600a546137db565b600a5567ffffffffffffffff6124be610c0285888a61379c565b16600052600c6020526000846040822082815501556124e1610c0284878961379c565b6040805167ffffffffffffffff9290921682526020820192909252a1016121a8565b610c029061251a9267ffffffffffffffff9461379c565b7f46f5f12b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b346102bf5760206003193601126102bf5761259561341b565b61259d613dc5565b73ffffffffffffffffffffffffffffffffffffffff81169081156113e157600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f66b1c1bdec8b60a3442bb25b5b6cd6fff3d0eceb6f5390be8e2f82a8ad39b23491819081016113dc565b346102bf5760406003193601126102bf5761265261343e565b60243573ffffffffffffffffffffffffffffffffffffffff8116918282036102bf5767ffffffffffffffff90612686613dc5565b169182600052600c60205260016040600020019081549060ff8260a01c16156127295780156113e15782547fffffffffffffffffffffffff000000000000000000000000000000000000000016179091556040805173ffffffffffffffffffffffffffffffffffffffff92831681529190921660208201527f01efd4cd7dd64263689551000d4359d6559c839f39b773b1df3fd19ff060cf5f91819081016110c1565b847f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5761276536613455565b612770929192613dc5565b67ffffffffffffffff8216612792816000526006602052604060002054151590565b156127ad5750610be4926127a7913691613628565b90613e10565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5761280261280a6127ee366134eb565b94916127fb939193613dc5565b3691613734565b923691613734565b7f00000000000000000000000000000000000000000000000000000000000000001561292a5760005b82518110156128a6578073ffffffffffffffffffffffffffffffffffffffff61285e60019386613864565b511661286981614736565b612875575b5001612833565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a18461286e565b5060005b8151811015610be4578073ffffffffffffffffffffffffffffffffffffffff6128d560019385613864565b51168015612924576128e681614b2b565b6128f3575b505b016128aa565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1836128eb565b506128ed565b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576020611f8261296736613455565b916136d1565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff600b5416604051908152f35b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf578060040161010060031983360301126102bf5760006040516129e5816132a2565b52608482016129f3816136b0565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d715750602482019177ffffffffffffffff00000000000000000000000000000000612a5a8461365f565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c8957600091612db9575b50611d1857612ae68361365f565b67ffffffffffffffff8116612b08816000526006602052604060002054151590565b15611c955750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff93909316918301919091523360248301526020908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115611c8957600091612d9a575b5015611bf157612b928361365f565b612ba460a483019161296783866135d7565b15612d53575067ffffffffffffffff612c49612c43612bc28661365f565b83606486013591166000526007602052612c3d612c38612c31600260406000200198612c277f00000000000000000000000000000000000000000000000000000000000000009a8673ffffffffffffffffffffffffffffffffffffffff8d1691614c3a565b60c48901906135d7565b3691613628565b613b63565b90613c56565b9461365f565b16600052600c602052604060002060ff600182015460a01c1680600014612d4b5781545b808611612d195760208673ffffffffffffffffffffffffffffffffffffffff612cc288612cbd8460448b8b8b15612d0457612ca9848254613674565b90555b0192612cb7846136b0565b90613d63565b6136b0565b166040518281527f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52843392a380604051612cfb816132a2565b52604051908152f35b50612d1183600a54613674565b600a55612cac565b85907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a54612c6d565b612d5d90836135d7565b6115cd6040519283927f24eb47e500000000000000000000000000000000000000000000000000000000845260206004850152602484019161398d565b612db3915060203d602011611d6a57611d5c8183613341565b84612b83565b612dd2915060203d602011611d6a57611d5c8183613341565b84612ad8565b346102bf5760206003193601126102bf5767ffffffffffffffff612dfa61343e565b16600052600c602052602060ff60016040600020015460a01c166040519015158152f35b346102bf5760406003193601126102bf57612e3761343e565b60243567ffffffffffffffff821680600052600c60205260ff60016040600020015460a01c16158015612f49575b6111155781156104805773ffffffffffffffffffffffffffffffffffffffff612e8d846137f8565b163303610452577f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf916110c191600052600c602052604060002060ff600182015460a01c16600014612f3457612ee48282546137db565b90555b61109c6040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e2608482613341565b50612f4181600a546137db565b600a55612ee7565b508015612e65565b346102bf5760006003193601126102bf57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760206003193601126102bf576020612faa61341b565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760006003193601126102bf576111ef60408051906130638183613341565b602082527f53696c6f65644c6f636b52656c65617365546f6b656e506f6f6c20312e362e306020830152519182916020835260208301906133bc565b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff6130d860006137f8565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff1680156131cb5781545b8084116110db5750156131b657613153828254613674565b90555b61318181337f0000000000000000000000000000000000000000000000000000000000000000613d63565b604051906000825260208201527f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e60403392a2005b506131c381600a54613674565b600a55613156565b600a5461313b565b346102bf5760206003193601126102bf57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036102bf57817faff2afbf0000000000000000000000000000000000000000000000000000000060209314908115613278575b811561324e575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483613247565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150613240565b6020810190811067ffffffffffffffff8211176132be57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176132be57604052565b6040810190811067ffffffffffffffff8211176132be57604052565b60a0810190811067ffffffffffffffff8211176132be57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176132be57604052565b67ffffffffffffffff81116132be57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b8481106134065750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016133c7565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bf57565b6004359067ffffffffffffffff821682036102bf57565b60406003198201126102bf5760043567ffffffffffffffff811681036102bf579160243567ffffffffffffffff81116102bf57826023820112156102bf5780600401359267ffffffffffffffff84116102bf57602484830101116102bf576024019190565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf576020808501948460051b0101116102bf57565b60406003198201126102bf5760043567ffffffffffffffff81116102bf5781613516916004016134ba565b929092916024359067ffffffffffffffff82116102bf57613539916004016134ba565b9091565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf57602080850194606085020101116102bf57565b35906fffffffffffffffffffffffffffffffff821682036102bf57565b91908260609103126102bf576040516135a3816132ed565b809280359081151582036102bf5760406135d291819385526135c76020820161356e565b60208601520161356e565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102bf570180359067ffffffffffffffff82116102bf576020019181360383136102bf57565b92919261363482613382565b916136426040519384613341565b8294818452818301116102bf578281602093846000960137010152565b3567ffffffffffffffff811681036102bf5790565b9190820391821161368157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bf5790565b613719929167ffffffffffffffff6136fc921660005260076020526005604060002001923691613628565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff81116132be5760051b60200190565b929161373f8261371c565b9361374d6040519586613341565b602085848152019260051b81019182116102bf57915b81831061376f57505050565b823573ffffffffffffffffffffffffffffffffffffffff811681036102bf57815260209283019201613763565b91908110156137ac5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190820180921161368157565b91908110156137ac5760061b0190565b67ffffffffffffffff16600052600c60205260016040600020015460ff8160a01c1661383b575073ffffffffffffffffffffffffffffffffffffffff600b541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b91908110156137ac576060020190565b80518210156137ac5760209160051b010190565b90600182811c921680156138c1575b602083101461389257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613887565b90604051918260008254926138df84613878565b808452936001811690811561394d5750600114613906575b5061390492500383613341565b565b90506000929192526020600020906000915b81831061393157505090602061390492820101386138f7565b6020919350806001915483858901015201910190918492613918565b602093506139049592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386138f7565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b604051906139d982613325565b60006080838281528260208201528260408201528260608201520152565b90604051613a0481613325565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff16600052600760205261371960046040600020016138cb565b818110613a8a575050565b60008155600101613a7f565b8181029291811591840414171561368157565b9080601f830112156102bf5781602061371993359101613628565b67ffffffffffffffff16613ae5816000526006602052604060002054151590565b15613b1e5780600052600c60205260ff60016040600020015460a01c16613b0d5750600a5490565b600052600c60205260406000205490565b7fd9a9cd680000000000000000000000000000000000000000000000000000000060005260045260246000fd5b908160209103126102bf575180151581036102bf5790565b80518015613bd257602003613b94576020818051810103126102bf5760208101519060ff8211613b94575060ff1690565b6115cd906040519182917f953576f70000000000000000000000000000000000000000000000000000000083526020600484015260248301906133bc565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161368157565b60ff16604d811161368157600a0a90565b8115613c27570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff811692828414613d5c57828411613d325790613c9b91613bf8565b91604d60ff8416118015613cf9575b613cc357505090613cbd61371992613c0c565b90613a96565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50613d0383613c0c565b8015613c27577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613caa565b613d3b91613bf8565b91604d60ff841611613cc357505090613d5661371992613c0c565b90613c1d565b5050505090565b6139049273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252613dc0606483613341565b614360565b73ffffffffffffffffffffffffffffffffffffffff600154163303613de657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156113e15767ffffffffffffffff81516020830120921691826000526007602052613e45816005604060002001614be5565b1561400c5760005260086020526040600020815167ffffffffffffffff81116132be57613e728254613878565b601f8111613fda575b506020601f8211600114613f145791613eee827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9593613f0495600091613f09575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90556040519182916020835260208301906133bc565b0390a2565b905084015138613ebd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110613fc2575092613f049492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea989610613f8b575b5050811b01905561142f565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880613f7f565b9192602060018192868a015181550194019201613f44565b61400690836000526020600020601f840160051c81019160208510610b0b57601f0160051c0190613a7f565b38613e7b565b50906115cd6040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401526040602484015260448301906133bc565b67ffffffffffffffff166000818152600660205260409020549092919015614152579161414f60e09261411b856140a77f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b97614205565b8460005260076020526140be8160406000206144a0565b6140c783614205565b8460005260076020526140e18360026040600020016144a0565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6141886139cc565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff80835116916141e560208501936141df6141d263ffffffff87511642613674565b8560808901511690613a96565b906137db565b808210156141fe57505b16825263ffffffff4216905290565b90506141ef565b8051156142b9576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff6020830151168110908115916142b0575b5061424d5750565b6064906142ae604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b90501538614245565b6fffffffffffffffffffffffffffffffff60408201511615801590614341575b6142e05750565b6064906142ae604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff60208201511615156142d9565b73ffffffffffffffffffffffffffffffffffffffff6143ef91169160409260008085519361438e8786613341565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d15614498573d916143d383613382565b926143e087519485613341565b83523d6000602085013e614f22565b805190816143fc57505050565b60208061440d938301019101613b4b565b156144155750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b606091614f22565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19916145d960609280546144dd63ffffffff8260801c1642613674565b9081614618575b50506fffffffffffffffffffffffffffffffff600181602086015116928281541680851060001461461057508280855b16167fffffffffffffffffffffffffffffffff0000000000000000000000000000000082541617815561458d8651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b61414f60405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b838091614514565b6fffffffffffffffffffffffffffffffff9161464d8392836146466001880154948286169560801c90613a96565b91166137db565b808210156146cc57505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff000000000000000000000000000000001617815538806144e4565b9050614657565b906040519182815491828252602082019060005260206000209260005b81811061470557505061390492500383613341565b84548352600194850194879450602090930192016146f0565b80548210156137ac5760005260206000200190600090565b60008181526003602052604090205480156148c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161368157600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161368157818103614856575b5050506002548015614827577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016147e481600261471e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6148ad61486761487893600261471e565b90549060031b1c928392600261471e565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806147ab565b5050600090565b60008181526006602052604090205480156148c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161368157600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613681578181036149bd575b5050506005548015614827577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161497a81600561471e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b6149df6149ce61487893600561471e565b90549060031b1c928392600561471e565b90556000526006602052604060002055388080614941565b9060018201918160005282602052604060002054801515600014614b22577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613681578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161368157818103614aeb575b50505080548015614827577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614aac828261471e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b614b0b614afb614878938661471e565b90549060031b1c9283928661471e565b905560005283602052604060002055388080614a74565b50505050600090565b80600052600360205260406000205415600014614b8557600254680100000000000000008110156132be57614b6c614878826001859401600255600261471e565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014614b8557600554680100000000000000008110156132be57614bcc614878826001859401600555600561471e565b9055600554906000526006602052604060002055600190565b60008281526001820160205260409020546148c557805490680100000000000000008210156132be5782614c2361487884600180960185558461471e565b905580549260005201602052604060002055600190565b929192805460ff8160a01c16158015614f1a575b614f13576fffffffffffffffffffffffffffffffff81169060018301908154614c9363ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642613674565b9081614e75575b5050848110614df35750838210614d2257507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff80614cf08560209695613674565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b819450614d3492505460801c92613674565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019080821161368157614d82614d879273ffffffffffffffffffffffffffffffffffffffff946137db565b613c1d565b9216918215614dc3577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614e45577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b828592939511614ee957614e90926141df9160801c90613a96565b80831015614ee45750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178455913880614c9a565b614e9b565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b508215614c4e565b91929015614f9d5750815115614f36575090565b3b15614f3f5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015614fb05750805190602001fd5b6115cd906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906133bc56fea164736f6c634300081a000a", } var SiloedLockReleaseTokenPoolABI = SiloedLockReleaseTokenPoolMetaData.ABI diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt index ab5f01ce9ad..8ebcfa838d4 100644 --- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -4,31 +4,31 @@ burn_mint_token_pool: ../../../contracts/solc/ccip/BurnMintTokenPool/BurnMintTok burn_to_address_mint_token_pool: ../../../contracts/solc/ccip/BurnToAddressMintTokenPool/BurnToAddressMintTokenPool.sol/BurnToAddressMintTokenPool.abi.json ../../../contracts/solc/ccip/BurnToAddressMintTokenPool/BurnToAddressMintTokenPool.sol/BurnToAddressMintTokenPool.bin ca4d24535b7c8a9cff9ca0ff96a41b8410b0e055059e45152e3e49a7c40a6656 burn_with_from_mint_token_pool: ../../../contracts/solc/ccip/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.sol/BurnWithFromMintTokenPool.abi.json ../../../contracts/solc/ccip/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.sol/BurnWithFromMintTokenPool.bin 66715c303bb2da2b49bba100a788f6471b0f94d255d40f92306e279b909ae33b ccip_encoding_utils: ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.sol/EncodingUtils.abi.json ../../../contracts/solc/ccip/EncodingUtils/EncodingUtils.sol/EncodingUtils.bin 540f6273375ebf1ad6fa4906fbd6b37896141f94b8122f06ddb6d42e2dc49ce9 -ccip_home: ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.abi.json ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.bin 39de1fbc907a2b573e9358e716803bf5ac3b0a2e622d5bc0069ab60daf38949b +ccip_home: ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.abi.json ../../../contracts/solc/ccip/CCIPHome/CCIPHome.sol/CCIPHome.bin 18a668e4ddab50189d3d60a24694f3cecc76680ca4f858948969b77df3cb13db ccip_reader_tester: ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.abi.json ../../../contracts/solc/ccip/CCIPReaderTester/CCIPReaderTester.sol/CCIPReaderTester.bin fcc137fc5a0f322abc37a370eee6b75fda2e26bd7e8859b0c79d0da320a75fa8 ether_sender_receiver: ../../../contracts/solc/ccip/EtherSenderReceiver/EtherSenderReceiver.sol/EtherSenderReceiver.abi.json ../../../contracts/solc/ccip/EtherSenderReceiver/EtherSenderReceiver.sol/EtherSenderReceiver.bin 88973abc1bfbca23a23704e20087ef46f2e20581a13477806308c8f2e664844e -fee_quoter: ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.abi.json ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.bin 38101152e412d1560ba8b17c8b57a91af593ea70b556e76bdd693c521101c89c +fee_quoter: ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.abi.json ../../../contracts/solc/ccip/FeeQuoter/FeeQuoter.sol/FeeQuoter.bin 066ea0bbc80fe65a001ee23fa52a0fa58c5c9dbbfd9822ab904c71a063d1214e lock_release_token_pool: ../../../contracts/solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.abi.json ../../../contracts/solc/ccip/LockReleaseTokenPool/LockReleaseTokenPool.sol/LockReleaseTokenPool.bin 2e73ee0da6f9a9a5722294289b969e4202476706e5d7cdb623e728831c79c28b log_message_data_receiver: ../../../contracts/solc/ccip/LogMessageDataReceiver/LogMessageDataReceiver.sol/LogMessageDataReceiver.abi.json ../../../contracts/solc/ccip/LogMessageDataReceiver/LogMessageDataReceiver.sol/LogMessageDataReceiver.bin 6fe60e48711884eae82dd95cabb1c66a5644336719fa1219df1ceceec11e6bce maybe_revert_message_receiver: ../../../contracts/solc/ccip/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.sol/MaybeRevertMessageReceiver.abi.json ../../../contracts/solc/ccip/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.sol/MaybeRevertMessageReceiver.bin ee264f67a2356cc4eebe839a5a88367cbcdc27a7520cca56263319e9afe97a1a message_hasher: ../../../contracts/solc/ccip/MessageHasher/MessageHasher.sol/MessageHasher.abi.json ../../../contracts/solc/ccip/MessageHasher/MessageHasher.sol/MessageHasher.bin ada9824b9e506bb9619e4e16657631cf87a3a6008f8586beff2893bfe46b0055 mock_usdc_token_messenger: ../../../contracts/solc/ccip/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.sol/MockE2EUSDCTokenMessenger.abi.json ../../../contracts/solc/ccip/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.sol/MockE2EUSDCTokenMessenger.bin ad7902d63667e582b93b2fad139aa53111f9fddcedf92b1d6d122d1ab7ec4bab mock_usdc_token_transmitter: ../../../contracts/solc/ccip/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.sol/MockE2EUSDCTransmitter.abi.json ../../../contracts/solc/ccip/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.sol/MockE2EUSDCTransmitter.bin ae0d090105bc248f4eccd337836ec1db760c506d6f5578e662305abbbc520fcd -multi_aggregate_rate_limiter: ../../../contracts/solc/ccip/MultiAggregateRateLimiter/MultiAggregateRateLimiter.sol/MultiAggregateRateLimiter.abi.json ../../../contracts/solc/ccip/MultiAggregateRateLimiter/MultiAggregateRateLimiter.sol/MultiAggregateRateLimiter.bin d462b10c87ad74b73502c3c97a7fc53771b915adb9a0fbee781e744f3827d179 +multi_aggregate_rate_limiter: ../../../contracts/solc/ccip/MultiAggregateRateLimiter/MultiAggregateRateLimiter.sol/MultiAggregateRateLimiter.abi.json ../../../contracts/solc/ccip/MultiAggregateRateLimiter/MultiAggregateRateLimiter.sol/MultiAggregateRateLimiter.bin 759388e1f0bdeb3fa3fca8cd2dc901a1e8f55279031eb1baed585593056c5b06 multi_ocr3_helper: ../../../contracts/solc/ccip/MultiOCR3Helper/MultiOCR3Helper.sol/MultiOCR3Helper.abi.json ../../../contracts/solc/ccip/MultiOCR3Helper/MultiOCR3Helper.sol/MultiOCR3Helper.bin 05f010e978f8beb0226fd9b8c5413767529a1606b5597c03ee7cdfd857c1647f -nonce_manager: ../../../contracts/solc/ccip/NonceManager/NonceManager.sol/NonceManager.abi.json ../../../contracts/solc/ccip/NonceManager/NonceManager.sol/NonceManager.bin ac76c64749ce07dd2ec1b9346d3401dcc5538253e516aecc4767c4308817ea59 -offramp: ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.abi.json ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.bin 0175497da17d3580e24f116448de47bdb4f1efcfddae119ea77cfc31b34142d3 -offramp_with_message_transformer: ../../../contracts/solc/ccip/OffRampWithMessageTransformer/OffRampWithMessageTransformer.sol/OffRampWithMessageTransformer.abi.json ../../../contracts/solc/ccip/OffRampWithMessageTransformer/OffRampWithMessageTransformer.sol/OffRampWithMessageTransformer.bin 3433de99da372f9c2597239d82cd396c6ac6cdf3241f06ef225674b4aae862fd -onramp: ../../../contracts/solc/ccip/OnRamp/OnRamp.sol/OnRamp.abi.json ../../../contracts/solc/ccip/OnRamp/OnRamp.sol/OnRamp.bin fd60ff9791af289e0f8bb6ee44c7a8248c2e28ca7d508b1a30fdcb690aec98b8 -onramp_with_message_transformer: ../../../contracts/solc/ccip/OnRampWithMessageTransformer/OnRampWithMessageTransformer.sol/OnRampWithMessageTransformer.abi.json ../../../contracts/solc/ccip/OnRampWithMessageTransformer/OnRampWithMessageTransformer.sol/OnRampWithMessageTransformer.bin 63eb65eb3c14f3d3cd421006aff602fd70e53feafc653d469a7e18d64614fbb5 +nonce_manager: ../../../contracts/solc/ccip/NonceManager/NonceManager.sol/NonceManager.abi.json ../../../contracts/solc/ccip/NonceManager/NonceManager.sol/NonceManager.bin cce6e4c0304f23c9578648199c5972c4a9199b697b97bb48fc40437786193f25 +offramp: ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.abi.json ../../../contracts/solc/ccip/OffRamp/OffRamp.sol/OffRamp.bin 1148648496625e82e2fb872f4623989201e0f0e9097569fac8bfc5d8053748c6 +offramp_with_message_transformer: ../../../contracts/solc/ccip/OffRampWithMessageTransformer/OffRampWithMessageTransformer.sol/OffRampWithMessageTransformer.abi.json ../../../contracts/solc/ccip/OffRampWithMessageTransformer/OffRampWithMessageTransformer.sol/OffRampWithMessageTransformer.bin 4b9fb3e2640e25d972df331300fd242ce6340d3418773e54da2069376eb2550c +onramp: ../../../contracts/solc/ccip/OnRamp/OnRamp.sol/OnRamp.abi.json ../../../contracts/solc/ccip/OnRamp/OnRamp.sol/OnRamp.bin b8c493a8d94a34ad93b3a12686163c252854e79831606e0644d6861cc43d422b +onramp_with_message_transformer: ../../../contracts/solc/ccip/OnRampWithMessageTransformer/OnRampWithMessageTransformer.sol/OnRampWithMessageTransformer.abi.json ../../../contracts/solc/ccip/OnRampWithMessageTransformer/OnRampWithMessageTransformer.sol/OnRampWithMessageTransformer.bin 11d32afff3a0506a0950b0fd72d1de654ed9af291499b0a1aff7f6c0ceca7285 ping_pong_demo: ../../../contracts/solc/ccip/PingPongDemo/PingPongDemo.sol/PingPongDemo.abi.json ../../../contracts/solc/ccip/PingPongDemo/PingPongDemo.sol/PingPongDemo.bin c87b6e1a8961a9dd2fab1eced0df12d0c1ef47bb1b2511f372b7e33443a20683 registry_module_owner_custom: ../../../contracts/solc/ccip/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.sol/RegistryModuleOwnerCustom.abi.json ../../../contracts/solc/ccip/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.sol/RegistryModuleOwnerCustom.bin ce04722cdea2e96d791e48c6a99f64559125d34cd24e19cfd5281892d2ed8ef0 report_codec: ../../../contracts/solc/ccip/ReportCodec/ReportCodec.sol/ReportCodec.abi.json ../../../contracts/solc/ccip/ReportCodec/ReportCodec.sol/ReportCodec.bin 5dbf5d817141fb025a8c5e889b7c4481f1e4339587ed72f046199b3199dfedb6 -rmn_home: ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.abi.json ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.bin f13285ef924c4675710e3055b0ecc028a1e0cf4ea3c0e83b31ffe8a76fc6c420 +rmn_home: ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.abi.json ../../../contracts/solc/ccip/RMNHome/RMNHome.sol/RMNHome.bin 96944df89e952dae93205f5975fbec5935d1bfec5187967fc3e242562131f338 rmn_proxy_contract: ../../../contracts/solc/ccip/RMNProxy/RMNProxy.sol/RMNProxy.abi.json ../../../contracts/solc/ccip/RMNProxy/RMNProxy.sol/RMNProxy.bin 4d06f9e5c6f72daef745e6114faed3bae57ad29758d75de5a4eefcd5f0172328 -rmn_remote: ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.abi.json ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.bin 32173df61397fc104bc6bcd9d8e929165ee3911518350dc7f2bb5d1d94875a94 +rmn_remote: ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.abi.json ../../../contracts/solc/ccip/RMNRemote/RMNRemote.sol/RMNRemote.bin e345511af2c05588a6875c9c5cc728732e8728e76217caa3de3966b0051b0ad2 router: ../../../contracts/solc/ccip/Router/Router.sol/Router.abi.json ../../../contracts/solc/ccip/Router/Router.sol/Router.bin 0103ab2fd344179d49f0320d0a47ec8255fe8a401a2f2c8973e8314dc49d2413 -siloed_lock_release_token_pool: ../../../contracts/solc/ccip/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.sol/SiloedLockReleaseTokenPool.abi.json ../../../contracts/solc/ccip/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.sol/SiloedLockReleaseTokenPool.bin f08d3e14a2659499c381cf5a9fc7d985df85c5ee020c7f7cb129d4565b90c3af +siloed_lock_release_token_pool: ../../../contracts/solc/ccip/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.sol/SiloedLockReleaseTokenPool.abi.json ../../../contracts/solc/ccip/SiloedLockReleaseTokenPool/SiloedLockReleaseTokenPool.sol/SiloedLockReleaseTokenPool.bin 67d4668d8a1e7e6504e29b6d0c15f3045d9577d5b8b376a90b2994767510b634 token_admin_registry: ../../../contracts/solc/ccip/TokenAdminRegistry/TokenAdminRegistry.sol/TokenAdminRegistry.abi.json ../../../contracts/solc/ccip/TokenAdminRegistry/TokenAdminRegistry.sol/TokenAdminRegistry.bin 086268b9df56e089a69a96ce3e4fd03a07a00a1c8812ba9504e31930a5c3ff1d token_pool: ../../../contracts/solc/ccip/TokenPool/TokenPool.sol/TokenPool.abi.json ../../../contracts/solc/ccip/TokenPool/TokenPool.sol/TokenPool.bin 6c00ce7b2082f40d5f9b4808eb692a90e81c312b4f5d70d62e4b1ef69a164a9f usdc_reader_tester: ../../../contracts/solc/ccip/USDCReaderTester/USDCReaderTester.sol/USDCReaderTester.abi.json ../../../contracts/solc/ccip/USDCReaderTester/USDCReaderTester.sol/USDCReaderTester.bin 7622b1e42bc9c3933c51607d765d8463796c615155596929e554a58ed68b263d diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go index 3dd4dbc851a..5278ecc0fe0 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go @@ -260,7 +260,7 @@ func TestNewPriceRegistryReader(t *testing.T) { expectedErr: "", }, { - typeAndVersion: "PriceRegistry 1.6.0-dev", + typeAndVersion: "PriceRegistry 1.6.0", expectedErr: "", }, { diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/reader.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/reader.go index a5da4f1d18b..9e4dcc2d365 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/reader.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/reader.go @@ -18,7 +18,8 @@ const ( V1_2_0 = "1.2.0" V1_4_0 = "1.4.0" V1_5_0 = "1.5.0" - V1_6_0 = "1.6.0-dev" + //nolint:revive // was like this before + V1_6_0 = "1.6.0" ) const ( diff --git a/deployment/address_book.go b/deployment/address_book.go index 4daf758eb07..191c43b9867 100644 --- a/deployment/address_book.go +++ b/deployment/address_book.go @@ -23,12 +23,12 @@ var ( type ContractType string var ( - Version1_0_0 = *semver.MustParse("1.0.0") - Version1_1_0 = *semver.MustParse("1.1.0") - Version1_2_0 = *semver.MustParse("1.2.0") - Version1_5_0 = *semver.MustParse("1.5.0") - Version1_5_1 = *semver.MustParse("1.5.1") - Version1_6_0_dev = *semver.MustParse("1.6.0-dev") + Version1_0_0 = *semver.MustParse("1.0.0") + Version1_1_0 = *semver.MustParse("1.1.0") + Version1_2_0 = *semver.MustParse("1.2.0") + Version1_5_0 = *semver.MustParse("1.5.0") + Version1_5_1 = *semver.MustParse("1.5.1") + Version1_6_0 = *semver.MustParse("1.6.0") ) type TypeAndVersion struct { diff --git a/deployment/ccip/changeset/cs_deploy_chain.go b/deployment/ccip/changeset/cs_deploy_chain.go index 1833a5ac011..49a37c504e8 100644 --- a/deployment/ccip/changeset/cs_deploy_chain.go +++ b/deployment/ccip/changeset/cs_deploy_chain.go @@ -314,7 +314,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a rmnLegacyAddr, ) return deployment.ContractDeploy[*rmn_remote.RMNRemote]{ - Address: rmnRemoteAddr, Contract: rmnRemote, Tx: tx, Tv: deployment.NewTypeAndVersion(RMNRemote, deployment.Version1_6_0_dev), Err: err2, + Address: rmnRemoteAddr, Contract: rmnRemote, Tx: tx, Tv: deployment.NewTypeAndVersion(RMNRemote, deployment.Version1_6_0), Err: err2, } }) if err != nil { @@ -375,7 +375,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a []common.Address{}, // Need to add onRamp after ) return deployment.ContractDeploy[*nonce_manager.NonceManager]{ - Address: nonceManagerAddr, Contract: nonceManager, Tx: tx2, Tv: deployment.NewTypeAndVersion(NonceManager, deployment.Version1_6_0_dev), Err: err2, + Address: nonceManagerAddr, Contract: nonceManager, Tx: tx2, Tv: deployment.NewTypeAndVersion(NonceManager, deployment.Version1_6_0), Err: err2, } }) if err != nil { @@ -415,7 +415,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a contractParams.FeeQuoterParams.DestChainConfigArgs, ) return deployment.ContractDeploy[*fee_quoter.FeeQuoter]{ - Address: prAddr, Contract: pr, Tx: tx2, Tv: deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_6_0_dev), Err: err2, + Address: prAddr, Contract: pr, Tx: tx2, Tv: deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_6_0), Err: err2, } }) if err != nil { @@ -446,7 +446,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a []onramp.OnRampDestChainConfigArgs{}, ) return deployment.ContractDeploy[*onramp.OnRamp]{ - Address: onRampAddr, Contract: onRamp, Tx: tx2, Tv: deployment.NewTypeAndVersion(OnRamp, deployment.Version1_6_0_dev), Err: err2, + Address: onRampAddr, Contract: onRamp, Tx: tx2, Tv: deployment.NewTypeAndVersion(OnRamp, deployment.Version1_6_0), Err: err2, } }) if err != nil { @@ -479,7 +479,7 @@ func deployChainContractsEVM(e deployment.Environment, chain deployment.Chain, a []offramp.OffRampSourceChainConfigArgs{}, ) return deployment.ContractDeploy[*offramp.OffRamp]{ - Address: offRampAddr, Contract: offRamp, Tx: tx2, Tv: deployment.NewTypeAndVersion(OffRamp, deployment.Version1_6_0_dev), Err: err2, + Address: offRampAddr, Contract: offRamp, Tx: tx2, Tv: deployment.NewTypeAndVersion(OffRamp, deployment.Version1_6_0), Err: err2, } }) if err != nil { diff --git a/deployment/ccip/changeset/cs_home_chain.go b/deployment/ccip/changeset/cs_home_chain.go index b9a0b4ce245..7dec23610b4 100644 --- a/deployment/ccip/changeset/cs_home_chain.go +++ b/deployment/ccip/changeset/cs_home_chain.go @@ -157,7 +157,7 @@ func deployHomeChain( capReg.Address, ) return deployment.ContractDeploy[*ccip_home.CCIPHome]{ - Address: ccAddr, Tv: deployment.NewTypeAndVersion(CCIPHome, deployment.Version1_6_0_dev), Tx: tx, Err: err2, Contract: cc, + Address: ccAddr, Tv: deployment.NewTypeAndVersion(CCIPHome, deployment.Version1_6_0), Tx: tx, Err: err2, Contract: cc, } }) if err != nil { @@ -178,7 +178,7 @@ func deployHomeChain( chain.Client, ) return deployment.ContractDeploy[*rmn_home.RMNHome]{ - Address: rmnAddr, Tv: deployment.NewTypeAndVersion(RMNHome, deployment.Version1_6_0_dev), Tx: tx, Err: err2, Contract: rmn, + Address: rmnAddr, Tv: deployment.NewTypeAndVersion(RMNHome, deployment.Version1_6_0), Tx: tx, Err: err2, Contract: rmn, } }, ) diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go index 3154b4c6998..cce5ddbf02d 100644 --- a/deployment/ccip/changeset/state.go +++ b/deployment/ccip/changeset/state.go @@ -536,13 +536,13 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, err } state.CapabilityRegistry = cr - case deployment.NewTypeAndVersion(OnRamp, deployment.Version1_6_0_dev).String(): + case deployment.NewTypeAndVersion(OnRamp, deployment.Version1_6_0).String(): onRampC, err := onramp.NewOnRamp(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.OnRamp = onRampC - case deployment.NewTypeAndVersion(OffRamp, deployment.Version1_6_0_dev).String(): + case deployment.NewTypeAndVersion(OffRamp, deployment.Version1_6_0).String(): offRamp, err := offramp.NewOffRamp(common.HexToAddress(address), chain.Client) if err != nil { return state, err @@ -554,13 +554,13 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, err } state.RMNProxy = armProxy - case deployment.NewTypeAndVersion(RMNRemote, deployment.Version1_6_0_dev).String(): + case deployment.NewTypeAndVersion(RMNRemote, deployment.Version1_6_0).String(): rmnRemote, err := rmn_remote.NewRMNRemote(common.HexToAddress(address), chain.Client) if err != nil { return state, err } state.RMNRemote = rmnRemote - case deployment.NewTypeAndVersion(RMNHome, deployment.Version1_6_0_dev).String(): + case deployment.NewTypeAndVersion(RMNHome, deployment.Version1_6_0).String(): rmnHome, err := rmn_home.NewRMNHome(common.HexToAddress(address), chain.Client) if err != nil { return state, err @@ -572,7 +572,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, err } state.Weth9 = weth9 - case deployment.NewTypeAndVersion(NonceManager, deployment.Version1_6_0_dev).String(): + case deployment.NewTypeAndVersion(NonceManager, deployment.Version1_6_0).String(): nm, err := nonce_manager.NewNonceManager(common.HexToAddress(address), chain.Client) if err != nil { return state, err @@ -602,7 +602,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, err } state.TestRouter = r - case deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_6_0_dev).String(): + case deployment.NewTypeAndVersion(FeeQuoter, deployment.Version1_6_0).String(): fq, err := fee_quoter.NewFeeQuoter(common.HexToAddress(address), chain.Client) if err != nil { return state, err @@ -634,7 +634,7 @@ func LoadChainState(ctx context.Context, chain deployment.Chain, addresses map[s return state, err } state.MockUSDCTokenMessenger = utm - case deployment.NewTypeAndVersion(CCIPHome, deployment.Version1_6_0_dev).String(): + case deployment.NewTypeAndVersion(CCIPHome, deployment.Version1_6_0).String(): ccipHome, err := ccip_home.NewCCIPHome(common.HexToAddress(address), chain.Client) if err != nil { return state, err diff --git a/deployment/ccip/view/v1_6/ccip_home_test.go b/deployment/ccip/view/v1_6/ccip_home_test.go index 3d4701d705a..5d6200a604b 100644 --- a/deployment/ccip/view/v1_6/ccip_home_test.go +++ b/deployment/ccip/view/v1_6/ccip_home_test.go @@ -33,7 +33,7 @@ func TestCCIPHomeView(t *testing.T) { v, err := GenerateCCIPHomeView(cr, ch) require.NoError(t, err) - assert.Equal(t, "CCIPHome 1.6.0-dev", v.TypeAndVersion) + assert.Equal(t, "CCIPHome 1.6.0", v.TypeAndVersion) _, err = json.MarshalIndent(v, "", " ") require.NoError(t, err) From 56d9e6a00e8f054a2b0539e794bbc45ddb2526ba Mon Sep 17 00:00:00 2001 From: nogo <110664798+0xnogo@users.noreply.github.com> Date: Tue, 11 Feb 2025 23:38:43 +0400 Subject: [PATCH 23/83] CCIP bump (#16327) * bump * make generate --- core/scripts/go.mod | 3 ++- core/scripts/go.sum | 6 ++++-- deployment/go.mod | 3 ++- deployment/go.sum | 6 ++++-- go.md | 8 ++++++++ go.mod | 7 +++++-- go.sum | 6 ++++-- integration-tests/go.mod | 3 ++- integration-tests/go.sum | 6 ++++-- integration-tests/load/go.mod | 3 ++- integration-tests/load/go.sum | 6 ++++-- 11 files changed, 41 insertions(+), 16 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 723b7196fcf..a698354163c 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -302,13 +302,14 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect + github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index a7fe7098d07..e68226a3768 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1113,8 +1113,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= @@ -1133,6 +1133,8 @@ github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= diff --git a/deployment/go.mod b/deployment/go.mod index 82db28367f2..cfdfc8bf3db 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -31,7 +31,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 @@ -351,6 +351,7 @@ require ( github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect + github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index 89e3289895c..b369ad429d0 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1110,8 +1110,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= @@ -1130,6 +1130,8 @@ github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= diff --git a/go.md b/go.md index 974cd9bf01b..5f270efcee2 100644 --- a/go.md +++ b/go.md @@ -27,6 +27,7 @@ flowchart LR click chainlink-automation href "https://github.com/smartcontractkit/chainlink-automation" chainlink-ccip --> chain-selectors chainlink-ccip --> chainlink-common + chainlink-ccip --> chainlink-protos/rmn/v1.6/go click chainlink-ccip href "https://github.com/smartcontractkit/chainlink-ccip" chainlink-ccip/chains/solana --> chainlink-common click chainlink-ccip/chains/solana href "https://github.com/smartcontractkit/chainlink-ccip" @@ -45,6 +46,8 @@ flowchart LR click chainlink-integrations/evm href "https://github.com/smartcontractkit/chainlink-integrations" chainlink-protos/orchestrator --> wsrpc click chainlink-protos/orchestrator href "https://github.com/smartcontractkit/chainlink-protos" + chainlink-protos/rmn/v1.6/go + click chainlink-protos/rmn/v1.6/go href "https://github.com/smartcontractkit/chainlink-protos" chainlink-protos/svr click chainlink-protos/svr href "https://github.com/smartcontractkit/chainlink-protos" chainlink-solana --> chainlink-ccip @@ -86,6 +89,7 @@ flowchart LR subgraph chainlink-protos-repo[chainlink-protos] chainlink-protos/orchestrator + chainlink-protos/rmn/v1.6/go chainlink-protos/svr end click chainlink-protos-repo href "https://github.com/smartcontractkit/chainlink-protos" @@ -129,6 +133,7 @@ flowchart LR click chainlink-automation href "https://github.com/smartcontractkit/chainlink-automation" chainlink-ccip --> chain-selectors chainlink-ccip --> chainlink-common + chainlink-ccip --> chainlink-protos/rmn/v1.6/go click chainlink-ccip href "https://github.com/smartcontractkit/chainlink-ccip" chainlink-ccip/chains/solana --> chainlink-common click chainlink-ccip/chains/solana href "https://github.com/smartcontractkit/chainlink-ccip" @@ -149,6 +154,8 @@ flowchart LR click chainlink-protos/job-distributor href "https://github.com/smartcontractkit/chainlink-protos" chainlink-protos/orchestrator --> wsrpc click chainlink-protos/orchestrator href "https://github.com/smartcontractkit/chainlink-protos" + chainlink-protos/rmn/v1.6/go + click chainlink-protos/rmn/v1.6/go href "https://github.com/smartcontractkit/chainlink-protos" chainlink-protos/svr click chainlink-protos/svr href "https://github.com/smartcontractkit/chainlink-protos" chainlink-solana --> chainlink-ccip @@ -233,6 +240,7 @@ flowchart LR subgraph chainlink-protos-repo[chainlink-protos] chainlink-protos/job-distributor chainlink-protos/orchestrator + chainlink-protos/rmn/v1.6/go chainlink-protos/svr end click chainlink-protos-repo href "https://github.com/smartcontractkit/chainlink-protos" diff --git a/go.mod b/go.mod index cb3241e2b88..d09aca3e1ec 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 @@ -127,7 +127,10 @@ require ( k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 ) -require github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 // indirect +require ( + github.com/bytecodealliance/wasmtime-go/v28 v28.0.0 // indirect + github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect +) require ( cosmossdk.io/errors v1.0.1 // indirect diff --git a/go.sum b/go.sum index 731145aa9d2..76b94238cb8 100644 --- a/go.sum +++ b/go.sum @@ -1010,8 +1010,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= @@ -1028,6 +1028,8 @@ github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 44cf95ded4e..ec0ded24f8a 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 @@ -429,6 +429,7 @@ require ( github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect + github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 6cbb9711b7e..9ba46f9f817 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1360,8 +1360,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= @@ -1380,6 +1380,8 @@ github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index c8c836baa10..7562966fb2b 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 @@ -416,6 +416,7 @@ require ( github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect + github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 6ac7ddb148a..589add03659 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1343,8 +1343,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09 h1:eQLVvVPKru0szeApqNymCOpLHNWnndllxaDUZhapF/A= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250207152018-27a940edbb09/go.mod h1:UEnHaxkUsfreeA7rR45LMmua1Uen95tOFUR8/AI9BAo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= @@ -1363,6 +1363,8 @@ github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= +github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= From c18343512adcde3a9784fd94a40fc21b02fb2afc Mon Sep 17 00:00:00 2001 From: amit-momin <108959691+amit-momin@users.noreply.github.com> Date: Tue, 11 Feb 2025 15:38:46 -0600 Subject: [PATCH 24/83] Updated the Solana ChainWriter configs (#16214) * Updated the ChainWriter configs to reflect the changes made to the offramp contract * Plumbed offramp address from OCR3 config to ChainWriter config * Fixed PDA internal field locations * Added validation for router IDL * Updated ChainWriter Solana configs with new accounts * Added offramp IDL fetch * Updated CCIP Solana ChainWriter config with lookup options and internal field IDLs * Fixed linting * Moved Solana offramp address conversion into chain specific switch * Addressed feedback * Updated commit method extra accounts to point to fee quoter * Fixed linting * Aligned execute method extra accounts with on-chain changes * Fixed ChainConfigGasPrice seed and addressed feedback * Upgraded chainlink-solana dependency * Fixed linting --- .../ccip/configs/solana/chain_writer.go | 312 ++++++++++++------ .../ccip/configs/solana/chain_writer_test.go | 4 +- .../capabilities/ccip/oraclecreator/plugin.go | 11 +- core/scripts/go.mod | 4 +- core/scripts/go.sum | 8 +- deployment/go.mod | 4 +- deployment/go.sum | 8 +- go.mod | 4 +- go.sum | 8 +- integration-tests/go.mod | 4 +- integration-tests/go.sum | 8 +- integration-tests/load/go.mod | 4 +- integration-tests/load/go.sum | 8 +- 13 files changed, 254 insertions(+), 133 deletions(-) diff --git a/core/capabilities/ccip/configs/solana/chain_writer.go b/core/capabilities/ccip/configs/solana/chain_writer.go index 941c04f7c68..29e6f4a59ed 100644 --- a/core/capabilities/ccip/configs/solana/chain_writer.go +++ b/core/capabilities/ccip/configs/solana/chain_writer.go @@ -1,6 +1,7 @@ package solana import ( + "encoding/binary" "encoding/json" "errors" "fmt" @@ -10,20 +11,24 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/codec" idl "github.com/smartcontractkit/chainlink-ccip/chains/solana" + ccipconsts "github.com/smartcontractkit/chainlink-ccip/pkg/consts" "github.com/smartcontractkit/chainlink-solana/pkg/solana/chainwriter" solanacodec "github.com/smartcontractkit/chainlink-solana/pkg/solana/codec" ) +var ccipOfframpIDL = idl.FetchCCIPOfframpIDL() var ccipRouterIDL = idl.FetchCCIPRouterIDL() const ( - destChainSelectorPath = "Info.AbstractReports.Messages.Header.DestChainSelector" - destTokenAddress = "Info.AbstractReports.Messages.TokenAmounts.DestTokenAddress" - merkleRootChainSelector = "Info.MerkleRoots.ChainSel" + sourceChainSelectorPath = "Info.AbstractReports.Messages.Header.SourceChainSelector" + destChainSelectorPath = "Info.AbstractReports.Messages.Header.DestChainSelector" + destTokenAddress = "Info.AbstractReports.Messages.TokenAmounts.DestTokenAddress" + merkleRootSourceChainSelector = "Info.MerkleRoots.ChainSel" + merkleRoot = "Info.MerkleRoots.MerkleRoot" ) -func getCommitMethodConfig(fromAddress string, routerProgramAddress string, commonAddressesLookupTable solana.PublicKey) chainwriter.MethodConfig { - sysvarInstructionsAddress := solana.SysVarInstructionsPubkey.String() +func getCommitMethodConfig(fromAddress string, offrampProgramAddress string, destChainSelector uint64) chainwriter.MethodConfig { + destChainSelectorBytes := binary.LittleEndian.AppendUint64([]byte{}, destChainSelector) return chainwriter.MethodConfig{ FromAddress: fromAddress, InputModifications: []codec.ModifierConfig{ @@ -36,91 +41,98 @@ func getCommitMethodConfig(fromAddress string, routerProgramAddress string, comm }, ChainSpecificName: "commit", LookupTables: chainwriter.LookupTables{ - StaticLookupTables: []solana.PublicKey{ - commonAddressesLookupTable, + DerivedLookupTables: []chainwriter.DerivedLookupTable{ + getCommonAddressLookupTableConfig(offrampProgramAddress), }, }, Accounts: []chainwriter.Lookup{ - getRouterAccountConfig(routerProgramAddress), + getOfframpAccountConfig(offrampProgramAddress), + getReferenceAddressesConfig(offrampProgramAddress), chainwriter.PDALookups{ - Name: "SourceChainState", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - }, + Name: "SourceChainState", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("source_chain_state")}, - {Dynamic: chainwriter.AccountLookup{Location: merkleRootChainSelector}}, + {Dynamic: chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}, }, IsSigner: false, IsWritable: true, }, chainwriter.PDALookups{ - Name: "RouterReportAccount", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - IsSigner: false, - IsWritable: false, - }, + Name: "CommitReport", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("commit_report")}, - {Dynamic: chainwriter.AccountLookup{Location: merkleRootChainSelector}}, - {Dynamic: chainwriter.AccountLookup{ - Location: "Info.MerkleRoots.MerkleRoot", - }}, + {Dynamic: chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}, + {Dynamic: chainwriter.AccountLookup{Location: merkleRoot}}, }, IsSigner: false, - IsWritable: false, + IsWritable: true, }, getAuthorityAccountConstant(fromAddress), getSystemProgramConstant(), - chainwriter.AccountConstant{ - Name: "SysvarInstructions", - Address: sysvarInstructionsAddress, - IsSigner: true, + getSysVarInstructionConstant(), + getFeeBillingSignerConfig(offrampProgramAddress), + getFeeQuoterConfig(offrampProgramAddress), + chainwriter.PDALookups{ + Name: "FeeQuoterAllowedPriceUpdater", + // Fetch fee quoter public key to use as program ID for PDA + PublicKey: getFeeQuoterConfig(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("allowed_price_updater")}, + {Dynamic: getFeeBillingSignerConfig(offrampProgramAddress)}, + }, + IsSigner: false, IsWritable: false, }, chainwriter.PDALookups{ - Name: "GlobalState", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, + Name: "FeeQuoterConfig", + // Fetch fee quoter public key to use as program ID for PDA + PublicKey: getFeeQuoterConfig(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("config")}, }, + IsSigner: false, + IsWritable: false, + }, + chainwriter.PDALookups{ + Name: "GlobalState", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("state")}, }, IsSigner: false, IsWritable: false, + LookupOpts: chainwriter.LookupOpts{Optional: true}, }, chainwriter.PDALookups{ - Name: "BillingTokenConfig", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - }, + Name: "BillingTokenConfig", + PublicKey: getFeeQuoterConfig(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("fee_billing_token_config")}, {Dynamic: chainwriter.AccountLookup{Location: "Info.TokenPrices.TokenID"}}, }, IsSigner: false, IsWritable: false, + LookupOpts: chainwriter.LookupOpts{Optional: true}, }, chainwriter.PDALookups{ - Name: "ChainConfigGasPrice", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - }, + Name: "ChainConfigGasPrice", + PublicKey: getFeeQuoterConfig(offrampProgramAddress), Seeds: []chainwriter.Seed{ - {Static: []byte("dest_chain_state")}, - {Dynamic: chainwriter.AccountLookup{Location: merkleRootChainSelector}}, + {Static: []byte("dest_chain")}, + {Static: destChainSelectorBytes}, }, IsSigner: false, IsWritable: false, + LookupOpts: chainwriter.LookupOpts{Optional: true}, }, }, DebugIDLocation: "", } } -func getExecuteMethodConfig(fromAddress string, routerProgramAddress string, commonAddressesLookupTable solana.PublicKey) chainwriter.MethodConfig { - sysvarInstructionsAddress := solana.SysVarInstructionsPubkey.String() +func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) chainwriter.MethodConfig { return chainwriter.MethodConfig{ FromAddress: fromAddress, InputModifications: []codec.ModifierConfig{ @@ -138,10 +150,8 @@ func getExecuteMethodConfig(fromAddress string, routerProgramAddress string, com { Name: "PoolLookupTable", Accounts: chainwriter.PDALookups{ - Name: "TokenAdminRegistry", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - }, + Name: "TokenAdminRegistry", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, }, @@ -150,49 +160,56 @@ func getExecuteMethodConfig(fromAddress string, routerProgramAddress string, com InternalField: chainwriter.InternalField{ TypeName: "TokenAdminRegistry", Location: "LookupTable", + // TokenAdminRegistry is in the router program so need to provide the router's IDL + IDL: ccipRouterIDL, }, }, }, - }, - StaticLookupTables: []solana.PublicKey{ - commonAddressesLookupTable, + getCommonAddressLookupTableConfig(offrampProgramAddress), }, }, Accounts: []chainwriter.Lookup{ - getRouterAccountConfig(routerProgramAddress), + getOfframpAccountConfig(offrampProgramAddress), + getReferenceAddressesConfig(offrampProgramAddress), chainwriter.PDALookups{ - Name: "SourceChainState", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - }, + Name: "SourceChainState", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("source_chain_state")}, - {Dynamic: chainwriter.AccountLookup{Location: destChainSelectorPath}}, + {Dynamic: chainwriter.AccountLookup{Location: sourceChainSelectorPath}}, }, IsSigner: false, IsWritable: false, }, chainwriter.PDALookups{ - Name: "CommitReport", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - }, + Name: "CommitReport", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ - {Static: []byte("external_execution_config")}, - {Dynamic: chainwriter.AccountLookup{Location: destChainSelectorPath}}, + {Static: []byte("commit_report")}, + {Dynamic: chainwriter.AccountLookup{Location: sourceChainSelectorPath}}, {Dynamic: chainwriter.AccountLookup{ // The seed is the merkle root of the report, as passed into the input params. - Location: "Info.MerkleRoots.MerkleRoot", + Location: merkleRoot, }}, }, IsSigner: false, IsWritable: true, }, + getAddressConstant(offrampProgramAddress), chainwriter.PDALookups{ - Name: "ExternalExecutionConfig", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, + Name: "AllowedOfframp", + PublicKey: getRouterConfig(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("allowed_offramp")}, + {Dynamic: chainwriter.AccountLookup{Location: sourceChainSelectorPath}}, + {Dynamic: getAddressConstant(offrampProgramAddress)}, }, + IsSigner: false, + IsWritable: false, + }, + chainwriter.PDALookups{ + Name: "ExternalExecutionConfig", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("external_execution_config")}, }, @@ -201,17 +218,10 @@ func getExecuteMethodConfig(fromAddress string, routerProgramAddress string, com }, getAuthorityAccountConstant(fromAddress), getSystemProgramConstant(), - chainwriter.AccountConstant{ - Name: "SysvarInstructions", - Address: sysvarInstructionsAddress, - IsSigner: true, - IsWritable: false, - }, + getSysVarInstructionConstant(), chainwriter.PDALookups{ - Name: "ExternalTokenPoolsSigner", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - }, + Name: "ExternalTokenPoolsSigner", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("external_token_pools_signer")}, }, @@ -223,6 +233,7 @@ func getExecuteMethodConfig(fromAddress string, routerProgramAddress string, com Location: "Info.AbstractReports.Message.ExtraArgsDecoded.Accounts", IsWritable: chainwriter.MetaBool{BitmapLocation: "Info.AbstractReports.Message.ExtraArgsDecoded.IsWritableBitmap"}, IsSigner: chainwriter.MetaBool{Value: false}, + LookupOpts: chainwriter.LookupOpts{Optional: true}, }, chainwriter.PDALookups{ Name: "ReceiverAssociatedTokenAccount", @@ -240,19 +251,19 @@ func getExecuteMethodConfig(fromAddress string, routerProgramAddress string, com }, IsSigner: false, IsWritable: false, + LookupOpts: chainwriter.LookupOpts{Optional: true}, }, chainwriter.PDALookups{ - Name: "PerChainTokenConfig", - PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, - }, + Name: "PerChainTokenConfig", + PublicKey: getFeeQuoterConfig(offrampProgramAddress), Seeds: []chainwriter.Seed{ - {Static: []byte("ccip_tokenpool_billing")}, - {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, + {Static: []byte("per_chain_per_token_config")}, {Dynamic: chainwriter.AccountLookup{Location: destChainSelectorPath}}, + {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, }, IsSigner: false, IsWritable: false, + LookupOpts: chainwriter.LookupOpts{Optional: true}, }, chainwriter.PDALookups{ Name: "PoolChainConfig", @@ -261,23 +272,25 @@ func getExecuteMethodConfig(fromAddress string, routerProgramAddress string, com IncludeIndexes: []int{2}, }, Seeds: []chainwriter.Seed{ - {Static: []byte("ccip_tokenpool_billing")}, - {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, + {Static: []byte("ccip_tokenpool_chainconfig")}, {Dynamic: chainwriter.AccountLookup{Location: destChainSelectorPath}}, + {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, }, IsSigner: false, IsWritable: false, + LookupOpts: chainwriter.LookupOpts{Optional: true}, }, chainwriter.AccountsFromLookupTable{ LookupTableName: "PoolLookupTable", IncludeIndexes: []int{}, + LookupOpts: chainwriter.LookupOpts{Optional: true}, }, }, - DebugIDLocation: "AbstractReport.Message.MessageID", + DebugIDLocation: "Info.AbstractReports.Messages.Header.MessageID", } } -func GetSolanaChainWriterConfig(routerProgramAddress string, commonAddressesLookupTable solana.PublicKey, fromAddress string) (chainwriter.ChainWriterConfig, error) { +func GetSolanaChainWriterConfig(offrampProgramAddress string, fromAddress string, destChainSelector uint64) (chainwriter.ChainWriterConfig, error) { // check fromAddress pk, err := solana.PublicKeyFromBase58(fromAddress) if err != nil { @@ -288,32 +301,40 @@ func GetSolanaChainWriterConfig(routerProgramAddress string, commonAddressesLook return chainwriter.ChainWriterConfig{}, errors.New("from address cannot be empty") } + // validate CCIP Offramp IDL, errors not expected + var offrampIDL solanacodec.IDL + if err = json.Unmarshal([]byte(ccipOfframpIDL), &offrampIDL); err != nil { + return chainwriter.ChainWriterConfig{}, fmt.Errorf("unexpected error: invalid CCIP Offramp IDL, error: %w", err) + } // validate CCIP Router IDL, errors not expected - var idl solanacodec.IDL - if err = json.Unmarshal([]byte(ccipRouterIDL), &idl); err != nil { + var routerIDL solanacodec.IDL + if err = json.Unmarshal([]byte(ccipOfframpIDL), &routerIDL); err != nil { return chainwriter.ChainWriterConfig{}, fmt.Errorf("unexpected error: invalid CCIP Router IDL, error: %w", err) } - - // solConfig references the ccip_example_config.go from github.com/smartcontractkit/chainlink-solana/pkg/solana/chainwriter, which is currently subject to change solConfig := chainwriter.ChainWriterConfig{ Programs: map[string]chainwriter.ProgramConfig{ - "ccip-router": { + ccipconsts.ContractNameOffRamp: { Methods: map[string]chainwriter.MethodConfig{ - "execute": getExecuteMethodConfig(fromAddress, routerProgramAddress, commonAddressesLookupTable), - "commit": getCommitMethodConfig(fromAddress, routerProgramAddress, commonAddressesLookupTable), + ccipconsts.MethodExecute: getExecuteMethodConfig(fromAddress, offrampProgramAddress), + ccipconsts.MethodCommit: getCommitMethodConfig(fromAddress, offrampProgramAddress, destChainSelector), }, - IDL: ccipRouterIDL}, + IDL: ccipOfframpIDL, + }, + // Required for the CCIP args transform configured for the execute method which relies on the TokenAdminRegistry stored in the router + ccipconsts.ContractNameRouter: { + IDL: ccipRouterIDL, + }, }, } return solConfig, nil } -func getRouterAccountConfig(routerProgramAddress string) chainwriter.PDALookups { +func getOfframpAccountConfig(offrampProgramAddress string) chainwriter.PDALookups { return chainwriter.PDALookups{ - Name: "RouterAccountConfig", + Name: "OfframpAccountConfig", PublicKey: chainwriter.AccountConstant{ - Address: routerProgramAddress, + Address: offrampProgramAddress, }, Seeds: []chainwriter.Seed{ {Static: []byte("config")}, @@ -323,6 +344,94 @@ func getRouterAccountConfig(routerProgramAddress string) chainwriter.PDALookups } } +func getAddressConstant(address string) chainwriter.AccountConstant { + return chainwriter.AccountConstant{ + Address: address, + IsSigner: false, + IsWritable: false, + } +} + +func getFeeQuoterConfig(offrampProgramAddress string) chainwriter.PDALookups { + return chainwriter.PDALookups{ + Name: ccipconsts.ContractNameFeeQuoter, + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("reference_addresses")}, + }, + IsSigner: false, + IsWritable: false, + // Reads the address from the reference addresses account + InternalField: chainwriter.InternalField{ + TypeName: "ReferenceAddresses", + Location: "FeeQuoter", + IDL: ccipOfframpIDL, + }, + } +} + +func getRouterConfig(offrampProgramAddress string) chainwriter.PDALookups { + return chainwriter.PDALookups{ + Name: ccipconsts.ContractNameRouter, + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("reference_addresses")}, + }, + IsSigner: false, + IsWritable: false, + // Reads the address from the reference addresses account + InternalField: chainwriter.InternalField{ + TypeName: "ReferenceAddresses", + Location: "Router", + IDL: ccipOfframpIDL, + }, + } +} + +func getReferenceAddressesConfig(offrampProgramAddress string) chainwriter.PDALookups { + return chainwriter.PDALookups{ + Name: "ReferenceAddresses", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("reference_addresses")}, + }, + IsSigner: false, + IsWritable: false, + } +} + +func getFeeBillingSignerConfig(offrampProgramAddress string) chainwriter.PDALookups { + return chainwriter.PDALookups{ + Name: "FeeBillingSigner", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("fee_billing_signer")}, + }, + IsSigner: false, + IsWritable: false, + } +} + +// getCommonAddressLookupTableConfig returns the lookup table config that fetches the lookup table address from a PDA on-chain +// The offramp contract contains a PDA with a ReferenceAddresses struct that stores the lookup table address in the OfframpLookupTable field +func getCommonAddressLookupTableConfig(offrampProgramAddress string) chainwriter.DerivedLookupTable { + return chainwriter.DerivedLookupTable{ + Name: "CommonAddressLookupTable", + Accounts: chainwriter.PDALookups{ + Name: "OfframpLookupTable", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("reference_addresses")}, + }, + InternalField: chainwriter.InternalField{ + TypeName: "ReferenceAddresses", + Location: "OfframpLookupTable", + IDL: ccipOfframpIDL, + }, + }, + } +} + func getAuthorityAccountConstant(fromAddress string) chainwriter.AccountConstant { return chainwriter.AccountConstant{ Name: "Authority", @@ -340,3 +449,12 @@ func getSystemProgramConstant() chainwriter.AccountConstant { IsWritable: false, } } + +func getSysVarInstructionConstant() chainwriter.AccountConstant { + return chainwriter.AccountConstant{ + Name: "SysvarInstructions", + Address: solana.SysVarInstructionsPubkey.String(), + IsSigner: false, + IsWritable: false, + } +} diff --git a/core/capabilities/ccip/configs/solana/chain_writer_test.go b/core/capabilities/ccip/configs/solana/chain_writer_test.go index 3915185ab06..e47837e9b6a 100644 --- a/core/capabilities/ccip/configs/solana/chain_writer_test.go +++ b/core/capabilities/ccip/configs/solana/chain_writer_test.go @@ -3,7 +3,6 @@ package solana import ( "testing" - "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/assert" ) @@ -25,10 +24,9 @@ func TestChainWriterConfigRaw(t *testing.T) { }, } - commonAddressesLookupTable := solana.MustPublicKeyFromBase58("4Nn9dsYBcSTzRbK9hg9kzCUdrCSkMZq1UR6Vw1Tkaf6H") for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - _, err := GetSolanaChainWriterConfig("4Nn9dsYBcSTzRbK9hg9kzCUdrCSkMZq1UR6Vw1Tkaf6H", commonAddressesLookupTable, tt.fromAddress) + _, err := GetSolanaChainWriterConfig("4Nn9dsYBcSTzRbK9hg9kzCUdrCSkMZq1UR6Vw1Tkaf6H", tt.fromAddress, 0) if tt.expectedError != "" { assert.EqualError(t, err, tt.expectedError) } else { diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go index 0c577e7ef62..e9cab490893 100644 --- a/core/capabilities/ccip/oraclecreator/plugin.go +++ b/core/capabilities/ccip/oraclecreator/plugin.go @@ -441,7 +441,10 @@ func (i *pluginOracleCreator) createReadersAndWriters( relayer, i.transmitters, execBatchGasLimit, - relayChainFamily) + relayChainFamily, + config.Config.OfframpAddress, + chainDetails.ChainSelector, + ) if err1 != nil { return nil, nil, err1 } @@ -561,6 +564,8 @@ func createChainWriter( transmitters map[types.RelayID][]string, execBatchGasLimit uint64, chainFamily string, + offrampProgramAddress []byte, + destChainSelector uint64, ) (types.ContractWriter, error) { var err error var chainWriterConfig []byte @@ -569,8 +574,8 @@ func createChainWriter( switch chainFamily { case relay.NetworkSolana: var solConfig chainwriter.ChainWriterConfig - // TODO once on-chain account lookup address are available, the routerProgramAddress and commonAddressesLookupTable should be provided from tooling config, and populated here for the params. - if solConfig, err = solanaconfig.GetSolanaChainWriterConfig("", solana.PublicKey{}, transmitter[0]); err == nil { + offrampAddress := solana.PublicKeyFromBytes(offrampProgramAddress) + if solConfig, err = solanaconfig.GetSolanaChainWriterConfig(offrampAddress.String(), transmitter[0], destChainSelector); err == nil { return nil, fmt.Errorf("failed to get Solana chain writer config: %w", err) } if chainWriterConfig, err = json.Marshal(solConfig); err != nil { diff --git a/core/scripts/go.mod b/core/scripts/go.mod index a698354163c..52434be5c18 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -306,12 +306,12 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect - github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect + github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index e68226a3768..bfd2ac4c564 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1125,8 +1125,8 @@ github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6An github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= @@ -1137,8 +1137,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVoZN8VwJb/kAZsbDjW+6cgZPgNTcQHJUH9JrA= diff --git a/deployment/go.mod b/deployment/go.mod index cfdfc8bf3db..b8eaca13dcb 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -34,10 +34,10 @@ require ( github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 + github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 diff --git a/deployment/go.sum b/deployment/go.sum index b369ad429d0..c23821fc2bc 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1122,8 +1122,8 @@ github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6An github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= @@ -1134,8 +1134,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVoZN8VwJb/kAZsbDjW+6cgZPgNTcQHJUH9JrA= diff --git a/go.mod b/go.mod index d09aca3e1ec..96f051ba54c 100644 --- a/go.mod +++ b/go.mod @@ -84,10 +84,10 @@ require ( github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-feeds v0.1.1 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a - github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 + github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de diff --git a/go.sum b/go.sum index 76b94238cb8..b6ab5437d7a 100644 --- a/go.sum +++ b/go.sum @@ -1022,8 +1022,8 @@ github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6An github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= @@ -1032,8 +1032,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index ec0ded24f8a..861b2f96e64 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -427,11 +427,11 @@ require ( github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect - github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect + github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 9ba46f9f817..e6f3bedc1fc 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1372,8 +1372,8 @@ github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6An github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= @@ -1384,8 +1384,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 7562966fb2b..b40b000350c 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -413,12 +413,12 @@ require ( github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect - github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 // indirect + github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 // indirect github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 // indirect github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 589add03659..34054f8eb39 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1355,8 +1355,8 @@ github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6An github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a h1:zllQ6pOs1T0oiDNK3EHr7ABy1zHp+2oxoCuVE/hK+uI= github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678 h1:3CWUXtDkNppMkXIsKZdDp1ZP2ELkZ3e33h3InZB7TRA= -github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250205171936-649f95193678/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= +github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= @@ -1367,8 +1367,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0 h1:7aVq8aHYRSa3X5mhR4ucuyIXoHtAkOUfBGXzof6F7bQ= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250207060333-005a15b407b0/go.mod h1:opSOqV40CJKODdTpFAQTTOOQP3+WiPLXtBEiC+pLizc= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE= From 8c8cd4eee84decc6431601f8a344396d2b291835 Mon Sep 17 00:00:00 2001 From: Adam Hamrick Date: Tue, 11 Feb 2025 18:03:05 -0500 Subject: [PATCH 25/83] Updates flakeguard to reduce data sent to splunk (#16335) --- .github/workflows/flakeguard.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/flakeguard.yml b/.github/workflows/flakeguard.yml index 79b4cba7229..ba20378a79a 100644 --- a/.github/workflows/flakeguard.yml +++ b/.github/workflows/flakeguard.yml @@ -133,7 +133,7 @@ jobs: - name: Install flakeguard if: ${{ inputs.runAllTests == false }} shell: bash - run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@76e3b96cab242e7fc4be2a296b4232335e245a67 # flakguard@0.1.0 + run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@49bbad97ccd743e7b704e4a17f92c475f2ee044d # flakguard@0.1.0 - name: Find new or updated test packages if: ${{ inputs.runAllTests == false && env.RUN_CUSTOM_TEST_PACKAGES == '' }} @@ -334,7 +334,7 @@ jobs: - name: Install flakeguard shell: bash - run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@76e3b96cab242e7fc4be2a296b4232335e245a67 # flakguard@0.1.0 + run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@49bbad97ccd743e7b704e4a17f92c475f2ee044d # flakguard@0.1.0 - name: Run tests with flakeguard shell: bash @@ -411,7 +411,7 @@ jobs: - name: Install flakeguard shell: bash - run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@76e3b96cab242e7fc4be2a296b4232335e245a67 # flakguard@0.1.0 + run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@49bbad97ccd743e7b704e4a17f92c475f2ee044d # flakguard@0.1.0 - name: Aggregate Flakeguard Results id: results From 2f260f71d049f1f712c786b545d2cbee2c95aabd Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Tue, 11 Feb 2025 16:17:27 -0800 Subject: [PATCH 26/83] chore: disable solana artifact builds for certain tests (#16338) --- .github/workflows/ci-core.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index 3f1bf939bf7..8c3af9e18c0 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -176,15 +176,15 @@ jobs: type: - cmd: go_core_tests os: ubuntu22.04-32cores-128GB - printResults: true + build-solana-artifacts: 'false' - cmd: go_core_tests_integration os: ubuntu22.04-32cores-128GB - printResults: true + build-solana-artifacts: 'false' - cmd: go_core_ccip_deployment_tests os: ubuntu22.04-32cores-128GB - printResults: true - cmd: go_core_fuzz os: ubuntu22.04-8cores-32GB + build-solana-artifacts: 'false' - cmd: go_core_race_tests # use 64cores for certain scheduled runs only os: ${{ needs.run-frequency.outputs.two-per-day-frequency == 'true' && 'ubuntu-latest-64cores-256GB' || 'ubuntu-latest-32cores-128GB' }} @@ -230,7 +230,8 @@ jobs: uses: ./.github/actions/setup-solana - name: Build Solana artifacts - if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }} + # do not build for core tests, core 'integration' tests, or fuzz tests + if: ${{ needs.filter.outputs.should-run-ci-core == 'true' && matrix.type.build-solana-artifacts != 'false' }} uses: ./.github/actions/setup-solana/build-contracts - name: Setup wasmd From d4eb16f864119239e95f6157362134ae83844a1c Mon Sep 17 00:00:00 2001 From: Dylan Tinianov Date: Wed, 12 Feb 2025 03:43:40 -0500 Subject: [PATCH 27/83] Bump framework + solana + integrations (#16325) * Bump framework + solana + integrations * bump solana * Bump integrations * Bump solana * Delete coverage.txt * bump integrations --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 52434be5c18..5086416d985 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -36,7 +36,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 github.com/spf13/cobra v1.8.1 diff --git a/core/scripts/go.sum b/core/scripts/go.sum index bfd2ac4c564..3d91012586a 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1127,8 +1127,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/deployment/go.mod b/deployment/go.mod index b8eaca13dcb..4397325a97b 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -35,7 +35,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 diff --git a/deployment/go.sum b/deployment/go.sum index c23821fc2bc..f492e8a7453 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1124,8 +1124,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/go.mod b/go.mod index 96f051ba54c..64625e89e53 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( github.com/smartcontractkit/chainlink-feeds v0.1.1 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 diff --git a/go.sum b/go.sum index b6ab5437d7a..a7acdc271d1 100644 --- a/go.sum +++ b/go.sum @@ -1024,8 +1024,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 861b2f96e64..cdc84f15e93 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -51,7 +51,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index e6f3bedc1fc..633358694e0 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1374,8 +1374,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index b40b000350c..e1bb093cd39 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -30,7 +30,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 34054f8eb39..403b6cdf390 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1357,8 +1357,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406 h1:aOEqsgoTmdpTW7i1uIxtXNvVCpUDOEViTxpcPNaAe98= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211093128-285968896406/go.mod h1:sCZR6tZ7O72RmDNC44VsfFToHr/JA/Td99S//wsDHn4= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= From d3b8e3a0bf3887c4f2b8a26779b044734e02489f Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Wed, 12 Feb 2025 02:45:54 -0600 Subject: [PATCH 28/83] update modgraph (#16342) --- go.md | 6 ++++-- tools/bin/modgraph | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/go.md b/go.md index 5f270efcee2..0a9ebdb8455 100644 --- a/go.md +++ b/go.md @@ -6,12 +6,13 @@ flowchart LR chainlink-cosmos chainlink-solana chainlink-starknet/relayer - chainlink-evm + chainlink-integrations/evm end subgraph products chainlink-automation chainlink-ccip + chainlink-ccip/chains/solana chainlink-data-streams chainlink-feeds chainlink-functions @@ -110,12 +111,13 @@ flowchart LR chainlink-cosmos chainlink-solana chainlink-starknet/relayer - chainlink-evm + chainlink-integrations/evm end subgraph products chainlink-automation chainlink-ccip + chainlink-ccip/chains/solana chainlink-data-streams chainlink-feeds chainlink-functions diff --git a/tools/bin/modgraph b/tools/bin/modgraph index fdb9789b044..fb956d6b2a3 100755 --- a/tools/bin/modgraph +++ b/tools/bin/modgraph @@ -12,12 +12,13 @@ flowchart LR chainlink-cosmos chainlink-solana chainlink-starknet/relayer - chainlink-evm + chainlink-integrations/evm end subgraph products chainlink-automation chainlink-ccip + chainlink-ccip/chains/solana chainlink-data-streams chainlink-feeds chainlink-functions @@ -37,12 +38,13 @@ flowchart LR chainlink-cosmos chainlink-solana chainlink-starknet/relayer - chainlink-evm + chainlink-integrations/evm end subgraph products chainlink-automation chainlink-ccip + chainlink-ccip/chains/solana chainlink-data-streams chainlink-feeds chainlink-functions From 5f02ba508cd47597f6c703b3ccbd5f33c246d015 Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Wed, 12 Feb 2025 05:36:37 -0500 Subject: [PATCH 29/83] split solana offramp init (#16334) * split offramp init * gomodtidy * add update changeset * fix changeset comment --------- Co-authored-by: jlaveracll --- .changeset/wild-bikes-guess.md | 5 +++++ core/scripts/go.mod | 4 ++-- core/scripts/go.sum | 8 +++---- .../ccip/changeset/solana/cs_deploy_chain.go | 21 ++++++++++++++----- deployment/go.mod | 4 ++-- deployment/go.sum | 8 +++---- integration-tests/go.mod | 4 ++-- integration-tests/go.sum | 8 +++---- integration-tests/load/go.mod | 4 ++-- integration-tests/load/go.sum | 8 +++---- 10 files changed, 45 insertions(+), 29 deletions(-) create mode 100644 .changeset/wild-bikes-guess.md diff --git a/.changeset/wild-bikes-guess.md b/.changeset/wild-bikes-guess.md new file mode 100644 index 00000000000..1e9e187f0bc --- /dev/null +++ b/.changeset/wild-bikes-guess.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal add binding call to new config initialize method diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 5086416d985..a90296ba3ea 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -302,8 +302,8 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 3d91012586a..9b60cb8e5ba 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1113,10 +1113,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 h1:0ppmV08aZdRcoaaNqKE9TYA4PF9UYEVuJ84sXEIN+co= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain.go b/deployment/ccip/changeset/solana/cs_deploy_chain.go index 08139899043..2623e69a9c5 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain.go @@ -188,10 +188,7 @@ func intializeOffRamp( offRampExternalExecutionConfigPDA, _, _ := solState.FindExternalExecutionConfigPDA(offRampAddress) offRampTokenPoolsSignerPDA, _, _ := solState.FindExternalTokenPoolsSignerPDA(offRampAddress) - instruction, err := solOffRamp.NewInitializeInstruction( - chain.Selector, - deployment.EnableExecutionAfter, - offRampConfigPDA, + initIx, err := solOffRamp.NewInitializeInstruction( offRampReferenceAddressesPDA, ccipRouterProgram, feeQuoterAddress, @@ -208,7 +205,21 @@ func intializeOffRamp( if err != nil { return fmt.Errorf("failed to build instruction: %w", err) } - if err := chain.Confirm([]solana.Instruction{instruction}); err != nil { + + initConfigIx, err := solOffRamp.NewInitializeConfigInstruction( + chain.Selector, + deployment.EnableExecutionAfter, + offRampConfigPDA, + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + offRampAddress, + programData.Address, + ).ValidateAndBuild() + + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + if err := chain.Confirm([]solana.Instruction{initIx, initConfigIx}); err != nil { return fmt.Errorf("failed to confirm instructions: %w", err) } e.Logger.Infow("Initialized offRamp", "chain", chain.String()) diff --git a/deployment/go.mod b/deployment/go.mod index 4397325a97b..46b50d4460e 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -31,8 +31,8 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 diff --git a/deployment/go.sum b/deployment/go.sum index f492e8a7453..574e8f0be17 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1110,10 +1110,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 h1:0ppmV08aZdRcoaaNqKE9TYA4PF9UYEVuJ84sXEIN+co= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index cdc84f15e93..8ebe81a7f5e 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 @@ -423,7 +423,7 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 633358694e0..5e3d1f90395 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1360,10 +1360,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 h1:0ppmV08aZdRcoaaNqKE9TYA4PF9UYEVuJ84sXEIN+co= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index e1bb093cd39..8071edeb4d5 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 @@ -409,7 +409,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 403b6cdf390..1738c372886 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1343,10 +1343,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f h1:43zbfJBsJz6vyiNN0m3QLLWJQ7V8gUdR0ypoC0J3xKc= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211080425-26dc02d5359f/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 h1:0ppmV08aZdRcoaaNqKE9TYA4PF9UYEVuJ84sXEIN+co= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= From a73f9adb42705fe38fd0743f1a0a1140cd4dc034 Mon Sep 17 00:00:00 2001 From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com> Date: Wed, 12 Feb 2025 05:37:49 -0800 Subject: [PATCH 30/83] Versioned gethwrappers (#16337) * move gethwrappers to corresponding versioned folders make it new * more changes * fix imports * fix more imports * lint fixes * import fix * crib * remove versions from file names/package names (#16345) * remove versions from file names/package names * generate latest ccip wrappers in generated/latest * bring back lbtc token pool * fix test imports * move around stuff, fix imports * add back accidentally deleted files * fix mockery * fix imports in scripts * rm unused test file * pin imports where applicable, mockery --------- Co-authored-by: Makram --- .mockery.yaml | 15 +- .../ccip_integration_tests/home_chain_test.go | 2 +- .../integrationhelpers/integration_helpers.go | 4 +- .../rmn/rmn_home_test.go | 2 +- .../usdcreader/usdcreader_test.go | 2 +- core/capabilities/ccip/ccipevm/commitcodec.go | 2 +- .../capabilities/ccip/ccipevm/executecodec.go | 3 +- .../ccip/ccipevm/executecodec_test.go | 6 +- .../ccip/ccipevm/extradatadecoder_test.go | 2 +- .../capabilities/ccip/ccipevm/helpers_test.go | 2 +- core/capabilities/ccip/ccipevm/msghasher.go | 2 +- .../ccip/ccipevm/msghasher_test.go | 2 +- .../ccip/configs/evm/chain_writer.go | 3 +- .../ccip/configs/evm/contract_reader.go | 19 +- .../ccip/launcher/integration_test.go | 3 +- .../ocrimpls/contract_transmitter_test.go | 2 +- .../ccip/deployment_test/deployment_test.go | 14 +- .../burn_from_mint_token_pool.go | 0 .../burn_mint_token_pool.go | 0 .../burn_to_address_mint_token_pool.go | 0 .../burn_with_from_mint_token_pool.go | 0 .../ccip_encoding_utils.go | 0 .../{ => latest}/ccip_home/ccip_home.go | 0 .../ccip_reader_tester/ccip_reader_tester.go | 0 .../ether_sender_receiver.go | 0 .../{ => latest}/fee_quoter/fee_quoter.go | 0 .../lock_release_token_pool.go | 0 .../log_message_data_receiver.go | 0 .../maybe_revert_message_receiver.go | 0 .../message_hasher/message_hasher.go | 0 .../mock_usdc_token_messenger.go | 0 .../mock_usdc_token_transmitter.go | 0 .../multi_aggregate_rate_limiter.go | 0 .../multi_ocr3_helper/multi_ocr3_helper.go | 0 .../nonce_manager/nonce_manager.go | 0 .../generated/{ => latest}/offramp/offramp.go | 0 .../offramp_with_message_transformer.go | 0 .../generated/{ => latest}/onramp/onramp.go | 0 .../onramp_with_message_transformer.go | 0 .../ping_pong_demo/ping_pong_demo.go | 0 .../registry_module_owner_custom.go | 0 .../{ => latest}/report_codec/report_codec.go | 0 .../{ => latest}/rmn_home/rmn_home.go | 0 .../rmn_proxy_contract/rmn_proxy_contract.go | 0 .../{ => latest}/rmn_remote/rmn_remote.go | 0 .../generated/{ => latest}/router/router.go | 0 .../siloed_lock_release_token_pool.go | 0 .../token_admin_registry.go | 0 .../{ => latest}/token_pool/token_pool.go | 0 .../usdc_reader_tester/usdc_reader_tester.go | 0 .../usdc_token_pool/usdc_token_pool.go | 0 .../lock_release_token_pool.go | 5 +- .../rmn_proxy_contract/rmn_proxy_contract.go | 744 +++ .../burn_mint_token_pool.go} | 2 +- .../commit_store}/commit_store.go | 2 +- .../commit_store_helper.go} | 5 +- .../evm_2_evm_offramp/evm_2_evm_offramp.go} | 2 +- .../evm_2_evm_onramp/evm_2_evm_onramp.go} | 5 +- .../price_registry}/price_registry.go | 5 +- .../ccip/generated/v1_2_0/router/router.go | 1432 +++++ .../burn_mint_token_pool.go} | 5 +- .../lock_release_token_pool.go} | 5 +- .../token_pool/token_pool.go} | 5 +- .../usdc_token_pool/usdc_token_pool.go} | 5 +- .../burn_mint_token_pool_and_proxy.go | 0 ...burn_with_from_mint_rebasing_token_pool.go | 0 ...urn_with_from_mint_token_pool_and_proxy.go | 0 .../{ => v1_5_0}/commit_store/commit_store.go | 0 .../commit_store_helper.go | 3 +- .../evm_2_evm_offramp/evm_2_evm_offramp.go | 0 .../evm_2_evm_onramp/evm_2_evm_onramp.go | 0 .../lock_release_token_pool_and_proxy.go | 0 .../mock_lbtc_token_pool.go | 0 .../mock_rmn_contract/mock_rmn_contract.go | 0 .../v1_5_0/ping_pong_demo/ping_pong_demo.go | 1229 +++++ .../{ => v1_5_0}/rmn_contract/rmn_contract.go | 21 +- .../self_funded_ping_pong.go | 0 .../token_admin_registry.go | 1526 ++++++ .../burn_from_mint_token_pool.go | 3161 +++++++++++ .../burn_mint_token_pool.go | 3162 +++++++++++ .../burn_to_address_mint_token_pool.go | 3210 +++++++++++ .../burn_with_from_mint_token_pool.go | 3162 +++++++++++ .../lock_release_token_pool.go | 3702 +++++++++++++ .../generated/v1_5_1/token_pool/token_pool.go | 2989 +++++++++++ .../v1_5_1/usdc_token_pool/usdc_token_pool.go | 3567 +++++++++++++ .../ccip_encoding_utils.go | 282 + .../generated/v1_6_0/ccip_home/ccip_home.go | 1918 +++++++ .../ccip_reader_tester/ccip_reader_tester.go | 896 ++++ .../generated/v1_6_0/fee_quoter/fee_quoter.go | 3119 +++++++++++ .../v1_6_0/message_hasher/message_hasher.go | 516 ++ .../multi_aggregate_rate_limiter.go | 1860 +++++++ .../multi_ocr3_helper/multi_ocr3_helper.go | 1096 ++++ .../v1_6_0/nonce_manager/nonce_manager.go | 1259 +++++ .../ccip/generated/v1_6_0/offramp/offramp.go | 2612 +++++++++ .../ccip/generated/v1_6_0/onramp/onramp.go | 1913 +++++++ .../registry_module_owner_custom.go | 404 ++ .../v1_6_0/report_codec/report_codec.go | 564 ++ .../generated/v1_6_0/rmn_home/rmn_home.go | 1508 ++++++ .../generated/v1_6_0/rmn_remote/rmn_remote.go | 1264 +++++ .../siloed_lock_release_token_pool.go | 4197 +++++++++++++++ core/gethwrappers/ccip/go_generate.go | 68 +- .../ccip/mocks/commit_store_interface.go | 2 +- .../ccip/mocks/evm2_evm_off_ramp_interface.go | 2 +- .../ccip/mocks/evm2_evm_on_ramp_interface.go | 2 +- .../ccip/mocks/fee_quoter_interface.go | 4683 ----------------- .../v1_2_0/evm2_evm_off_ramp_interface.go | 634 +-- .../generate/genwrapper/genwrapper.go | 24 +- core/gethwrappers/generation/generate/wrap.go | 7 +- core/gethwrappers/generation/wrap.go | 7 +- .../ccip/revert-reason/handler/reason.go | 35 +- .../ocr2/plugins/ccip/ccipcommit/ocr2_test.go | 2 +- .../plugins/ccip/clo_ccip_integration_test.go | 3 +- .../ocr2/plugins/ccip/integration_test.go | 4 +- .../ccip/internal/cache/commit_roots_test.go | 3 +- .../internal/ccipdata/commit_store_reader.go | 3 +- .../ccipdata/commit_store_reader_test.go | 6 +- .../internal/ccipdata/factory/commit_store.go | 2 +- .../ccip/internal/ccipdata/factory/offramp.go | 3 +- .../internal/ccipdata/offramp_reader_test.go | 10 +- .../internal/ccipdata/onramp_reader_test.go | 5 +- .../ccipdata/price_registry_reader_test.go | 2 +- .../internal/ccipdata/v1_2_0/commit_store.go | 3 +- .../ccip/internal/ccipdata/v1_2_0/hasher.go | 2 +- .../internal/ccipdata/v1_2_0/hasher_test.go | 2 +- .../ccip/internal/ccipdata/v1_2_0/offramp.go | 5 +- .../v1_2_0/offramp_reader_unit_test.go | 5 +- .../ccip/internal/ccipdata/v1_2_0/onramp.go | 5 +- .../ccipdata/v1_2_0/price_registry.go | 4 +- .../internal/ccipdata/v1_2_0/test_helpers.go | 2 +- .../internal/ccipdata/v1_2_0/token_pool.go | 2 +- .../internal/ccipdata/v1_4_0/token_pool.go | 2 +- .../internal/ccipdata/v1_5_0/commit_store.go | 2 +- .../ccip/internal/ccipdata/v1_5_0/hasher.go | 2 +- .../internal/ccipdata/v1_5_0/hasher_test.go | 2 +- .../ccip/internal/ccipdata/v1_5_0/offramp.go | 6 +- .../ccip/internal/ccipdata/v1_5_0/onramp.go | 5 +- .../internal/ccipdata/v1_5_0/onramp_test.go | 5 +- .../ocr2/plugins/ccip/pkg/leafer/leafer.go | 4 +- .../ccip/testhelpers/ccip_contracts.go | 27 +- .../ccip/testhelpers/integration/chainlink.go | 9 +- .../ocr2/plugins/ccip/testhelpers/offramp.go | 3 +- .../testhelpers_1_4_0/ccip_contracts_1_4_0.go | 65 +- .../testhelpers_1_4_0/chainlink.go | 7 +- core/services/relay/evm/commit_provider.go | 4 +- core/services/relay/evm/exec_provider.go | 3 +- .../ccip/changeset/cs_accept_admin_role.go | 2 +- .../changeset/cs_active_candidate_test.go | 4 +- deployment/ccip/changeset/cs_add_lane_test.go | 2 +- deployment/ccip/changeset/cs_ccip_home.go | 2 +- .../ccip/changeset/cs_chain_contracts.go | 13 +- .../ccip/changeset/cs_chain_contracts_test.go | 3 +- .../changeset/cs_configure_token_pools.go | 6 +- .../cs_configure_token_pools_test.go | 2 +- deployment/ccip/changeset/cs_deploy_chain.go | 16 +- .../ccip/changeset/cs_deploy_token_pools.go | 13 +- deployment/ccip/changeset/cs_home_chain.go | 4 +- deployment/ccip/changeset/cs_prerequisites.go | 23 +- .../ccip/changeset/cs_propose_admin_role.go | 3 +- deployment/ccip/changeset/cs_set_pool.go | 2 +- .../ccip/changeset/cs_transfer_admin_role.go | 3 +- .../ccip/changeset/cs_update_rmn_config.go | 6 +- .../changeset/internal/deploy_home_chain.go | 4 +- deployment/ccip/changeset/state.go | 56 +- .../testhelpers/messagingtest/helpers.go | 5 +- .../changeset/testhelpers/test_assertions.go | 4 +- .../changeset/testhelpers/test_helpers.go | 11 +- .../ccip/changeset/testhelpers/test_params.go | 2 +- .../testhelpers/test_usdc_helpers.go | 4 +- .../testhelpers/v1_5/test_helpers.go | 8 +- deployment/ccip/changeset/token_pools.go | 5 +- .../ccip/changeset/v1_5/cs_lane_contracts.go | 10 +- .../ccip/changeset/v1_5/cs_ocr2_config.go | 2 +- deployment/ccip/changeset/v1_5/cs_rmn.go | 2 +- deployment/ccip/changeset/v1_5/e2e_test.go | 6 +- .../ccip/view/v1_0/rmn_proxy_contract.go | 2 +- deployment/ccip/view/v1_2/price_registry.go | 2 +- .../ccip/view/v1_2/price_registry_test.go | 2 +- deployment/ccip/view/v1_2/router.go | 2 +- deployment/ccip/view/v1_5/commit_store.go | 2 +- deployment/ccip/view/v1_5/offramp.go | 2 +- deployment/ccip/view/v1_5/offramp_test.go | 7 +- deployment/ccip/view/v1_5/onramp.go | 2 +- deployment/ccip/view/v1_5/onramp_test.go | 2 +- deployment/ccip/view/v1_5/rmn.go | 2 +- deployment/ccip/view/v1_5/rmn_test.go | 2 +- .../ccip/view/v1_5/tokenadminregistry.go | 2 +- deployment/ccip/view/v1_5_1/token_pool.go | 13 +- deployment/ccip/view/v1_6/ccip_home.go | 2 +- deployment/ccip/view/v1_6/ccip_home_test.go | 2 +- deployment/ccip/view/v1_6/feequoter.go | 6 +- deployment/ccip/view/v1_6/noncemanager.go | 2 +- deployment/ccip/view/v1_6/offramp.go | 4 +- deployment/ccip/view/v1_6/onramp.go | 7 +- deployment/ccip/view/v1_6/rmnhome.go | 2 +- deployment/ccip/view/v1_6/rmnremote.go | 2 +- deployment/environment/crib/ccip_deployer.go | 2 +- .../ccip-tests/actions/ccip_helpers.go | 22 +- .../ccip-tests/contracts/contract_deployer.go | 45 +- .../ccip-tests/contracts/contract_models.go | 45 +- .../ccip-tests/contracts/lm_contracts.go | 2 +- .../ccip-tests/contracts/multicall.go | 2 +- .../ccip-tests/load/ccip_loadgen.go | 4 +- integration-tests/ccip-tests/load/helper.go | 2 +- .../ccip-tests/smoke/ccip_test.go | 7 +- .../load/ccip/destination_gun.go | 4 +- integration-tests/load/ccip/helpers.go | 7 +- .../smoke/ccip/ccip_add_chain_test.go | 4 +- .../smoke/ccip/ccip_batching_test.go | 6 +- .../ccip/ccip_cs_update_rmn_config_test.go | 7 +- .../smoke/ccip/ccip_disable_lane_test.go | 5 +- .../smoke/ccip/ccip_fee_boosting_test.go | 4 +- .../smoke/ccip/ccip_fees_test.go | 3 +- .../smoke/ccip/ccip_gas_price_updates_test.go | 2 +- .../ccip/ccip_message_limitations_test.go | 2 +- .../smoke/ccip/ccip_messaging_test.go | 2 +- .../ccip/ccip_migration_to_v_1_6_test.go | 11 +- .../smoke/ccip/ccip_ooo_execution_test.go | 2 +- .../smoke/ccip/ccip_reader_test.go | 13 +- integration-tests/smoke/ccip/ccip_rmn_test.go | 6 +- .../ccip/ccip_token_price_updates_test.go | 2 +- .../smoke/ccip/ccip_token_transfer_test.go | 6 +- .../smoke/ccip/ccip_usdc_test.go | 3 +- 222 files changed, 52178 insertions(+), 5464 deletions(-) rename core/gethwrappers/ccip/generated/{ => latest}/burn_from_mint_token_pool/burn_from_mint_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/burn_mint_token_pool/burn_mint_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/ccip_encoding_utils/ccip_encoding_utils.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/ccip_home/ccip_home.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/ccip_reader_tester/ccip_reader_tester.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/ether_sender_receiver/ether_sender_receiver.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/fee_quoter/fee_quoter.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/lock_release_token_pool/lock_release_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/log_message_data_receiver/log_message_data_receiver.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/maybe_revert_message_receiver/maybe_revert_message_receiver.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/message_hasher/message_hasher.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/mock_usdc_token_messenger/mock_usdc_token_messenger.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/multi_ocr3_helper/multi_ocr3_helper.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/nonce_manager/nonce_manager.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/offramp/offramp.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/offramp_with_message_transformer/offramp_with_message_transformer.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/onramp/onramp.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/onramp_with_message_transformer/onramp_with_message_transformer.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/ping_pong_demo/ping_pong_demo.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/registry_module_owner_custom/registry_module_owner_custom.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/report_codec/report_codec.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/rmn_home/rmn_home.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/rmn_proxy_contract/rmn_proxy_contract.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/rmn_remote/rmn_remote.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/router/router.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/token_admin_registry/token_admin_registry.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/token_pool/token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/usdc_reader_tester/usdc_reader_tester.go (100%) rename core/gethwrappers/ccip/generated/{ => latest}/usdc_token_pool/usdc_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{lock_release_token_pool_1_0_0 => v1_0_0/lock_release_token_pool}/lock_release_token_pool.go (99%) create mode 100644 core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract/rmn_proxy_contract.go rename core/gethwrappers/ccip/generated/{burn_mint_token_pool_1_2_0/burn_mint_token_pool_1_2_0.go => v1_2_0/burn_mint_token_pool/burn_mint_token_pool.go} (99%) rename core/gethwrappers/ccip/generated/{commit_store_1_2_0 => v1_2_0/commit_store}/commit_store.go (99%) rename core/gethwrappers/ccip/generated/{commit_store_helper_1_2_0/commit_store_helper_1_2_0.go => v1_2_0/commit_store_helper/commit_store_helper.go} (99%) rename core/gethwrappers/ccip/generated/{evm_2_evm_offramp_1_2_0/evm_2_evm_offramp_1_2_0.go => v1_2_0/evm_2_evm_offramp/evm_2_evm_offramp.go} (99%) rename core/gethwrappers/ccip/generated/{evm_2_evm_onramp_1_2_0/evm_2_evm_onramp_1_2_0.go => v1_2_0/evm_2_evm_onramp/evm_2_evm_onramp.go} (99%) rename core/gethwrappers/ccip/generated/{price_registry_1_2_0 => v1_2_0/price_registry}/price_registry.go (99%) create mode 100644 core/gethwrappers/ccip/generated/v1_2_0/router/router.go rename core/gethwrappers/ccip/generated/{burn_mint_token_pool_1_4_0/burn_mint_token_pool_1_4_0.go => v1_4_0/burn_mint_token_pool/burn_mint_token_pool.go} (99%) rename core/gethwrappers/ccip/generated/{lock_release_token_pool_1_4_0/lock_release_token_pool_1_4_0.go => v1_4_0/lock_release_token_pool/lock_release_token_pool.go} (99%) rename core/gethwrappers/ccip/generated/{token_pool_1_4_0/token_pool_1_4_0.go => v1_4_0/token_pool/token_pool.go} (99%) rename core/gethwrappers/ccip/generated/{usdc_token_pool_1_4_0/usdc_token_pool_1_4_0.go => v1_4_0/usdc_token_pool/usdc_token_pool.go} (99%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go (100%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go (100%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/commit_store/commit_store.go (100%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/commit_store_helper/commit_store_helper.go (99%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/evm_2_evm_offramp/evm_2_evm_offramp.go (100%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/evm_2_evm_onramp/evm_2_evm_onramp.go (100%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go (100%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/mock_lbtc_token_pool/mock_lbtc_token_pool.go (100%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/mock_rmn_contract/mock_rmn_contract.go (100%) create mode 100644 core/gethwrappers/ccip/generated/v1_5_0/ping_pong_demo/ping_pong_demo.go rename core/gethwrappers/ccip/generated/{ => v1_5_0}/rmn_contract/rmn_contract.go (99%) rename core/gethwrappers/ccip/generated/{ => v1_5_0}/self_funded_ping_pong/self_funded_ping_pong.go (100%) create mode 100644 core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry/token_admin_registry.go create mode 100644 core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool/burn_from_mint_token_pool.go create mode 100644 core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool/burn_mint_token_pool.go create mode 100644 core/gethwrappers/ccip/generated/v1_5_1/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go create mode 100644 core/gethwrappers/ccip/generated/v1_5_1/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go create mode 100644 core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool/lock_release_token_pool.go create mode 100644 core/gethwrappers/ccip/generated/v1_5_1/token_pool/token_pool.go create mode 100644 core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool/usdc_token_pool.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/ccip_encoding_utils/ccip_encoding_utils.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/ccip_home/ccip_home.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/ccip_reader_tester/ccip_reader_tester.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/fee_quoter/fee_quoter.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/message_hasher/message_hasher.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/multi_ocr3_helper/multi_ocr3_helper.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/nonce_manager/nonce_manager.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/offramp/offramp.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/onramp/onramp.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/registry_module_owner_custom/registry_module_owner_custom.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/report_codec/report_codec.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/rmn_home/rmn_home.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/rmn_remote/rmn_remote.go create mode 100644 core/gethwrappers/ccip/generated/v1_6_0/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go delete mode 100644 core/gethwrappers/ccip/mocks/fee_quoter_interface.go diff --git a/.mockery.yaml b/.mockery.yaml index 924ace73b0d..3db053d4d7a 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -315,41 +315,34 @@ packages: config: dir: core/services/relay/evm/mocks ContractWriter: - github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp: + github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp: config: dir: core/gethwrappers/ccip/mocks/ filename: evm2_evm_on_ramp_interface.go outpkg: mock_contracts interfaces: EVM2EVMOnRampInterface: - github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp: + github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp: config: dir: core/gethwrappers/ccip/mocks/ filename: evm2_evm_off_ramp_interface.go outpkg: mock_contracts interfaces: EVM2EVMOffRampInterface: - github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0: + github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp: config: dir: core/gethwrappers/ccip/mocks/v1_2_0/ filename: evm2_evm_off_ramp_interface.go outpkg: mock_contracts interfaces: EVM2EVMOffRampInterface: - github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store: + github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store: config: dir: core/gethwrappers/ccip/mocks/ filename: commit_store_interface.go outpkg: mock_contracts interfaces: CommitStoreInterface: - github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter: - config: - dir: core/gethwrappers/ccip/mocks/ - filename: fee_quoter_interface.go - outpkg: mock_contracts - interfaces: - FeeQuoterInterface: github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface: config: dir: core/gethwrappers/ccip/mocks/ diff --git a/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go b/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go index 2d0d2c3ba1c..5af73605dc1 100644 --- a/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go +++ b/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go @@ -8,6 +8,7 @@ import ( mapset "github.com/deckarep/golang-set/v2" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" libocrtypes "github.com/smartcontractkit/libocr/ragep2p/types" @@ -17,7 +18,6 @@ import ( "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go index e927fe42717..ecd2f3b4a12 100644 --- a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go +++ b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go @@ -31,8 +31,8 @@ import ( cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" diff --git a/core/capabilities/ccip/ccip_integration_tests/rmn/rmn_home_test.go b/core/capabilities/ccip/ccip_integration_tests/rmn/rmn_home_test.go index aecef0b0f23..983fcc89086 100644 --- a/core/capabilities/ccip/ccip_integration_tests/rmn/rmn_home_test.go +++ b/core/capabilities/ccip/ccip_integration_tests/rmn/rmn_home_test.go @@ -18,7 +18,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go b/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go index b8e344557b2..f3d5f1a75d6 100644 --- a/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go +++ b/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go @@ -32,7 +32,7 @@ import ( evmconfig "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_reader_tester" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/usdc_reader_tester" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" "github.com/smartcontractkit/chainlink/v2/core/logger" diff --git a/core/capabilities/ccip/ccipevm/commitcodec.go b/core/capabilities/ccip/ccipevm/commitcodec.go index 622433df50c..9c83d06385a 100644 --- a/core/capabilities/ccip/ccipevm/commitcodec.go +++ b/core/capabilities/ccip/ccipevm/commitcodec.go @@ -10,7 +10,7 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_encoding_utils" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_encoding_utils" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ) diff --git a/core/capabilities/ccip/ccipevm/executecodec.go b/core/capabilities/ccip/ccipevm/executecodec.go index 57b93e16262..6a2431d6e81 100644 --- a/core/capabilities/ccip/ccipevm/executecodec.go +++ b/core/capabilities/ccip/ccipevm/executecodec.go @@ -9,7 +9,8 @@ import ( "github.com/ethereum/go-ethereum/common" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ) diff --git a/core/capabilities/ccip/ccipevm/executecodec_test.go b/core/capabilities/ccip/ccipevm/executecodec_test.go index 0c7c6504fe1..ba282073db8 100644 --- a/core/capabilities/ccip/ccipevm/executecodec_test.go +++ b/core/capabilities/ccip/ccipevm/executecodec_test.go @@ -18,9 +18,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/message_hasher" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/report_codec" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/message_hasher" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/report_codec" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) diff --git a/core/capabilities/ccip/ccipevm/extradatadecoder_test.go b/core/capabilities/ccip/ccipevm/extradatadecoder_test.go index e0387ed9040..f2a7b168618 100644 --- a/core/capabilities/ccip/ccipevm/extradatadecoder_test.go +++ b/core/capabilities/ccip/ccipevm/extradatadecoder_test.go @@ -8,7 +8,7 @@ import ( "github.com/gagliardetto/solana-go" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/message_hasher" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/message_hasher" ) func Test_decodeExtraData(t *testing.T) { diff --git a/core/capabilities/ccip/ccipevm/helpers_test.go b/core/capabilities/ccip/ccipevm/helpers_test.go index 89580c4d6f7..35615e9644a 100644 --- a/core/capabilities/ccip/ccipevm/helpers_test.go +++ b/core/capabilities/ccip/ccipevm/helpers_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/message_hasher" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/message_hasher" ) func Test_decodeExtraArgs(t *testing.T) { diff --git a/core/capabilities/ccip/ccipevm/msghasher.go b/core/capabilities/ccip/ccipevm/msghasher.go index 60d677d8e34..ac436afb028 100644 --- a/core/capabilities/ccip/ccipevm/msghasher.go +++ b/core/capabilities/ccip/ccipevm/msghasher.go @@ -14,7 +14,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/message_hasher" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/message_hasher" ) var ( diff --git a/core/capabilities/ccip/ccipevm/msghasher_test.go b/core/capabilities/ccip/ccipevm/msghasher_test.go index f3c0f0a4b78..28cf5d04bce 100644 --- a/core/capabilities/ccip/ccipevm/msghasher_test.go +++ b/core/capabilities/ccip/ccipevm/msghasher_test.go @@ -24,7 +24,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/message_hasher" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/message_hasher" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" diff --git a/core/capabilities/ccip/configs/evm/chain_writer.go b/core/capabilities/ccip/configs/evm/chain_writer.go index f1fb1bf4063..a90aaab7af1 100644 --- a/core/capabilities/ccip/configs/evm/chain_writer.go +++ b/core/capabilities/ccip/configs/evm/chain_writer.go @@ -9,7 +9,8 @@ import ( "github.com/smartcontractkit/chainlink-ccip/pkg/consts" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" evmrelaytypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" ) diff --git a/core/capabilities/ccip/configs/evm/contract_reader.go b/core/capabilities/ccip/configs/evm/contract_reader.go index 20a6f44a729..f69286739aa 100644 --- a/core/capabilities/ccip/configs/evm/contract_reader.go +++ b/core/capabilities/ccip/configs/evm/contract_reader.go @@ -10,15 +10,16 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/codec" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface" evmrelaytypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" diff --git a/core/capabilities/ccip/launcher/integration_test.go b/core/capabilities/ccip/launcher/integration_test.go index 954fda03969..1acdde0fc49 100644 --- a/core/capabilities/ccip/launcher/integration_test.go +++ b/core/capabilities/ccip/launcher/integration_test.go @@ -7,14 +7,15 @@ import ( "github.com/smartcontractkit/chainlink-ccip/chainconfig" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + it "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer" diff --git a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go index e695729c505..4c504137835 100644 --- a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go +++ b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go @@ -37,7 +37,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/config" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/multi_ocr3_helper" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/multi_ocr3_helper" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" diff --git a/core/gethwrappers/ccip/deployment_test/deployment_test.go b/core/gethwrappers/ccip/deployment_test/deployment_test.go index e4d9b3b3ecd..2e6116b2d73 100644 --- a/core/gethwrappers/ccip/deployment_test/deployment_test.go +++ b/core/gethwrappers/ccip/deployment_test/deployment_test.go @@ -11,12 +11,14 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/assets" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) diff --git a/core/gethwrappers/ccip/generated/burn_from_mint_token_pool/burn_from_mint_token_pool.go b/core/gethwrappers/ccip/generated/latest/burn_from_mint_token_pool/burn_from_mint_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/burn_from_mint_token_pool/burn_from_mint_token_pool.go rename to core/gethwrappers/ccip/generated/latest/burn_from_mint_token_pool/burn_from_mint_token_pool.go diff --git a/core/gethwrappers/ccip/generated/burn_mint_token_pool/burn_mint_token_pool.go b/core/gethwrappers/ccip/generated/latest/burn_mint_token_pool/burn_mint_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/burn_mint_token_pool/burn_mint_token_pool.go rename to core/gethwrappers/ccip/generated/latest/burn_mint_token_pool/burn_mint_token_pool.go diff --git a/core/gethwrappers/ccip/generated/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go b/core/gethwrappers/ccip/generated/latest/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go rename to core/gethwrappers/ccip/generated/latest/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go diff --git a/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go b/core/gethwrappers/ccip/generated/latest/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go rename to core/gethwrappers/ccip/generated/latest/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go diff --git a/core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go b/core/gethwrappers/ccip/generated/latest/ccip_encoding_utils/ccip_encoding_utils.go similarity index 100% rename from core/gethwrappers/ccip/generated/ccip_encoding_utils/ccip_encoding_utils.go rename to core/gethwrappers/ccip/generated/latest/ccip_encoding_utils/ccip_encoding_utils.go diff --git a/core/gethwrappers/ccip/generated/ccip_home/ccip_home.go b/core/gethwrappers/ccip/generated/latest/ccip_home/ccip_home.go similarity index 100% rename from core/gethwrappers/ccip/generated/ccip_home/ccip_home.go rename to core/gethwrappers/ccip/generated/latest/ccip_home/ccip_home.go diff --git a/core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go b/core/gethwrappers/ccip/generated/latest/ccip_reader_tester/ccip_reader_tester.go similarity index 100% rename from core/gethwrappers/ccip/generated/ccip_reader_tester/ccip_reader_tester.go rename to core/gethwrappers/ccip/generated/latest/ccip_reader_tester/ccip_reader_tester.go diff --git a/core/gethwrappers/ccip/generated/ether_sender_receiver/ether_sender_receiver.go b/core/gethwrappers/ccip/generated/latest/ether_sender_receiver/ether_sender_receiver.go similarity index 100% rename from core/gethwrappers/ccip/generated/ether_sender_receiver/ether_sender_receiver.go rename to core/gethwrappers/ccip/generated/latest/ether_sender_receiver/ether_sender_receiver.go diff --git a/core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/latest/fee_quoter/fee_quoter.go similarity index 100% rename from core/gethwrappers/ccip/generated/fee_quoter/fee_quoter.go rename to core/gethwrappers/ccip/generated/latest/fee_quoter/fee_quoter.go diff --git a/core/gethwrappers/ccip/generated/lock_release_token_pool/lock_release_token_pool.go b/core/gethwrappers/ccip/generated/latest/lock_release_token_pool/lock_release_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/lock_release_token_pool/lock_release_token_pool.go rename to core/gethwrappers/ccip/generated/latest/lock_release_token_pool/lock_release_token_pool.go diff --git a/core/gethwrappers/ccip/generated/log_message_data_receiver/log_message_data_receiver.go b/core/gethwrappers/ccip/generated/latest/log_message_data_receiver/log_message_data_receiver.go similarity index 100% rename from core/gethwrappers/ccip/generated/log_message_data_receiver/log_message_data_receiver.go rename to core/gethwrappers/ccip/generated/latest/log_message_data_receiver/log_message_data_receiver.go diff --git a/core/gethwrappers/ccip/generated/maybe_revert_message_receiver/maybe_revert_message_receiver.go b/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver/maybe_revert_message_receiver.go similarity index 100% rename from core/gethwrappers/ccip/generated/maybe_revert_message_receiver/maybe_revert_message_receiver.go rename to core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver/maybe_revert_message_receiver.go diff --git a/core/gethwrappers/ccip/generated/message_hasher/message_hasher.go b/core/gethwrappers/ccip/generated/latest/message_hasher/message_hasher.go similarity index 100% rename from core/gethwrappers/ccip/generated/message_hasher/message_hasher.go rename to core/gethwrappers/ccip/generated/latest/message_hasher/message_hasher.go diff --git a/core/gethwrappers/ccip/generated/mock_usdc_token_messenger/mock_usdc_token_messenger.go b/core/gethwrappers/ccip/generated/latest/mock_usdc_token_messenger/mock_usdc_token_messenger.go similarity index 100% rename from core/gethwrappers/ccip/generated/mock_usdc_token_messenger/mock_usdc_token_messenger.go rename to core/gethwrappers/ccip/generated/latest/mock_usdc_token_messenger/mock_usdc_token_messenger.go diff --git a/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go b/core/gethwrappers/ccip/generated/latest/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go similarity index 100% rename from core/gethwrappers/ccip/generated/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go rename to core/gethwrappers/ccip/generated/latest/mock_usdc_token_transmitter/mock_usdc_token_transmitter.go diff --git a/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go b/core/gethwrappers/ccip/generated/latest/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go similarity index 100% rename from core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go rename to core/gethwrappers/ccip/generated/latest/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go diff --git a/core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go b/core/gethwrappers/ccip/generated/latest/multi_ocr3_helper/multi_ocr3_helper.go similarity index 100% rename from core/gethwrappers/ccip/generated/multi_ocr3_helper/multi_ocr3_helper.go rename to core/gethwrappers/ccip/generated/latest/multi_ocr3_helper/multi_ocr3_helper.go diff --git a/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go b/core/gethwrappers/ccip/generated/latest/nonce_manager/nonce_manager.go similarity index 100% rename from core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go rename to core/gethwrappers/ccip/generated/latest/nonce_manager/nonce_manager.go diff --git a/core/gethwrappers/ccip/generated/offramp/offramp.go b/core/gethwrappers/ccip/generated/latest/offramp/offramp.go similarity index 100% rename from core/gethwrappers/ccip/generated/offramp/offramp.go rename to core/gethwrappers/ccip/generated/latest/offramp/offramp.go diff --git a/core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go b/core/gethwrappers/ccip/generated/latest/offramp_with_message_transformer/offramp_with_message_transformer.go similarity index 100% rename from core/gethwrappers/ccip/generated/offramp_with_message_transformer/offramp_with_message_transformer.go rename to core/gethwrappers/ccip/generated/latest/offramp_with_message_transformer/offramp_with_message_transformer.go diff --git a/core/gethwrappers/ccip/generated/onramp/onramp.go b/core/gethwrappers/ccip/generated/latest/onramp/onramp.go similarity index 100% rename from core/gethwrappers/ccip/generated/onramp/onramp.go rename to core/gethwrappers/ccip/generated/latest/onramp/onramp.go diff --git a/core/gethwrappers/ccip/generated/onramp_with_message_transformer/onramp_with_message_transformer.go b/core/gethwrappers/ccip/generated/latest/onramp_with_message_transformer/onramp_with_message_transformer.go similarity index 100% rename from core/gethwrappers/ccip/generated/onramp_with_message_transformer/onramp_with_message_transformer.go rename to core/gethwrappers/ccip/generated/latest/onramp_with_message_transformer/onramp_with_message_transformer.go diff --git a/core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/latest/ping_pong_demo/ping_pong_demo.go similarity index 100% rename from core/gethwrappers/ccip/generated/ping_pong_demo/ping_pong_demo.go rename to core/gethwrappers/ccip/generated/latest/ping_pong_demo/ping_pong_demo.go diff --git a/core/gethwrappers/ccip/generated/registry_module_owner_custom/registry_module_owner_custom.go b/core/gethwrappers/ccip/generated/latest/registry_module_owner_custom/registry_module_owner_custom.go similarity index 100% rename from core/gethwrappers/ccip/generated/registry_module_owner_custom/registry_module_owner_custom.go rename to core/gethwrappers/ccip/generated/latest/registry_module_owner_custom/registry_module_owner_custom.go diff --git a/core/gethwrappers/ccip/generated/report_codec/report_codec.go b/core/gethwrappers/ccip/generated/latest/report_codec/report_codec.go similarity index 100% rename from core/gethwrappers/ccip/generated/report_codec/report_codec.go rename to core/gethwrappers/ccip/generated/latest/report_codec/report_codec.go diff --git a/core/gethwrappers/ccip/generated/rmn_home/rmn_home.go b/core/gethwrappers/ccip/generated/latest/rmn_home/rmn_home.go similarity index 100% rename from core/gethwrappers/ccip/generated/rmn_home/rmn_home.go rename to core/gethwrappers/ccip/generated/latest/rmn_home/rmn_home.go diff --git a/core/gethwrappers/ccip/generated/rmn_proxy_contract/rmn_proxy_contract.go b/core/gethwrappers/ccip/generated/latest/rmn_proxy_contract/rmn_proxy_contract.go similarity index 100% rename from core/gethwrappers/ccip/generated/rmn_proxy_contract/rmn_proxy_contract.go rename to core/gethwrappers/ccip/generated/latest/rmn_proxy_contract/rmn_proxy_contract.go diff --git a/core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go b/core/gethwrappers/ccip/generated/latest/rmn_remote/rmn_remote.go similarity index 100% rename from core/gethwrappers/ccip/generated/rmn_remote/rmn_remote.go rename to core/gethwrappers/ccip/generated/latest/rmn_remote/rmn_remote.go diff --git a/core/gethwrappers/ccip/generated/router/router.go b/core/gethwrappers/ccip/generated/latest/router/router.go similarity index 100% rename from core/gethwrappers/ccip/generated/router/router.go rename to core/gethwrappers/ccip/generated/latest/router/router.go diff --git a/core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go b/core/gethwrappers/ccip/generated/latest/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go rename to core/gethwrappers/ccip/generated/latest/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go diff --git a/core/gethwrappers/ccip/generated/token_admin_registry/token_admin_registry.go b/core/gethwrappers/ccip/generated/latest/token_admin_registry/token_admin_registry.go similarity index 100% rename from core/gethwrappers/ccip/generated/token_admin_registry/token_admin_registry.go rename to core/gethwrappers/ccip/generated/latest/token_admin_registry/token_admin_registry.go diff --git a/core/gethwrappers/ccip/generated/token_pool/token_pool.go b/core/gethwrappers/ccip/generated/latest/token_pool/token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/token_pool/token_pool.go rename to core/gethwrappers/ccip/generated/latest/token_pool/token_pool.go diff --git a/core/gethwrappers/ccip/generated/usdc_reader_tester/usdc_reader_tester.go b/core/gethwrappers/ccip/generated/latest/usdc_reader_tester/usdc_reader_tester.go similarity index 100% rename from core/gethwrappers/ccip/generated/usdc_reader_tester/usdc_reader_tester.go rename to core/gethwrappers/ccip/generated/latest/usdc_reader_tester/usdc_reader_tester.go diff --git a/core/gethwrappers/ccip/generated/usdc_token_pool/usdc_token_pool.go b/core/gethwrappers/ccip/generated/latest/usdc_token_pool/usdc_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/usdc_token_pool/usdc_token_pool.go rename to core/gethwrappers/ccip/generated/latest/usdc_token_pool/usdc_token_pool.go diff --git a/core/gethwrappers/ccip/generated/lock_release_token_pool_1_0_0/lock_release_token_pool.go b/core/gethwrappers/ccip/generated/v1_0_0/lock_release_token_pool/lock_release_token_pool.go similarity index 99% rename from core/gethwrappers/ccip/generated/lock_release_token_pool_1_0_0/lock_release_token_pool.go rename to core/gethwrappers/ccip/generated/v1_0_0/lock_release_token_pool/lock_release_token_pool.go index 30ea97eb99e..71316d8f890 100644 --- a/core/gethwrappers/ccip/generated/lock_release_token_pool_1_0_0/lock_release_token_pool.go +++ b/core/gethwrappers/ccip/generated/v1_0_0/lock_release_token_pool/lock_release_token_pool.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package lock_release_token_pool_1_0_0 +package lock_release_token_pool import ( "errors" @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract/rmn_proxy_contract.go b/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract/rmn_proxy_contract.go new file mode 100644 index 00000000000..1942c3f3d88 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract/rmn_proxy_contract.go @@ -0,0 +1,744 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package rmn_proxy_contract + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "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" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +var RMNProxyMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"arm\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getARM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setARM\",\"inputs\":[{\"name\":\"arm\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ARMSet\",\"inputs\":[{\"name\":\"arm\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x60803461012f5760009061079a3881900390601f8201601f191683016001600160401b0381118482101761011b579180849260209460405283398101031261011757516001600160a01b03811691908290036101145733156100cf5780546001600160a01b0319163317905580156100be57600280546001600160a01b031916821790556040519081527fef31f568d741a833c6a9dc85a6e1c65e06fa772740d5dc94d1da21827a4e0cab90602090a160405161066590816101358239f35b6342bcdf7f60e11b60005260046000fd5b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f00000000000000006044820152606490fd5b80fd5b5080fd5b634e487b7160e01b85526041600452602485fd5b600080fdfe6080604052600436101561001a575b3415610598575b600080fd5b60003560e01c8063181f5a771461007a5780632e90aa2114610075578063458fec3b1461007057806379ba50971461006b5780638da5cb5b146100665763f2fde38b0361000e5761049b565b610449565b6102ee565b61023b565b61019c565b346100155760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261001557604051604081019080821067ffffffffffffffff8311176101055761010191604052600e81527f41524d50726f787920312e302e30000000000000000000000000000000000000602082015260405191829182610134565b0390f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b9190916020815282519283602083015260005b8481106101865750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b8060208092840101516040828601015201610147565b346100155760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261001557602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60209101126100155760043573ffffffffffffffffffffffffffffffffffffffff811681036100155790565b346100155773ffffffffffffffffffffffffffffffffffffffff61025e366101ee565b6102666105d9565b1680156102c4576020817fef31f568d741a833c6a9dc85a6e1c65e06fa772740d5dc94d1da21827a4e0cab927fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255604051908152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346100155760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100155773ffffffffffffffffffffffffffffffffffffffff6001541633036103eb5760005473ffffffffffffffffffffffffffffffffffffffff16600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556103ac7fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b73ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152fd5b346100155760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261001557602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b346100155773ffffffffffffffffffffffffffffffffffffffff6104be366101ee565b6104c66105d9565b1633811461053a57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015573ffffffffffffffffffffffffffffffffffffffff8060005416167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152fd5b73ffffffffffffffffffffffffffffffffffffffff60025416803b15610015576000809136828037818036925af13d6000803e6105d4573d6000fd5b3d6000f35b73ffffffffffffffffffffffffffffffffffffffff6000541633036105fa57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152fdfea164736f6c634300081a000a", +} + +var RMNProxyABI = RMNProxyMetaData.ABI + +var RMNProxyBin = RMNProxyMetaData.Bin + +func DeployRMNProxy(auth *bind.TransactOpts, backend bind.ContractBackend, arm common.Address) (common.Address, *types.Transaction, *RMNProxy, error) { + parsed, err := RMNProxyMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RMNProxyBin), backend, arm) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &RMNProxy{address: address, abi: *parsed, RMNProxyCaller: RMNProxyCaller{contract: contract}, RMNProxyTransactor: RMNProxyTransactor{contract: contract}, RMNProxyFilterer: RMNProxyFilterer{contract: contract}}, nil +} + +type RMNProxy struct { + address common.Address + abi abi.ABI + RMNProxyCaller + RMNProxyTransactor + RMNProxyFilterer +} + +type RMNProxyCaller struct { + contract *bind.BoundContract +} + +type RMNProxyTransactor struct { + contract *bind.BoundContract +} + +type RMNProxyFilterer struct { + contract *bind.BoundContract +} + +type RMNProxySession struct { + Contract *RMNProxy + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type RMNProxyCallerSession struct { + Contract *RMNProxyCaller + CallOpts bind.CallOpts +} + +type RMNProxyTransactorSession struct { + Contract *RMNProxyTransactor + TransactOpts bind.TransactOpts +} + +type RMNProxyRaw struct { + Contract *RMNProxy +} + +type RMNProxyCallerRaw struct { + Contract *RMNProxyCaller +} + +type RMNProxyTransactorRaw struct { + Contract *RMNProxyTransactor +} + +func NewRMNProxy(address common.Address, backend bind.ContractBackend) (*RMNProxy, error) { + abi, err := abi.JSON(strings.NewReader(RMNProxyABI)) + if err != nil { + return nil, err + } + contract, err := bindRMNProxy(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RMNProxy{address: address, abi: abi, RMNProxyCaller: RMNProxyCaller{contract: contract}, RMNProxyTransactor: RMNProxyTransactor{contract: contract}, RMNProxyFilterer: RMNProxyFilterer{contract: contract}}, nil +} + +func NewRMNProxyCaller(address common.Address, caller bind.ContractCaller) (*RMNProxyCaller, error) { + contract, err := bindRMNProxy(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RMNProxyCaller{contract: contract}, nil +} + +func NewRMNProxyTransactor(address common.Address, transactor bind.ContractTransactor) (*RMNProxyTransactor, error) { + contract, err := bindRMNProxy(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RMNProxyTransactor{contract: contract}, nil +} + +func NewRMNProxyFilterer(address common.Address, filterer bind.ContractFilterer) (*RMNProxyFilterer, error) { + contract, err := bindRMNProxy(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RMNProxyFilterer{contract: contract}, nil +} + +func bindRMNProxy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RMNProxyMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_RMNProxy *RMNProxyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RMNProxy.Contract.RMNProxyCaller.contract.Call(opts, result, method, params...) +} + +func (_RMNProxy *RMNProxyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNProxy.Contract.RMNProxyTransactor.contract.Transfer(opts) +} + +func (_RMNProxy *RMNProxyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RMNProxy.Contract.RMNProxyTransactor.contract.Transact(opts, method, params...) +} + +func (_RMNProxy *RMNProxyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RMNProxy.Contract.contract.Call(opts, result, method, params...) +} + +func (_RMNProxy *RMNProxyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNProxy.Contract.contract.Transfer(opts) +} + +func (_RMNProxy *RMNProxyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RMNProxy.Contract.contract.Transact(opts, method, params...) +} + +func (_RMNProxy *RMNProxyCaller) GetARM(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _RMNProxy.contract.Call(opts, &out, "getARM") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_RMNProxy *RMNProxySession) GetARM() (common.Address, error) { + return _RMNProxy.Contract.GetARM(&_RMNProxy.CallOpts) +} + +func (_RMNProxy *RMNProxyCallerSession) GetARM() (common.Address, error) { + return _RMNProxy.Contract.GetARM(&_RMNProxy.CallOpts) +} + +func (_RMNProxy *RMNProxyCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _RMNProxy.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 + +} + +func (_RMNProxy *RMNProxySession) Owner() (common.Address, error) { + return _RMNProxy.Contract.Owner(&_RMNProxy.CallOpts) +} + +func (_RMNProxy *RMNProxyCallerSession) Owner() (common.Address, error) { + return _RMNProxy.Contract.Owner(&_RMNProxy.CallOpts) +} + +func (_RMNProxy *RMNProxyCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RMNProxy.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_RMNProxy *RMNProxySession) TypeAndVersion() (string, error) { + return _RMNProxy.Contract.TypeAndVersion(&_RMNProxy.CallOpts) +} + +func (_RMNProxy *RMNProxyCallerSession) TypeAndVersion() (string, error) { + return _RMNProxy.Contract.TypeAndVersion(&_RMNProxy.CallOpts) +} + +func (_RMNProxy *RMNProxyTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNProxy.contract.Transact(opts, "acceptOwnership") +} + +func (_RMNProxy *RMNProxySession) AcceptOwnership() (*types.Transaction, error) { + return _RMNProxy.Contract.AcceptOwnership(&_RMNProxy.TransactOpts) +} + +func (_RMNProxy *RMNProxyTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _RMNProxy.Contract.AcceptOwnership(&_RMNProxy.TransactOpts) +} + +func (_RMNProxy *RMNProxyTransactor) SetARM(opts *bind.TransactOpts, arm common.Address) (*types.Transaction, error) { + return _RMNProxy.contract.Transact(opts, "setARM", arm) +} + +func (_RMNProxy *RMNProxySession) SetARM(arm common.Address) (*types.Transaction, error) { + return _RMNProxy.Contract.SetARM(&_RMNProxy.TransactOpts, arm) +} + +func (_RMNProxy *RMNProxyTransactorSession) SetARM(arm common.Address) (*types.Transaction, error) { + return _RMNProxy.Contract.SetARM(&_RMNProxy.TransactOpts, arm) +} + +func (_RMNProxy *RMNProxyTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _RMNProxy.contract.Transact(opts, "transferOwnership", to) +} + +func (_RMNProxy *RMNProxySession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _RMNProxy.Contract.TransferOwnership(&_RMNProxy.TransactOpts, to) +} + +func (_RMNProxy *RMNProxyTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _RMNProxy.Contract.TransferOwnership(&_RMNProxy.TransactOpts, to) +} + +func (_RMNProxy *RMNProxyTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _RMNProxy.contract.RawTransact(opts, calldata) +} + +func (_RMNProxy *RMNProxySession) Fallback(calldata []byte) (*types.Transaction, error) { + return _RMNProxy.Contract.Fallback(&_RMNProxy.TransactOpts, calldata) +} + +func (_RMNProxy *RMNProxyTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _RMNProxy.Contract.Fallback(&_RMNProxy.TransactOpts, calldata) +} + +type RMNProxyARMSetIterator struct { + Event *RMNProxyARMSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNProxyARMSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNProxyARMSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNProxyARMSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNProxyARMSetIterator) Error() error { + return it.fail +} + +func (it *RMNProxyARMSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNProxyARMSet struct { + Arm common.Address + Raw types.Log +} + +func (_RMNProxy *RMNProxyFilterer) FilterARMSet(opts *bind.FilterOpts) (*RMNProxyARMSetIterator, error) { + + logs, sub, err := _RMNProxy.contract.FilterLogs(opts, "ARMSet") + if err != nil { + return nil, err + } + return &RMNProxyARMSetIterator{contract: _RMNProxy.contract, event: "ARMSet", logs: logs, sub: sub}, nil +} + +func (_RMNProxy *RMNProxyFilterer) WatchARMSet(opts *bind.WatchOpts, sink chan<- *RMNProxyARMSet) (event.Subscription, error) { + + logs, sub, err := _RMNProxy.contract.WatchLogs(opts, "ARMSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNProxyARMSet) + if err := _RMNProxy.contract.UnpackLog(event, "ARMSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNProxy *RMNProxyFilterer) ParseARMSet(log types.Log) (*RMNProxyARMSet, error) { + event := new(RMNProxyARMSet) + if err := _RMNProxy.contract.UnpackLog(event, "ARMSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNProxyOwnershipTransferRequestedIterator struct { + Event *RMNProxyOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNProxyOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNProxyOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNProxyOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNProxyOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *RMNProxyOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNProxyOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_RMNProxy *RMNProxyFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyOwnershipTransferRequestedIterator, 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 := _RMNProxy.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &RMNProxyOwnershipTransferRequestedIterator{contract: _RMNProxy.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_RMNProxy *RMNProxyFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNProxyOwnershipTransferRequested, 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 := _RMNProxy.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: + + event := new(RMNProxyOwnershipTransferRequested) + if err := _RMNProxy.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 +} + +func (_RMNProxy *RMNProxyFilterer) ParseOwnershipTransferRequested(log types.Log) (*RMNProxyOwnershipTransferRequested, error) { + event := new(RMNProxyOwnershipTransferRequested) + if err := _RMNProxy.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNProxyOwnershipTransferredIterator struct { + Event *RMNProxyOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNProxyOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNProxyOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNProxyOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNProxyOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *RMNProxyOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNProxyOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_RMNProxy *RMNProxyFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyOwnershipTransferredIterator, 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 := _RMNProxy.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &RMNProxyOwnershipTransferredIterator{contract: _RMNProxy.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_RMNProxy *RMNProxyFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNProxyOwnershipTransferred, 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 := _RMNProxy.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: + + event := new(RMNProxyOwnershipTransferred) + if err := _RMNProxy.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 +} + +func (_RMNProxy *RMNProxyFilterer) ParseOwnershipTransferred(log types.Log) (*RMNProxyOwnershipTransferred, error) { + event := new(RMNProxyOwnershipTransferred) + if err := _RMNProxy.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_RMNProxy *RMNProxy) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _RMNProxy.abi.Events["ARMSet"].ID: + return _RMNProxy.ParseARMSet(log) + case _RMNProxy.abi.Events["OwnershipTransferRequested"].ID: + return _RMNProxy.ParseOwnershipTransferRequested(log) + case _RMNProxy.abi.Events["OwnershipTransferred"].ID: + return _RMNProxy.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (RMNProxyARMSet) Topic() common.Hash { + return common.HexToHash("0xef31f568d741a833c6a9dc85a6e1c65e06fa772740d5dc94d1da21827a4e0cab") +} + +func (RMNProxyOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (RMNProxyOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_RMNProxy *RMNProxy) Address() common.Address { + return _RMNProxy.address +} + +type RMNProxyInterface interface { + GetARM(opts *bind.CallOpts) (common.Address, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + SetARM(opts *bind.TransactOpts, arm common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) + + FilterARMSet(opts *bind.FilterOpts) (*RMNProxyARMSetIterator, error) + + WatchARMSet(opts *bind.WatchOpts, sink chan<- *RMNProxyARMSet) (event.Subscription, error) + + ParseARMSet(log types.Log) (*RMNProxyARMSet, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNProxyOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*RMNProxyOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNProxyOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNProxyOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*RMNProxyOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_2_0/burn_mint_token_pool_1_2_0.go b/core/gethwrappers/ccip/generated/v1_2_0/burn_mint_token_pool/burn_mint_token_pool.go similarity index 99% rename from core/gethwrappers/ccip/generated/burn_mint_token_pool_1_2_0/burn_mint_token_pool_1_2_0.go rename to core/gethwrappers/ccip/generated/v1_2_0/burn_mint_token_pool/burn_mint_token_pool.go index d11a7db6e60..d254ce17a2c 100644 --- a/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_2_0/burn_mint_token_pool_1_2_0.go +++ b/core/gethwrappers/ccip/generated/v1_2_0/burn_mint_token_pool/burn_mint_token_pool.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package burn_mint_token_pool_1_2_0 +package burn_mint_token_pool import ( "errors" diff --git a/core/gethwrappers/ccip/generated/commit_store_1_2_0/commit_store.go b/core/gethwrappers/ccip/generated/v1_2_0/commit_store/commit_store.go similarity index 99% rename from core/gethwrappers/ccip/generated/commit_store_1_2_0/commit_store.go rename to core/gethwrappers/ccip/generated/v1_2_0/commit_store/commit_store.go index fa757f287d3..6b42f1b0961 100644 --- a/core/gethwrappers/ccip/generated/commit_store_1_2_0/commit_store.go +++ b/core/gethwrappers/ccip/generated/v1_2_0/commit_store/commit_store.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package commit_store_1_2_0 +package commit_store import ( "errors" diff --git a/core/gethwrappers/ccip/generated/commit_store_helper_1_2_0/commit_store_helper_1_2_0.go b/core/gethwrappers/ccip/generated/v1_2_0/commit_store_helper/commit_store_helper.go similarity index 99% rename from core/gethwrappers/ccip/generated/commit_store_helper_1_2_0/commit_store_helper_1_2_0.go rename to core/gethwrappers/ccip/generated/v1_2_0/commit_store_helper/commit_store_helper.go index be974665981..9613798a533 100644 --- a/core/gethwrappers/ccip/generated/commit_store_helper_1_2_0/commit_store_helper_1_2_0.go +++ b/core/gethwrappers/ccip/generated/v1_2_0/commit_store_helper/commit_store_helper.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package commit_store_helper_1_2_0 +package commit_store_helper import ( "errors" @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0/evm_2_evm_offramp_1_2_0.go b/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp/evm_2_evm_offramp.go similarity index 99% rename from core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0/evm_2_evm_offramp_1_2_0.go rename to core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp/evm_2_evm_offramp.go index beeaee1bb76..4d357a298f6 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0/evm_2_evm_offramp_1_2_0.go +++ b/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp/evm_2_evm_offramp.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package evm_2_evm_offramp_1_2_0 +package evm_2_evm_offramp import ( "errors" diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0/evm_2_evm_onramp_1_2_0.go b/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp/evm_2_evm_onramp.go similarity index 99% rename from core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0/evm_2_evm_onramp_1_2_0.go rename to core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp/evm_2_evm_onramp.go index 8c652e140d3..abd92266e8a 100644 --- a/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0/evm_2_evm_onramp_1_2_0.go +++ b/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp/evm_2_evm_onramp.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package evm_2_evm_onramp_1_2_0 +package evm_2_evm_onramp import ( "errors" @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/price_registry_1_2_0/price_registry.go b/core/gethwrappers/ccip/generated/v1_2_0/price_registry/price_registry.go similarity index 99% rename from core/gethwrappers/ccip/generated/price_registry_1_2_0/price_registry.go rename to core/gethwrappers/ccip/generated/v1_2_0/price_registry/price_registry.go index 30b1b26da94..4c7a27aeb96 100644 --- a/core/gethwrappers/ccip/generated/price_registry_1_2_0/price_registry.go +++ b/core/gethwrappers/ccip/generated/v1_2_0/price_registry/price_registry.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package price_registry_1_2_0 +package price_registry import ( "errors" @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/v1_2_0/router/router.go b/core/gethwrappers/ccip/generated/v1_2_0/router/router.go new file mode 100644 index 00000000000..00928a9252f --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_2_0/router/router.go @@ -0,0 +1,1432 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package router + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "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" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type ClientAny2EVMMessage struct { + MessageId [32]byte + SourceChainSelector uint64 + Sender []byte + Data []byte + DestTokenAmounts []ClientEVMTokenAmount +} + +type ClientEVM2AnyMessage struct { + Receiver []byte + Data []byte + TokenAmounts []ClientEVMTokenAmount + FeeToken common.Address + ExtraArgs []byte +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type RouterOffRamp struct { + SourceChainSelector uint64 + OffRamp common.Address +} + +type RouterOnRamp struct { + DestChainSelector uint64 + OnRamp common.Address +} + +var RouterMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"wrappedNative\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"armProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_RET_BYTES\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyRampUpdates\",\"inputs\":[{\"name\":\"onRampUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structRouter.OnRamp[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"offRampRemoves\",\"type\":\"tuple[]\",\"internalType\":\"structRouter.OffRamp[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"offRampAdds\",\"type\":\"tuple[]\",\"internalType\":\"structRouter.OffRamp[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipSend\",\"inputs\":[{\"name\":\"destinationChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getArmProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"destinationChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"fee\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOffRamps\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structRouter.OffRamp[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOnRamp\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedTokens\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWrappedNative\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isChainSupported\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOffRamp\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"routeMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"success\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"retData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWrappedNative\",\"inputs\":[{\"name\":\"wrappedNative\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"MessageExecuted\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"calldataHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OffRampAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OffRampRemoved\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OnRampSet\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"onRamp\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"error\",\"name\":\"BadARMSignal\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedToSendValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFeeTokenAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMsgValue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRecipientAddress\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OffRampMismatch\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offRamp\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyOffRamp\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnsupportedDestinationChain\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}]", + Bin: "0x60a0346100f557601f612b2e38819003918201601f19168301916001600160401b038311848410176100fa5780849260409485528339810103126100f557610052602061004b83610110565b9201610110565b9033156100b057600080546001600160a01b03199081163317909155600280549091166001600160a01b0392909216919091179055608052604051612a099081610125823960805181818161084e01528181610bfb0152611d290152f35b60405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f00000000000000006044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100f55756fe6080604052600436101561001257600080fd5b60003560e01c8063181f5a771461013757806320487ded146101325780633cf979831461012d5780635246492f1461012857806352cb60ca146101235780635f3e849f1461011e578063787350e31461011957806379ba50971461011457806383826b2b1461010f5780638da5cb5b1461010a57806396f4e9f914610105578063a40e69c714610100578063a48a9058146100fb578063a8d87a3b146100f6578063da5fcac8146100f1578063e861e907146100ec578063f2fde38b146100e75763fbca3b74146100e257600080fd5b611922565b6117de565b61178c565b611413565b61136f565b6112fc565b6111ab565b610baf565b610b5d565b610aeb565b610990565b610956565b6108f9565b610872565b610803565b610758565b61057d565b6102aa565b600091031261014757565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761019757604052565b61014c565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761019757604052565b604051906101ec60a08361019c565b565b604051906101ec60408361019c565b67ffffffffffffffff811161019757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b8481106102815750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610242565b9060206102a7928181520190610237565b90565b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475761032760408051906102eb818361019c565b600c82527f526f7574657220312e322e300000000000000000000000000000000000000000602083015251918291602083526020830190610237565b0390f35b67ffffffffffffffff81160361014757565b81601f8201121561014757803590610354826101fd565b92610362604051948561019c565b8284526020838301011161014757816000926020809301838601378301015290565b67ffffffffffffffff81116101975760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361014757565b35906101ec8261039c565b81601f82011215610147578035906103dc82610384565b926103ea604051948561019c565b82845260208085019360061b8301019181831161014757602001925b828410610414575050505090565b604084830312610147576020604091825161042e8161017b565b86356104398161039c565b81528287013583820152815201930192610406565b9060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc830112610147576004356104858161032b565b9160243567ffffffffffffffff81116101475760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8284030112610147576104cc6101dd565b91816004013567ffffffffffffffff8111610147578160046104f09285010161033d565b8352602482013567ffffffffffffffff8111610147578160046105159285010161033d565b6020840152604482013567ffffffffffffffff81116101475781600461053d928501016103c5565b604084015261054e606483016103ba565b606084015260848201359167ffffffffffffffff831161014757610575920160040161033d565b608082015290565b346101475761058b3661044e565b6060810173ffffffffffffffffffffffffffffffffffffffff6105c2825173ffffffffffffffffffffffffffffffffffffffff1690565b16156106f1575b5073ffffffffffffffffffffffffffffffffffffffff61061a6106008467ffffffffffffffff166000526003602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1680156106b9579060209161065e936040518095819482937f20487ded00000000000000000000000000000000000000000000000000000000845260048401611a98565b03915afa80156106b45761032791600091610685575b506040519081529081906020820190565b6106a7915060203d6020116106ad575b61069f818361019c565b8101906119c0565b38610674565b503d610695565b611ab9565b7fae236d9c0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff831660045260246000fd5b61072e9061071460025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff169052565b386105c9565b9392916107539060409215158652606060208701526060860190610237565b930152565b346101475760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475760043567ffffffffffffffff81116101475760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101475760243561ffff8116810361014757610327916107f49160443590606435926107ec8461039c565b600401611ce2565b60409391935193849384610734565b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475773ffffffffffffffffffffffffffffffffffffffff6004356108c28161039c565b6108ca6123fe565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255600080f35b346101475760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610147576109546004356109378161039c565b6024356109438161039c565b6044359161094f6123fe565b611ef4565b005b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014757602060405160848152f35b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475773ffffffffffffffffffffffffffffffffffffffff600154163303610a8d5760005473ffffffffffffffffffffffffffffffffffffffff16600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055610a4e7fffffffffffffffffffffffff000000000000000000000000000000000000000060015416600155565b73ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152fd5b346101475760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610147576020610b53610b40600435610b2e8161032b565b60243590610b3b8261039c565b61250e565b6000526005602052604060002054151590565b6040519015158152f35b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014757602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b610bb83661044e565b6040517f397796f700000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156106b457600091611116575b506110ec57610c526106008367ffffffffffffffff166000526003602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff811680156110b4576060830191610cae610c95845173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b610fe157610cee610cd460025473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff168452565b6040517f20487ded00000000000000000000000000000000000000000000000000000000815260208180610d26888a60048401611a98565b0381865afa9081156106b457600091610fc2575b503410610f98573492610d67610c95610c95835173ffffffffffffffffffffffffffffffffffffffff1690565b91823b15610147576000600493604051948580927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af19283156106b457610dda93610f7d575b50610dd5610c9534935173ffffffffffffffffffffffffffffffffffffffff1690565b61247d565b9190915b604082019160005b83518051821015610ef557610c95610e0183610e1c93611fdc565b515173ffffffffffffffffffffffffffffffffffffffff1690565b6040517f48a98aa400000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8816600482015273ffffffffffffffffffffffffffffffffffffffff82166024820152909190602081604481885afa80156106b457600193610ebf92600092610ec5575b5073ffffffffffffffffffffffffffffffffffffffff6020610eb2868b51611fdc565b5101519216903390612558565b01610de6565b610ee791925060203d8111610eee575b610edf818361019c565b810190611ff5565b9038610e8f565b503d610ed5565b610f386020888689600088604051968795869485937fdf0aa9e900000000000000000000000000000000000000000000000000000000855233926004860161200a565b03925af180156106b45761032791600091610f5e57506040519081529081906020820190565b610f77915060203d6020116106ad5761069f818361019c565b82610674565b80610f8c6000610f929361019c565b8061013c565b38610db2565b7f07da6ee60000000000000000000000000000000000000000000000000000000060005260046000fd5b610fdb915060203d6020116106ad5761069f818361019c565b38610d3a565b3461108a57604051907f20487ded0000000000000000000000000000000000000000000000000000000082526020828061101f888a60048401611a98565b0381865afa9081156106b45761106192600092611069575b5061105a610c9583965173ffffffffffffffffffffffffffffffffffffffff1690565b3390612558565b919091610dde565b61108391925060203d6020116106ad5761069f818361019c565b9038611037565b7f1841b4e10000000000000000000000000000000000000000000000000000000060005260046000fd5b7fae236d9c0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff841660045260246000fd5b7fc14837150000000000000000000000000000000000000000000000000000000060005260046000fd5b611138915060203d60201161113e575b611130818361019c565b810190611ac5565b38610c2c565b503d611126565b602060408183019282815284518094520192019060005b8181106111695750505090565b8251805167ffffffffffffffff16855260209081015173ffffffffffffffffffffffffffffffffffffffff16818601526040909401939092019160010161115c565b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475760405180816020600454928381520160046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9260005b8181106112e35750506112289250038261019c565b6112328151612052565b9060005b81518110156112d5578061124c60019284611fdc565b516112b973ffffffffffffffffffffffffffffffffffffffff61127f6112728460a01c90565b67ffffffffffffffff1690565b9261129b61128b6101ee565b67ffffffffffffffff9095168552565b1673ffffffffffffffffffffffffffffffffffffffff166020830152565b6112c38286611fdc565b526112ce8185611fdc565b5001611236565b604051806103278582611145565b8454835260019485019486945060209093019201611213565b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610147576020610b5360043561133c8161032b565b67ffffffffffffffff16600052600360205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475767ffffffffffffffff6004356113b38161032b565b166000526003602052602073ffffffffffffffffffffffffffffffffffffffff60406000205416604051908152f35b9181601f840112156101475782359167ffffffffffffffff8311610147576020808501948460061b01011161014757565b346101475760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475760043567ffffffffffffffff8111610147576114629036906004016113e2565b60243567ffffffffffffffff8111610147576114829036906004016113e2565b60443567ffffffffffffffff8111610147576114a29036906004016113e2565b9490936114ad6123fe565b60005b81811061165d5750505060005b8181106115755750505060005b8281106114d357005b806114e96114e460019386866120cd565b611add565b6114ff60206114f98488886120cd565b01612116565b9061151261150d838361250e565b6128a3565b61151f575b5050016114ca565b60405173ffffffffffffffffffffffffffffffffffffffff92909216825267ffffffffffffffff16907fa4bdf64ebdf3316320601a081916a75aa144bcef6c4beeb0e9fb1982cacc6b9490602090a23880611517565b6115836114e48284866120cd565b61159360206114f98486886120cd565b906115ad6115a96115a4848461250e565b6127bf565b1590565b61160d5760405173ffffffffffffffffffffffffffffffffffffffff9290921682526001929167ffffffffffffffff91909116907fa823809efda3ba66c873364eec120fa0923d9fabda73bc97dd5663341e2d9bcb90602090a2016114bd565b7f496477900000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045273ffffffffffffffffffffffffffffffffffffffff1660245260446000fd5b8061167361166e60019385876120cd565b6120dd565b7f1f7d0ec248b80e5c0dde0ee531c4fc8fdb6ce9a2b3d90f560c74acd6a7202f2367ffffffffffffffff61176161174660208501946117386116c9875173ffffffffffffffffffffffffffffffffffffffff1690565b6116f86116de845167ffffffffffffffff1690565b67ffffffffffffffff166000526003602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b5167ffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff919091168152921691602090a2016114b0565b346101475760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261014757602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101475773ffffffffffffffffffffffffffffffffffffffff60043561182e8161039c565b6118366123fe565b163381146118c457807fffffffffffffffffffffffff0000000000000000000000000000000000000000600154161760015573ffffffffffffffffffffffffffffffffffffffff61189c60005473ffffffffffffffffffffffffffffffffffffffff1690565b167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152fd5b346101475760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610147576119656004356119608161032b565b6121a4565b60405180916020820160208352815180915260206040840192019060005b818110611991575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611983565b90816020910312610147575190565b91906119f96119e7845160a0845260a0840190610237565b60208501518382036020850152610237565b9060408401519181810360408301526020808451928381520193019060005b818110611a6057505050608084611a5060606102a796970151606085019073ffffffffffffffffffffffffffffffffffffffff169052565b0151906080818403910152610237565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101518187015260409095019490920191600101611a18565b60409067ffffffffffffffff6102a7949316815281602082015201906119cf565b6040513d6000823e3d90fd5b90816020910312610147575180151581036101475790565b356102a78161032b565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561014757016020813591019167ffffffffffffffff821161014757813603831361014757565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9160209082815201919060005b818110611b905750505090565b90919260408060019273ffffffffffffffffffffffffffffffffffffffff8735611bb98161039c565b16815260208781013590820152019401929101611b83565b90602082528035602083015267ffffffffffffffff6020820135611bf48161032b565b166040830152611c5b611c1e611c0d6040840184611ae7565b60a0606087015260c0860191611b37565b611c2b6060840184611ae7565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0868403016080870152611b37565b9060808101357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215610147570160208135910167ffffffffffffffff8211610147578160061b36038113610147578360a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06102a796860301910152611b76565b939190926040517f397796f700000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156106b457600091611ea5575b506110ec5760208501611d7b610b408235611d748161032b565b339061250e565b15611e7b57611deb611e73611e1d7f85572ffb0000000000000000000000000000000000000000000000000000000097611e29967f9b877de93ea9895756e337442c657f95a34fc68e7eb988bdfa693d5be83016b696611e178c604051978891602083019e8f5260248301611bd1565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810188528761019c565b856122d8565b98919690993594611add565b925190206040519384933391859094939273ffffffffffffffffffffffffffffffffffffffff9067ffffffffffffffff606094608085019885521660208401521660408201520152565b0390a1929190565b7fd2316ede0000000000000000000000000000000000000000000000000000000060005260046000fd5b611ebe915060203d60201161113e57611130818361019c565b38611d5a565b3d15611eef573d90611ed5826101fd565b91611ee3604051938461019c565b82523d6000602084013e565b606090565b91909173ffffffffffffffffffffffffffffffffffffffff83168015611f80575073ffffffffffffffffffffffffffffffffffffffff16918215611f3b576101ec9261247d565b6000809350809281925af1611f4e611ec4565b5015611f5657565b7fe417b80b0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f26a78f8f0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051821015611ff05760209160051b010190565b611fad565b9081602091031261014757516102a78161039c565b92949361204660609367ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff941686526080602087015260808601906119cf565b95604085015216910152565b9061205c82610384565b612069604051918261019c565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06120978294610384565b019060005b8281106120a857505050565b6020906040516120b78161017b565b600081526000838201528282850101520161209c565b9190811015611ff05760061b0190565b604081360312610147576020604051916120f68361017b565b80356121018161032b565b8352013561210e8161039c565b602082015290565b356102a78161039c565b6020818303126101475780519067ffffffffffffffff821161014757019080601f8301121561014757815161215481610384565b92612162604051948561019c565b81845260208085019260051b82010192831161014757602001905b82821061218a5750505090565b6020809183516121998161039c565b81520191019061217d565b6121db8167ffffffffffffffff16600052600360205273ffffffffffffffffffffffffffffffffffffffff60406000205416151590565b156122985760006122659167ffffffffffffffff811682526003602052612220610c95610c956040852073ffffffffffffffffffffffffffffffffffffffff90541690565b60405180809581947ffbca3b740000000000000000000000000000000000000000000000000000000083526004830191909167ffffffffffffffff6020820193169052565b03915afa9081156106b45760009161227b575090565b6102a791503d806000833e612290818361019c565b810190612120565b5060405160206122a8818361019c565b600082527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810190369083013790565b9391936122e560846101fd565b946122f3604051968761019c565b6084865261230160846101fd565b947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602088019601368737833b156123d4575a908082106123aa578291038060061c90031115612380576000918291825a9560208451940192f1905a9003923d9060848211612377575b6000908287523e929190565b6084915061236b565b7f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b7fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff60005416330361241f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152fd5b6101ec9273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb0000000000000000000000000000000000000000000000000000000060208601521660248401526044830152604482526124da60648361019c565b6125bf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7bffffffffffffffff000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9160a01b16911681018091116125535790565b6124df565b90919273ffffffffffffffffffffffffffffffffffffffff6101ec9481604051957f23b872dd0000000000000000000000000000000000000000000000000000000060208801521660248601521660448401526064830152606482526124da60848361019c565b73ffffffffffffffffffffffffffffffffffffffff61262f9116916040926000808551936125ed878661019c565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af1612629611ec4565b91612934565b8051908161263c57505050565b60208061264d938301019101611ac5565b156126555750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b8054821015611ff05760005260206000200190600090565b91612728918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b80548015612790577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061276182826126d8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008181526005602052604090205490811561289c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019082821161255357600454927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff840193841161255357838360009561285b9503612861575b50505061284a600461272c565b600590600052602052604060002090565b55600190565b61284a61288d916128836128796128939560046126d8565b90549060031b1c90565b92839160046126d8565b906126f0565b5538808061283d565b5050600090565b60008181526005602052604090205461292e5760045468010000000000000000811015610197576129156128e082600185940160045560046126d8565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600454906000526005602052604060002055600190565b50600090565b919290156129af5750815115612948575090565b3b156129515790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156129c25750805190602001fd5b6129f8906040519182917f08c379a000000000000000000000000000000000000000000000000000000000835260048301610296565b0390fdfea164736f6c634300081a000a", +} + +var RouterABI = RouterMetaData.ABI + +var RouterBin = RouterMetaData.Bin + +func DeployRouter(auth *bind.TransactOpts, backend bind.ContractBackend, wrappedNative common.Address, armProxy common.Address) (common.Address, *types.Transaction, *Router, error) { + parsed, err := RouterMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RouterBin), backend, wrappedNative, armProxy) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Router{address: address, abi: *parsed, RouterCaller: RouterCaller{contract: contract}, RouterTransactor: RouterTransactor{contract: contract}, RouterFilterer: RouterFilterer{contract: contract}}, nil +} + +type Router struct { + address common.Address + abi abi.ABI + RouterCaller + RouterTransactor + RouterFilterer +} + +type RouterCaller struct { + contract *bind.BoundContract +} + +type RouterTransactor struct { + contract *bind.BoundContract +} + +type RouterFilterer struct { + contract *bind.BoundContract +} + +type RouterSession struct { + Contract *Router + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type RouterCallerSession struct { + Contract *RouterCaller + CallOpts bind.CallOpts +} + +type RouterTransactorSession struct { + Contract *RouterTransactor + TransactOpts bind.TransactOpts +} + +type RouterRaw struct { + Contract *Router +} + +type RouterCallerRaw struct { + Contract *RouterCaller +} + +type RouterTransactorRaw struct { + Contract *RouterTransactor +} + +func NewRouter(address common.Address, backend bind.ContractBackend) (*Router, error) { + abi, err := abi.JSON(strings.NewReader(RouterABI)) + if err != nil { + return nil, err + } + contract, err := bindRouter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Router{address: address, abi: abi, RouterCaller: RouterCaller{contract: contract}, RouterTransactor: RouterTransactor{contract: contract}, RouterFilterer: RouterFilterer{contract: contract}}, nil +} + +func NewRouterCaller(address common.Address, caller bind.ContractCaller) (*RouterCaller, error) { + contract, err := bindRouter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RouterCaller{contract: contract}, nil +} + +func NewRouterTransactor(address common.Address, transactor bind.ContractTransactor) (*RouterTransactor, error) { + contract, err := bindRouter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RouterTransactor{contract: contract}, nil +} + +func NewRouterFilterer(address common.Address, filterer bind.ContractFilterer) (*RouterFilterer, error) { + contract, err := bindRouter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RouterFilterer{contract: contract}, nil +} + +func bindRouter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RouterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_Router *RouterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Router.Contract.RouterCaller.contract.Call(opts, result, method, params...) +} + +func (_Router *RouterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Router.Contract.RouterTransactor.contract.Transfer(opts) +} + +func (_Router *RouterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Router.Contract.RouterTransactor.contract.Transact(opts, method, params...) +} + +func (_Router *RouterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Router.Contract.contract.Call(opts, result, method, params...) +} + +func (_Router *RouterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Router.Contract.contract.Transfer(opts) +} + +func (_Router *RouterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Router.Contract.contract.Transact(opts, method, params...) +} + +func (_Router *RouterCaller) MAXRETBYTES(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "MAX_RET_BYTES") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +func (_Router *RouterSession) MAXRETBYTES() (uint16, error) { + return _Router.Contract.MAXRETBYTES(&_Router.CallOpts) +} + +func (_Router *RouterCallerSession) MAXRETBYTES() (uint16, error) { + return _Router.Contract.MAXRETBYTES(&_Router.CallOpts) +} + +func (_Router *RouterCaller) GetArmProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "getArmProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_Router *RouterSession) GetArmProxy() (common.Address, error) { + return _Router.Contract.GetArmProxy(&_Router.CallOpts) +} + +func (_Router *RouterCallerSession) GetArmProxy() (common.Address, error) { + return _Router.Contract.GetArmProxy(&_Router.CallOpts) +} + +func (_Router *RouterCaller) GetFee(opts *bind.CallOpts, destinationChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "getFee", destinationChainSelector, message) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_Router *RouterSession) GetFee(destinationChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + return _Router.Contract.GetFee(&_Router.CallOpts, destinationChainSelector, message) +} + +func (_Router *RouterCallerSession) GetFee(destinationChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + return _Router.Contract.GetFee(&_Router.CallOpts, destinationChainSelector, message) +} + +func (_Router *RouterCaller) GetOffRamps(opts *bind.CallOpts) ([]RouterOffRamp, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "getOffRamps") + + if err != nil { + return *new([]RouterOffRamp), err + } + + out0 := *abi.ConvertType(out[0], new([]RouterOffRamp)).(*[]RouterOffRamp) + + return out0, err + +} + +func (_Router *RouterSession) GetOffRamps() ([]RouterOffRamp, error) { + return _Router.Contract.GetOffRamps(&_Router.CallOpts) +} + +func (_Router *RouterCallerSession) GetOffRamps() ([]RouterOffRamp, error) { + return _Router.Contract.GetOffRamps(&_Router.CallOpts) +} + +func (_Router *RouterCaller) GetOnRamp(opts *bind.CallOpts, destChainSelector uint64) (common.Address, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "getOnRamp", destChainSelector) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_Router *RouterSession) GetOnRamp(destChainSelector uint64) (common.Address, error) { + return _Router.Contract.GetOnRamp(&_Router.CallOpts, destChainSelector) +} + +func (_Router *RouterCallerSession) GetOnRamp(destChainSelector uint64) (common.Address, error) { + return _Router.Contract.GetOnRamp(&_Router.CallOpts, destChainSelector) +} + +func (_Router *RouterCaller) GetSupportedTokens(opts *bind.CallOpts, chainSelector uint64) ([]common.Address, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "getSupportedTokens", chainSelector) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_Router *RouterSession) GetSupportedTokens(chainSelector uint64) ([]common.Address, error) { + return _Router.Contract.GetSupportedTokens(&_Router.CallOpts, chainSelector) +} + +func (_Router *RouterCallerSession) GetSupportedTokens(chainSelector uint64) ([]common.Address, error) { + return _Router.Contract.GetSupportedTokens(&_Router.CallOpts, chainSelector) +} + +func (_Router *RouterCaller) GetWrappedNative(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "getWrappedNative") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_Router *RouterSession) GetWrappedNative() (common.Address, error) { + return _Router.Contract.GetWrappedNative(&_Router.CallOpts) +} + +func (_Router *RouterCallerSession) GetWrappedNative() (common.Address, error) { + return _Router.Contract.GetWrappedNative(&_Router.CallOpts) +} + +func (_Router *RouterCaller) IsChainSupported(opts *bind.CallOpts, chainSelector uint64) (bool, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "isChainSupported", chainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_Router *RouterSession) IsChainSupported(chainSelector uint64) (bool, error) { + return _Router.Contract.IsChainSupported(&_Router.CallOpts, chainSelector) +} + +func (_Router *RouterCallerSession) IsChainSupported(chainSelector uint64) (bool, error) { + return _Router.Contract.IsChainSupported(&_Router.CallOpts, chainSelector) +} + +func (_Router *RouterCaller) IsOffRamp(opts *bind.CallOpts, sourceChainSelector uint64, offRamp common.Address) (bool, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "isOffRamp", sourceChainSelector, offRamp) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_Router *RouterSession) IsOffRamp(sourceChainSelector uint64, offRamp common.Address) (bool, error) { + return _Router.Contract.IsOffRamp(&_Router.CallOpts, sourceChainSelector, offRamp) +} + +func (_Router *RouterCallerSession) IsOffRamp(sourceChainSelector uint64, offRamp common.Address) (bool, error) { + return _Router.Contract.IsOffRamp(&_Router.CallOpts, sourceChainSelector, offRamp) +} + +func (_Router *RouterCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Router.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 + +} + +func (_Router *RouterSession) Owner() (common.Address, error) { + return _Router.Contract.Owner(&_Router.CallOpts) +} + +func (_Router *RouterCallerSession) Owner() (common.Address, error) { + return _Router.Contract.Owner(&_Router.CallOpts) +} + +func (_Router *RouterCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Router.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_Router *RouterSession) TypeAndVersion() (string, error) { + return _Router.Contract.TypeAndVersion(&_Router.CallOpts) +} + +func (_Router *RouterCallerSession) TypeAndVersion() (string, error) { + return _Router.Contract.TypeAndVersion(&_Router.CallOpts) +} + +func (_Router *RouterTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Router.contract.Transact(opts, "acceptOwnership") +} + +func (_Router *RouterSession) AcceptOwnership() (*types.Transaction, error) { + return _Router.Contract.AcceptOwnership(&_Router.TransactOpts) +} + +func (_Router *RouterTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _Router.Contract.AcceptOwnership(&_Router.TransactOpts) +} + +func (_Router *RouterTransactor) ApplyRampUpdates(opts *bind.TransactOpts, onRampUpdates []RouterOnRamp, offRampRemoves []RouterOffRamp, offRampAdds []RouterOffRamp) (*types.Transaction, error) { + return _Router.contract.Transact(opts, "applyRampUpdates", onRampUpdates, offRampRemoves, offRampAdds) +} + +func (_Router *RouterSession) ApplyRampUpdates(onRampUpdates []RouterOnRamp, offRampRemoves []RouterOffRamp, offRampAdds []RouterOffRamp) (*types.Transaction, error) { + return _Router.Contract.ApplyRampUpdates(&_Router.TransactOpts, onRampUpdates, offRampRemoves, offRampAdds) +} + +func (_Router *RouterTransactorSession) ApplyRampUpdates(onRampUpdates []RouterOnRamp, offRampRemoves []RouterOffRamp, offRampAdds []RouterOffRamp) (*types.Transaction, error) { + return _Router.Contract.ApplyRampUpdates(&_Router.TransactOpts, onRampUpdates, offRampRemoves, offRampAdds) +} + +func (_Router *RouterTransactor) CcipSend(opts *bind.TransactOpts, destinationChainSelector uint64, message ClientEVM2AnyMessage) (*types.Transaction, error) { + return _Router.contract.Transact(opts, "ccipSend", destinationChainSelector, message) +} + +func (_Router *RouterSession) CcipSend(destinationChainSelector uint64, message ClientEVM2AnyMessage) (*types.Transaction, error) { + return _Router.Contract.CcipSend(&_Router.TransactOpts, destinationChainSelector, message) +} + +func (_Router *RouterTransactorSession) CcipSend(destinationChainSelector uint64, message ClientEVM2AnyMessage) (*types.Transaction, error) { + return _Router.Contract.CcipSend(&_Router.TransactOpts, destinationChainSelector, message) +} + +func (_Router *RouterTransactor) RecoverTokens(opts *bind.TransactOpts, tokenAddress common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Router.contract.Transact(opts, "recoverTokens", tokenAddress, to, amount) +} + +func (_Router *RouterSession) RecoverTokens(tokenAddress common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Router.Contract.RecoverTokens(&_Router.TransactOpts, tokenAddress, to, amount) +} + +func (_Router *RouterTransactorSession) RecoverTokens(tokenAddress common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + return _Router.Contract.RecoverTokens(&_Router.TransactOpts, tokenAddress, to, amount) +} + +func (_Router *RouterTransactor) RouteMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage, gasForCallExactCheck uint16, gasLimit *big.Int, receiver common.Address) (*types.Transaction, error) { + return _Router.contract.Transact(opts, "routeMessage", message, gasForCallExactCheck, gasLimit, receiver) +} + +func (_Router *RouterSession) RouteMessage(message ClientAny2EVMMessage, gasForCallExactCheck uint16, gasLimit *big.Int, receiver common.Address) (*types.Transaction, error) { + return _Router.Contract.RouteMessage(&_Router.TransactOpts, message, gasForCallExactCheck, gasLimit, receiver) +} + +func (_Router *RouterTransactorSession) RouteMessage(message ClientAny2EVMMessage, gasForCallExactCheck uint16, gasLimit *big.Int, receiver common.Address) (*types.Transaction, error) { + return _Router.Contract.RouteMessage(&_Router.TransactOpts, message, gasForCallExactCheck, gasLimit, receiver) +} + +func (_Router *RouterTransactor) SetWrappedNative(opts *bind.TransactOpts, wrappedNative common.Address) (*types.Transaction, error) { + return _Router.contract.Transact(opts, "setWrappedNative", wrappedNative) +} + +func (_Router *RouterSession) SetWrappedNative(wrappedNative common.Address) (*types.Transaction, error) { + return _Router.Contract.SetWrappedNative(&_Router.TransactOpts, wrappedNative) +} + +func (_Router *RouterTransactorSession) SetWrappedNative(wrappedNative common.Address) (*types.Transaction, error) { + return _Router.Contract.SetWrappedNative(&_Router.TransactOpts, wrappedNative) +} + +func (_Router *RouterTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _Router.contract.Transact(opts, "transferOwnership", to) +} + +func (_Router *RouterSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _Router.Contract.TransferOwnership(&_Router.TransactOpts, to) +} + +func (_Router *RouterTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _Router.Contract.TransferOwnership(&_Router.TransactOpts, to) +} + +type RouterMessageExecutedIterator struct { + Event *RouterMessageExecuted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RouterMessageExecutedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RouterMessageExecuted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RouterMessageExecuted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RouterMessageExecutedIterator) Error() error { + return it.fail +} + +func (it *RouterMessageExecutedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RouterMessageExecuted struct { + MessageId [32]byte + SourceChainSelector uint64 + OffRamp common.Address + CalldataHash [32]byte + Raw types.Log +} + +func (_Router *RouterFilterer) FilterMessageExecuted(opts *bind.FilterOpts) (*RouterMessageExecutedIterator, error) { + + logs, sub, err := _Router.contract.FilterLogs(opts, "MessageExecuted") + if err != nil { + return nil, err + } + return &RouterMessageExecutedIterator{contract: _Router.contract, event: "MessageExecuted", logs: logs, sub: sub}, nil +} + +func (_Router *RouterFilterer) WatchMessageExecuted(opts *bind.WatchOpts, sink chan<- *RouterMessageExecuted) (event.Subscription, error) { + + logs, sub, err := _Router.contract.WatchLogs(opts, "MessageExecuted") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RouterMessageExecuted) + if err := _Router.contract.UnpackLog(event, "MessageExecuted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_Router *RouterFilterer) ParseMessageExecuted(log types.Log) (*RouterMessageExecuted, error) { + event := new(RouterMessageExecuted) + if err := _Router.contract.UnpackLog(event, "MessageExecuted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RouterOffRampAddedIterator struct { + Event *RouterOffRampAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RouterOffRampAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RouterOffRampAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RouterOffRampAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RouterOffRampAddedIterator) Error() error { + return it.fail +} + +func (it *RouterOffRampAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RouterOffRampAdded struct { + SourceChainSelector uint64 + OffRamp common.Address + Raw types.Log +} + +func (_Router *RouterFilterer) FilterOffRampAdded(opts *bind.FilterOpts, sourceChainSelector []uint64) (*RouterOffRampAddedIterator, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + + logs, sub, err := _Router.contract.FilterLogs(opts, "OffRampAdded", sourceChainSelectorRule) + if err != nil { + return nil, err + } + return &RouterOffRampAddedIterator{contract: _Router.contract, event: "OffRampAdded", logs: logs, sub: sub}, nil +} + +func (_Router *RouterFilterer) WatchOffRampAdded(opts *bind.WatchOpts, sink chan<- *RouterOffRampAdded, sourceChainSelector []uint64) (event.Subscription, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + + logs, sub, err := _Router.contract.WatchLogs(opts, "OffRampAdded", sourceChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RouterOffRampAdded) + if err := _Router.contract.UnpackLog(event, "OffRampAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_Router *RouterFilterer) ParseOffRampAdded(log types.Log) (*RouterOffRampAdded, error) { + event := new(RouterOffRampAdded) + if err := _Router.contract.UnpackLog(event, "OffRampAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RouterOffRampRemovedIterator struct { + Event *RouterOffRampRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RouterOffRampRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RouterOffRampRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RouterOffRampRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RouterOffRampRemovedIterator) Error() error { + return it.fail +} + +func (it *RouterOffRampRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RouterOffRampRemoved struct { + SourceChainSelector uint64 + OffRamp common.Address + Raw types.Log +} + +func (_Router *RouterFilterer) FilterOffRampRemoved(opts *bind.FilterOpts, sourceChainSelector []uint64) (*RouterOffRampRemovedIterator, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + + logs, sub, err := _Router.contract.FilterLogs(opts, "OffRampRemoved", sourceChainSelectorRule) + if err != nil { + return nil, err + } + return &RouterOffRampRemovedIterator{contract: _Router.contract, event: "OffRampRemoved", logs: logs, sub: sub}, nil +} + +func (_Router *RouterFilterer) WatchOffRampRemoved(opts *bind.WatchOpts, sink chan<- *RouterOffRampRemoved, sourceChainSelector []uint64) (event.Subscription, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + + logs, sub, err := _Router.contract.WatchLogs(opts, "OffRampRemoved", sourceChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RouterOffRampRemoved) + if err := _Router.contract.UnpackLog(event, "OffRampRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_Router *RouterFilterer) ParseOffRampRemoved(log types.Log) (*RouterOffRampRemoved, error) { + event := new(RouterOffRampRemoved) + if err := _Router.contract.UnpackLog(event, "OffRampRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RouterOnRampSetIterator struct { + Event *RouterOnRampSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RouterOnRampSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RouterOnRampSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RouterOnRampSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RouterOnRampSetIterator) Error() error { + return it.fail +} + +func (it *RouterOnRampSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RouterOnRampSet struct { + DestChainSelector uint64 + OnRamp common.Address + Raw types.Log +} + +func (_Router *RouterFilterer) FilterOnRampSet(opts *bind.FilterOpts, destChainSelector []uint64) (*RouterOnRampSetIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _Router.contract.FilterLogs(opts, "OnRampSet", destChainSelectorRule) + if err != nil { + return nil, err + } + return &RouterOnRampSetIterator{contract: _Router.contract, event: "OnRampSet", logs: logs, sub: sub}, nil +} + +func (_Router *RouterFilterer) WatchOnRampSet(opts *bind.WatchOpts, sink chan<- *RouterOnRampSet, destChainSelector []uint64) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _Router.contract.WatchLogs(opts, "OnRampSet", destChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RouterOnRampSet) + if err := _Router.contract.UnpackLog(event, "OnRampSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_Router *RouterFilterer) ParseOnRampSet(log types.Log) (*RouterOnRampSet, error) { + event := new(RouterOnRampSet) + if err := _Router.contract.UnpackLog(event, "OnRampSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RouterOwnershipTransferRequestedIterator struct { + Event *RouterOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RouterOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RouterOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RouterOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RouterOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *RouterOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RouterOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_Router *RouterFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RouterOwnershipTransferRequestedIterator, 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 := _Router.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &RouterOwnershipTransferRequestedIterator{contract: _Router.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_Router *RouterFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RouterOwnershipTransferRequested, 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 := _Router.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: + + event := new(RouterOwnershipTransferRequested) + if err := _Router.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 +} + +func (_Router *RouterFilterer) ParseOwnershipTransferRequested(log types.Log) (*RouterOwnershipTransferRequested, error) { + event := new(RouterOwnershipTransferRequested) + if err := _Router.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RouterOwnershipTransferredIterator struct { + Event *RouterOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RouterOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RouterOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RouterOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RouterOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *RouterOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RouterOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_Router *RouterFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RouterOwnershipTransferredIterator, 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 := _Router.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &RouterOwnershipTransferredIterator{contract: _Router.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_Router *RouterFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RouterOwnershipTransferred, 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 := _Router.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: + + event := new(RouterOwnershipTransferred) + if err := _Router.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 +} + +func (_Router *RouterFilterer) ParseOwnershipTransferred(log types.Log) (*RouterOwnershipTransferred, error) { + event := new(RouterOwnershipTransferred) + if err := _Router.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_Router *Router) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _Router.abi.Events["MessageExecuted"].ID: + return _Router.ParseMessageExecuted(log) + case _Router.abi.Events["OffRampAdded"].ID: + return _Router.ParseOffRampAdded(log) + case _Router.abi.Events["OffRampRemoved"].ID: + return _Router.ParseOffRampRemoved(log) + case _Router.abi.Events["OnRampSet"].ID: + return _Router.ParseOnRampSet(log) + case _Router.abi.Events["OwnershipTransferRequested"].ID: + return _Router.ParseOwnershipTransferRequested(log) + case _Router.abi.Events["OwnershipTransferred"].ID: + return _Router.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (RouterMessageExecuted) Topic() common.Hash { + return common.HexToHash("0x9b877de93ea9895756e337442c657f95a34fc68e7eb988bdfa693d5be83016b6") +} + +func (RouterOffRampAdded) Topic() common.Hash { + return common.HexToHash("0xa4bdf64ebdf3316320601a081916a75aa144bcef6c4beeb0e9fb1982cacc6b94") +} + +func (RouterOffRampRemoved) Topic() common.Hash { + return common.HexToHash("0xa823809efda3ba66c873364eec120fa0923d9fabda73bc97dd5663341e2d9bcb") +} + +func (RouterOnRampSet) Topic() common.Hash { + return common.HexToHash("0x1f7d0ec248b80e5c0dde0ee531c4fc8fdb6ce9a2b3d90f560c74acd6a7202f23") +} + +func (RouterOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (RouterOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_Router *Router) Address() common.Address { + return _Router.address +} + +type RouterInterface interface { + MAXRETBYTES(opts *bind.CallOpts) (uint16, error) + + GetArmProxy(opts *bind.CallOpts) (common.Address, error) + + GetFee(opts *bind.CallOpts, destinationChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) + + GetOffRamps(opts *bind.CallOpts) ([]RouterOffRamp, error) + + GetOnRamp(opts *bind.CallOpts, destChainSelector uint64) (common.Address, error) + + GetSupportedTokens(opts *bind.CallOpts, chainSelector uint64) ([]common.Address, error) + + GetWrappedNative(opts *bind.CallOpts) (common.Address, error) + + IsChainSupported(opts *bind.CallOpts, chainSelector uint64) (bool, error) + + IsOffRamp(opts *bind.CallOpts, sourceChainSelector uint64, offRamp common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyRampUpdates(opts *bind.TransactOpts, onRampUpdates []RouterOnRamp, offRampRemoves []RouterOffRamp, offRampAdds []RouterOffRamp) (*types.Transaction, error) + + CcipSend(opts *bind.TransactOpts, destinationChainSelector uint64, message ClientEVM2AnyMessage) (*types.Transaction, error) + + RecoverTokens(opts *bind.TransactOpts, tokenAddress common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) + + RouteMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage, gasForCallExactCheck uint16, gasLimit *big.Int, receiver common.Address) (*types.Transaction, error) + + SetWrappedNative(opts *bind.TransactOpts, wrappedNative common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterMessageExecuted(opts *bind.FilterOpts) (*RouterMessageExecutedIterator, error) + + WatchMessageExecuted(opts *bind.WatchOpts, sink chan<- *RouterMessageExecuted) (event.Subscription, error) + + ParseMessageExecuted(log types.Log) (*RouterMessageExecuted, error) + + FilterOffRampAdded(opts *bind.FilterOpts, sourceChainSelector []uint64) (*RouterOffRampAddedIterator, error) + + WatchOffRampAdded(opts *bind.WatchOpts, sink chan<- *RouterOffRampAdded, sourceChainSelector []uint64) (event.Subscription, error) + + ParseOffRampAdded(log types.Log) (*RouterOffRampAdded, error) + + FilterOffRampRemoved(opts *bind.FilterOpts, sourceChainSelector []uint64) (*RouterOffRampRemovedIterator, error) + + WatchOffRampRemoved(opts *bind.WatchOpts, sink chan<- *RouterOffRampRemoved, sourceChainSelector []uint64) (event.Subscription, error) + + ParseOffRampRemoved(log types.Log) (*RouterOffRampRemoved, error) + + FilterOnRampSet(opts *bind.FilterOpts, destChainSelector []uint64) (*RouterOnRampSetIterator, error) + + WatchOnRampSet(opts *bind.WatchOpts, sink chan<- *RouterOnRampSet, destChainSelector []uint64) (event.Subscription, error) + + ParseOnRampSet(log types.Log) (*RouterOnRampSet, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RouterOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RouterOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*RouterOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RouterOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RouterOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*RouterOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_4_0/burn_mint_token_pool_1_4_0.go b/core/gethwrappers/ccip/generated/v1_4_0/burn_mint_token_pool/burn_mint_token_pool.go similarity index 99% rename from core/gethwrappers/ccip/generated/burn_mint_token_pool_1_4_0/burn_mint_token_pool_1_4_0.go rename to core/gethwrappers/ccip/generated/v1_4_0/burn_mint_token_pool/burn_mint_token_pool.go index 5beb58e096d..2b0916912bc 100644 --- a/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_4_0/burn_mint_token_pool_1_4_0.go +++ b/core/gethwrappers/ccip/generated/v1_4_0/burn_mint_token_pool/burn_mint_token_pool.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package burn_mint_token_pool_1_4_0 +package burn_mint_token_pool import ( "errors" @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/lock_release_token_pool_1_4_0/lock_release_token_pool_1_4_0.go b/core/gethwrappers/ccip/generated/v1_4_0/lock_release_token_pool/lock_release_token_pool.go similarity index 99% rename from core/gethwrappers/ccip/generated/lock_release_token_pool_1_4_0/lock_release_token_pool_1_4_0.go rename to core/gethwrappers/ccip/generated/v1_4_0/lock_release_token_pool/lock_release_token_pool.go index 8d3377f25be..e95069b4cd5 100644 --- a/core/gethwrappers/ccip/generated/lock_release_token_pool_1_4_0/lock_release_token_pool_1_4_0.go +++ b/core/gethwrappers/ccip/generated/v1_4_0/lock_release_token_pool/lock_release_token_pool.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package lock_release_token_pool_1_4_0 +package lock_release_token_pool import ( "errors" @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/token_pool_1_4_0/token_pool_1_4_0.go b/core/gethwrappers/ccip/generated/v1_4_0/token_pool/token_pool.go similarity index 99% rename from core/gethwrappers/ccip/generated/token_pool_1_4_0/token_pool_1_4_0.go rename to core/gethwrappers/ccip/generated/v1_4_0/token_pool/token_pool.go index 477a32d0fd2..e879b82a921 100644 --- a/core/gethwrappers/ccip/generated/token_pool_1_4_0/token_pool_1_4_0.go +++ b/core/gethwrappers/ccip/generated/v1_4_0/token_pool/token_pool.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package token_pool_1_4_0 +package token_pool import ( "errors" @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/usdc_token_pool_1_4_0/usdc_token_pool_1_4_0.go b/core/gethwrappers/ccip/generated/v1_4_0/usdc_token_pool/usdc_token_pool.go similarity index 99% rename from core/gethwrappers/ccip/generated/usdc_token_pool_1_4_0/usdc_token_pool_1_4_0.go rename to core/gethwrappers/ccip/generated/v1_4_0/usdc_token_pool/usdc_token_pool.go index 67250b86e60..21ba1e16eee 100644 --- a/core/gethwrappers/ccip/generated/usdc_token_pool_1_4_0/usdc_token_pool_1_4_0.go +++ b/core/gethwrappers/ccip/generated/v1_4_0/usdc_token_pool/usdc_token_pool.go @@ -1,7 +1,7 @@ // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. -package usdc_token_pool_1_4_0 +package usdc_token_pool import ( "errors" @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go b/core/gethwrappers/ccip/generated/v1_5_0/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go similarity index 100% rename from core/gethwrappers/ccip/generated/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go rename to core/gethwrappers/ccip/generated/v1_5_0/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go diff --git a/core/gethwrappers/ccip/generated/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go b/core/gethwrappers/ccip/generated/v1_5_0/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go rename to core/gethwrappers/ccip/generated/v1_5_0/burn_with_from_mint_rebasing_token_pool/burn_with_from_mint_rebasing_token_pool.go diff --git a/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go b/core/gethwrappers/ccip/generated/v1_5_0/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go similarity index 100% rename from core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go rename to core/gethwrappers/ccip/generated/v1_5_0/burn_with_from_mint_token_pool_and_proxy/burn_with_from_mint_token_pool_and_proxy.go diff --git a/core/gethwrappers/ccip/generated/commit_store/commit_store.go b/core/gethwrappers/ccip/generated/v1_5_0/commit_store/commit_store.go similarity index 100% rename from core/gethwrappers/ccip/generated/commit_store/commit_store.go rename to core/gethwrappers/ccip/generated/v1_5_0/commit_store/commit_store.go diff --git a/core/gethwrappers/ccip/generated/commit_store_helper/commit_store_helper.go b/core/gethwrappers/ccip/generated/v1_5_0/commit_store_helper/commit_store_helper.go similarity index 99% rename from core/gethwrappers/ccip/generated/commit_store_helper/commit_store_helper.go rename to core/gethwrappers/ccip/generated/v1_5_0/commit_store_helper/commit_store_helper.go index 3c9b22d67d5..9c6067dab03 100644 --- a/core/gethwrappers/ccip/generated/commit_store_helper/commit_store_helper.go +++ b/core/gethwrappers/ccip/generated/v1_5_0/commit_store_helper/commit_store_helper.go @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp/evm_2_evm_offramp.go similarity index 100% rename from core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go rename to core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp/evm_2_evm_offramp.go diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go b/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp/evm_2_evm_onramp.go similarity index 100% rename from core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go rename to core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp/evm_2_evm_onramp.go diff --git a/core/gethwrappers/ccip/generated/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go b/core/gethwrappers/ccip/generated/v1_5_0/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go similarity index 100% rename from core/gethwrappers/ccip/generated/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go rename to core/gethwrappers/ccip/generated/v1_5_0/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go diff --git a/core/gethwrappers/ccip/generated/mock_lbtc_token_pool/mock_lbtc_token_pool.go b/core/gethwrappers/ccip/generated/v1_5_0/mock_lbtc_token_pool/mock_lbtc_token_pool.go similarity index 100% rename from core/gethwrappers/ccip/generated/mock_lbtc_token_pool/mock_lbtc_token_pool.go rename to core/gethwrappers/ccip/generated/v1_5_0/mock_lbtc_token_pool/mock_lbtc_token_pool.go diff --git a/core/gethwrappers/ccip/generated/mock_rmn_contract/mock_rmn_contract.go b/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract/mock_rmn_contract.go similarity index 100% rename from core/gethwrappers/ccip/generated/mock_rmn_contract/mock_rmn_contract.go rename to core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract/mock_rmn_contract.go diff --git a/core/gethwrappers/ccip/generated/v1_5_0/ping_pong_demo/ping_pong_demo.go b/core/gethwrappers/ccip/generated/v1_5_0/ping_pong_demo/ping_pong_demo.go new file mode 100644 index 00000000000..949e15f5914 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_0/ping_pong_demo/ping_pong_demo.go @@ -0,0 +1,1229 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ping_pong_demo + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "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" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type ClientAny2EVMMessage struct { + MessageId [32]byte + SourceChainSelector uint64 + Sender []byte + Data []byte + DestTokenAmounts []ClientEVMTokenAmount +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +var PingPongDemoMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCounterpartAddress\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCounterpartChainSelector\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOutOfOrderExecution\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isPaused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setCounterpart\",\"inputs\":[{\"name\":\"counterpartChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"counterpartAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCounterpartAddress\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCounterpartChainSelector\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOutOfOrderExecution\",\"inputs\":[{\"name\":\"outOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPaused\",\"inputs\":[{\"name\":\"pause\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"startPingPong\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"OutOfOrderExecutionChange\",\"inputs\":[{\"name\":\"isOutOfOrder\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"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\":\"Ping\",\"inputs\":[{\"name\":\"pingPongCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Pong\",\"inputs\":[{\"name\":\"pingPongCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRouter\",\"inputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]}]", + Bin: "0x60a0806040523461011f57604081611643803803809161001f828561015f565b83398101031261011f578051906001600160a01b0382169081830361011f57602001516001600160a01b038116929083900361011f57811561014957608052331561013857600180546001600160a01b031990811633179091556002805460ff60a01b19169055600380549091168317905560405163095ea7b360e01b81526004810191909152600019602482015290602090829060449082906000905af1801561012c576100ef575b6040516114aa908161019982396080518181816103df015281816105a00152610fd20152f35b6020813d602011610124575b816101086020938361015f565b8101031261011f57518015150361011f57386100c9565b600080fd5b3d91506100fb565b6040513d6000823e3d90fd5b639b15e16f60e01b60005260046000fd5b6335fdcccd60e21b600052600060045260246000fd5b601f909101601f19168101906001600160401b0382119082101761018257604052565b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146111e05750806316c38b3c14611152578063181f5a77146110d15780631892b906146110415780632874d8bf14610cf25780632b6e5d6314610ca0578063665ed53714610bea57806379ba509714610b0157806385572ffb1461051c5780638da5cb5b146104ca5780639d2aede514610447578063ae90de5514610403578063b0f479a114610394578063b187bd2614610350578063b5a1101114610275578063bee518a41461022c578063ca709a25146101da5763f2fde38b146100e557600080fd5b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55773ffffffffffffffffffffffffffffffffffffffff610131611312565b610139611452565b163381146101ab57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602073ffffffffffffffffffffffffffffffffffffffff60035416604051908152f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602067ffffffffffffffff60015460a01c16604051908152f35b346101d55760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d5576102ac6112fb565b6024359073ffffffffffffffffffffffffffffffffffffffff82168092036101d5576102d6611452565b7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff00000000000000000000000000000000000000006001549260a01b169116176001557fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255600080f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602060ff60025460a01c166040519015158152f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602060ff60035460a01c166040519015158152f35b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55773ffffffffffffffffffffffffffffffffffffffff610493611312565b61049b611452565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006002541617600255600080f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55760043567ffffffffffffffff81116101d55760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101d55773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803303610ad3576000916040516105d681611335565b81600401358152602482013567ffffffffffffffff81168103610acb576020820152604482013567ffffffffffffffff8111610acb5761061c90600436918501016113dd565b6040820152606482013567ffffffffffffffff8111610acb5761064590600436918501016113dd565b916060820192835260848101359067ffffffffffffffff8211610acf57019036602383011215610acb57600482013567ffffffffffffffff8111610a9e5760208160051b0192610698604051948561139c565b818452602060048186019360061b8301010190368211610a9a57602401915b818310610a44575050506080015251602081805181010312610a4057602001519060ff60025460a01c16156106ea578280f35b60018201809211610a13576001828116036109e4577f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f6020604051848152a15b73ffffffffffffffffffffffffffffffffffffffff60025416906040519160208301526020825261075c60408361139c565b6040519260208401526020835261077460408461139c565b604051602093610784858361139c565b85825290918585936003546040519061079c82611380565b62030d40825286820160ff8260a01c1615158152604051927f181dcf1000000000000000000000000000000000000000000000000000000000898501525160248401525115156044830152604482526107f660648361139c565b6040519761080389611335565b88528688019586526040880192835273ffffffffffffffffffffffffffffffffffffffff6060890191168152608088019182526108c567ffffffffffffffff60015460a01c16966108946040519a8b997f96f4e9f9000000000000000000000000000000000000000000000000000000008b5260048b0152604060248b01525160a060448b015260e48a019061129c565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8983030160648a015261129c565b9251927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc878203016084880152878085519283815201940190855b8181106109a757505050859392849273ffffffffffffffffffffffffffffffffffffffff61095f93511660a4850152517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8483030160c485015261129c565b03925af1801561099c57610971578280f35b813d8311610995575b610984818361139c565b810103126109925781808280f35b80fd5b503d61097a565b6040513d85823e3d90fd5b8251805173ffffffffffffffffffffffffffffffffffffffff1687528a01518a8701528b998b99508d975060409096019590920191600101610900565b7f58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b15256020604051848152a161072a565b6024837f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8280fd5b604083360312610a9a5760405190610a5b82611380565b83359073ffffffffffffffffffffffffffffffffffffffff82168203610a9657826020926040945282860135838201528152019201916106b7565b8980fd5b8780fd5b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8480fd5b8580fd5b7fd7f73334000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55760005473ffffffffffffffffffffffffffffffffffffffff81163303610bc0577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d5576004358015158091036101d55760207f05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd991610c52611452565b6003547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000008360a01b16911617600355604051908152a1005b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557610d29611452565b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002557f48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f602060405160018152a1600173ffffffffffffffffffffffffffffffffffffffff6002541660405190602082015260208152610daf60408261139c565b6040519082602083015260208252610dc860408361139c565b604051602092610dd8848361139c565b6000825260009461103c575b839060035460405190610df682611380565b62030d40825283820160ff8260a01c1615158152604051927f181dcf100000000000000000000000000000000000000000000000000000000086850152516024840152511515604483015260448252610e5060648361139c565b60405195610e5d87611335565b86528386019283526040860194855273ffffffffffffffffffffffffffffffffffffffff606087019116815260808601918252610f1f67ffffffffffffffff60015460a01c1693610eee6040519889967f96f4e9f90000000000000000000000000000000000000000000000000000000088526004880152604060248801525160a0604488015260e487019061129c565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc86830301606487015261129c565b9451947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc848203016084850152848087519283815201960190895b8181106110025750505093610fb89173ffffffffffffffffffffffffffffffffffffffff849596511660a4850152517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8483030160c485015261129c565b03818673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561099c57610971578280f35b8251805173ffffffffffffffffffffffffffffffffffffffff16895287015187890152604090970196899689965090920191600101610f5a565b610de4565b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d5576110786112fb565b611080611452565b7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff00000000000000000000000000000000000000006001549260a01b16911617600155600080f35b346101d55760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d55761114e6040805190611112818361139c565b601282527f50696e67506f6e6744656d6f20312e352e30000000000000000000000000000060208301525191829160208352602083019061129c565b0390f35b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d5576004358015158091036101d557611196611452565b7fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006002549260a01b16911617600255600080f35b346101d55760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101d557600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101d557817f85572ffb0000000000000000000000000000000000000000000000000000000060209314908115611272575b5015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148361126b565b919082519283825260005b8481106112e65750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016112a7565b6004359067ffffffffffffffff821682036101d557565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101d557565b60a0810190811067ffffffffffffffff82111761135157604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761135157604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761135157604052565b81601f820112156101d55780359067ffffffffffffffff82116113515760405192611430601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018561139c565b828452602083830101116101d557816000926020809301838601378301015290565b73ffffffffffffffffffffffffffffffffffffffff60015416330361147357565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fdfea164736f6c634300081a000a", +} + +var PingPongDemoABI = PingPongDemoMetaData.ABI + +var PingPongDemoBin = PingPongDemoMetaData.Bin + +func DeployPingPongDemo(auth *bind.TransactOpts, backend bind.ContractBackend, router common.Address, feeToken common.Address) (common.Address, *types.Transaction, *PingPongDemo, error) { + parsed, err := PingPongDemoMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PingPongDemoBin), backend, router, feeToken) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &PingPongDemo{address: address, abi: *parsed, PingPongDemoCaller: PingPongDemoCaller{contract: contract}, PingPongDemoTransactor: PingPongDemoTransactor{contract: contract}, PingPongDemoFilterer: PingPongDemoFilterer{contract: contract}}, nil +} + +type PingPongDemo struct { + address common.Address + abi abi.ABI + PingPongDemoCaller + PingPongDemoTransactor + PingPongDemoFilterer +} + +type PingPongDemoCaller struct { + contract *bind.BoundContract +} + +type PingPongDemoTransactor struct { + contract *bind.BoundContract +} + +type PingPongDemoFilterer struct { + contract *bind.BoundContract +} + +type PingPongDemoSession struct { + Contract *PingPongDemo + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type PingPongDemoCallerSession struct { + Contract *PingPongDemoCaller + CallOpts bind.CallOpts +} + +type PingPongDemoTransactorSession struct { + Contract *PingPongDemoTransactor + TransactOpts bind.TransactOpts +} + +type PingPongDemoRaw struct { + Contract *PingPongDemo +} + +type PingPongDemoCallerRaw struct { + Contract *PingPongDemoCaller +} + +type PingPongDemoTransactorRaw struct { + Contract *PingPongDemoTransactor +} + +func NewPingPongDemo(address common.Address, backend bind.ContractBackend) (*PingPongDemo, error) { + abi, err := abi.JSON(strings.NewReader(PingPongDemoABI)) + if err != nil { + return nil, err + } + contract, err := bindPingPongDemo(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &PingPongDemo{address: address, abi: abi, PingPongDemoCaller: PingPongDemoCaller{contract: contract}, PingPongDemoTransactor: PingPongDemoTransactor{contract: contract}, PingPongDemoFilterer: PingPongDemoFilterer{contract: contract}}, nil +} + +func NewPingPongDemoCaller(address common.Address, caller bind.ContractCaller) (*PingPongDemoCaller, error) { + contract, err := bindPingPongDemo(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &PingPongDemoCaller{contract: contract}, nil +} + +func NewPingPongDemoTransactor(address common.Address, transactor bind.ContractTransactor) (*PingPongDemoTransactor, error) { + contract, err := bindPingPongDemo(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &PingPongDemoTransactor{contract: contract}, nil +} + +func NewPingPongDemoFilterer(address common.Address, filterer bind.ContractFilterer) (*PingPongDemoFilterer, error) { + contract, err := bindPingPongDemo(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &PingPongDemoFilterer{contract: contract}, nil +} + +func bindPingPongDemo(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := PingPongDemoMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_PingPongDemo *PingPongDemoRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PingPongDemo.Contract.PingPongDemoCaller.contract.Call(opts, result, method, params...) +} + +func (_PingPongDemo *PingPongDemoRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PingPongDemo.Contract.PingPongDemoTransactor.contract.Transfer(opts) +} + +func (_PingPongDemo *PingPongDemoRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PingPongDemo.Contract.PingPongDemoTransactor.contract.Transact(opts, method, params...) +} + +func (_PingPongDemo *PingPongDemoCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PingPongDemo.Contract.contract.Call(opts, result, method, params...) +} + +func (_PingPongDemo *PingPongDemoTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PingPongDemo.Contract.contract.Transfer(opts) +} + +func (_PingPongDemo *PingPongDemoTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PingPongDemo.Contract.contract.Transact(opts, method, params...) +} + +func (_PingPongDemo *PingPongDemoCaller) GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "getCounterpartAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) GetCounterpartAddress() (common.Address, error) { + return _PingPongDemo.Contract.GetCounterpartAddress(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) GetCounterpartAddress() (common.Address, error) { + return _PingPongDemo.Contract.GetCounterpartAddress(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCaller) GetCounterpartChainSelector(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "getCounterpartChainSelector") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) GetCounterpartChainSelector() (uint64, error) { + return _PingPongDemo.Contract.GetCounterpartChainSelector(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) GetCounterpartChainSelector() (uint64, error) { + return _PingPongDemo.Contract.GetCounterpartChainSelector(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCaller) GetFeeToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "getFeeToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) GetFeeToken() (common.Address, error) { + return _PingPongDemo.Contract.GetFeeToken(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) GetFeeToken() (common.Address, error) { + return _PingPongDemo.Contract.GetFeeToken(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCaller) GetOutOfOrderExecution(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "getOutOfOrderExecution") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) GetOutOfOrderExecution() (bool, error) { + return _PingPongDemo.Contract.GetOutOfOrderExecution(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) GetOutOfOrderExecution() (bool, error) { + return _PingPongDemo.Contract.GetOutOfOrderExecution(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) GetRouter() (common.Address, error) { + return _PingPongDemo.Contract.GetRouter(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) GetRouter() (common.Address, error) { + return _PingPongDemo.Contract.GetRouter(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCaller) IsPaused(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "isPaused") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) IsPaused() (bool, error) { + return _PingPongDemo.Contract.IsPaused(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) IsPaused() (bool, error) { + return _PingPongDemo.Contract.IsPaused(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PingPongDemo.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 + +} + +func (_PingPongDemo *PingPongDemoSession) Owner() (common.Address, error) { + return _PingPongDemo.Contract.Owner(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) Owner() (common.Address, error) { + return _PingPongDemo.Contract.Owner(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _PingPongDemo.Contract.SupportsInterface(&_PingPongDemo.CallOpts, interfaceId) +} + +func (_PingPongDemo *PingPongDemoCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _PingPongDemo.Contract.SupportsInterface(&_PingPongDemo.CallOpts, interfaceId) +} + +func (_PingPongDemo *PingPongDemoCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _PingPongDemo.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_PingPongDemo *PingPongDemoSession) TypeAndVersion() (string, error) { + return _PingPongDemo.Contract.TypeAndVersion(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoCallerSession) TypeAndVersion() (string, error) { + return _PingPongDemo.Contract.TypeAndVersion(&_PingPongDemo.CallOpts) +} + +func (_PingPongDemo *PingPongDemoTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "acceptOwnership") +} + +func (_PingPongDemo *PingPongDemoSession) AcceptOwnership() (*types.Transaction, error) { + return _PingPongDemo.Contract.AcceptOwnership(&_PingPongDemo.TransactOpts) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _PingPongDemo.Contract.AcceptOwnership(&_PingPongDemo.TransactOpts) +} + +func (_PingPongDemo *PingPongDemoTransactor) CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "ccipReceive", message) +} + +func (_PingPongDemo *PingPongDemoSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _PingPongDemo.Contract.CcipReceive(&_PingPongDemo.TransactOpts, message) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) CcipReceive(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _PingPongDemo.Contract.CcipReceive(&_PingPongDemo.TransactOpts, message) +} + +func (_PingPongDemo *PingPongDemoTransactor) SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "setCounterpart", counterpartChainSelector, counterpartAddress) +} + +func (_PingPongDemo *PingPongDemoSession) SetCounterpart(counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpart(&_PingPongDemo.TransactOpts, counterpartChainSelector, counterpartAddress) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpart(counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpart(&_PingPongDemo.TransactOpts, counterpartChainSelector, counterpartAddress) +} + +func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "setCounterpartAddress", addr) +} + +func (_PingPongDemo *PingPongDemoSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, addr) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartAddress(addr common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpartAddress(&_PingPongDemo.TransactOpts, addr) +} + +func (_PingPongDemo *PingPongDemoTransactor) SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "setCounterpartChainSelector", chainSelector) +} + +func (_PingPongDemo *PingPongDemoSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, chainSelector) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) SetCounterpartChainSelector(chainSelector uint64) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetCounterpartChainSelector(&_PingPongDemo.TransactOpts, chainSelector) +} + +func (_PingPongDemo *PingPongDemoTransactor) SetOutOfOrderExecution(opts *bind.TransactOpts, outOfOrderExecution bool) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "setOutOfOrderExecution", outOfOrderExecution) +} + +func (_PingPongDemo *PingPongDemoSession) SetOutOfOrderExecution(outOfOrderExecution bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetOutOfOrderExecution(&_PingPongDemo.TransactOpts, outOfOrderExecution) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) SetOutOfOrderExecution(outOfOrderExecution bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetOutOfOrderExecution(&_PingPongDemo.TransactOpts, outOfOrderExecution) +} + +func (_PingPongDemo *PingPongDemoTransactor) SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "setPaused", pause) +} + +func (_PingPongDemo *PingPongDemoSession) SetPaused(pause bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetPaused(&_PingPongDemo.TransactOpts, pause) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) SetPaused(pause bool) (*types.Transaction, error) { + return _PingPongDemo.Contract.SetPaused(&_PingPongDemo.TransactOpts, pause) +} + +func (_PingPongDemo *PingPongDemoTransactor) StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "startPingPong") +} + +func (_PingPongDemo *PingPongDemoSession) StartPingPong() (*types.Transaction, error) { + return _PingPongDemo.Contract.StartPingPong(&_PingPongDemo.TransactOpts) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) StartPingPong() (*types.Transaction, error) { + return _PingPongDemo.Contract.StartPingPong(&_PingPongDemo.TransactOpts) +} + +func (_PingPongDemo *PingPongDemoTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _PingPongDemo.contract.Transact(opts, "transferOwnership", to) +} + +func (_PingPongDemo *PingPongDemoSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) +} + +func (_PingPongDemo *PingPongDemoTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _PingPongDemo.Contract.TransferOwnership(&_PingPongDemo.TransactOpts, to) +} + +type PingPongDemoOutOfOrderExecutionChangeIterator struct { + Event *PingPongDemoOutOfOrderExecutionChange + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOutOfOrderExecutionChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOutOfOrderExecutionChange) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoOutOfOrderExecutionChangeIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoOutOfOrderExecutionChange struct { + IsOutOfOrder bool + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterOutOfOrderExecutionChange(opts *bind.FilterOpts) (*PingPongDemoOutOfOrderExecutionChangeIterator, error) { + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "OutOfOrderExecutionChange") + if err != nil { + return nil, err + } + return &PingPongDemoOutOfOrderExecutionChangeIterator{contract: _PingPongDemo.contract, event: "OutOfOrderExecutionChange", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchOutOfOrderExecutionChange(opts *bind.WatchOpts, sink chan<- *PingPongDemoOutOfOrderExecutionChange) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "OutOfOrderExecutionChange") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoOutOfOrderExecutionChange) + if err := _PingPongDemo.contract.UnpackLog(event, "OutOfOrderExecutionChange", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_PingPongDemo *PingPongDemoFilterer) ParseOutOfOrderExecutionChange(log types.Log) (*PingPongDemoOutOfOrderExecutionChange, error) { + event := new(PingPongDemoOutOfOrderExecutionChange) + if err := _PingPongDemo.contract.UnpackLog(event, "OutOfOrderExecutionChange", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoOwnershipTransferRequestedIterator struct { + Event *PingPongDemoOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *PingPongDemoOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferRequestedIterator, 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 := _PingPongDemo.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &PingPongDemoOwnershipTransferRequestedIterator{contract: _PingPongDemo.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferRequested, 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 := _PingPongDemo.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: + + event := new(PingPongDemoOwnershipTransferRequested) + if err := _PingPongDemo.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 +} + +func (_PingPongDemo *PingPongDemoFilterer) ParseOwnershipTransferRequested(log types.Log) (*PingPongDemoOwnershipTransferRequested, error) { + event := new(PingPongDemoOwnershipTransferRequested) + if err := _PingPongDemo.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoOwnershipTransferredIterator struct { + Event *PingPongDemoOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(PingPongDemoOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *PingPongDemoOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferredIterator, 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 := _PingPongDemo.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &PingPongDemoOwnershipTransferredIterator{contract: _PingPongDemo.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferred, 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 := _PingPongDemo.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: + + event := new(PingPongDemoOwnershipTransferred) + if err := _PingPongDemo.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 +} + +func (_PingPongDemo *PingPongDemoFilterer) ParseOwnershipTransferred(log types.Log) (*PingPongDemoOwnershipTransferred, error) { + event := new(PingPongDemoOwnershipTransferred) + if err := _PingPongDemo.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoPingIterator struct { + Event *PingPongDemoPing + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoPingIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoPing) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(PingPongDemoPing) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *PingPongDemoPingIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoPingIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoPing struct { + PingPongCount *big.Int + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterPing(opts *bind.FilterOpts) (*PingPongDemoPingIterator, error) { + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "Ping") + if err != nil { + return nil, err + } + return &PingPongDemoPingIterator{contract: _PingPongDemo.contract, event: "Ping", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchPing(opts *bind.WatchOpts, sink chan<- *PingPongDemoPing) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "Ping") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoPing) + if err := _PingPongDemo.contract.UnpackLog(event, "Ping", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_PingPongDemo *PingPongDemoFilterer) ParsePing(log types.Log) (*PingPongDemoPing, error) { + event := new(PingPongDemoPing) + if err := _PingPongDemo.contract.UnpackLog(event, "Ping", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type PingPongDemoPongIterator struct { + Event *PingPongDemoPong + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *PingPongDemoPongIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(PingPongDemoPong) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(PingPongDemoPong) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *PingPongDemoPongIterator) Error() error { + return it.fail +} + +func (it *PingPongDemoPongIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type PingPongDemoPong struct { + PingPongCount *big.Int + Raw types.Log +} + +func (_PingPongDemo *PingPongDemoFilterer) FilterPong(opts *bind.FilterOpts) (*PingPongDemoPongIterator, error) { + + logs, sub, err := _PingPongDemo.contract.FilterLogs(opts, "Pong") + if err != nil { + return nil, err + } + return &PingPongDemoPongIterator{contract: _PingPongDemo.contract, event: "Pong", logs: logs, sub: sub}, nil +} + +func (_PingPongDemo *PingPongDemoFilterer) WatchPong(opts *bind.WatchOpts, sink chan<- *PingPongDemoPong) (event.Subscription, error) { + + logs, sub, err := _PingPongDemo.contract.WatchLogs(opts, "Pong") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(PingPongDemoPong) + if err := _PingPongDemo.contract.UnpackLog(event, "Pong", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_PingPongDemo *PingPongDemoFilterer) ParsePong(log types.Log) (*PingPongDemoPong, error) { + event := new(PingPongDemoPong) + if err := _PingPongDemo.contract.UnpackLog(event, "Pong", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_PingPongDemo *PingPongDemo) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _PingPongDemo.abi.Events["OutOfOrderExecutionChange"].ID: + return _PingPongDemo.ParseOutOfOrderExecutionChange(log) + case _PingPongDemo.abi.Events["OwnershipTransferRequested"].ID: + return _PingPongDemo.ParseOwnershipTransferRequested(log) + case _PingPongDemo.abi.Events["OwnershipTransferred"].ID: + return _PingPongDemo.ParseOwnershipTransferred(log) + case _PingPongDemo.abi.Events["Ping"].ID: + return _PingPongDemo.ParsePing(log) + case _PingPongDemo.abi.Events["Pong"].ID: + return _PingPongDemo.ParsePong(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (PingPongDemoOutOfOrderExecutionChange) Topic() common.Hash { + return common.HexToHash("0x05a3fef9935c9013a24c6193df2240d34fcf6b0ebf8786b85efe8401d696cdd9") +} + +func (PingPongDemoOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (PingPongDemoOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (PingPongDemoPing) Topic() common.Hash { + return common.HexToHash("0x48257dc961b6f792c2b78a080dacfed693b660960a702de21cee364e20270e2f") +} + +func (PingPongDemoPong) Topic() common.Hash { + return common.HexToHash("0x58b69f57828e6962d216502094c54f6562f3bf082ba758966c3454f9e37b1525") +} + +func (_PingPongDemo *PingPongDemo) Address() common.Address { + return _PingPongDemo.address +} + +type PingPongDemoInterface interface { + GetCounterpartAddress(opts *bind.CallOpts) (common.Address, error) + + GetCounterpartChainSelector(opts *bind.CallOpts) (uint64, error) + + GetFeeToken(opts *bind.CallOpts) (common.Address, error) + + GetOutOfOrderExecution(opts *bind.CallOpts) (bool, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + IsPaused(opts *bind.CallOpts) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + CcipReceive(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + SetCounterpart(opts *bind.TransactOpts, counterpartChainSelector uint64, counterpartAddress common.Address) (*types.Transaction, error) + + SetCounterpartAddress(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) + + SetCounterpartChainSelector(opts *bind.TransactOpts, chainSelector uint64) (*types.Transaction, error) + + SetOutOfOrderExecution(opts *bind.TransactOpts, outOfOrderExecution bool) (*types.Transaction, error) + + SetPaused(opts *bind.TransactOpts, pause bool) (*types.Transaction, error) + + StartPingPong(opts *bind.TransactOpts) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterOutOfOrderExecutionChange(opts *bind.FilterOpts) (*PingPongDemoOutOfOrderExecutionChangeIterator, error) + + WatchOutOfOrderExecutionChange(opts *bind.WatchOpts, sink chan<- *PingPongDemoOutOfOrderExecutionChange) (event.Subscription, error) + + ParseOutOfOrderExecutionChange(log types.Log) (*PingPongDemoOutOfOrderExecutionChange, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*PingPongDemoOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*PingPongDemoOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PingPongDemoOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*PingPongDemoOwnershipTransferred, error) + + FilterPing(opts *bind.FilterOpts) (*PingPongDemoPingIterator, error) + + WatchPing(opts *bind.WatchOpts, sink chan<- *PingPongDemoPing) (event.Subscription, error) + + ParsePing(log types.Log) (*PingPongDemoPing, error) + + FilterPong(opts *bind.FilterOpts) (*PingPongDemoPongIterator, error) + + WatchPong(opts *bind.WatchOpts, sink chan<- *PingPongDemoPong) (event.Subscription, error) + + ParsePong(log types.Log) (*PingPongDemoPong, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/rmn_contract/rmn_contract.go b/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract/rmn_contract.go similarity index 99% rename from core/gethwrappers/ccip/generated/rmn_contract/rmn_contract.go rename to core/gethwrappers/ccip/generated/v1_5_0/rmn_contract/rmn_contract.go index e314f0243a9..35ac9379380 100644 --- a/core/gethwrappers/ccip/generated/rmn_contract/rmn_contract.go +++ b/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract/rmn_contract.go @@ -9,12 +9,13 @@ import ( "math/big" "strings" - ethereum "github.com/ethereum/go-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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ) @@ -683,9 +684,9 @@ func (it *RMNContractAlreadyBlessedIterator) Close() error { type RMNContractAlreadyBlessed struct { ConfigVersion uint32 - Voter common.Address - TaggedRoot IRMNTaggedRoot - Raw types.Log + Voter common.Address + TaggedRoot IRMNTaggedRoot + Raw types.Log } func (_RMNContract *RMNContractFilterer) FilterAlreadyBlessed(opts *bind.FilterOpts, configVersion []uint32, voter []common.Address) (*RMNContractAlreadyBlessedIterator, error) { @@ -820,9 +821,9 @@ func (it *RMNContractAlreadyVotedToBlessIterator) Close() error { type RMNContractAlreadyVotedToBless struct { ConfigVersion uint32 - Voter common.Address - TaggedRoot IRMNTaggedRoot - Raw types.Log + Voter common.Address + TaggedRoot IRMNTaggedRoot + Raw types.Log } func (_RMNContract *RMNContractFilterer) FilterAlreadyVotedToBless(opts *bind.FilterOpts, configVersion []uint32, voter []common.Address) (*RMNContractAlreadyVotedToBlessIterator, error) { @@ -2365,9 +2366,9 @@ func (it *RMNContractVotedToBlessIterator) Close() error { type RMNContractVotedToBless struct { ConfigVersion uint32 - Voter common.Address - TaggedRoot IRMNTaggedRoot - Weight uint8 + Voter common.Address + TaggedRoot IRMNTaggedRoot + Weight uint8 Raw types.Log } diff --git a/core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go b/core/gethwrappers/ccip/generated/v1_5_0/self_funded_ping_pong/self_funded_ping_pong.go similarity index 100% rename from core/gethwrappers/ccip/generated/self_funded_ping_pong/self_funded_ping_pong.go rename to core/gethwrappers/ccip/generated/v1_5_0/self_funded_ping_pong/self_funded_ping_pong.go diff --git a/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry/token_admin_registry.go b/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry/token_admin_registry.go new file mode 100644 index 00000000000..d9883e72250 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry/token_admin_registry.go @@ -0,0 +1,1526 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package token_admin_registry + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type TokenAdminRegistryTokenConfig struct { + Administrator common.Address + PendingAdministrator common.Address + TokenPool common.Address +} + +var TokenAdminRegistryMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"acceptAdminRole\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRegistryModule\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllConfiguredTokens\",\"inputs\":[{\"name\":\"startIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxCount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPool\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPools\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenConfig\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTokenAdminRegistry.TokenConfig\",\"components\":[{\"name\":\"administrator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pendingAdministrator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPool\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAdministrator\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"administrator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRegistryModule\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proposeAdministrator\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"administrator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRegistryModule\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPool\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pool\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferAdminRole\",\"inputs\":[{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdministratorTransferRequested\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"currentAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AdministratorTransferred\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"PoolSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousPool\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPool\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RegistryModuleAdded\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RegistryModuleRemoved\",\"inputs\":[{\"name\":\"module\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyRegistered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenPoolToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyAdministrator\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPendingAdministrator\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyRegistryModuleOrOwner\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x60808060405234603d573315602c57600180546001600160a01b031916331790556114a790816100438239f35b639b15e16f60e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806310cbcf1814610e82578063156194da14610d45578063181f5a7714610c335780633dc4577214610ba25780634e847fc7146109b65780635e63547a146108be57806372d64a811461084957806379ba5097146107605780637d3f2552146106f15780638da5cb5b1461069f578063bbe4f6db14610621578063c1af6e0314610587578063cb67e3b1146104b5578063ddadfa8e14610385578063e677ae37146101c15763f2fde38b146100cc57600080fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610118610f0d565b6101206111e7565b1633811461019257807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc576101f8610f0d565b610200610f30565b610217336000526006602052604060002054151590565b1580610363575b6103355773ffffffffffffffffffffffffffffffffffffffff1690811561030b5773ffffffffffffffffffffffffffffffffffffffff16806000526002602052604060002073ffffffffffffffffffffffffffffffffffffffff8154166102dd5760010180547fffffffffffffffffffffffff000000000000000000000000000000000000000016831790556000906102b681611440565b507fc54c3051ff16e63bb9203214432372aca006c589e3653619b577a3265675b7168280a4005b507f45ed80e90000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fd92e233d0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f51ca1ec3000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b5073ffffffffffffffffffffffffffffffffffffffff6001541633141561021e565b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc576103bc610f0d565b73ffffffffffffffffffffffffffffffffffffffff6103d9610f30565b91169081600052600260205273ffffffffffffffffffffffffffffffffffffffff6040600020541633036104835773ffffffffffffffffffffffffffffffffffffffff9082600052600260205260016040600020018282167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055169033907fc54c3051ff16e63bb9203214432372aca006c589e3653619b577a3265675b716600080a4005b507fed5d85b5000000000000000000000000000000000000000000000000000000006000523360045260245260446000fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610501610f0d565b60006040805161051081610f53565b82815282602082015201521660005260026020526060604060002073ffffffffffffffffffffffffffffffffffffffff60405161054c81610f53565b818084541693848352604082600281600185015416936020870194855201541693019283526040519485525116602084015251166040820152f35b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5760206105c0610f0d565b73ffffffffffffffffffffffffffffffffffffffff6105dd610f30565b91166000526002825273ffffffffffffffffffffffffffffffffffffffff6040600020541673ffffffffffffffffffffffffffffffffffffffff6040519216148152f35b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff61066d610f0d565b166000526002602052602073ffffffffffffffffffffffffffffffffffffffff60026040600020015416604051908152f35b346101bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc57602061075673ffffffffffffffffffffffffffffffffffffffff610742610f0d565b166000526006602052604060002054151590565b6040519015158152f35b346101bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5760005473ffffffffffffffffffffffffffffffffffffffff8116330361081f577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5760043567ffffffffffffffff811681036101bc576024359067ffffffffffffffff821682036101bc576108ba916108ae916110e6565b60405191829182610fb0565b0390f35b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5760043567ffffffffffffffff81116101bc57366023820112156101bc57806004013567ffffffffffffffff81116101bc573660248260051b840101116101bc5761093681611018565b60005b828110156109a857600060248260051b8601013573ffffffffffffffffffffffffffffffffffffffff81168091036109a457600260408373ffffffffffffffffffffffffffffffffffffffff936001969552826020522001541661099d8285611067565b5201610939565b5080fd5b604051806108ba8482610fb0565b346101bc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc576109ed610f0d565b73ffffffffffffffffffffffffffffffffffffffff610a0a610f30565b91169081600052600260205273ffffffffffffffffffffffffffffffffffffffff6040600020541633036104835773ffffffffffffffffffffffffffffffffffffffff169081151580610b0c575b610adf5780600052600260205260026040600020019073ffffffffffffffffffffffffffffffffffffffff82541691837fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055828203610ab857005b7f754449ec3aff3bd528bfce43ae9319c4a381b67fcd1d20097b3b24dacaecc35d600080a4005b7f962b60e60000000000000000000000000000000000000000000000000000000060005260045260246000fd5b506040517f240028e8000000000000000000000000000000000000000000000000000000008152816004820152602081602481865afa908115610b9657600091610b58575b5015610a58565b6020813d602011610b8e575b81610b7160209383610f6f565b810103126109a45751908115158203610b8b575083610b51565b80fd5b3d9150610b64565b6040513d6000823e3d90fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610bee610f0d565b610bf66111e7565b16610c00816113e0565b610c0657005b60207f3cabf004338366bfeaeb610ad827cb58d16b588017c509501f2c97c83caae7b291604051908152a1005b346101bc5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc576040516040810181811067ffffffffffffffff821117610d1657604052601881527f546f6b656e41646d696e526567697374727920312e352e300000000000000000602082015260405190602082528181519182602083015260005b838110610cfe5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610cbe565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610d91610f0d565b168060005260026020526040600020600181019073ffffffffffffffffffffffffffffffffffffffff8254163303610e505773ffffffffffffffffffffffffffffffffffffffff33167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790557fffffffffffffffffffffffff0000000000000000000000000000000000000000815416905533907f399b55200f7f639a63d76efe3dcfa9156ce367058d6b673041b84a628885f5a7600080a3005b827f3edffe75000000000000000000000000000000000000000000000000000000006000523360045260245260446000fd5b346101bc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101bc5773ffffffffffffffffffffffffffffffffffffffff610ece610f0d565b610ed66111e7565b16610ee08161124a565b610ee657005b7f93eaa26dcb9275e56bacb1d33fdbf402262da6f0f4baf2a6e2cd154b73f387f8600080a2005b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101bc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101bc57565b6060810190811067ffffffffffffffff821117610d1657604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610d1657604052565b602060408183019282815284518094520192019060005b818110610fd45750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101610fc7565b67ffffffffffffffff8111610d165760051b60200190565b9061102282611000565b61102f6040519182610f6f565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061105d8294611000565b0190602036910137565b805182101561107b5760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919082018092116110b757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff600354911691818310156111df5767ffffffffffffffff16908061111384846110aa565b116111ce575b509061112482611018565b91600091600354925b82811061113b575050505090565b61114581836110aa565b6000858210156111a157600390527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b01546001919073ffffffffffffffffffffffffffffffffffffffff1661119a8288611067565b520161112d565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b828103915081116110b75738611119565b505050606090565b73ffffffffffffffffffffffffffffffffffffffff60015416330361120857565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b805482101561107b5760005260206000200190600090565b60008181526006602052604090205480156113d9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116110b757600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116110b75781810361136a575b505050600554801561133b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016112f8816005611232565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6113c161137b61138c936005611232565b90549060031b1c9283926005611232565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260066020526040600020553880806112bf565b5050600090565b8060005260066020526040600020541560001461143a5760055468010000000000000000811015610d165761142161138c8260018594016005556005611232565b9055600554906000526006602052604060002055600190565b50600090565b8060005260046020526040600020541560001461143a5760035468010000000000000000811015610d165761148161138c8260018594016003556003611232565b905560035490600052600460205260406000205560019056fea164736f6c634300081a000a", +} + +var TokenAdminRegistryABI = TokenAdminRegistryMetaData.ABI + +var TokenAdminRegistryBin = TokenAdminRegistryMetaData.Bin + +func DeployTokenAdminRegistry(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *TokenAdminRegistry, error) { + parsed, err := TokenAdminRegistryMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(TokenAdminRegistryBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &TokenAdminRegistry{address: address, abi: *parsed, TokenAdminRegistryCaller: TokenAdminRegistryCaller{contract: contract}, TokenAdminRegistryTransactor: TokenAdminRegistryTransactor{contract: contract}, TokenAdminRegistryFilterer: TokenAdminRegistryFilterer{contract: contract}}, nil +} + +type TokenAdminRegistry struct { + address common.Address + abi abi.ABI + TokenAdminRegistryCaller + TokenAdminRegistryTransactor + TokenAdminRegistryFilterer +} + +type TokenAdminRegistryCaller struct { + contract *bind.BoundContract +} + +type TokenAdminRegistryTransactor struct { + contract *bind.BoundContract +} + +type TokenAdminRegistryFilterer struct { + contract *bind.BoundContract +} + +type TokenAdminRegistrySession struct { + Contract *TokenAdminRegistry + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type TokenAdminRegistryCallerSession struct { + Contract *TokenAdminRegistryCaller + CallOpts bind.CallOpts +} + +type TokenAdminRegistryTransactorSession struct { + Contract *TokenAdminRegistryTransactor + TransactOpts bind.TransactOpts +} + +type TokenAdminRegistryRaw struct { + Contract *TokenAdminRegistry +} + +type TokenAdminRegistryCallerRaw struct { + Contract *TokenAdminRegistryCaller +} + +type TokenAdminRegistryTransactorRaw struct { + Contract *TokenAdminRegistryTransactor +} + +func NewTokenAdminRegistry(address common.Address, backend bind.ContractBackend) (*TokenAdminRegistry, error) { + abi, err := abi.JSON(strings.NewReader(TokenAdminRegistryABI)) + if err != nil { + return nil, err + } + contract, err := bindTokenAdminRegistry(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &TokenAdminRegistry{address: address, abi: abi, TokenAdminRegistryCaller: TokenAdminRegistryCaller{contract: contract}, TokenAdminRegistryTransactor: TokenAdminRegistryTransactor{contract: contract}, TokenAdminRegistryFilterer: TokenAdminRegistryFilterer{contract: contract}}, nil +} + +func NewTokenAdminRegistryCaller(address common.Address, caller bind.ContractCaller) (*TokenAdminRegistryCaller, error) { + contract, err := bindTokenAdminRegistry(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &TokenAdminRegistryCaller{contract: contract}, nil +} + +func NewTokenAdminRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*TokenAdminRegistryTransactor, error) { + contract, err := bindTokenAdminRegistry(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &TokenAdminRegistryTransactor{contract: contract}, nil +} + +func NewTokenAdminRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*TokenAdminRegistryFilterer, error) { + contract, err := bindTokenAdminRegistry(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &TokenAdminRegistryFilterer{contract: contract}, nil +} + +func bindTokenAdminRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := TokenAdminRegistryMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _TokenAdminRegistry.Contract.TokenAdminRegistryCaller.contract.Call(opts, result, method, params...) +} + +func (_TokenAdminRegistry *TokenAdminRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.TokenAdminRegistryTransactor.contract.Transfer(opts) +} + +func (_TokenAdminRegistry *TokenAdminRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.TokenAdminRegistryTransactor.contract.Transact(opts, method, params...) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _TokenAdminRegistry.Contract.contract.Call(opts, result, method, params...) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.contract.Transfer(opts) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.contract.Transact(opts, method, params...) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCaller) GetAllConfiguredTokens(opts *bind.CallOpts, startIndex uint64, maxCount uint64) ([]common.Address, error) { + var out []interface{} + err := _TokenAdminRegistry.contract.Call(opts, &out, "getAllConfiguredTokens", startIndex, maxCount) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) GetAllConfiguredTokens(startIndex uint64, maxCount uint64) ([]common.Address, error) { + return _TokenAdminRegistry.Contract.GetAllConfiguredTokens(&_TokenAdminRegistry.CallOpts, startIndex, maxCount) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerSession) GetAllConfiguredTokens(startIndex uint64, maxCount uint64) ([]common.Address, error) { + return _TokenAdminRegistry.Contract.GetAllConfiguredTokens(&_TokenAdminRegistry.CallOpts, startIndex, maxCount) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCaller) GetPool(opts *bind.CallOpts, token common.Address) (common.Address, error) { + var out []interface{} + err := _TokenAdminRegistry.contract.Call(opts, &out, "getPool", token) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) GetPool(token common.Address) (common.Address, error) { + return _TokenAdminRegistry.Contract.GetPool(&_TokenAdminRegistry.CallOpts, token) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerSession) GetPool(token common.Address) (common.Address, error) { + return _TokenAdminRegistry.Contract.GetPool(&_TokenAdminRegistry.CallOpts, token) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCaller) GetPools(opts *bind.CallOpts, tokens []common.Address) ([]common.Address, error) { + var out []interface{} + err := _TokenAdminRegistry.contract.Call(opts, &out, "getPools", tokens) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) GetPools(tokens []common.Address) ([]common.Address, error) { + return _TokenAdminRegistry.Contract.GetPools(&_TokenAdminRegistry.CallOpts, tokens) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerSession) GetPools(tokens []common.Address) ([]common.Address, error) { + return _TokenAdminRegistry.Contract.GetPools(&_TokenAdminRegistry.CallOpts, tokens) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCaller) GetTokenConfig(opts *bind.CallOpts, token common.Address) (TokenAdminRegistryTokenConfig, error) { + var out []interface{} + err := _TokenAdminRegistry.contract.Call(opts, &out, "getTokenConfig", token) + + if err != nil { + return *new(TokenAdminRegistryTokenConfig), err + } + + out0 := *abi.ConvertType(out[0], new(TokenAdminRegistryTokenConfig)).(*TokenAdminRegistryTokenConfig) + + return out0, err + +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) GetTokenConfig(token common.Address) (TokenAdminRegistryTokenConfig, error) { + return _TokenAdminRegistry.Contract.GetTokenConfig(&_TokenAdminRegistry.CallOpts, token) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerSession) GetTokenConfig(token common.Address) (TokenAdminRegistryTokenConfig, error) { + return _TokenAdminRegistry.Contract.GetTokenConfig(&_TokenAdminRegistry.CallOpts, token) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCaller) IsAdministrator(opts *bind.CallOpts, localToken common.Address, administrator common.Address) (bool, error) { + var out []interface{} + err := _TokenAdminRegistry.contract.Call(opts, &out, "isAdministrator", localToken, administrator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) IsAdministrator(localToken common.Address, administrator common.Address) (bool, error) { + return _TokenAdminRegistry.Contract.IsAdministrator(&_TokenAdminRegistry.CallOpts, localToken, administrator) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerSession) IsAdministrator(localToken common.Address, administrator common.Address) (bool, error) { + return _TokenAdminRegistry.Contract.IsAdministrator(&_TokenAdminRegistry.CallOpts, localToken, administrator) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCaller) IsRegistryModule(opts *bind.CallOpts, module common.Address) (bool, error) { + var out []interface{} + err := _TokenAdminRegistry.contract.Call(opts, &out, "isRegistryModule", module) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) IsRegistryModule(module common.Address) (bool, error) { + return _TokenAdminRegistry.Contract.IsRegistryModule(&_TokenAdminRegistry.CallOpts, module) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerSession) IsRegistryModule(module common.Address) (bool, error) { + return _TokenAdminRegistry.Contract.IsRegistryModule(&_TokenAdminRegistry.CallOpts, module) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _TokenAdminRegistry.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 + +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) Owner() (common.Address, error) { + return _TokenAdminRegistry.Contract.Owner(&_TokenAdminRegistry.CallOpts) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerSession) Owner() (common.Address, error) { + return _TokenAdminRegistry.Contract.Owner(&_TokenAdminRegistry.CallOpts) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _TokenAdminRegistry.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) TypeAndVersion() (string, error) { + return _TokenAdminRegistry.Contract.TypeAndVersion(&_TokenAdminRegistry.CallOpts) +} + +func (_TokenAdminRegistry *TokenAdminRegistryCallerSession) TypeAndVersion() (string, error) { + return _TokenAdminRegistry.Contract.TypeAndVersion(&_TokenAdminRegistry.CallOpts) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactor) AcceptAdminRole(opts *bind.TransactOpts, localToken common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.contract.Transact(opts, "acceptAdminRole", localToken) +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) AcceptAdminRole(localToken common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.AcceptAdminRole(&_TokenAdminRegistry.TransactOpts, localToken) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorSession) AcceptAdminRole(localToken common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.AcceptAdminRole(&_TokenAdminRegistry.TransactOpts, localToken) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TokenAdminRegistry.contract.Transact(opts, "acceptOwnership") +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) AcceptOwnership() (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.AcceptOwnership(&_TokenAdminRegistry.TransactOpts) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.AcceptOwnership(&_TokenAdminRegistry.TransactOpts) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactor) AddRegistryModule(opts *bind.TransactOpts, module common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.contract.Transact(opts, "addRegistryModule", module) +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) AddRegistryModule(module common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.AddRegistryModule(&_TokenAdminRegistry.TransactOpts, module) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorSession) AddRegistryModule(module common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.AddRegistryModule(&_TokenAdminRegistry.TransactOpts, module) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactor) ProposeAdministrator(opts *bind.TransactOpts, localToken common.Address, administrator common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.contract.Transact(opts, "proposeAdministrator", localToken, administrator) +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) ProposeAdministrator(localToken common.Address, administrator common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.ProposeAdministrator(&_TokenAdminRegistry.TransactOpts, localToken, administrator) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorSession) ProposeAdministrator(localToken common.Address, administrator common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.ProposeAdministrator(&_TokenAdminRegistry.TransactOpts, localToken, administrator) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactor) RemoveRegistryModule(opts *bind.TransactOpts, module common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.contract.Transact(opts, "removeRegistryModule", module) +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) RemoveRegistryModule(module common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.RemoveRegistryModule(&_TokenAdminRegistry.TransactOpts, module) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorSession) RemoveRegistryModule(module common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.RemoveRegistryModule(&_TokenAdminRegistry.TransactOpts, module) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactor) SetPool(opts *bind.TransactOpts, localToken common.Address, pool common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.contract.Transact(opts, "setPool", localToken, pool) +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) SetPool(localToken common.Address, pool common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.SetPool(&_TokenAdminRegistry.TransactOpts, localToken, pool) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorSession) SetPool(localToken common.Address, pool common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.SetPool(&_TokenAdminRegistry.TransactOpts, localToken, pool) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactor) TransferAdminRole(opts *bind.TransactOpts, localToken common.Address, newAdmin common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.contract.Transact(opts, "transferAdminRole", localToken, newAdmin) +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) TransferAdminRole(localToken common.Address, newAdmin common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.TransferAdminRole(&_TokenAdminRegistry.TransactOpts, localToken, newAdmin) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorSession) TransferAdminRole(localToken common.Address, newAdmin common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.TransferAdminRole(&_TokenAdminRegistry.TransactOpts, localToken, newAdmin) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.contract.Transact(opts, "transferOwnership", to) +} + +func (_TokenAdminRegistry *TokenAdminRegistrySession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.TransferOwnership(&_TokenAdminRegistry.TransactOpts, to) +} + +func (_TokenAdminRegistry *TokenAdminRegistryTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _TokenAdminRegistry.Contract.TransferOwnership(&_TokenAdminRegistry.TransactOpts, to) +} + +type TokenAdminRegistryAdministratorTransferRequestedIterator struct { + Event *TokenAdminRegistryAdministratorTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenAdminRegistryAdministratorTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryAdministratorTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryAdministratorTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenAdminRegistryAdministratorTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *TokenAdminRegistryAdministratorTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenAdminRegistryAdministratorTransferRequested struct { + Token common.Address + CurrentAdmin common.Address + NewAdmin common.Address + Raw types.Log +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) FilterAdministratorTransferRequested(opts *bind.FilterOpts, token []common.Address, currentAdmin []common.Address, newAdmin []common.Address) (*TokenAdminRegistryAdministratorTransferRequestedIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var currentAdminRule []interface{} + for _, currentAdminItem := range currentAdmin { + currentAdminRule = append(currentAdminRule, currentAdminItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _TokenAdminRegistry.contract.FilterLogs(opts, "AdministratorTransferRequested", tokenRule, currentAdminRule, newAdminRule) + if err != nil { + return nil, err + } + return &TokenAdminRegistryAdministratorTransferRequestedIterator{contract: _TokenAdminRegistry.contract, event: "AdministratorTransferRequested", logs: logs, sub: sub}, nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) WatchAdministratorTransferRequested(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryAdministratorTransferRequested, token []common.Address, currentAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var currentAdminRule []interface{} + for _, currentAdminItem := range currentAdmin { + currentAdminRule = append(currentAdminRule, currentAdminItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _TokenAdminRegistry.contract.WatchLogs(opts, "AdministratorTransferRequested", tokenRule, currentAdminRule, newAdminRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenAdminRegistryAdministratorTransferRequested) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "AdministratorTransferRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) ParseAdministratorTransferRequested(log types.Log) (*TokenAdminRegistryAdministratorTransferRequested, error) { + event := new(TokenAdminRegistryAdministratorTransferRequested) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "AdministratorTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenAdminRegistryAdministratorTransferredIterator struct { + Event *TokenAdminRegistryAdministratorTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenAdminRegistryAdministratorTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryAdministratorTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryAdministratorTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenAdminRegistryAdministratorTransferredIterator) Error() error { + return it.fail +} + +func (it *TokenAdminRegistryAdministratorTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenAdminRegistryAdministratorTransferred struct { + Token common.Address + NewAdmin common.Address + Raw types.Log +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) FilterAdministratorTransferred(opts *bind.FilterOpts, token []common.Address, newAdmin []common.Address) (*TokenAdminRegistryAdministratorTransferredIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _TokenAdminRegistry.contract.FilterLogs(opts, "AdministratorTransferred", tokenRule, newAdminRule) + if err != nil { + return nil, err + } + return &TokenAdminRegistryAdministratorTransferredIterator{contract: _TokenAdminRegistry.contract, event: "AdministratorTransferred", logs: logs, sub: sub}, nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) WatchAdministratorTransferred(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryAdministratorTransferred, token []common.Address, newAdmin []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var newAdminRule []interface{} + for _, newAdminItem := range newAdmin { + newAdminRule = append(newAdminRule, newAdminItem) + } + + logs, sub, err := _TokenAdminRegistry.contract.WatchLogs(opts, "AdministratorTransferred", tokenRule, newAdminRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenAdminRegistryAdministratorTransferred) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "AdministratorTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) ParseAdministratorTransferred(log types.Log) (*TokenAdminRegistryAdministratorTransferred, error) { + event := new(TokenAdminRegistryAdministratorTransferred) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "AdministratorTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenAdminRegistryOwnershipTransferRequestedIterator struct { + Event *TokenAdminRegistryOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenAdminRegistryOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenAdminRegistryOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *TokenAdminRegistryOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenAdminRegistryOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TokenAdminRegistryOwnershipTransferRequestedIterator, 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 := _TokenAdminRegistry.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &TokenAdminRegistryOwnershipTransferRequestedIterator{contract: _TokenAdminRegistry.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryOwnershipTransferRequested, 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 := _TokenAdminRegistry.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: + + event := new(TokenAdminRegistryOwnershipTransferRequested) + if err := _TokenAdminRegistry.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 +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) ParseOwnershipTransferRequested(log types.Log) (*TokenAdminRegistryOwnershipTransferRequested, error) { + event := new(TokenAdminRegistryOwnershipTransferRequested) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenAdminRegistryOwnershipTransferredIterator struct { + Event *TokenAdminRegistryOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenAdminRegistryOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenAdminRegistryOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *TokenAdminRegistryOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenAdminRegistryOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TokenAdminRegistryOwnershipTransferredIterator, 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 := _TokenAdminRegistry.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &TokenAdminRegistryOwnershipTransferredIterator{contract: _TokenAdminRegistry.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryOwnershipTransferred, 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 := _TokenAdminRegistry.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: + + event := new(TokenAdminRegistryOwnershipTransferred) + if err := _TokenAdminRegistry.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 +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) ParseOwnershipTransferred(log types.Log) (*TokenAdminRegistryOwnershipTransferred, error) { + event := new(TokenAdminRegistryOwnershipTransferred) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenAdminRegistryPoolSetIterator struct { + Event *TokenAdminRegistryPoolSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenAdminRegistryPoolSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryPoolSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryPoolSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenAdminRegistryPoolSetIterator) Error() error { + return it.fail +} + +func (it *TokenAdminRegistryPoolSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenAdminRegistryPoolSet struct { + Token common.Address + PreviousPool common.Address + NewPool common.Address + Raw types.Log +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) FilterPoolSet(opts *bind.FilterOpts, token []common.Address, previousPool []common.Address, newPool []common.Address) (*TokenAdminRegistryPoolSetIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var previousPoolRule []interface{} + for _, previousPoolItem := range previousPool { + previousPoolRule = append(previousPoolRule, previousPoolItem) + } + var newPoolRule []interface{} + for _, newPoolItem := range newPool { + newPoolRule = append(newPoolRule, newPoolItem) + } + + logs, sub, err := _TokenAdminRegistry.contract.FilterLogs(opts, "PoolSet", tokenRule, previousPoolRule, newPoolRule) + if err != nil { + return nil, err + } + return &TokenAdminRegistryPoolSetIterator{contract: _TokenAdminRegistry.contract, event: "PoolSet", logs: logs, sub: sub}, nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) WatchPoolSet(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryPoolSet, token []common.Address, previousPool []common.Address, newPool []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var previousPoolRule []interface{} + for _, previousPoolItem := range previousPool { + previousPoolRule = append(previousPoolRule, previousPoolItem) + } + var newPoolRule []interface{} + for _, newPoolItem := range newPool { + newPoolRule = append(newPoolRule, newPoolItem) + } + + logs, sub, err := _TokenAdminRegistry.contract.WatchLogs(opts, "PoolSet", tokenRule, previousPoolRule, newPoolRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenAdminRegistryPoolSet) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "PoolSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) ParsePoolSet(log types.Log) (*TokenAdminRegistryPoolSet, error) { + event := new(TokenAdminRegistryPoolSet) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "PoolSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenAdminRegistryRegistryModuleAddedIterator struct { + Event *TokenAdminRegistryRegistryModuleAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenAdminRegistryRegistryModuleAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryRegistryModuleAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryRegistryModuleAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenAdminRegistryRegistryModuleAddedIterator) Error() error { + return it.fail +} + +func (it *TokenAdminRegistryRegistryModuleAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenAdminRegistryRegistryModuleAdded struct { + Module common.Address + Raw types.Log +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) FilterRegistryModuleAdded(opts *bind.FilterOpts) (*TokenAdminRegistryRegistryModuleAddedIterator, error) { + + logs, sub, err := _TokenAdminRegistry.contract.FilterLogs(opts, "RegistryModuleAdded") + if err != nil { + return nil, err + } + return &TokenAdminRegistryRegistryModuleAddedIterator{contract: _TokenAdminRegistry.contract, event: "RegistryModuleAdded", logs: logs, sub: sub}, nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) WatchRegistryModuleAdded(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryRegistryModuleAdded) (event.Subscription, error) { + + logs, sub, err := _TokenAdminRegistry.contract.WatchLogs(opts, "RegistryModuleAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenAdminRegistryRegistryModuleAdded) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "RegistryModuleAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) ParseRegistryModuleAdded(log types.Log) (*TokenAdminRegistryRegistryModuleAdded, error) { + event := new(TokenAdminRegistryRegistryModuleAdded) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "RegistryModuleAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenAdminRegistryRegistryModuleRemovedIterator struct { + Event *TokenAdminRegistryRegistryModuleRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenAdminRegistryRegistryModuleRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryRegistryModuleRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenAdminRegistryRegistryModuleRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenAdminRegistryRegistryModuleRemovedIterator) Error() error { + return it.fail +} + +func (it *TokenAdminRegistryRegistryModuleRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenAdminRegistryRegistryModuleRemoved struct { + Module common.Address + Raw types.Log +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) FilterRegistryModuleRemoved(opts *bind.FilterOpts, module []common.Address) (*TokenAdminRegistryRegistryModuleRemovedIterator, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _TokenAdminRegistry.contract.FilterLogs(opts, "RegistryModuleRemoved", moduleRule) + if err != nil { + return nil, err + } + return &TokenAdminRegistryRegistryModuleRemovedIterator{contract: _TokenAdminRegistry.contract, event: "RegistryModuleRemoved", logs: logs, sub: sub}, nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) WatchRegistryModuleRemoved(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryRegistryModuleRemoved, module []common.Address) (event.Subscription, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _TokenAdminRegistry.contract.WatchLogs(opts, "RegistryModuleRemoved", moduleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenAdminRegistryRegistryModuleRemoved) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "RegistryModuleRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenAdminRegistry *TokenAdminRegistryFilterer) ParseRegistryModuleRemoved(log types.Log) (*TokenAdminRegistryRegistryModuleRemoved, error) { + event := new(TokenAdminRegistryRegistryModuleRemoved) + if err := _TokenAdminRegistry.contract.UnpackLog(event, "RegistryModuleRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_TokenAdminRegistry *TokenAdminRegistry) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _TokenAdminRegistry.abi.Events["AdministratorTransferRequested"].ID: + return _TokenAdminRegistry.ParseAdministratorTransferRequested(log) + case _TokenAdminRegistry.abi.Events["AdministratorTransferred"].ID: + return _TokenAdminRegistry.ParseAdministratorTransferred(log) + case _TokenAdminRegistry.abi.Events["OwnershipTransferRequested"].ID: + return _TokenAdminRegistry.ParseOwnershipTransferRequested(log) + case _TokenAdminRegistry.abi.Events["OwnershipTransferred"].ID: + return _TokenAdminRegistry.ParseOwnershipTransferred(log) + case _TokenAdminRegistry.abi.Events["PoolSet"].ID: + return _TokenAdminRegistry.ParsePoolSet(log) + case _TokenAdminRegistry.abi.Events["RegistryModuleAdded"].ID: + return _TokenAdminRegistry.ParseRegistryModuleAdded(log) + case _TokenAdminRegistry.abi.Events["RegistryModuleRemoved"].ID: + return _TokenAdminRegistry.ParseRegistryModuleRemoved(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (TokenAdminRegistryAdministratorTransferRequested) Topic() common.Hash { + return common.HexToHash("0xc54c3051ff16e63bb9203214432372aca006c589e3653619b577a3265675b716") +} + +func (TokenAdminRegistryAdministratorTransferred) Topic() common.Hash { + return common.HexToHash("0x399b55200f7f639a63d76efe3dcfa9156ce367058d6b673041b84a628885f5a7") +} + +func (TokenAdminRegistryOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (TokenAdminRegistryOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (TokenAdminRegistryPoolSet) Topic() common.Hash { + return common.HexToHash("0x754449ec3aff3bd528bfce43ae9319c4a381b67fcd1d20097b3b24dacaecc35d") +} + +func (TokenAdminRegistryRegistryModuleAdded) Topic() common.Hash { + return common.HexToHash("0x3cabf004338366bfeaeb610ad827cb58d16b588017c509501f2c97c83caae7b2") +} + +func (TokenAdminRegistryRegistryModuleRemoved) Topic() common.Hash { + return common.HexToHash("0x93eaa26dcb9275e56bacb1d33fdbf402262da6f0f4baf2a6e2cd154b73f387f8") +} + +func (_TokenAdminRegistry *TokenAdminRegistry) Address() common.Address { + return _TokenAdminRegistry.address +} + +type TokenAdminRegistryInterface interface { + GetAllConfiguredTokens(opts *bind.CallOpts, startIndex uint64, maxCount uint64) ([]common.Address, error) + + GetPool(opts *bind.CallOpts, token common.Address) (common.Address, error) + + GetPools(opts *bind.CallOpts, tokens []common.Address) ([]common.Address, error) + + GetTokenConfig(opts *bind.CallOpts, token common.Address) (TokenAdminRegistryTokenConfig, error) + + IsAdministrator(opts *bind.CallOpts, localToken common.Address, administrator common.Address) (bool, error) + + IsRegistryModule(opts *bind.CallOpts, module common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptAdminRole(opts *bind.TransactOpts, localToken common.Address) (*types.Transaction, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRegistryModule(opts *bind.TransactOpts, module common.Address) (*types.Transaction, error) + + ProposeAdministrator(opts *bind.TransactOpts, localToken common.Address, administrator common.Address) (*types.Transaction, error) + + RemoveRegistryModule(opts *bind.TransactOpts, module common.Address) (*types.Transaction, error) + + SetPool(opts *bind.TransactOpts, localToken common.Address, pool common.Address) (*types.Transaction, error) + + TransferAdminRole(opts *bind.TransactOpts, localToken common.Address, newAdmin common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAdministratorTransferRequested(opts *bind.FilterOpts, token []common.Address, currentAdmin []common.Address, newAdmin []common.Address) (*TokenAdminRegistryAdministratorTransferRequestedIterator, error) + + WatchAdministratorTransferRequested(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryAdministratorTransferRequested, token []common.Address, currentAdmin []common.Address, newAdmin []common.Address) (event.Subscription, error) + + ParseAdministratorTransferRequested(log types.Log) (*TokenAdminRegistryAdministratorTransferRequested, error) + + FilterAdministratorTransferred(opts *bind.FilterOpts, token []common.Address, newAdmin []common.Address) (*TokenAdminRegistryAdministratorTransferredIterator, error) + + WatchAdministratorTransferred(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryAdministratorTransferred, token []common.Address, newAdmin []common.Address) (event.Subscription, error) + + ParseAdministratorTransferred(log types.Log) (*TokenAdminRegistryAdministratorTransferred, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TokenAdminRegistryOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*TokenAdminRegistryOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TokenAdminRegistryOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*TokenAdminRegistryOwnershipTransferred, error) + + FilterPoolSet(opts *bind.FilterOpts, token []common.Address, previousPool []common.Address, newPool []common.Address) (*TokenAdminRegistryPoolSetIterator, error) + + WatchPoolSet(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryPoolSet, token []common.Address, previousPool []common.Address, newPool []common.Address) (event.Subscription, error) + + ParsePoolSet(log types.Log) (*TokenAdminRegistryPoolSet, error) + + FilterRegistryModuleAdded(opts *bind.FilterOpts) (*TokenAdminRegistryRegistryModuleAddedIterator, error) + + WatchRegistryModuleAdded(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryRegistryModuleAdded) (event.Subscription, error) + + ParseRegistryModuleAdded(log types.Log) (*TokenAdminRegistryRegistryModuleAdded, error) + + FilterRegistryModuleRemoved(opts *bind.FilterOpts, module []common.Address) (*TokenAdminRegistryRegistryModuleRemovedIterator, error) + + WatchRegistryModuleRemoved(opts *bind.WatchOpts, sink chan<- *TokenAdminRegistryRegistryModuleRemoved, module []common.Address) (event.Subscription, error) + + ParseRegistryModuleRemoved(log types.Log) (*TokenAdminRegistryRegistryModuleRemoved, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool/burn_from_mint_token_pool.go b/core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool/burn_from_mint_token_pool.go new file mode 100644 index 00000000000..e30fb318f9d --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool/burn_from_mint_token_pool.go @@ -0,0 +1,3161 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package burn_from_mint_token_pool + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type PoolLockOrBurnInV1 struct { + Receiver []byte + RemoteChainSelector uint64 + OriginalSender common.Address + Amount *big.Int + LocalToken common.Address +} + +type PoolLockOrBurnOutV1 struct { + DestTokenAddress []byte + DestPoolData []byte +} + +type PoolReleaseOrMintInV1 struct { + OriginalSender []byte + RemoteChainSelector uint64 + Receiver common.Address + Amount *big.Int + LocalToken common.Address + SourcePoolAddress []byte + SourcePoolData []byte + OffchainTokenData []byte +} + +type PoolReleaseOrMintOutV1 struct { + DestinationAmount *big.Int +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type TokenPoolChainUpdate struct { + RemoteChainSelector uint64 + RemotePoolAddresses [][]byte + RemoteTokenAddress []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig +} + +var BurnFromMintTokenPoolMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIBurnMintERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x610100806040523461035457614bb5803803809161001d82856105b2565b8339810160a0828203126103545781516001600160a01b03811692908390036103545761004c602082016105d5565b60408201516001600160401b0381116103545782019280601f85011215610354578351936001600160401b038511610359578460051b90602082019561009560405197886105b2565b865260208087019282010192831161035457602001905b82821061059a575050506100ce60806100c7606085016105e3565b93016105e3565b91331561058957600180546001600160a01b0319163317905584158015610578575b8015610567575b61055657608085905260c05260405163313ce56760e01b8152602081600481885afa6000918161051a575b506104ef575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526103d2575b50604051636eb1769f60e11b81523060048201819052602482015290602082604481845afa9182156103c657600092610392575b50600019820180921161037c57604051602081019263095ea7b360e01b84523060248301526044820152604481526101c76064826105b2565b6000806040948551936101da87866105b2565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082865af13d1561036f573d906001600160401b03821161035957845161024b94909261023c601f8201601f1916602001856105b2565b83523d6000602085013e610781565b8051806102d9575b8251614363908161085282396080518181816115fc015281816117e80152818161220e015281816123ea01528181612707015261277f015260a0518181816118a90152818161268e0152818161316801526131eb015260c051818181610bd50152818161169801526122a9015260e051818181610b65015281816116db01526120050152f35b81602091810103126103545760200151801590811503610354576102fe573880610253565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b9161024b92606091610781565b634e487b7160e01b600052601160045260246000fd5b9091506020813d6020116103be575b816103ae602093836105b2565b810103126103545751903861018e565b3d91506103a1565b6040513d6000823e3d90fd5b60206040516103e182826105b2565b60008152600036813760e051156104de5760005b815181101561045c576001906001600160a01b0361041382856105f7565b51168461041f82610639565b61042c575b5050016103f5565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13884610424565b505060005b82518110156104d5576001906001600160a01b0361047f82866105f7565b511680156104cf578361049182610721565b61049f575b50505b01610461565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a13883610496565b50610499565b5050503861015a565b6335f4a7b360e01b60005260046000fd5b60ff1660ff82168181036105035750610128565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161054e575b81610536602093836105b2565b8101031261035457610547906105d5565b9038610122565b3d9150610529565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038116156100f7565b506001600160a01b038316156100f0565b639b15e16f60e01b60005260046000fd5b602080916105a7846105e3565b8152019101906100ac565b601f909101601f19168101906001600160401b0382119082101761035957604052565b519060ff8216820361035457565b51906001600160a01b038216820361035457565b805182101561060b5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561060b5760005260206000200190600090565b600081815260036020526040902054801561071a57600019810181811161037c5760025460001981019190821161037c578181036106c9575b50505060025480156106b3576000190161068d816002610621565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6107026106da6106eb936002610621565b90549060031b1c9283926002610621565b819391549060031b91821b91600019901b19161790565b90556000526003602052604060002055388080610672565b5050600090565b8060005260036020526040600020541560001461077b5760025468010000000000000000811015610359576107626106eb8260018594016002556002610621565b9055600254906000526003602052604060002055600190565b50600090565b919290156107e35750815115610795575090565b3b1561079e5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156107f65750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b8381106108395750508160006044809484010152601f80199101168101030190fd5b6020828201810151604487840101528593500161081756fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461282257508063181f5a77146127a357806321df0da714612734578063240028e8146126b257806324f65ee71461265657806339077537146121685780634c5ef0ed1461214e57806354c8a4f314611fd157806362ddd3c414611f4d5780636d3d1a5814611efb57806379ba509714611e165780637d54534e14611d695780638926f54f14611d055780638da5cb5b14611cb3578063962d402014611b0f5780639a4575b914611554578063a42a7b8b146113cf578063a7cd63b714611303578063acfecf91146111df578063af58d59f14611178578063b0f479a114611126578063b7946580146110cf578063c0d7865514610fd7578063c4bffe2b14610e8e578063c75eea9c14610dc8578063cf7401f314610bf9578063dc0bd97114610b8a578063e0351e1314610b2f578063e8a1da171461025a5763f2fde38b1461016b57600080fd5b346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff6101b7612a50565b6101bf6132f5565b1633811461022f57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102575761026936612b3e565b939190926102756132f5565b82915b80831061099a575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b85821015610996578160051b85013581811215610992578501906101208236031261099257604051956102e387612978565b823567ffffffffffffffff8116810361098d578752602083013567ffffffffffffffff81116109895783019536601f880112156109895786359661032688612d6a565b97610334604051998a6129b0565b8089526020808a019160051b830101903682116109855760208301905b828210610952575050505060208801968752604084013567ffffffffffffffff811161094e5761038490369086016130c2565b9860408901998a526103ae61039c3660608801612bfc565b9560608b0196875260c0369101612bfc565b9660808a019788526103c0865161376c565b6103ca885161376c565b8a515115610926576103e667ffffffffffffffff8b5116613fbf565b156108ef5767ffffffffffffffff8a5116815260076020526040812061052687516fffffffffffffffffffffffffffffffff604082015116906104e16fffffffffffffffffffffffffffffffff6020830151169151151583608060405161044c81612978565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b61064c89516fffffffffffffffffffffffffffffffff604082015116906106076fffffffffffffffffffffffffffffffff6020830151169151151583608060405161057081612978565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff82116108c25761066f8354612e62565b601f8111610887575b50602090601f83116001146107e8576106c692918591836107dd575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b8951805182101561070157906106fb6001926106f4838f67ffffffffffffffff90511692612e4e565b5190613340565b016106cb565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2929593966107cf67ffffffffffffffff600197949c511692519351915161079b610766604051968796875261010060208801526101008701906129f1565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a10190939492916102b1565b015190503880610694565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b81811061086f5750908460019594939210610838575b505050811b0190556106c9565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061082b565b92936020600181928786015181550195019301610815565b6108b29084865260208620601f850160051c810191602086106108b8575b601f0160051c0190613069565b38610678565b90915081906108a5565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff81116109815760209161097683928336918901016130c2565b815201910190610351565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff6109ba6109b5878588612dea565b612e29565b16956109c587613cf3565b15610b035786845260076020526109e160056040862001613afa565b94845b8651811015610a1a576001908987526007602052610a1360056040892001610a0c838b612e4e565b5190613e1e565b50016109e4565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610a538154612e62565b80610ac2575b5050500180549086815581610aa4575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a1019190949394610278565b865260208620908101905b81811015610a6957868155600101610aaf565b601f8111600114610ad85750555b863880610a59565b81835260208320610af391601f01861c810190600101613069565b8082528160208120915555610ad0565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610c31612a73565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261025757604051610c6881612994565b6024358015158103610dc45781526044356fffffffffffffffffffffffffffffffff81168103610dc45760208201526064356fffffffffffffffffffffffffffffffff81168103610dc457604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610dc05760405190610cef82612994565b608435801515810361099257825260a4356fffffffffffffffffffffffffffffffff8116810361099257602083015260c4356fffffffffffffffffffffffffffffffff8116810361099257604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610d9e575b610d7257610d6f92936135aa565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610d61565b5080fd5b8280fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c6040610e8a9367ffffffffffffffff610e15612a73565b610e1d612fb6565b50168152600760205220612fe1565b6136e7565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051906005548083528260208101600584526020842092845b818110610fbe575050610eec925003836129b0565b8151610f10610efa82612d6a565b91610f0860405193846129b0565b808352612d6a565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015610f6f578067ffffffffffffffff610f5c60019388612e4e565b5116610f688286612e4e565b5201610f3d565b50925090604051928392602084019060208552518091526040840192915b818110610f9b575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101610f8d565b8454835260019485019487945060209093019201610ed7565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff611024612a50565b61102c6132f5565b1680156110a75760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e8a61111261110d612a73565b613047565b6040519182916020835260208301906129f1565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c60026040610e8a9467ffffffffffffffff6111c7612a73565b6111cf612fb6565b5016815260076020522001612fe1565b50346102575767ffffffffffffffff6111f736612a8a565b9290916112026132f5565b169161121b836000526006602052604060002054151590565b156112d757828452600760205261124a6005604086200161123d368486612c99565b6020815191012090613e1e565b1561128f57907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691611289604051928392602084526020840191612f77565b0390a280f35b826112d3836040519384937f74f23c7c0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191612f77565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051600254808252602082018091600285526020852090855b8181106113b957505050826113629103836129b0565b604051928392602084019060208552518091526040840192915b81811061138a575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff1684528594506020938401939092019160010161137c565b825484526020909301926001928301920161134c565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575767ffffffffffffffff611410612a73565b168152600760205261142760056040832001613afa565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061146c61145683612d6a565b9261146460405194856129b0565b808452612d6a565b01835b818110611543575050825b82518110156114c0578061149060019285612e4e565b51855260086020526114a460408620612eb5565b6114ae8285612e4e565b526114b98184612e4e565b500161147a565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b8282106114f857505050500390f35b91936020611533827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0600195979984950301865288516129f1565b96019201920185949391926114e9565b80606060208093860101520161146f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc05760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610dc057606060206040516115d28161295c565b8281520152608481016115e481612cfe565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611ac55750602481019177ffffffffffffffff0000000000000000000000000000000061164b84612e29565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611955578291611a96575b50611a6e576116d960448301612cfe565b7f0000000000000000000000000000000000000000000000000000000000000000611a1b575b5067ffffffffffffffff61171284612e29565b1661172a816000526006602052604060002054151590565b156119ef57602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa801561195557829061198c575b73ffffffffffffffffffffffffffffffffffffffff91501633036119605767ffffffffffffffff60646117bd85612e29565b930135921681526007602052816118106040832073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692839161406e565b803b15610dc0576040517f79cc6790000000000000000000000000000000000000000000000000000000008152306004820152602481018490529082908290604490829084905af1801561195557611940575b61190f61189f61110d86866040519081527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df760203392a2612e29565b610e8a60405160ff7f0000000000000000000000000000000000000000000000000000000000000000166020820152602081526118dd6040826129b0565b604051926118ea8461295c565b83526020830190815260405193849360208552516040602086015260608501906129f1565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526129f1565b61194b8280926129b0565b6102575780611863565b6040513d84823e3d90fd5b807f728fe07b000000000000000000000000000000000000000000000000000000006024925233600452fd5b506020813d6020116119e7575b816119a6602093836129b0565b81010312610dc0575173ffffffffffffffffffffffffffffffffffffffff81168103610dc05773ffffffffffffffffffffffffffffffffffffffff9061178b565b3d9150611999565b602492507fa9902c7e000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16808252600360205260408220546116ff57602492507fd0d25976000000000000000000000000000000000000000000000000000000008252600452fd5b807f53ad11d80000000000000000000000000000000000000000000000000000000060049252fd5b611ab8915060203d602011611abe575b611ab081836129b0565b8101906130dd565b386116c8565b503d611aa6565b8273ffffffffffffffffffffffffffffffffffffffff611ae6602493612cfe565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b50346102575760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057611b5f903690600401612b0d565b60243567ffffffffffffffff811161099257611b7f903690600401612bae565b60449291923567ffffffffffffffff811161098957611ba2903690600401612bae565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611c91575b611c6557818114801590611c5b575b611c3357865b818110611be7578780f35b80611c2d611bfb6109b5600194868c612dea565b611c0683878b612e3e565b611c27611c1f611c17868b8d612e3e565b923690612bfc565b913690612bfc565b916135aa565b01611bdc565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611bd6565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611bc7565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020611d5f67ffffffffffffffff611d4b612a73565b166000526006602052604060002054151590565b6040519015158152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611dd9612a50565b611de16132f5565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757805473ffffffffffffffffffffffffffffffffffffffff81163303611ed3577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b503461025757611f5c36612a8a565b611f68939291936132f5565b67ffffffffffffffff8216611f8a816000526006602052604060002054151590565b15611fa65750610d6f9293611fa0913691612c99565b90613340565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b503461025757611ffb90612003611fe736612b3e565b9591611ff49391936132f5565b3691612d82565b933691612d82565b7f00000000000000000000000000000000000000000000000000000000000000001561212657815b835181101561209e578073ffffffffffffffffffffffffffffffffffffffff61205660019387612e4e565b511661206181613b5d565b61206d575b500161202b565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a138612066565b5090805b8251811015612122578073ffffffffffffffffffffffffffffffffffffffff6120cd60019386612e4e565b5116801561211c576120de81613f5f565b6120eb575b505b016120a2565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1846120e3565b506120e5565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b5034610257576020611d5f61216236612a8a565b91612d1f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610dc457826040516121e881612911565b52608482016121f681612cfe565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361263557506024820177ffffffffffffffff0000000000000000000000000000000061225c82612e29565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156125b8578591612616575b506125ee5767ffffffffffffffff6122f082612e29565b16612308816000526006602052604060002054151590565b156125c357602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156125b8578591612599575b501561256d5761237f81612e29565b61239160a48501916121628386612c48565b15612526575061242e67ffffffffffffffff9261242861242361241c6123b8604496612e29565b936064890135978895168a526007602052612412600260408c200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016998a9161406e565b60c4890190612c48565b3691612c99565b6130f5565b906131e8565b9201908361243b83612cfe565b823b15610dc0576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91909116600482015260248101859052918290604490829084905af1801561251b57916020946124c99273ffffffffffffffffffffffffffffffffffffffff9461250b575b5050612cfe565b166040518281527f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0843392a38060405161250281612911565b52604051908152f35b81612515916129b0565b386124c2565b6040513d86823e3d90fd5b6125309083612c48565b6112d36040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452602060048501526024840191612f77565b6024847f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b6125b2915060203d602011611abe57611ab081836129b0565b38612370565b6040513d87823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008552600452602484fd5b6004847f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b61262f915060203d602011611abe57611ab081836129b0565b386122d9565b8373ffffffffffffffffffffffffffffffffffffffff611ae6602493612cfe565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020906126ed612a50565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575750610e8a6040516127e46040826129b0565b601b81527f4275726e46726f6d4d696e74546f6b656e506f6f6c20312e352e31000000000060208201526040519182916020835260208301906129f1565b905034610dc05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610dc0576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610dc457602092507faff2afbf0000000000000000000000000000000000000000000000000000000081149081156128e7575b81156128bd575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386128b6565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506128af565b6020810190811067ffffffffffffffff82111761292d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761292d57604052565b60a0810190811067ffffffffffffffff82111761292d57604052565b6060810190811067ffffffffffffffff82111761292d57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761292d57604052565b919082519283825260005b848110612a3b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016129fc565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361098d57565b6004359067ffffffffffffffff8216820361098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff8116810361098d579160243567ffffffffffffffff811161098d578260238201121561098d5780600401359267ffffffffffffffff841161098d576024848301011161098d576024019190565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501948460051b01011161098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff811161098d5781612b8791600401612b0d565b929092916024359067ffffffffffffffff821161098d57612baa91600401612b0d565b9091565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501946060850201011161098d57565b35906fffffffffffffffffffffffffffffffff8216820361098d57565b919082606091031261098d57604051612c1481612994565b8092803590811515820361098d576040612c439181938552612c3860208201612bdf565b602086015201612bdf565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561098d570180359067ffffffffffffffff821161098d5760200191813603831361098d57565b92919267ffffffffffffffff821161292d5760405191612ce1601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846129b0565b82948184528183011161098d578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff8116810361098d5790565b612d67929167ffffffffffffffff612d4a921660005260076020526005604060002001923691612c99565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff811161292d5760051b60200190565b9291612d8d82612d6a565b93612d9b60405195866129b0565b602085848152019260051b810191821161098d57915b818310612dbd57505050565b823573ffffffffffffffffffffffffffffffffffffffff8116810361098d57815260209283019201612db1565b9190811015612dfa5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff8116810361098d5790565b9190811015612dfa576060020190565b8051821015612dfa5760209160051b010190565b90600182811c92168015612eab575b6020831014612e7c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612e71565b9060405191826000825492612ec984612e62565b8084529360018116908115612f375750600114612ef0575b50612eee925003836129b0565b565b90506000929192526020600020906000915b818310612f1b575050906020612eee9282010138612ee1565b6020919350806001915483858901015201910190918492612f02565b60209350612eee9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612ee1565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60405190612fc382612978565b60006080838281528260208201528260408201528260608201520152565b90604051612fee81612978565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff166000526007602052612d676004604060002001612eb5565b818110613074575050565b60008155600101613069565b8181029291811591840414171561309357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f8301121561098d57816020612d6793359101612c99565b9081602091031261098d5751801515810361098d5790565b80518015613164576020036131265760208180518101031261098d5760208101519060ff8211613126575060ff1690565b6112d3906040519182917f953576f70000000000000000000000000000000000000000000000000000000083526020600484015260248301906129f1565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161309357565b60ff16604d811161309357600a0a90565b81156131b9570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146132ee578284116132c4579061322d9161318a565b91604d60ff841611801561328b575b6132555750509061324f612d679261319e565b90613080565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b506132958361319e565b80156131b9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04841161323c565b6132cd9161318a565b91604d60ff841611613255575050906132e8612d679261319e565b906131af565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff60015416330361331657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156135805767ffffffffffffffff81516020830120921691826000526007602052613375816005604060002001614019565b1561353c5760005260086020526040600020815167ffffffffffffffff811161292d576133a28254612e62565b601f811161350a575b506020601f8211600114613444579161341e827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea959361343495600091613439575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90556040519182916020835260208301906129f1565b0390a2565b9050840151386133ed565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106134f25750926134349492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9896106134bb575b5050811b019055611112565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538806134af565b9192602060018192868a015181550194019201613474565b61353690836000526020600020601f840160051c810191602085106108b857601f0160051c0190613069565b386133ab565b50906112d36040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401526040602484015260448301906129f1565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff1660008181526006602052604090205490929190156136ac57916136a960e092613675856136017f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761376c565b8460005260076020526136188160406000206138c7565b6136218361376c565b84600052600760205261363b8360026040600020016138c7565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161309357565b6136ef612fb6565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161374c602085019361374661373963ffffffff875116426136da565b8560808901511690613080565b90613f52565b8082101561376557505b16825263ffffffff4216905290565b9050613756565b805115613820576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116811090811591613817575b506137b45750565b606490613815604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b905015386137ac565b6fffffffffffffffffffffffffffffffff604082015116158015906138a8575b6138475750565b606490613815604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613840565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1991613a00606092805461390463ffffffff8260801c16426136da565b9081613a3f575b50506fffffffffffffffffffffffffffffffff6001816020860151169282815416808510600014613a3757508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556139b48651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b6136a960405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161393b565b6fffffffffffffffffffffffffffffffff91613a74839283613a6d6001880154948286169560801c90613080565b9116613f52565b80821015613af357505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff0000000000000000000000000000000016178155388061390b565b9050613a7e565b906040519182815491828252602082019060005260206000209260005b818110613b2c575050612eee925003836129b0565b8454835260019485019487945060209093019201613b17565b8054821015612dfa5760005260206000200190600090565b6000818152600360205260409020548015613cec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161309357600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613c7d575b5050506002548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613c0b816002613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613cd4613c8e613c9f936002613b45565b90549060031b1c9283926002613b45565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526003602052604060002055388080613bd2565b5050600090565b6000818152600660205260409020548015613cec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161309357600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613de4575b5050506005548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613da1816005613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b613e06613df5613c9f936005613b45565b90549060031b1c9283926005613b45565b90556000526006602052604060002055388080613d68565b9060018201918160005282602052604060002054801515600014613f49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613093578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613f12575b50505080548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613ed38282613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b613f32613f22613c9f9386613b45565b90549060031b1c92839286613b45565b905560005283602052604060002055388080613e9b565b50505050600090565b9190820180921161309357565b80600052600360205260406000205415600014613fb9576002546801000000000000000081101561292d57613fa0613c9f8260018594016002556002613b45565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014613fb9576005546801000000000000000081101561292d57614000613c9f8260018594016005556005613b45565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054613cec578054906801000000000000000082101561292d5782614057613c9f846001809601855584613b45565b905580549260005201602052604060002055600190565b929192805460ff8160a01c1615801561434e575b614347576fffffffffffffffffffffffffffffffff811690600183019081546140c763ffffffff6fffffffffffffffffffffffffffffffff83169360801c16426136da565b90816142a9575b5050848110614227575083821061415657507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff8061412485602096956136da565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061416892505460801c926136da565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613093576141b66141bb9273ffffffffffffffffffffffffffffffffffffffff94613f52565b6131af565b92169182156141f7577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614279577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b82859293951161431d576142c4926137469160801c90613080565b808310156143185750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806140ce565b6142cf565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b50821561408256fea164736f6c634300081a000a", +} + +var BurnFromMintTokenPoolABI = BurnFromMintTokenPoolMetaData.ABI + +var BurnFromMintTokenPoolBin = BurnFromMintTokenPoolMetaData.Bin + +func DeployBurnFromMintTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, localTokenDecimals uint8, allowlist []common.Address, rmnProxy common.Address, router common.Address) (common.Address, *types.Transaction, *BurnFromMintTokenPool, error) { + parsed, err := BurnFromMintTokenPoolMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(BurnFromMintTokenPoolBin), backend, token, localTokenDecimals, allowlist, rmnProxy, router) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &BurnFromMintTokenPool{address: address, abi: *parsed, BurnFromMintTokenPoolCaller: BurnFromMintTokenPoolCaller{contract: contract}, BurnFromMintTokenPoolTransactor: BurnFromMintTokenPoolTransactor{contract: contract}, BurnFromMintTokenPoolFilterer: BurnFromMintTokenPoolFilterer{contract: contract}}, nil +} + +type BurnFromMintTokenPool struct { + address common.Address + abi abi.ABI + BurnFromMintTokenPoolCaller + BurnFromMintTokenPoolTransactor + BurnFromMintTokenPoolFilterer +} + +type BurnFromMintTokenPoolCaller struct { + contract *bind.BoundContract +} + +type BurnFromMintTokenPoolTransactor struct { + contract *bind.BoundContract +} + +type BurnFromMintTokenPoolFilterer struct { + contract *bind.BoundContract +} + +type BurnFromMintTokenPoolSession struct { + Contract *BurnFromMintTokenPool + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type BurnFromMintTokenPoolCallerSession struct { + Contract *BurnFromMintTokenPoolCaller + CallOpts bind.CallOpts +} + +type BurnFromMintTokenPoolTransactorSession struct { + Contract *BurnFromMintTokenPoolTransactor + TransactOpts bind.TransactOpts +} + +type BurnFromMintTokenPoolRaw struct { + Contract *BurnFromMintTokenPool +} + +type BurnFromMintTokenPoolCallerRaw struct { + Contract *BurnFromMintTokenPoolCaller +} + +type BurnFromMintTokenPoolTransactorRaw struct { + Contract *BurnFromMintTokenPoolTransactor +} + +func NewBurnFromMintTokenPool(address common.Address, backend bind.ContractBackend) (*BurnFromMintTokenPool, error) { + abi, err := abi.JSON(strings.NewReader(BurnFromMintTokenPoolABI)) + if err != nil { + return nil, err + } + contract, err := bindBurnFromMintTokenPool(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPool{address: address, abi: abi, BurnFromMintTokenPoolCaller: BurnFromMintTokenPoolCaller{contract: contract}, BurnFromMintTokenPoolTransactor: BurnFromMintTokenPoolTransactor{contract: contract}, BurnFromMintTokenPoolFilterer: BurnFromMintTokenPoolFilterer{contract: contract}}, nil +} + +func NewBurnFromMintTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*BurnFromMintTokenPoolCaller, error) { + contract, err := bindBurnFromMintTokenPool(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolCaller{contract: contract}, nil +} + +func NewBurnFromMintTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*BurnFromMintTokenPoolTransactor, error) { + contract, err := bindBurnFromMintTokenPool(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolTransactor{contract: contract}, nil +} + +func NewBurnFromMintTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*BurnFromMintTokenPoolFilterer, error) { + contract, err := bindBurnFromMintTokenPool(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolFilterer{contract: contract}, nil +} + +func bindBurnFromMintTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := BurnFromMintTokenPoolMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BurnFromMintTokenPool.Contract.BurnFromMintTokenPoolCaller.contract.Call(opts, result, method, params...) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.BurnFromMintTokenPoolTransactor.contract.Transfer(opts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.BurnFromMintTokenPoolTransactor.contract.Transact(opts, method, params...) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BurnFromMintTokenPool.Contract.contract.Call(opts, result, method, params...) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.contract.Transfer(opts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.contract.Transact(opts, method, params...) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getAllowList") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetAllowList() ([]common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetAllowList(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetAllowList() ([]common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetAllowList(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getAllowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetAllowListEnabled() (bool, error) { + return _BurnFromMintTokenPool.Contract.GetAllowListEnabled(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetAllowListEnabled() (bool, error) { + return _BurnFromMintTokenPool.Contract.GetAllowListEnabled(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnFromMintTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnFromMintTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnFromMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnFromMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getRateLimitAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetRateLimitAdmin() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetRateLimitAdmin(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetRateLimitAdmin(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _BurnFromMintTokenPool.Contract.GetRemotePools(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _BurnFromMintTokenPool.Contract.GetRemotePools(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _BurnFromMintTokenPool.Contract.GetRemoteToken(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _BurnFromMintTokenPool.Contract.GetRemoteToken(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getRmnProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetRmnProxy() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetRmnProxy(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetRmnProxy() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetRmnProxy(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetRouter() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetRouter(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetRouter() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetRouter(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getSupportedChains") + + if err != nil { + return *new([]uint64), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetSupportedChains() ([]uint64, error) { + return _BurnFromMintTokenPool.Contract.GetSupportedChains(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) { + return _BurnFromMintTokenPool.Contract.GetSupportedChains(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetToken() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetToken(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetToken() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.GetToken(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getTokenDecimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetTokenDecimals() (uint8, error) { + return _BurnFromMintTokenPool.Contract.GetTokenDecimals(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetTokenDecimals() (uint8, error) { + return _BurnFromMintTokenPool.Contract.GetTokenDecimals(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _BurnFromMintTokenPool.Contract.IsRemotePool(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _BurnFromMintTokenPool.Contract.IsRemotePool(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _BurnFromMintTokenPool.Contract.IsSupportedChain(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _BurnFromMintTokenPool.Contract.IsSupportedChain(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "isSupportedToken", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) { + return _BurnFromMintTokenPool.Contract.IsSupportedToken(&_BurnFromMintTokenPool.CallOpts, token) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) { + return _BurnFromMintTokenPool.Contract.IsSupportedToken(&_BurnFromMintTokenPool.CallOpts, token) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnFromMintTokenPool.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 + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) Owner() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.Owner(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) Owner() (common.Address, error) { + return _BurnFromMintTokenPool.Contract.Owner(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _BurnFromMintTokenPool.Contract.SupportsInterface(&_BurnFromMintTokenPool.CallOpts, interfaceId) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _BurnFromMintTokenPool.Contract.SupportsInterface(&_BurnFromMintTokenPool.CallOpts, interfaceId) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _BurnFromMintTokenPool.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) TypeAndVersion() (string, error) { + return _BurnFromMintTokenPool.Contract.TypeAndVersion(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) TypeAndVersion() (string, error) { + return _BurnFromMintTokenPool.Contract.TypeAndVersion(&_BurnFromMintTokenPool.CallOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "acceptOwnership") +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) AcceptOwnership() (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.AcceptOwnership(&_BurnFromMintTokenPool.TransactOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.AcceptOwnership(&_BurnFromMintTokenPool.TransactOpts) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.AddRemotePool(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.AddRemotePool(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.ApplyAllowListUpdates(&_BurnFromMintTokenPool.TransactOpts, removes, adds) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.ApplyAllowListUpdates(&_BurnFromMintTokenPool.TransactOpts, removes, adds) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.ApplyChainUpdates(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.ApplyChainUpdates(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.LockOrBurn(&_BurnFromMintTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.LockOrBurn(&_BurnFromMintTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.ReleaseOrMint(&_BurnFromMintTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.ReleaseOrMint(&_BurnFromMintTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.RemoveRemotePool(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.RemoveRemotePool(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "setChainRateLimiterConfigs", remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.SetChainRateLimiterConfigs(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.SetChainRateLimiterConfigs(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.SetRateLimitAdmin(&_BurnFromMintTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.SetRateLimitAdmin(&_BurnFromMintTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "setRouter", newRouter) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.SetRouter(&_BurnFromMintTokenPool.TransactOpts, newRouter) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.SetRouter(&_BurnFromMintTokenPool.TransactOpts, newRouter) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.contract.Transact(opts, "transferOwnership", to) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.TransferOwnership(&_BurnFromMintTokenPool.TransactOpts, to) +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BurnFromMintTokenPool.Contract.TransferOwnership(&_BurnFromMintTokenPool.TransactOpts, to) +} + +type BurnFromMintTokenPoolAllowListAddIterator struct { + Event *BurnFromMintTokenPoolAllowListAdd + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolAllowListAddIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolAllowListAddIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolAllowListAddIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolAllowListAdd struct { + Sender common.Address + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*BurnFromMintTokenPoolAllowListAddIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolAllowListAddIterator{contract: _BurnFromMintTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolAllowListAdd) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolAllowListAdd) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*BurnFromMintTokenPoolAllowListAdd, error) { + event := new(BurnFromMintTokenPoolAllowListAdd) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolAllowListRemoveIterator struct { + Event *BurnFromMintTokenPoolAllowListRemove + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolAllowListRemoveIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolAllowListRemoveIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolAllowListRemoveIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolAllowListRemove struct { + Sender common.Address + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*BurnFromMintTokenPoolAllowListRemoveIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolAllowListRemoveIterator{contract: _BurnFromMintTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolAllowListRemove) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolAllowListRemove) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*BurnFromMintTokenPoolAllowListRemove, error) { + event := new(BurnFromMintTokenPoolAllowListRemove) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolBurnedIterator struct { + Event *BurnFromMintTokenPoolBurned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolBurnedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolBurnedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolBurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolBurned struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnFromMintTokenPoolBurnedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolBurnedIterator{contract: _BurnFromMintTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolBurned, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolBurned) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseBurned(log types.Log) (*BurnFromMintTokenPoolBurned, error) { + event := new(BurnFromMintTokenPoolBurned) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolChainAddedIterator struct { + Event *BurnFromMintTokenPoolChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolChainAddedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolChainAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*BurnFromMintTokenPoolChainAddedIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolChainAddedIterator{contract: _BurnFromMintTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolChainAdded) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolChainAdded) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseChainAdded(log types.Log) (*BurnFromMintTokenPoolChainAdded, error) { + event := new(BurnFromMintTokenPoolChainAdded) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolChainConfiguredIterator struct { + Event *BurnFromMintTokenPoolChainConfigured + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolChainConfiguredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolChainConfiguredIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolChainConfiguredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolChainConfigured struct { + RemoteChainSelector uint64 + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*BurnFromMintTokenPoolChainConfiguredIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolChainConfiguredIterator{contract: _BurnFromMintTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolChainConfigured) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolChainConfigured) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseChainConfigured(log types.Log) (*BurnFromMintTokenPoolChainConfigured, error) { + event := new(BurnFromMintTokenPoolChainConfigured) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolChainRemovedIterator struct { + Event *BurnFromMintTokenPoolChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolChainRemovedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolChainRemoved struct { + RemoteChainSelector uint64 + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*BurnFromMintTokenPoolChainRemovedIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolChainRemovedIterator{contract: _BurnFromMintTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolChainRemoved) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolChainRemoved) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseChainRemoved(log types.Log) (*BurnFromMintTokenPoolChainRemoved, error) { + event := new(BurnFromMintTokenPoolChainRemoved) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolConfigChangedIterator struct { + Event *BurnFromMintTokenPoolConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolConfigChangedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*BurnFromMintTokenPoolConfigChangedIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolConfigChangedIterator{contract: _BurnFromMintTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolConfigChanged) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolConfigChanged) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseConfigChanged(log types.Log) (*BurnFromMintTokenPoolConfigChanged, error) { + event := new(BurnFromMintTokenPoolConfigChanged) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolLockedIterator struct { + Event *BurnFromMintTokenPoolLocked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolLockedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolLockedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolLockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolLocked struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnFromMintTokenPoolLockedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolLockedIterator{contract: _BurnFromMintTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolLocked, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolLocked) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseLocked(log types.Log) (*BurnFromMintTokenPoolLocked, error) { + event := new(BurnFromMintTokenPoolLocked) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolMintedIterator struct { + Event *BurnFromMintTokenPoolMinted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolMintedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolMintedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnFromMintTokenPoolMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolMintedIterator{contract: _BurnFromMintTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolMinted) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseMinted(log types.Log) (*BurnFromMintTokenPoolMinted, error) { + event := new(BurnFromMintTokenPoolMinted) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolOwnershipTransferRequestedIterator struct { + Event *BurnFromMintTokenPoolOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnFromMintTokenPoolOwnershipTransferRequestedIterator, 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 := _BurnFromMintTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolOwnershipTransferRequestedIterator{contract: _BurnFromMintTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolOwnershipTransferRequested, 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 := _BurnFromMintTokenPool.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: + + event := new(BurnFromMintTokenPoolOwnershipTransferRequested) + if err := _BurnFromMintTokenPool.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 +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*BurnFromMintTokenPoolOwnershipTransferRequested, error) { + event := new(BurnFromMintTokenPoolOwnershipTransferRequested) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolOwnershipTransferredIterator struct { + Event *BurnFromMintTokenPoolOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnFromMintTokenPoolOwnershipTransferredIterator, 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 := _BurnFromMintTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolOwnershipTransferredIterator{contract: _BurnFromMintTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolOwnershipTransferred, 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 := _BurnFromMintTokenPool.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: + + event := new(BurnFromMintTokenPoolOwnershipTransferred) + if err := _BurnFromMintTokenPool.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 +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*BurnFromMintTokenPoolOwnershipTransferred, error) { + event := new(BurnFromMintTokenPoolOwnershipTransferred) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolRateLimitAdminSetIterator struct { + Event *BurnFromMintTokenPoolRateLimitAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolRateLimitAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolRateLimitAdminSetIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolRateLimitAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolRateLimitAdminSet struct { + RateLimitAdmin common.Address + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*BurnFromMintTokenPoolRateLimitAdminSetIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolRateLimitAdminSetIterator{contract: _BurnFromMintTokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolRateLimitAdminSet) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolRateLimitAdminSet) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*BurnFromMintTokenPoolRateLimitAdminSet, error) { + event := new(BurnFromMintTokenPoolRateLimitAdminSet) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolReleasedIterator struct { + Event *BurnFromMintTokenPoolReleased + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolReleasedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolReleasedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolReleasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolReleased struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnFromMintTokenPoolReleasedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolReleasedIterator{contract: _BurnFromMintTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolReleased) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseReleased(log types.Log) (*BurnFromMintTokenPoolReleased, error) { + event := new(BurnFromMintTokenPoolReleased) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolRemotePoolAddedIterator struct { + Event *BurnFromMintTokenPoolRemotePoolAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolRemotePoolAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolRemotePoolAddedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolRemotePoolAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolRemotePoolAdded struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnFromMintTokenPoolRemotePoolAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolRemotePoolAddedIterator{contract: _BurnFromMintTokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolRemotePoolAdded) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*BurnFromMintTokenPoolRemotePoolAdded, error) { + event := new(BurnFromMintTokenPoolRemotePoolAdded) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolRemotePoolRemovedIterator struct { + Event *BurnFromMintTokenPoolRemotePoolRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolRemotePoolRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolRemotePoolRemovedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolRemotePoolRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolRemotePoolRemoved struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnFromMintTokenPoolRemotePoolRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolRemotePoolRemovedIterator{contract: _BurnFromMintTokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolRemotePoolRemoved) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*BurnFromMintTokenPoolRemotePoolRemoved, error) { + event := new(BurnFromMintTokenPoolRemotePoolRemoved) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolRouterUpdatedIterator struct { + Event *BurnFromMintTokenPoolRouterUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolRouterUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolRouterUpdatedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolRouterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolRouterUpdated struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*BurnFromMintTokenPoolRouterUpdatedIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolRouterUpdatedIterator{contract: _BurnFromMintTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolRouterUpdated) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolRouterUpdated) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*BurnFromMintTokenPoolRouterUpdated, error) { + event := new(BurnFromMintTokenPoolRouterUpdated) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnFromMintTokenPoolTokensConsumedIterator struct { + Event *BurnFromMintTokenPoolTokensConsumed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnFromMintTokenPoolTokensConsumedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnFromMintTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnFromMintTokenPoolTokensConsumedIterator) Error() error { + return it.fail +} + +func (it *BurnFromMintTokenPoolTokensConsumedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnFromMintTokenPoolTokensConsumed struct { + Tokens *big.Int + Raw types.Log +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*BurnFromMintTokenPoolTokensConsumedIterator, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.FilterLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return &BurnFromMintTokenPoolTokensConsumedIterator{contract: _BurnFromMintTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolTokensConsumed) (event.Subscription, error) { + + logs, sub, err := _BurnFromMintTokenPool.contract.WatchLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnFromMintTokenPoolTokensConsumed) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*BurnFromMintTokenPoolTokensConsumed, error) { + event := new(BurnFromMintTokenPoolTokensConsumed) + if err := _BurnFromMintTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _BurnFromMintTokenPool.abi.Events["AllowListAdd"].ID: + return _BurnFromMintTokenPool.ParseAllowListAdd(log) + case _BurnFromMintTokenPool.abi.Events["AllowListRemove"].ID: + return _BurnFromMintTokenPool.ParseAllowListRemove(log) + case _BurnFromMintTokenPool.abi.Events["Burned"].ID: + return _BurnFromMintTokenPool.ParseBurned(log) + case _BurnFromMintTokenPool.abi.Events["ChainAdded"].ID: + return _BurnFromMintTokenPool.ParseChainAdded(log) + case _BurnFromMintTokenPool.abi.Events["ChainConfigured"].ID: + return _BurnFromMintTokenPool.ParseChainConfigured(log) + case _BurnFromMintTokenPool.abi.Events["ChainRemoved"].ID: + return _BurnFromMintTokenPool.ParseChainRemoved(log) + case _BurnFromMintTokenPool.abi.Events["ConfigChanged"].ID: + return _BurnFromMintTokenPool.ParseConfigChanged(log) + case _BurnFromMintTokenPool.abi.Events["Locked"].ID: + return _BurnFromMintTokenPool.ParseLocked(log) + case _BurnFromMintTokenPool.abi.Events["Minted"].ID: + return _BurnFromMintTokenPool.ParseMinted(log) + case _BurnFromMintTokenPool.abi.Events["OwnershipTransferRequested"].ID: + return _BurnFromMintTokenPool.ParseOwnershipTransferRequested(log) + case _BurnFromMintTokenPool.abi.Events["OwnershipTransferred"].ID: + return _BurnFromMintTokenPool.ParseOwnershipTransferred(log) + case _BurnFromMintTokenPool.abi.Events["RateLimitAdminSet"].ID: + return _BurnFromMintTokenPool.ParseRateLimitAdminSet(log) + case _BurnFromMintTokenPool.abi.Events["Released"].ID: + return _BurnFromMintTokenPool.ParseReleased(log) + case _BurnFromMintTokenPool.abi.Events["RemotePoolAdded"].ID: + return _BurnFromMintTokenPool.ParseRemotePoolAdded(log) + case _BurnFromMintTokenPool.abi.Events["RemotePoolRemoved"].ID: + return _BurnFromMintTokenPool.ParseRemotePoolRemoved(log) + case _BurnFromMintTokenPool.abi.Events["RouterUpdated"].ID: + return _BurnFromMintTokenPool.ParseRouterUpdated(log) + case _BurnFromMintTokenPool.abi.Events["TokensConsumed"].ID: + return _BurnFromMintTokenPool.ParseTokensConsumed(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (BurnFromMintTokenPoolAllowListAdd) Topic() common.Hash { + return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8") +} + +func (BurnFromMintTokenPoolAllowListRemove) Topic() common.Hash { + return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566") +} + +func (BurnFromMintTokenPoolBurned) Topic() common.Hash { + return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7") +} + +func (BurnFromMintTokenPoolChainAdded) Topic() common.Hash { + return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") +} + +func (BurnFromMintTokenPoolChainConfigured) Topic() common.Hash { + return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b") +} + +func (BurnFromMintTokenPoolChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (BurnFromMintTokenPoolConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (BurnFromMintTokenPoolLocked) Topic() common.Hash { + return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008") +} + +func (BurnFromMintTokenPoolMinted) Topic() common.Hash { + return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0") +} + +func (BurnFromMintTokenPoolOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (BurnFromMintTokenPoolOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (BurnFromMintTokenPoolRateLimitAdminSet) Topic() common.Hash { + return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174") +} + +func (BurnFromMintTokenPoolReleased) Topic() common.Hash { + return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52") +} + +func (BurnFromMintTokenPoolRemotePoolAdded) Topic() common.Hash { + return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea") +} + +func (BurnFromMintTokenPoolRemotePoolRemoved) Topic() common.Hash { + return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76") +} + +func (BurnFromMintTokenPoolRouterUpdated) Topic() common.Hash { + return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684") +} + +func (BurnFromMintTokenPoolTokensConsumed) Topic() common.Hash { + return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a") +} + +func (_BurnFromMintTokenPool *BurnFromMintTokenPool) Address() common.Address { + return _BurnFromMintTokenPool.address +} + +type BurnFromMintTokenPoolInterface interface { + GetAllowList(opts *bind.CallOpts) ([]common.Address, error) + + GetAllowListEnabled(opts *bind.CallOpts) (bool, error) + + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) + + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) + + GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) + + GetRmnProxy(opts *bind.CallOpts) (common.Address, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) + + GetToken(opts *bind.CallOpts) (common.Address, error) + + GetTokenDecimals(opts *bind.CallOpts) (uint8, error) + + IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) + + IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) + + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) + + SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) + + SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) + + SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAllowListAdd(opts *bind.FilterOpts) (*BurnFromMintTokenPoolAllowListAddIterator, error) + + WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolAllowListAdd) (event.Subscription, error) + + ParseAllowListAdd(log types.Log) (*BurnFromMintTokenPoolAllowListAdd, error) + + FilterAllowListRemove(opts *bind.FilterOpts) (*BurnFromMintTokenPoolAllowListRemoveIterator, error) + + WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolAllowListRemove) (event.Subscription, error) + + ParseAllowListRemove(log types.Log) (*BurnFromMintTokenPoolAllowListRemove, error) + + FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnFromMintTokenPoolBurnedIterator, error) + + WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolBurned, sender []common.Address) (event.Subscription, error) + + ParseBurned(log types.Log) (*BurnFromMintTokenPoolBurned, error) + + FilterChainAdded(opts *bind.FilterOpts) (*BurnFromMintTokenPoolChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*BurnFromMintTokenPoolChainAdded, error) + + FilterChainConfigured(opts *bind.FilterOpts) (*BurnFromMintTokenPoolChainConfiguredIterator, error) + + WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolChainConfigured) (event.Subscription, error) + + ParseChainConfigured(log types.Log) (*BurnFromMintTokenPoolChainConfigured, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*BurnFromMintTokenPoolChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*BurnFromMintTokenPoolChainRemoved, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*BurnFromMintTokenPoolConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*BurnFromMintTokenPoolConfigChanged, error) + + FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnFromMintTokenPoolLockedIterator, error) + + WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolLocked, sender []common.Address) (event.Subscription, error) + + ParseLocked(log types.Log) (*BurnFromMintTokenPoolLocked, error) + + FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnFromMintTokenPoolMintedIterator, error) + + WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseMinted(log types.Log) (*BurnFromMintTokenPoolMinted, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnFromMintTokenPoolOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*BurnFromMintTokenPoolOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnFromMintTokenPoolOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*BurnFromMintTokenPoolOwnershipTransferred, error) + + FilterRateLimitAdminSet(opts *bind.FilterOpts) (*BurnFromMintTokenPoolRateLimitAdminSetIterator, error) + + WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolRateLimitAdminSet) (event.Subscription, error) + + ParseRateLimitAdminSet(log types.Log) (*BurnFromMintTokenPoolRateLimitAdminSet, error) + + FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnFromMintTokenPoolReleasedIterator, error) + + WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseReleased(log types.Log) (*BurnFromMintTokenPoolReleased, error) + + FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnFromMintTokenPoolRemotePoolAddedIterator, error) + + WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolAdded(log types.Log) (*BurnFromMintTokenPoolRemotePoolAdded, error) + + FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnFromMintTokenPoolRemotePoolRemovedIterator, error) + + WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolRemoved(log types.Log) (*BurnFromMintTokenPoolRemotePoolRemoved, error) + + FilterRouterUpdated(opts *bind.FilterOpts) (*BurnFromMintTokenPoolRouterUpdatedIterator, error) + + WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolRouterUpdated) (event.Subscription, error) + + ParseRouterUpdated(log types.Log) (*BurnFromMintTokenPoolRouterUpdated, error) + + FilterTokensConsumed(opts *bind.FilterOpts) (*BurnFromMintTokenPoolTokensConsumedIterator, error) + + WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnFromMintTokenPoolTokensConsumed) (event.Subscription, error) + + ParseTokensConsumed(log types.Log) (*BurnFromMintTokenPoolTokensConsumed, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool/burn_mint_token_pool.go b/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool/burn_mint_token_pool.go new file mode 100644 index 00000000000..cc9aa571b8f --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool/burn_mint_token_pool.go @@ -0,0 +1,3162 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package burn_mint_token_pool + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "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" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type PoolLockOrBurnInV1 struct { + Receiver []byte + RemoteChainSelector uint64 + OriginalSender common.Address + Amount *big.Int + LocalToken common.Address +} + +type PoolLockOrBurnOutV1 struct { + DestTokenAddress []byte + DestPoolData []byte +} + +type PoolReleaseOrMintInV1 struct { + OriginalSender []byte + RemoteChainSelector uint64 + Receiver common.Address + Amount *big.Int + LocalToken common.Address + SourcePoolAddress []byte + SourcePoolData []byte + OffchainTokenData []byte +} + +type PoolReleaseOrMintOutV1 struct { + DestinationAmount *big.Int +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type TokenPoolChainUpdate struct { + RemoteChainSelector uint64 + RemotePoolAddresses [][]byte + RemoteTokenAddress []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig +} + +var BurnMintTokenPoolMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIBurnMintERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x61010080604052346103635761491c803803809161001d82856103e2565b833981019060a0818303126103635780516001600160a01b038116908190036103635761004c60208301610405565b60408301519091906001600160401b0381116103635783019380601f86011215610363578451946001600160401b0386116103cc578560051b90602082019661009860405198896103e2565b875260208088019282010192831161036357602001905b8282106103b4575050506100d160806100ca60608601610413565b9401610413565b9233156103a357600180546001600160a01b0319163317905581158015610392575b8015610381575b610370578160209160049360805260c0526040519283809263313ce56760e01b82525afa6000918161032f575b50610304575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526101e6575b60405161435490816105c882396080518181816115fc015281816117e801528181612204015281816123e0015281816126f80152612770015260a05181818161189f0152818161267f0152818161315901526131dc015260c051818181610bd501528181611698015261229f015260e051818181610b65015281816116db0152611ffb0152f35b60405160206101f581836103e2565b60008252600036813760e051156102f35760005b8251811015610270576001906001600160a01b036102278286610427565b51168361023382610469565b610240575b505001610209565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13883610238565b50905060005b82518110156102ea576001906001600160a01b036102948286610427565b511680156102e457836102a682610567565b6102b4575b50505b01610276565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102ab565b506102ae565b5050503861015f565b6335f4a7b360e01b60005260046000fd5b60ff1660ff8216818103610318575061012d565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d602011610368575b8161034b602093836103e2565b810103126103635761035c90610405565b9038610127565b600080fd5b3d915061033e565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038116156100fa565b506001600160a01b038416156100f3565b639b15e16f60e01b60005260046000fd5b602080916103c184610413565b8152019101906100af565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103cc57604052565b519060ff8216820361036357565b51906001600160a01b038216820361036357565b805182101561043b5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561043b5760005260206000200190600090565b600081815260036020526040902054801561056057600019810181811161054a5760025460001981019190821161054a578181036104f9575b50505060025480156104e357600019016104bd816002610451565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61053261050a61051b936002610451565b90549060031b1c9283926002610451565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104a2565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105c157600254680100000000000000008110156103cc576105a861051b8260018594016002556002610451565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461281357508063181f5a771461279457806321df0da714612725578063240028e8146126a357806324f65ee714612647578063390775371461215e5780634c5ef0ed1461214457806354c8a4f314611fc757806362ddd3c414611f435780636d3d1a5814611ef157806379ba509714611e0c5780637d54534e14611d5f5780638926f54f14611cfb5780638da5cb5b14611ca9578063962d402014611b055780639a4575b914611554578063a42a7b8b146113cf578063a7cd63b714611303578063acfecf91146111df578063af58d59f14611178578063b0f479a114611126578063b7946580146110cf578063c0d7865514610fd7578063c4bffe2b14610e8e578063c75eea9c14610dc8578063cf7401f314610bf9578063dc0bd97114610b8a578063e0351e1314610b2f578063e8a1da171461025a5763f2fde38b1461016b57600080fd5b346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff6101b7612a41565b6101bf6132e6565b1633811461022f57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102575761026936612b2f565b939190926102756132e6565b82915b80831061099a575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b85821015610996578160051b85013581811215610992578501906101208236031261099257604051956102e387612969565b823567ffffffffffffffff8116810361098d578752602083013567ffffffffffffffff81116109895783019536601f880112156109895786359661032688612d5b565b97610334604051998a6129a1565b8089526020808a019160051b830101903682116109855760208301905b828210610952575050505060208801968752604084013567ffffffffffffffff811161094e5761038490369086016130b3565b9860408901998a526103ae61039c3660608801612bed565b9560608b0196875260c0369101612bed565b9660808a019788526103c0865161375d565b6103ca885161375d565b8a515115610926576103e667ffffffffffffffff8b5116613fb0565b156108ef5767ffffffffffffffff8a5116815260076020526040812061052687516fffffffffffffffffffffffffffffffff604082015116906104e16fffffffffffffffffffffffffffffffff6020830151169151151583608060405161044c81612969565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b61064c89516fffffffffffffffffffffffffffffffff604082015116906106076fffffffffffffffffffffffffffffffff6020830151169151151583608060405161057081612969565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff82116108c25761066f8354612e53565b601f8111610887575b50602090601f83116001146107e8576106c692918591836107dd575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b8951805182101561070157906106fb6001926106f4838f67ffffffffffffffff90511692612e3f565b5190613331565b016106cb565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2929593966107cf67ffffffffffffffff600197949c511692519351915161079b610766604051968796875261010060208801526101008701906129e2565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a10190939492916102b1565b015190503880610694565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b81811061086f5750908460019594939210610838575b505050811b0190556106c9565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061082b565b92936020600181928786015181550195019301610815565b6108b29084865260208620601f850160051c810191602086106108b8575b601f0160051c019061305a565b38610678565b90915081906108a5565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff81116109815760209161097683928336918901016130b3565b815201910190610351565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff6109ba6109b5878588612ddb565b612e1a565b16956109c587613ce4565b15610b035786845260076020526109e160056040862001613aeb565b94845b8651811015610a1a576001908987526007602052610a1360056040892001610a0c838b612e3f565b5190613e0f565b50016109e4565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610a538154612e53565b80610ac2575b5050500180549086815581610aa4575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a1019190949394610278565b865260208620908101905b81811015610a6957868155600101610aaf565b601f8111600114610ad85750555b863880610a59565b81835260208320610af391601f01861c81019060010161305a565b8082528160208120915555610ad0565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610c31612a64565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261025757604051610c6881612985565b6024358015158103610dc45781526044356fffffffffffffffffffffffffffffffff81168103610dc45760208201526064356fffffffffffffffffffffffffffffffff81168103610dc457604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610dc05760405190610cef82612985565b608435801515810361099257825260a4356fffffffffffffffffffffffffffffffff8116810361099257602083015260c4356fffffffffffffffffffffffffffffffff8116810361099257604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610d9e575b610d7257610d6f929361359b565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610d61565b5080fd5b8280fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c6040610e8a9367ffffffffffffffff610e15612a64565b610e1d612fa7565b50168152600760205220612fd2565b6136d8565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051906005548083528260208101600584526020842092845b818110610fbe575050610eec925003836129a1565b8151610f10610efa82612d5b565b91610f0860405193846129a1565b808352612d5b565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015610f6f578067ffffffffffffffff610f5c60019388612e3f565b5116610f688286612e3f565b5201610f3d565b50925090604051928392602084019060208552518091526040840192915b818110610f9b575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101610f8d565b8454835260019485019487945060209093019201610ed7565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff611024612a41565b61102c6132e6565b1680156110a75760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e8a61111261110d612a64565b613038565b6040519182916020835260208301906129e2565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c60026040610e8a9467ffffffffffffffff6111c7612a64565b6111cf612fa7565b5016815260076020522001612fd2565b50346102575767ffffffffffffffff6111f736612a7b565b9290916112026132e6565b169161121b836000526006602052604060002054151590565b156112d757828452600760205261124a6005604086200161123d368486612c8a565b6020815191012090613e0f565b1561128f57907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691611289604051928392602084526020840191612f68565b0390a280f35b826112d3836040519384937f74f23c7c0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191612f68565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051600254808252602082018091600285526020852090855b8181106113b957505050826113629103836129a1565b604051928392602084019060208552518091526040840192915b81811061138a575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff1684528594506020938401939092019160010161137c565b825484526020909301926001928301920161134c565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575767ffffffffffffffff611410612a64565b168152600760205261142760056040832001613aeb565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061146c61145683612d5b565b9261146460405194856129a1565b808452612d5b565b01835b818110611543575050825b82518110156114c0578061149060019285612e3f565b51855260086020526114a460408620612ea6565b6114ae8285612e3f565b526114b98184612e3f565b500161147a565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b8282106114f857505050500390f35b91936020611533827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0600195979984950301865288516129e2565b96019201920185949391926114e9565b80606060208093860101520161146f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc05760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610dc057606060206040516115d28161294d565b8281520152608481016115e481612cef565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611abb5750602481019177ffffffffffffffff0000000000000000000000000000000061164b84612e1a565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561194b578291611a8c575b50611a64576116d960448301612cef565b7f0000000000000000000000000000000000000000000000000000000000000000611a11575b5067ffffffffffffffff61171284612e1a565b1661172a816000526006602052604060002054151590565b156119e557602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa801561194b578290611982575b73ffffffffffffffffffffffffffffffffffffffff91501633036119565767ffffffffffffffff60646117bd85612e1a565b930135921681526007602052816118106040832073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692839161405f565b803b15610dc0578180916024604051809481937f42966c680000000000000000000000000000000000000000000000000000000083528860048401525af1801561194b57611936575b61190561189561110d86866040519081527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df760203392a2612e1a565b610e8a60405160ff7f0000000000000000000000000000000000000000000000000000000000000000166020820152602081526118d36040826129a1565b604051926118e08461294d565b83526020830190815260405193849360208552516040602086015260608501906129e2565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526129e2565b6119418280926129a1565b6102575780611859565b6040513d84823e3d90fd5b807f728fe07b000000000000000000000000000000000000000000000000000000006024925233600452fd5b506020813d6020116119dd575b8161199c602093836129a1565b81010312610dc0575173ffffffffffffffffffffffffffffffffffffffff81168103610dc05773ffffffffffffffffffffffffffffffffffffffff9061178b565b3d915061198f565b602492507fa9902c7e000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16808252600360205260408220546116ff57602492507fd0d25976000000000000000000000000000000000000000000000000000000008252600452fd5b807f53ad11d80000000000000000000000000000000000000000000000000000000060049252fd5b611aae915060203d602011611ab4575b611aa681836129a1565b8101906130ce565b386116c8565b503d611a9c565b8273ffffffffffffffffffffffffffffffffffffffff611adc602493612cef565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b50346102575760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057611b55903690600401612afe565b60243567ffffffffffffffff811161099257611b75903690600401612b9f565b60449291923567ffffffffffffffff811161098957611b98903690600401612b9f565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611c87575b611c5b57818114801590611c51575b611c2957865b818110611bdd578780f35b80611c23611bf16109b5600194868c612ddb565b611bfc83878b612e2f565b611c1d611c15611c0d868b8d612e2f565b923690612bed565b913690612bed565b9161359b565b01611bd2565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611bcc565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611bbd565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020611d5567ffffffffffffffff611d41612a64565b166000526006602052604060002054151590565b6040519015158152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611dcf612a41565b611dd76132e6565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757805473ffffffffffffffffffffffffffffffffffffffff81163303611ec9577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b503461025757611f5236612a7b565b611f5e939291936132e6565b67ffffffffffffffff8216611f80816000526006602052604060002054151590565b15611f9c5750610d6f9293611f96913691612c8a565b90613331565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b503461025757611ff190611ff9611fdd36612b2f565b9591611fea9391936132e6565b3691612d73565b933691612d73565b7f00000000000000000000000000000000000000000000000000000000000000001561211c57815b8351811015612094578073ffffffffffffffffffffffffffffffffffffffff61204c60019387612e3f565b511661205781613b4e565b612063575b5001612021565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13861205c565b5090805b8251811015612118578073ffffffffffffffffffffffffffffffffffffffff6120c360019386612e3f565b51168015612112576120d481613f50565b6120e1575b505b01612098565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1846120d9565b506120db565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b5034610257576020611d5561215836612a7b565b91612d10565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610dc457826040516121de81612902565b52608482016121ec81612cef565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361262657506024820177ffffffffffffffff0000000000000000000000000000000061225282612e1a565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156125a9578591612607575b506125df5767ffffffffffffffff6122e682612e1a565b166122fe816000526006602052604060002054151590565b156125b457602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156125a957859161258a575b501561255e5761237581612e1a565b61238760a48501916121588386612c39565b15612517575061242467ffffffffffffffff9261241e6124196124126123ae604496612e1a565b936064890135978895168a526007602052612408600260408c200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016998a9161405f565b60c4890190612c39565b3691612c8a565b6130e6565b906131d9565b9201908361243183612cef565b823b15610dc057604473ffffffffffffffffffffffffffffffffffffffff918360405195869485937f40c10f190000000000000000000000000000000000000000000000000000000085521660048401528860248401525af1801561250c57916020946124ba9273ffffffffffffffffffffffffffffffffffffffff946124fc575b5050612cef565b166040518281527f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0843392a3806040516124f381612902565b52604051908152f35b81612506916129a1565b386124b3565b6040513d86823e3d90fd5b6125219083612c39565b6112d36040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452602060048501526024840191612f68565b6024847f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b6125a3915060203d602011611ab457611aa681836129a1565b38612366565b6040513d87823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008552600452602484fd5b6004847f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b612620915060203d602011611ab457611aa681836129a1565b386122cf565b8373ffffffffffffffffffffffffffffffffffffffff611adc602493612cef565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020906126de612a41565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575750610e8a6040516127d56040826129a1565b601781527f4275726e4d696e74546f6b656e506f6f6c20312e352e3100000000000000000060208201526040519182916020835260208301906129e2565b905034610dc05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610dc0576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610dc457602092507faff2afbf0000000000000000000000000000000000000000000000000000000081149081156128d8575b81156128ae575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386128a7565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506128a0565b6020810190811067ffffffffffffffff82111761291e57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff82111761291e57604052565b60a0810190811067ffffffffffffffff82111761291e57604052565b6060810190811067ffffffffffffffff82111761291e57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761291e57604052565b919082519283825260005b848110612a2c5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016129ed565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361098d57565b6004359067ffffffffffffffff8216820361098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff8116810361098d579160243567ffffffffffffffff811161098d578260238201121561098d5780600401359267ffffffffffffffff841161098d576024848301011161098d576024019190565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501948460051b01011161098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff811161098d5781612b7891600401612afe565b929092916024359067ffffffffffffffff821161098d57612b9b91600401612afe565b9091565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501946060850201011161098d57565b35906fffffffffffffffffffffffffffffffff8216820361098d57565b919082606091031261098d57604051612c0581612985565b8092803590811515820361098d576040612c349181938552612c2960208201612bd0565b602086015201612bd0565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561098d570180359067ffffffffffffffff821161098d5760200191813603831361098d57565b92919267ffffffffffffffff821161291e5760405191612cd2601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846129a1565b82948184528183011161098d578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff8116810361098d5790565b612d58929167ffffffffffffffff612d3b921660005260076020526005604060002001923691612c8a565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff811161291e5760051b60200190565b9291612d7e82612d5b565b93612d8c60405195866129a1565b602085848152019260051b810191821161098d57915b818310612dae57505050565b823573ffffffffffffffffffffffffffffffffffffffff8116810361098d57815260209283019201612da2565b9190811015612deb5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff8116810361098d5790565b9190811015612deb576060020190565b8051821015612deb5760209160051b010190565b90600182811c92168015612e9c575b6020831014612e6d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612e62565b9060405191826000825492612eba84612e53565b8084529360018116908115612f285750600114612ee1575b50612edf925003836129a1565b565b90506000929192526020600020906000915b818310612f0c575050906020612edf9282010138612ed2565b6020919350806001915483858901015201910190918492612ef3565b60209350612edf9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612ed2565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60405190612fb482612969565b60006080838281528260208201528260408201528260608201520152565b90604051612fdf81612969565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff166000526007602052612d586004604060002001612ea6565b818110613065575050565b6000815560010161305a565b8181029291811591840414171561308457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f8301121561098d57816020612d5893359101612c8a565b9081602091031261098d5751801515810361098d5790565b80518015613155576020036131175760208180518101031261098d5760208101519060ff8211613117575060ff1690565b6112d3906040519182917f953576f70000000000000000000000000000000000000000000000000000000083526020600484015260248301906129e2565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161308457565b60ff16604d811161308457600a0a90565b81156131aa570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146132df578284116132b5579061321e9161317b565b91604d60ff841611801561327c575b61324657505090613240612d589261318f565b90613071565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b506132868361318f565b80156131aa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04841161322d565b6132be9161317b565b91604d60ff841611613246575050906132d9612d589261318f565b906131a0565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff60015416330361330757565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156135715767ffffffffffffffff8151602083012092169182600052600760205261336681600560406000200161400a565b1561352d5760005260086020526040600020815167ffffffffffffffff811161291e576133938254612e53565b601f81116134fb575b506020601f8211600114613435579161340f827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea95936134259560009161342a575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90556040519182916020835260208301906129e2565b0390a2565b9050840151386133de565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106134e35750926134259492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9896106134ac575b5050811b019055611112565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538806134a0565b9192602060018192868a015181550194019201613465565b61352790836000526020600020601f840160051c810191602085106108b857601f0160051c019061305a565b3861339c565b50906112d36040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401526040602484015260448301906129e2565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff16600081815260066020526040902054909291901561369d579161369a60e092613666856135f27f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761375d565b8460005260076020526136098160406000206138b8565b6136128361375d565b84600052600760205261362c8360026040600020016138b8565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161308457565b6136e0612fa7565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161373d602085019361373761372a63ffffffff875116426136cb565b8560808901511690613071565b90613f43565b8082101561375657505b16825263ffffffff4216905290565b9050613747565b805115613811576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116811090811591613808575b506137a55750565b606490613806604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b9050153861379d565b6fffffffffffffffffffffffffffffffff60408201511615801590613899575b6138385750565b606490613806604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613831565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19916139f160609280546138f563ffffffff8260801c16426136cb565b9081613a30575b50506fffffffffffffffffffffffffffffffff6001816020860151169282815416808510600014613a2857508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556139a58651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b61369a60405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161392c565b6fffffffffffffffffffffffffffffffff91613a65839283613a5e6001880154948286169560801c90613071565b9116613f43565b80821015613ae457505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff000000000000000000000000000000001617815538806138fc565b9050613a6f565b906040519182815491828252602082019060005260206000209260005b818110613b1d575050612edf925003836129a1565b8454835260019485019487945060209093019201613b08565b8054821015612deb5760005260206000200190600090565b6000818152600360205260409020548015613cdd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161308457600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161308457818103613c6e575b5050506002548015613c3f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613bfc816002613b36565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613cc5613c7f613c90936002613b36565b90549060031b1c9283926002613b36565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526003602052604060002055388080613bc3565b5050600090565b6000818152600660205260409020548015613cdd577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161308457600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161308457818103613dd5575b5050506005548015613c3f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613d92816005613b36565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b613df7613de6613c90936005613b36565b90549060031b1c9283926005613b36565b90556000526006602052604060002055388080613d59565b9060018201918160005282602052604060002054801515600014613f3a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613084578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161308457818103613f03575b50505080548015613c3f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613ec48282613b36565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b613f23613f13613c909386613b36565b90549060031b1c92839286613b36565b905560005283602052604060002055388080613e8c565b50505050600090565b9190820180921161308457565b80600052600360205260406000205415600014613faa576002546801000000000000000081101561291e57613f91613c908260018594016002556002613b36565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014613faa576005546801000000000000000081101561291e57613ff1613c908260018594016005556005613b36565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054613cdd578054906801000000000000000082101561291e5782614048613c90846001809601855584613b36565b905580549260005201602052604060002055600190565b929192805460ff8160a01c1615801561433f575b614338576fffffffffffffffffffffffffffffffff811690600183019081546140b863ffffffff6fffffffffffffffffffffffffffffffff83169360801c16426136cb565b908161429a575b5050848110614218575083821061414757507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff8061411585602096956136cb565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061415992505460801c926136cb565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613084576141a76141ac9273ffffffffffffffffffffffffffffffffffffffff94613f43565b6131a0565b92169182156141e8577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff881691821561426a577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b82859293951161430e576142b5926137379160801c90613071565b808310156143095750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806140bf565b6142c0565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b50821561407356fea164736f6c634300081a000a", +} + +var BurnMintTokenPoolABI = BurnMintTokenPoolMetaData.ABI + +var BurnMintTokenPoolBin = BurnMintTokenPoolMetaData.Bin + +func DeployBurnMintTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, localTokenDecimals uint8, allowlist []common.Address, rmnProxy common.Address, router common.Address) (common.Address, *types.Transaction, *BurnMintTokenPool, error) { + parsed, err := BurnMintTokenPoolMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(BurnMintTokenPoolBin), backend, token, localTokenDecimals, allowlist, rmnProxy, router) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &BurnMintTokenPool{address: address, abi: *parsed, BurnMintTokenPoolCaller: BurnMintTokenPoolCaller{contract: contract}, BurnMintTokenPoolTransactor: BurnMintTokenPoolTransactor{contract: contract}, BurnMintTokenPoolFilterer: BurnMintTokenPoolFilterer{contract: contract}}, nil +} + +type BurnMintTokenPool struct { + address common.Address + abi abi.ABI + BurnMintTokenPoolCaller + BurnMintTokenPoolTransactor + BurnMintTokenPoolFilterer +} + +type BurnMintTokenPoolCaller struct { + contract *bind.BoundContract +} + +type BurnMintTokenPoolTransactor struct { + contract *bind.BoundContract +} + +type BurnMintTokenPoolFilterer struct { + contract *bind.BoundContract +} + +type BurnMintTokenPoolSession struct { + Contract *BurnMintTokenPool + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type BurnMintTokenPoolCallerSession struct { + Contract *BurnMintTokenPoolCaller + CallOpts bind.CallOpts +} + +type BurnMintTokenPoolTransactorSession struct { + Contract *BurnMintTokenPoolTransactor + TransactOpts bind.TransactOpts +} + +type BurnMintTokenPoolRaw struct { + Contract *BurnMintTokenPool +} + +type BurnMintTokenPoolCallerRaw struct { + Contract *BurnMintTokenPoolCaller +} + +type BurnMintTokenPoolTransactorRaw struct { + Contract *BurnMintTokenPoolTransactor +} + +func NewBurnMintTokenPool(address common.Address, backend bind.ContractBackend) (*BurnMintTokenPool, error) { + abi, err := abi.JSON(strings.NewReader(BurnMintTokenPoolABI)) + if err != nil { + return nil, err + } + contract, err := bindBurnMintTokenPool(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &BurnMintTokenPool{address: address, abi: abi, BurnMintTokenPoolCaller: BurnMintTokenPoolCaller{contract: contract}, BurnMintTokenPoolTransactor: BurnMintTokenPoolTransactor{contract: contract}, BurnMintTokenPoolFilterer: BurnMintTokenPoolFilterer{contract: contract}}, nil +} + +func NewBurnMintTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*BurnMintTokenPoolCaller, error) { + contract, err := bindBurnMintTokenPool(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolCaller{contract: contract}, nil +} + +func NewBurnMintTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*BurnMintTokenPoolTransactor, error) { + contract, err := bindBurnMintTokenPool(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolTransactor{contract: contract}, nil +} + +func NewBurnMintTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*BurnMintTokenPoolFilterer, error) { + contract, err := bindBurnMintTokenPool(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolFilterer{contract: contract}, nil +} + +func bindBurnMintTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := BurnMintTokenPoolMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BurnMintTokenPool.Contract.BurnMintTokenPoolCaller.contract.Call(opts, result, method, params...) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.BurnMintTokenPoolTransactor.contract.Transfer(opts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.BurnMintTokenPoolTransactor.contract.Transact(opts, method, params...) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BurnMintTokenPool.Contract.contract.Call(opts, result, method, params...) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.contract.Transfer(opts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.contract.Transact(opts, method, params...) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getAllowList") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetAllowList() ([]common.Address, error) { + return _BurnMintTokenPool.Contract.GetAllowList(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetAllowList() ([]common.Address, error) { + return _BurnMintTokenPool.Contract.GetAllowList(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getAllowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetAllowListEnabled() (bool, error) { + return _BurnMintTokenPool.Contract.GetAllowListEnabled(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetAllowListEnabled() (bool, error) { + return _BurnMintTokenPool.Contract.GetAllowListEnabled(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnMintTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnMintTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getRateLimitAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetRateLimitAdmin() (common.Address, error) { + return _BurnMintTokenPool.Contract.GetRateLimitAdmin(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) { + return _BurnMintTokenPool.Contract.GetRateLimitAdmin(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _BurnMintTokenPool.Contract.GetRemotePools(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _BurnMintTokenPool.Contract.GetRemotePools(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _BurnMintTokenPool.Contract.GetRemoteToken(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _BurnMintTokenPool.Contract.GetRemoteToken(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getRmnProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetRmnProxy() (common.Address, error) { + return _BurnMintTokenPool.Contract.GetRmnProxy(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetRmnProxy() (common.Address, error) { + return _BurnMintTokenPool.Contract.GetRmnProxy(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetRouter() (common.Address, error) { + return _BurnMintTokenPool.Contract.GetRouter(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetRouter() (common.Address, error) { + return _BurnMintTokenPool.Contract.GetRouter(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getSupportedChains") + + if err != nil { + return *new([]uint64), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetSupportedChains() ([]uint64, error) { + return _BurnMintTokenPool.Contract.GetSupportedChains(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) { + return _BurnMintTokenPool.Contract.GetSupportedChains(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetToken() (common.Address, error) { + return _BurnMintTokenPool.Contract.GetToken(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetToken() (common.Address, error) { + return _BurnMintTokenPool.Contract.GetToken(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "getTokenDecimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetTokenDecimals() (uint8, error) { + return _BurnMintTokenPool.Contract.GetTokenDecimals(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetTokenDecimals() (uint8, error) { + return _BurnMintTokenPool.Contract.GetTokenDecimals(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _BurnMintTokenPool.Contract.IsRemotePool(&_BurnMintTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _BurnMintTokenPool.Contract.IsRemotePool(&_BurnMintTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _BurnMintTokenPool.Contract.IsSupportedChain(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _BurnMintTokenPool.Contract.IsSupportedChain(&_BurnMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "isSupportedToken", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) { + return _BurnMintTokenPool.Contract.IsSupportedToken(&_BurnMintTokenPool.CallOpts, token) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) { + return _BurnMintTokenPool.Contract.IsSupportedToken(&_BurnMintTokenPool.CallOpts, token) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnMintTokenPool.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 + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) Owner() (common.Address, error) { + return _BurnMintTokenPool.Contract.Owner(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) Owner() (common.Address, error) { + return _BurnMintTokenPool.Contract.Owner(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _BurnMintTokenPool.Contract.SupportsInterface(&_BurnMintTokenPool.CallOpts, interfaceId) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _BurnMintTokenPool.Contract.SupportsInterface(&_BurnMintTokenPool.CallOpts, interfaceId) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _BurnMintTokenPool.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) TypeAndVersion() (string, error) { + return _BurnMintTokenPool.Contract.TypeAndVersion(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) TypeAndVersion() (string, error) { + return _BurnMintTokenPool.Contract.TypeAndVersion(&_BurnMintTokenPool.CallOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "acceptOwnership") +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) AcceptOwnership() (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.AcceptOwnership(&_BurnMintTokenPool.TransactOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.AcceptOwnership(&_BurnMintTokenPool.TransactOpts) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.AddRemotePool(&_BurnMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.AddRemotePool(&_BurnMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.ApplyAllowListUpdates(&_BurnMintTokenPool.TransactOpts, removes, adds) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.ApplyAllowListUpdates(&_BurnMintTokenPool.TransactOpts, removes, adds) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.ApplyChainUpdates(&_BurnMintTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.ApplyChainUpdates(&_BurnMintTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.LockOrBurn(&_BurnMintTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.LockOrBurn(&_BurnMintTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.ReleaseOrMint(&_BurnMintTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.ReleaseOrMint(&_BurnMintTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.RemoveRemotePool(&_BurnMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.RemoveRemotePool(&_BurnMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "setChainRateLimiterConfigs", remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.SetChainRateLimiterConfigs(&_BurnMintTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.SetChainRateLimiterConfigs(&_BurnMintTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.SetRateLimitAdmin(&_BurnMintTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.SetRateLimitAdmin(&_BurnMintTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "setRouter", newRouter) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.SetRouter(&_BurnMintTokenPool.TransactOpts, newRouter) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.SetRouter(&_BurnMintTokenPool.TransactOpts, newRouter) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.contract.Transact(opts, "transferOwnership", to) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.TransferOwnership(&_BurnMintTokenPool.TransactOpts, to) +} + +func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BurnMintTokenPool.Contract.TransferOwnership(&_BurnMintTokenPool.TransactOpts, to) +} + +type BurnMintTokenPoolAllowListAddIterator struct { + Event *BurnMintTokenPoolAllowListAdd + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolAllowListAddIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolAllowListAddIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolAllowListAddIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolAllowListAdd struct { + Sender common.Address + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*BurnMintTokenPoolAllowListAddIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolAllowListAddIterator{contract: _BurnMintTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolAllowListAdd) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolAllowListAdd) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*BurnMintTokenPoolAllowListAdd, error) { + event := new(BurnMintTokenPoolAllowListAdd) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolAllowListRemoveIterator struct { + Event *BurnMintTokenPoolAllowListRemove + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolAllowListRemoveIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolAllowListRemoveIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolAllowListRemoveIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolAllowListRemove struct { + Sender common.Address + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*BurnMintTokenPoolAllowListRemoveIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolAllowListRemoveIterator{contract: _BurnMintTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolAllowListRemove) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolAllowListRemove) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*BurnMintTokenPoolAllowListRemove, error) { + event := new(BurnMintTokenPoolAllowListRemove) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolBurnedIterator struct { + Event *BurnMintTokenPoolBurned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolBurnedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolBurnedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolBurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolBurned struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnMintTokenPoolBurnedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolBurnedIterator{contract: _BurnMintTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolBurned, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolBurned) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseBurned(log types.Log) (*BurnMintTokenPoolBurned, error) { + event := new(BurnMintTokenPoolBurned) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolChainAddedIterator struct { + Event *BurnMintTokenPoolChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolChainAddedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolChainAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*BurnMintTokenPoolChainAddedIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolChainAddedIterator{contract: _BurnMintTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolChainAdded) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolChainAdded) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseChainAdded(log types.Log) (*BurnMintTokenPoolChainAdded, error) { + event := new(BurnMintTokenPoolChainAdded) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolChainConfiguredIterator struct { + Event *BurnMintTokenPoolChainConfigured + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolChainConfiguredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolChainConfiguredIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolChainConfiguredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolChainConfigured struct { + RemoteChainSelector uint64 + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*BurnMintTokenPoolChainConfiguredIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolChainConfiguredIterator{contract: _BurnMintTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolChainConfigured) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolChainConfigured) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseChainConfigured(log types.Log) (*BurnMintTokenPoolChainConfigured, error) { + event := new(BurnMintTokenPoolChainConfigured) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolChainRemovedIterator struct { + Event *BurnMintTokenPoolChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolChainRemovedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolChainRemoved struct { + RemoteChainSelector uint64 + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*BurnMintTokenPoolChainRemovedIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolChainRemovedIterator{contract: _BurnMintTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolChainRemoved) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolChainRemoved) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseChainRemoved(log types.Log) (*BurnMintTokenPoolChainRemoved, error) { + event := new(BurnMintTokenPoolChainRemoved) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolConfigChangedIterator struct { + Event *BurnMintTokenPoolConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolConfigChangedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*BurnMintTokenPoolConfigChangedIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolConfigChangedIterator{contract: _BurnMintTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolConfigChanged) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolConfigChanged) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseConfigChanged(log types.Log) (*BurnMintTokenPoolConfigChanged, error) { + event := new(BurnMintTokenPoolConfigChanged) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolLockedIterator struct { + Event *BurnMintTokenPoolLocked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolLockedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolLockedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolLockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolLocked struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnMintTokenPoolLockedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolLockedIterator{contract: _BurnMintTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolLocked, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolLocked) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseLocked(log types.Log) (*BurnMintTokenPoolLocked, error) { + event := new(BurnMintTokenPoolLocked) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolMintedIterator struct { + Event *BurnMintTokenPoolMinted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolMintedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolMintedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnMintTokenPoolMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolMintedIterator{contract: _BurnMintTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolMinted) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseMinted(log types.Log) (*BurnMintTokenPoolMinted, error) { + event := new(BurnMintTokenPoolMinted) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolOwnershipTransferRequestedIterator struct { + Event *BurnMintTokenPoolOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnMintTokenPoolOwnershipTransferRequestedIterator, 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 := _BurnMintTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolOwnershipTransferRequestedIterator{contract: _BurnMintTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolOwnershipTransferRequested, 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 := _BurnMintTokenPool.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: + + event := new(BurnMintTokenPoolOwnershipTransferRequested) + if err := _BurnMintTokenPool.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 +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*BurnMintTokenPoolOwnershipTransferRequested, error) { + event := new(BurnMintTokenPoolOwnershipTransferRequested) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolOwnershipTransferredIterator struct { + Event *BurnMintTokenPoolOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnMintTokenPoolOwnershipTransferredIterator, 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 := _BurnMintTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolOwnershipTransferredIterator{contract: _BurnMintTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolOwnershipTransferred, 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 := _BurnMintTokenPool.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: + + event := new(BurnMintTokenPoolOwnershipTransferred) + if err := _BurnMintTokenPool.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 +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*BurnMintTokenPoolOwnershipTransferred, error) { + event := new(BurnMintTokenPoolOwnershipTransferred) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolRateLimitAdminSetIterator struct { + Event *BurnMintTokenPoolRateLimitAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolRateLimitAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolRateLimitAdminSetIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolRateLimitAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolRateLimitAdminSet struct { + RateLimitAdmin common.Address + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*BurnMintTokenPoolRateLimitAdminSetIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolRateLimitAdminSetIterator{contract: _BurnMintTokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolRateLimitAdminSet) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolRateLimitAdminSet) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*BurnMintTokenPoolRateLimitAdminSet, error) { + event := new(BurnMintTokenPoolRateLimitAdminSet) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolReleasedIterator struct { + Event *BurnMintTokenPoolReleased + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolReleasedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolReleasedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolReleasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolReleased struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnMintTokenPoolReleasedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolReleasedIterator{contract: _BurnMintTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolReleased) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseReleased(log types.Log) (*BurnMintTokenPoolReleased, error) { + event := new(BurnMintTokenPoolReleased) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolRemotePoolAddedIterator struct { + Event *BurnMintTokenPoolRemotePoolAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolRemotePoolAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolRemotePoolAddedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolRemotePoolAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolRemotePoolAdded struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnMintTokenPoolRemotePoolAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolRemotePoolAddedIterator{contract: _BurnMintTokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolRemotePoolAdded) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*BurnMintTokenPoolRemotePoolAdded, error) { + event := new(BurnMintTokenPoolRemotePoolAdded) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolRemotePoolRemovedIterator struct { + Event *BurnMintTokenPoolRemotePoolRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolRemotePoolRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolRemotePoolRemovedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolRemotePoolRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolRemotePoolRemoved struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnMintTokenPoolRemotePoolRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &BurnMintTokenPoolRemotePoolRemovedIterator{contract: _BurnMintTokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolRemotePoolRemoved) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*BurnMintTokenPoolRemotePoolRemoved, error) { + event := new(BurnMintTokenPoolRemotePoolRemoved) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolRouterUpdatedIterator struct { + Event *BurnMintTokenPoolRouterUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolRouterUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolRouterUpdatedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolRouterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolRouterUpdated struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*BurnMintTokenPoolRouterUpdatedIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolRouterUpdatedIterator{contract: _BurnMintTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolRouterUpdated) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolRouterUpdated) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*BurnMintTokenPoolRouterUpdated, error) { + event := new(BurnMintTokenPoolRouterUpdated) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnMintTokenPoolTokensConsumedIterator struct { + Event *BurnMintTokenPoolTokensConsumed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnMintTokenPoolTokensConsumedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnMintTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnMintTokenPoolTokensConsumedIterator) Error() error { + return it.fail +} + +func (it *BurnMintTokenPoolTokensConsumedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnMintTokenPoolTokensConsumed struct { + Tokens *big.Int + Raw types.Log +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*BurnMintTokenPoolTokensConsumedIterator, error) { + + logs, sub, err := _BurnMintTokenPool.contract.FilterLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return &BurnMintTokenPoolTokensConsumedIterator{contract: _BurnMintTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolTokensConsumed) (event.Subscription, error) { + + logs, sub, err := _BurnMintTokenPool.contract.WatchLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnMintTokenPoolTokensConsumed) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnMintTokenPool *BurnMintTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*BurnMintTokenPoolTokensConsumed, error) { + event := new(BurnMintTokenPoolTokensConsumed) + if err := _BurnMintTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_BurnMintTokenPool *BurnMintTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _BurnMintTokenPool.abi.Events["AllowListAdd"].ID: + return _BurnMintTokenPool.ParseAllowListAdd(log) + case _BurnMintTokenPool.abi.Events["AllowListRemove"].ID: + return _BurnMintTokenPool.ParseAllowListRemove(log) + case _BurnMintTokenPool.abi.Events["Burned"].ID: + return _BurnMintTokenPool.ParseBurned(log) + case _BurnMintTokenPool.abi.Events["ChainAdded"].ID: + return _BurnMintTokenPool.ParseChainAdded(log) + case _BurnMintTokenPool.abi.Events["ChainConfigured"].ID: + return _BurnMintTokenPool.ParseChainConfigured(log) + case _BurnMintTokenPool.abi.Events["ChainRemoved"].ID: + return _BurnMintTokenPool.ParseChainRemoved(log) + case _BurnMintTokenPool.abi.Events["ConfigChanged"].ID: + return _BurnMintTokenPool.ParseConfigChanged(log) + case _BurnMintTokenPool.abi.Events["Locked"].ID: + return _BurnMintTokenPool.ParseLocked(log) + case _BurnMintTokenPool.abi.Events["Minted"].ID: + return _BurnMintTokenPool.ParseMinted(log) + case _BurnMintTokenPool.abi.Events["OwnershipTransferRequested"].ID: + return _BurnMintTokenPool.ParseOwnershipTransferRequested(log) + case _BurnMintTokenPool.abi.Events["OwnershipTransferred"].ID: + return _BurnMintTokenPool.ParseOwnershipTransferred(log) + case _BurnMintTokenPool.abi.Events["RateLimitAdminSet"].ID: + return _BurnMintTokenPool.ParseRateLimitAdminSet(log) + case _BurnMintTokenPool.abi.Events["Released"].ID: + return _BurnMintTokenPool.ParseReleased(log) + case _BurnMintTokenPool.abi.Events["RemotePoolAdded"].ID: + return _BurnMintTokenPool.ParseRemotePoolAdded(log) + case _BurnMintTokenPool.abi.Events["RemotePoolRemoved"].ID: + return _BurnMintTokenPool.ParseRemotePoolRemoved(log) + case _BurnMintTokenPool.abi.Events["RouterUpdated"].ID: + return _BurnMintTokenPool.ParseRouterUpdated(log) + case _BurnMintTokenPool.abi.Events["TokensConsumed"].ID: + return _BurnMintTokenPool.ParseTokensConsumed(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (BurnMintTokenPoolAllowListAdd) Topic() common.Hash { + return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8") +} + +func (BurnMintTokenPoolAllowListRemove) Topic() common.Hash { + return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566") +} + +func (BurnMintTokenPoolBurned) Topic() common.Hash { + return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7") +} + +func (BurnMintTokenPoolChainAdded) Topic() common.Hash { + return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") +} + +func (BurnMintTokenPoolChainConfigured) Topic() common.Hash { + return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b") +} + +func (BurnMintTokenPoolChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (BurnMintTokenPoolConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (BurnMintTokenPoolLocked) Topic() common.Hash { + return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008") +} + +func (BurnMintTokenPoolMinted) Topic() common.Hash { + return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0") +} + +func (BurnMintTokenPoolOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (BurnMintTokenPoolOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (BurnMintTokenPoolRateLimitAdminSet) Topic() common.Hash { + return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174") +} + +func (BurnMintTokenPoolReleased) Topic() common.Hash { + return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52") +} + +func (BurnMintTokenPoolRemotePoolAdded) Topic() common.Hash { + return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea") +} + +func (BurnMintTokenPoolRemotePoolRemoved) Topic() common.Hash { + return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76") +} + +func (BurnMintTokenPoolRouterUpdated) Topic() common.Hash { + return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684") +} + +func (BurnMintTokenPoolTokensConsumed) Topic() common.Hash { + return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a") +} + +func (_BurnMintTokenPool *BurnMintTokenPool) Address() common.Address { + return _BurnMintTokenPool.address +} + +type BurnMintTokenPoolInterface interface { + GetAllowList(opts *bind.CallOpts) ([]common.Address, error) + + GetAllowListEnabled(opts *bind.CallOpts) (bool, error) + + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) + + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) + + GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) + + GetRmnProxy(opts *bind.CallOpts) (common.Address, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) + + GetToken(opts *bind.CallOpts) (common.Address, error) + + GetTokenDecimals(opts *bind.CallOpts) (uint8, error) + + IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) + + IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) + + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) + + SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) + + SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) + + SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAllowListAdd(opts *bind.FilterOpts) (*BurnMintTokenPoolAllowListAddIterator, error) + + WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolAllowListAdd) (event.Subscription, error) + + ParseAllowListAdd(log types.Log) (*BurnMintTokenPoolAllowListAdd, error) + + FilterAllowListRemove(opts *bind.FilterOpts) (*BurnMintTokenPoolAllowListRemoveIterator, error) + + WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolAllowListRemove) (event.Subscription, error) + + ParseAllowListRemove(log types.Log) (*BurnMintTokenPoolAllowListRemove, error) + + FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnMintTokenPoolBurnedIterator, error) + + WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolBurned, sender []common.Address) (event.Subscription, error) + + ParseBurned(log types.Log) (*BurnMintTokenPoolBurned, error) + + FilterChainAdded(opts *bind.FilterOpts) (*BurnMintTokenPoolChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*BurnMintTokenPoolChainAdded, error) + + FilterChainConfigured(opts *bind.FilterOpts) (*BurnMintTokenPoolChainConfiguredIterator, error) + + WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolChainConfigured) (event.Subscription, error) + + ParseChainConfigured(log types.Log) (*BurnMintTokenPoolChainConfigured, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*BurnMintTokenPoolChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*BurnMintTokenPoolChainRemoved, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*BurnMintTokenPoolConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*BurnMintTokenPoolConfigChanged, error) + + FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnMintTokenPoolLockedIterator, error) + + WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolLocked, sender []common.Address) (event.Subscription, error) + + ParseLocked(log types.Log) (*BurnMintTokenPoolLocked, error) + + FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnMintTokenPoolMintedIterator, error) + + WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseMinted(log types.Log) (*BurnMintTokenPoolMinted, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnMintTokenPoolOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*BurnMintTokenPoolOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnMintTokenPoolOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*BurnMintTokenPoolOwnershipTransferred, error) + + FilterRateLimitAdminSet(opts *bind.FilterOpts) (*BurnMintTokenPoolRateLimitAdminSetIterator, error) + + WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolRateLimitAdminSet) (event.Subscription, error) + + ParseRateLimitAdminSet(log types.Log) (*BurnMintTokenPoolRateLimitAdminSet, error) + + FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnMintTokenPoolReleasedIterator, error) + + WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseReleased(log types.Log) (*BurnMintTokenPoolReleased, error) + + FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnMintTokenPoolRemotePoolAddedIterator, error) + + WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolAdded(log types.Log) (*BurnMintTokenPoolRemotePoolAdded, error) + + FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnMintTokenPoolRemotePoolRemovedIterator, error) + + WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolRemoved(log types.Log) (*BurnMintTokenPoolRemotePoolRemoved, error) + + FilterRouterUpdated(opts *bind.FilterOpts) (*BurnMintTokenPoolRouterUpdatedIterator, error) + + WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolRouterUpdated) (event.Subscription, error) + + ParseRouterUpdated(log types.Log) (*BurnMintTokenPoolRouterUpdated, error) + + FilterTokensConsumed(opts *bind.FilterOpts) (*BurnMintTokenPoolTokensConsumedIterator, error) + + WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnMintTokenPoolTokensConsumed) (event.Subscription, error) + + ParseTokensConsumed(log types.Log) (*BurnMintTokenPoolTokensConsumed, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_5_1/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go b/core/gethwrappers/ccip/generated/v1_5_1/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go new file mode 100644 index 00000000000..4e17c9f6097 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_1/burn_to_address_mint_token_pool/burn_to_address_mint_token_pool.go @@ -0,0 +1,3210 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package burn_to_address_mint_token_pool + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "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" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type PoolLockOrBurnInV1 struct { + Receiver []byte + RemoteChainSelector uint64 + OriginalSender common.Address + Amount *big.Int + LocalToken common.Address +} + +type PoolLockOrBurnOutV1 struct { + DestTokenAddress []byte + DestPoolData []byte +} + +type PoolReleaseOrMintInV1 struct { + OriginalSender []byte + RemoteChainSelector uint64 + Receiver common.Address + Amount *big.Int + LocalToken common.Address + SourcePoolAddress []byte + SourcePoolData []byte + OffchainTokenData []byte +} + +type PoolReleaseOrMintOutV1 struct { + DestinationAmount *big.Int +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type TokenPoolChainUpdate struct { + RemoteChainSelector uint64 + RemotePoolAddresses [][]byte + RemoteTokenAddress []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig +} + +var BurnToAddressMintTokenPoolMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIBurnMintERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"burnAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnAddress\",\"inputs\":[],\"outputs\":[{\"name\":\"burnAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_burnAddress\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x610120806040523461038257614bdb803803809161001d8285610401565b8339810160c0828203126103825781516001600160a01b03811692908390036103825761004c60208201610424565b60408201516001600160401b0381116103825782019280601f85011215610382578351936001600160401b0385116103eb578460051b9060208201956100956040519788610401565b865260208087019282010192831161038257602001905b8282106103d3575050506100c260608301610432565b936100db60a06100d460808601610432565b9401610432565b9433156103c257600180546001600160a01b03191633179055811580156103b1575b80156103a0575b61038f578160209160049360805260c0526040519283809263313ce56760e01b82525afa6000918161034e575b50610323575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e0819052610206575b50610100526040516145f490816105e7823960805181818161161701528181611809015281816123630152818161253f0152818161285101526128c9015260a05181818161196f015281816127d80152818161332d01526133b0015260c051818181610beb015281816116b301526123fe015260e051818181610b7b015281816116f6015261215a01526101005181818161185e0152612c420152f35b60206040516102158282610401565b60008152600036813760e051156103125760005b8151811015610290576001906001600160a01b036102478285610446565b51168461025382610488565b610260575b505001610229565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13884610258565b505060005b8251811015610309576001906001600160a01b036102b38286610446565b5116801561030357836102c582610586565b6102d3575b50505b01610295565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102ca565b506102cd565b50505038610169565b6335f4a7b360e01b60005260046000fd5b60ff1660ff82168181036103375750610137565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d602011610387575b8161036a60209383610401565b810103126103825761037b90610424565b9038610131565b600080fd5b3d915061035d565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b03811615610104565b506001600160a01b038416156100fd565b639b15e16f60e01b60005260046000fd5b602080916103e084610432565b8152019101906100ac565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103eb57604052565b519060ff8216820361038257565b51906001600160a01b038216820361038257565b805182101561045a5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561045a5760005260206000200190600090565b600081815260036020526040902054801561057f5760001981018181116105695760025460001981019190821161056957818103610518575b505050600254801561050257600019016104dc816002610470565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61055161052961053a936002610470565b90549060031b1c9283926002610470565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104c1565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105e057600254680100000000000000008110156103eb576105c761053a8260018594016002556002610470565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461296c57508063181f5a77146128ed57806321df0da71461287e578063240028e8146127fc57806324f65ee7146127a057806338b39d2914610dde57806339077537146122bd5780634c5ef0ed146122a357806354c8a4f31461212657806362ddd3c4146120a25780636d3d1a581461205057806379ba509714611f6b5780637d54534e14611ebe5780638926f54f14611e5a5780638da5cb5b14611e08578063962d402014611c645780639a4575b91461156f578063a42a7b8b146113ea578063a7cd63b71461131e578063acfecf91146111fa578063af58d59f14611193578063b0f479a114611141578063b7946580146110ea578063c0d7865514610ff2578063c4bffe2b14610ea9578063c75eea9c14610de3578063c8de9fe014610dde578063cf7401f314610c0f578063dc0bd97114610ba0578063e0351e1314610b45578063e8a1da17146102705763f2fde38b1461018157600080fd5b3461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d5773ffffffffffffffffffffffffffffffffffffffff6101cd612bd4565b6101d56134ba565b1633811461024557807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b503461026d5761027f36612d31565b9391909261028b6134ba565b82915b8083106109b0575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b858210156109ac578160051b850135818112156109a857850190610120823603126109a857604051956102f987612ac2565b823567ffffffffffffffff811681036109a3578752602083013567ffffffffffffffff811161099f5783019536601f8801121561099f5786359661033c88612f2f565b9761034a604051998a612afa565b8089526020808a019160051b8301019036821161099b5760208301905b828210610968575050505060208801968752604084013567ffffffffffffffff81116109645761039a9036908601613287565b9860408901998a526103c46103b23660608801612def565b9560608b0196875260c0369101612def565b9660808a019788526103d68651613931565b6103e08851613931565b8a51511561093c576103fc67ffffffffffffffff8b5116614184565b156109055767ffffffffffffffff8a5116815260076020526040812061053c87516fffffffffffffffffffffffffffffffff604082015116906104f76fffffffffffffffffffffffffffffffff6020830151169151151583608060405161046281612ac2565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b61066289516fffffffffffffffffffffffffffffffff6040820151169061061d6fffffffffffffffffffffffffffffffff6020830151169151151583608060405161058681612ac2565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff82116108d8576106858354613027565b601f811161089d575b50602090601f83116001146107fe576106dc92918591836107f3575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b89518051821015610717579061071160019261070a838f67ffffffffffffffff90511692613013565b5190613505565b016106e1565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2929593966107e567ffffffffffffffff600197949c51169251935191516107b161077c60405196879687526101006020880152610100870190612b75565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a10190939492916102c7565b0151905038806106aa565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b818110610885575090846001959493921061084e575b505050811b0190556106df565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055388080610841565b9293602060018192878601518155019501930161082b565b6108c89084865260208620601f850160051c810191602086106108ce575b601f0160051c019061322e565b3861068e565b90915081906108bb565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff81116109975760209161098c8392833691890101613287565b815201910190610367565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff6109d06109cb878588612faf565b612fee565b16956109db87613eb8565b15610b195786845260076020526109f760056040862001613cbf565b94845b8651811015610a30576001908987526007602052610a2960056040892001610a22838b613013565b5190613fe3565b50016109fa565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610a698154613027565b80610ad8575b5050500180549086815581610aba575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a101919094939461028e565b865260208620908101905b81811015610a7f57868155600101610ac5565b601f8111600114610aee5750555b863880610a6f565b81835260208320610b0991601f01861c81019060010161322e565b8082528160208120915555610ae6565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461026d5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57610c47612c66565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261026d57604051610c7e81612ade565b6024358015158103610dda5781526044356fffffffffffffffffffffffffffffffff81168103610dda5760208201526064356fffffffffffffffffffffffffffffffff81168103610dda57604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610dd65760405190610d0582612ade565b60843580151581036109a857825260a4356fffffffffffffffffffffffffffffffff811681036109a857602083015260c4356fffffffffffffffffffffffffffffffff811681036109a857604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610db4575b610d8857610d85929361376f565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610d77565b5080fd5b8280fd5b612bf7565b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57610e4c610e476040610ea59367ffffffffffffffff610e30612c66565b610e3861317b565b501681526007602052206131a6565b6138ac565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57604051906005548083528260208101600584526020842092845b818110610fd9575050610f0792500383612afa565b8151610f2b610f1582612f2f565b91610f236040519384612afa565b808352612f2f565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015610f8a578067ffffffffffffffff610f7760019388613013565b5116610f838286613013565b5201610f58565b50925090604051928392602084019060208552518091526040840192915b818110610fb6575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101610fa8565b8454835260019485019487945060209093019201610ef2565b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d5773ffffffffffffffffffffffffffffffffffffffff61103f612bd4565b6110476134ba565b1680156110c25760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57610ea561112d611128612c66565b61320c565b604051918291602083526020830190612b75565b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57610e4c610e4760026040610ea59467ffffffffffffffff6111e2612c66565b6111ea61317b565b50168152600760205220016131a6565b503461026d5767ffffffffffffffff61121236612c7d565b92909161121d6134ba565b1691611236836000526006602052604060002054151590565b156112f257828452600760205261126560056040862001611258368486612e8c565b6020815191012090613fe3565b156112aa57907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76916112a460405192839260208452602084019161313c565b0390a280f35b826112ee836040519384937f74f23c7c000000000000000000000000000000000000000000000000000000008552600485015260406024850152604484019161313c565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57604051600254808252602082018091600285526020852090855b8181106113d4575050508261137d910383612afa565b604051928392602084019060208552518091526040840192915b8181106113a5575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611397565b8254845260209093019260019283019201611367565b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d5767ffffffffffffffff61142b612c66565b168152600760205261144260056040832001613cbf565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061148761147183612f2f565b9261147f6040519485612afa565b808452612f2f565b01835b81811061155e575050825b82518110156114db57806114ab60019285613013565b51855260086020526114bf6040862061307a565b6114c98285613013565b526114d48184613013565b5001611495565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b82821061151357505050500390f35b9193602061154e827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186528851612b75565b9601920192018594939192611504565b80606060208093860101520161148a565b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d5760043567ffffffffffffffff8111610dd65760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610dd657606060206040516115ed81612aa6565b8281520152608481016115ff81612ec3565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611c1a5750602481019077ffffffffffffffff0000000000000000000000000000000061166683612fee565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611b3b578491611beb575b50611bc3576116f460448201612ec3565b7f0000000000000000000000000000000000000000000000000000000000000000611b71575b5067ffffffffffffffff61172d83612fee565b16611745816000526006602052604060002054151590565b15611b4657602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa8015611b3b578490611ad8575b73ffffffffffffffffffffffffffffffffffffffff9150163303611aac57611920829360646117dd67ffffffffffffffff95612fee565b93013593849316815260076020526118316040822073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016958691614233565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000602082019081527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16602483015260448083018690528252949091906118b1606484612afa565b81806040978851956118c38a88612afa565b602087527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020880152519082855af1903d15611aa3573d61190481612b3b565b9061191189519283612afa565b8152809360203d92013e61451b565b805180611a02575b6119d184610ea5611967611128898885519081527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df760203392a2612fee565b9180519060ff7f0000000000000000000000000000000000000000000000000000000000000000166020830152602082526119a28183612afa565b8051936119ae85612aa6565b845260208401918252805194859460208652518260208701526060860190612b75565b9151907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08584030190850152612b75565b90602080611a149383010191016132a2565b15611a20573880611928565b608482517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b6060925061451b565b6024837f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b506020813d602011611b33575b81611af260209383612afa565b810103126109a8575173ffffffffffffffffffffffffffffffffffffffff811681036109a85773ffffffffffffffffffffffffffffffffffffffff906117a6565b3d9150611ae5565b6040513d86823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008452600452602483fd5b73ffffffffffffffffffffffffffffffffffffffff168084526003602052604084205461171a577fd0d25976000000000000000000000000000000000000000000000000000000008452600452602483fd5b6004837f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b611c0d915060203d602011611c13575b611c058183612afa565b8101906132a2565b386116e3565b503d611bfb565b8273ffffffffffffffffffffffffffffffffffffffff611c3b602493612ec3565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b503461026d5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d5760043567ffffffffffffffff8111610dd657611cb4903690600401612d00565b60243567ffffffffffffffff81116109a857611cd4903690600401612da1565b60449291923567ffffffffffffffff811161099f57611cf7903690600401612da1565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611de6575b611dba57818114801590611db0575b611d8857865b818110611d3c578780f35b80611d82611d506109cb600194868c612faf565b611d5b83878b613003565b611d7c611d74611d6c868b8d613003565b923690612def565b913690612def565b9161376f565b01611d31565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611d2b565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611d1c565b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d576020611eb467ffffffffffffffff611ea0612c66565b166000526006602052604060002054151590565b6040519015158152f35b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611f2e612bd4565b611f366134ba565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57805473ffffffffffffffffffffffffffffffffffffffff81163303612028577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b503461026d576120b136612c7d565b6120bd939291936134ba565b67ffffffffffffffff82166120df816000526006602052604060002054151590565b156120fb5750610d8592936120f5913691612e8c565b90613505565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b503461026d576121509061215861213c36612d31565b95916121499391936134ba565b3691612f47565b933691612f47565b7f00000000000000000000000000000000000000000000000000000000000000001561227b57815b83518110156121f3578073ffffffffffffffffffffffffffffffffffffffff6121ab60019387613013565b51166121b681613d22565b6121c2575b5001612180565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1386121bb565b5090805b8251811015612277578073ffffffffffffffffffffffffffffffffffffffff61222260019386613013565b511680156122715761223381614124565b612240575b505b016121f7565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a184612238565b5061223a565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b503461026d576020611eb46122b736612c7d565b91612ee4565b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d5760043567ffffffffffffffff8111610dd657806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610dda578260405161233d81612a5b565b526084820161234b81612ec3565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361277f57506024820177ffffffffffffffff000000000000000000000000000000006123b182612fee565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115612702578591612760575b506127385767ffffffffffffffff61244582612fee565b1661245d816000526006602052604060002054151590565b1561270d57602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156127025785916126e3575b50156126b7576124d481612fee565b6124e660a48501916122b78386612e3b565b15612670575061258367ffffffffffffffff9261257d61257861257161250d604496612fee565b936064890135978895168a526007602052612567600260408c200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016998a91614233565b60c4890190612e3b565b3691612e8c565b6132ba565b906133ad565b9201908361259083612ec3565b823b15610dd6576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91909116600482015260248101859052918290604490829084905af18015611b3b579160209461261e9273ffffffffffffffffffffffffffffffffffffffff94612660575b5050612ec3565b166040518281527f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0843392a38060405161265781612a5b565b52604051908152f35b8161266a91612afa565b38612617565b61267a9083612e3b565b6112ee6040519283927f24eb47e500000000000000000000000000000000000000000000000000000000845260206004850152602484019161313c565b6024847f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b6126fc915060203d602011611c1357611c058183612afa565b386124c5565b6040513d87823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008552600452602484fd5b6004847f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b612779915060203d602011611c1357611c058183612afa565b3861242e565b8373ffffffffffffffffffffffffffffffffffffffff611c3b602493612ec3565b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461026d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57602090612837612bd4565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461026d57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261026d5750610ea560405161292e604082612afa565b601c81527f4275726e546f41646472657373546f6b656e506f6f6c20312e352e31000000006020820152604051918291602083526020830190612b75565b905034610dd65760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610dd6576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610dda57602092507faff2afbf000000000000000000000000000000000000000000000000000000008114908115612a31575b8115612a07575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612a00565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506129f9565b6020810190811067ffffffffffffffff821117612a7757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117612a7757604052565b60a0810190811067ffffffffffffffff821117612a7757604052565b6060810190811067ffffffffffffffff821117612a7757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612a7757604052565b67ffffffffffffffff8111612a7757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b848110612bbf5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612b80565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036109a357565b346109a35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109a357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b6004359067ffffffffffffffff821682036109a357565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126109a35760043567ffffffffffffffff811681036109a3579160243567ffffffffffffffff81116109a357826023820112156109a35780600401359267ffffffffffffffff84116109a357602484830101116109a3576024019190565b9181601f840112156109a35782359167ffffffffffffffff83116109a3576020808501948460051b0101116109a357565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126109a35760043567ffffffffffffffff81116109a35781612d7a91600401612d00565b929092916024359067ffffffffffffffff82116109a357612d9d91600401612d00565b9091565b9181601f840112156109a35782359167ffffffffffffffff83116109a357602080850194606085020101116109a357565b35906fffffffffffffffffffffffffffffffff821682036109a357565b91908260609103126109a357604051612e0781612ade565b809280359081151582036109a3576040612e369181938552612e2b60208201612dd2565b602086015201612dd2565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156109a3570180359067ffffffffffffffff82116109a3576020019181360383136109a357565b929192612e9882612b3b565b91612ea66040519384612afa565b8294818452818301116109a3578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff811681036109a35790565b612f2c929167ffffffffffffffff612f0f921660005260076020526005604060002001923691612e8c565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff8111612a775760051b60200190565b9291612f5282612f2f565b93612f606040519586612afa565b602085848152019260051b81019182116109a357915b818310612f8257505050565b823573ffffffffffffffffffffffffffffffffffffffff811681036109a357815260209283019201612f76565b9190811015612fbf5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff811681036109a35790565b9190811015612fbf576060020190565b8051821015612fbf5760209160051b010190565b90600182811c92168015613070575b602083101461304157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613036565b906040519182600082549261308e84613027565b80845293600181169081156130fc57506001146130b5575b506130b392500383612afa565b565b90506000929192526020600020906000915b8183106130e05750509060206130b392820101386130a6565b60209193508060019154838589010152019101909184926130c7565b602093506130b39592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386130a6565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b6040519061318882612ac2565b60006080838281528260208201528260408201528260608201520152565b906040516131b381612ac2565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff166000526007602052612f2c600460406000200161307a565b818110613239575050565b6000815560010161322e565b8181029291811591840414171561325857565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f830112156109a357816020612f2c93359101612e8c565b908160209103126109a3575180151581036109a35790565b80518015613329576020036132eb576020818051810103126109a35760208101519060ff82116132eb575060ff1690565b6112ee906040519182917f953576f7000000000000000000000000000000000000000000000000000000008352602060048401526024830190612b75565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161325857565b60ff16604d811161325857600a0a90565b811561337e570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146134b35782841161348957906133f29161334f565b91604d60ff8416118015613450575b61341a57505090613414612f2c92613363565b90613245565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b5061345a83613363565b801561337e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613401565b6134929161334f565b91604d60ff84161161341a575050906134ad612f2c92613363565b90613374565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff6001541633036134db57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156137455767ffffffffffffffff8151602083012092169182600052600760205261353a8160056040600020016141de565b156137015760005260086020526040600020815167ffffffffffffffff8111612a77576135678254613027565b601f81116136cf575b506020601f821160011461360957916135e3827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea95936135f9956000916135fe575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9055604051918291602083526020830190612b75565b0390a2565b9050840151386135b2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106136b75750926135f99492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea989610613680575b5050811b01905561112d565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880613674565b9192602060018192868a015181550194019201613639565b6136fb90836000526020600020601f840160051c810191602085106108ce57601f0160051c019061322e565b38613570565b50906112ee6040519283927f393b8ad20000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190612b75565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff166000818152600660205260409020549092919015613871579161386e60e09261383a856137c67f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b97613931565b8460005260076020526137dd816040600020613a8c565b6137e683613931565b846000526007602052613800836002604060002001613a8c565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161325857565b6138b461317b565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff8083511691613911602085019361390b6138fe63ffffffff8751164261389f565b8560808901511690613245565b90614117565b8082101561392a57505b16825263ffffffff4216905290565b905061391b565b8051156139e5576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff6020830151168110908115916139dc575b506139795750565b6064906139da604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b90501538613971565b6fffffffffffffffffffffffffffffffff60408201511615801590613a6d575b613a0c5750565b6064906139da604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613a05565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1991613bc56060928054613ac963ffffffff8260801c164261389f565b9081613c04575b50506fffffffffffffffffffffffffffffffff6001816020860151169282815416808510600014613bfc57508280855b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416178155613b798651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b61386e60405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b838091613b00565b6fffffffffffffffffffffffffffffffff91613c39839283613c326001880154948286169560801c90613245565b9116614117565b80821015613cb857505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff00000000000000000000000000000000161781553880613ad0565b9050613c43565b906040519182815491828252602082019060005260206000209260005b818110613cf15750506130b392500383612afa565b8454835260019485019487945060209093019201613cdc565b8054821015612fbf5760005260206000200190600090565b6000818152600360205260409020548015613eb1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161325857600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161325857818103613e42575b5050506002548015613e13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613dd0816002613d0a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613e99613e53613e64936002613d0a565b90549060031b1c9283926002613d0a565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526003602052604060002055388080613d97565b5050600090565b6000818152600660205260409020548015613eb1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161325857600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161325857818103613fa9575b5050506005548015613e13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613f66816005613d0a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b613fcb613fba613e64936005613d0a565b90549060031b1c9283926005613d0a565b90556000526006602052604060002055388080613f2d565b906001820191816000528260205260406000205480151560001461410e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613258578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613258578181036140d7575b50505080548015613e13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906140988282613d0a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b6140f76140e7613e649386613d0a565b90549060031b1c92839286613d0a565b905560005283602052604060002055388080614060565b50505050600090565b9190820180921161325857565b8060005260036020526040600020541560001461417e5760025468010000000000000000811015612a7757614165613e648260018594016002556002613d0a565b9055600254906000526003602052604060002055600190565b50600090565b8060005260066020526040600020541560001461417e5760055468010000000000000000811015612a77576141c5613e648260018594016005556005613d0a565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054613eb15780549068010000000000000000821015612a77578261421c613e64846001809601855584613d0a565b905580549260005201602052604060002055600190565b929192805460ff8160a01c16158015614513575b61450c576fffffffffffffffffffffffffffffffff8116906001830190815461428c63ffffffff6fffffffffffffffffffffffffffffffff83169360801c164261389f565b908161446e575b50508481106143ec575083821061431b57507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff806142e9856020969561389f565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061432d92505460801c9261389f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908082116132585761437b6143809273ffffffffffffffffffffffffffffffffffffffff94614117565b613374565b92169182156143bc577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff881691821561443e577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8285929395116144e2576144899261390b9160801c90613245565b808310156144dd5750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178455913880614293565b614494565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b508215614247565b91929015614596575081511561452f575090565b3b156145385790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b8251909150156145a95750805190602001fd5b6112ee906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612b7556fea164736f6c634300081a000a", +} + +var BurnToAddressMintTokenPoolABI = BurnToAddressMintTokenPoolMetaData.ABI + +var BurnToAddressMintTokenPoolBin = BurnToAddressMintTokenPoolMetaData.Bin + +func DeployBurnToAddressMintTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, localTokenDecimals uint8, allowlist []common.Address, rmnProxy common.Address, router common.Address, burnAddress common.Address) (common.Address, *types.Transaction, *BurnToAddressMintTokenPool, error) { + parsed, err := BurnToAddressMintTokenPoolMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(BurnToAddressMintTokenPoolBin), backend, token, localTokenDecimals, allowlist, rmnProxy, router, burnAddress) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &BurnToAddressMintTokenPool{address: address, abi: *parsed, BurnToAddressMintTokenPoolCaller: BurnToAddressMintTokenPoolCaller{contract: contract}, BurnToAddressMintTokenPoolTransactor: BurnToAddressMintTokenPoolTransactor{contract: contract}, BurnToAddressMintTokenPoolFilterer: BurnToAddressMintTokenPoolFilterer{contract: contract}}, nil +} + +type BurnToAddressMintTokenPool struct { + address common.Address + abi abi.ABI + BurnToAddressMintTokenPoolCaller + BurnToAddressMintTokenPoolTransactor + BurnToAddressMintTokenPoolFilterer +} + +type BurnToAddressMintTokenPoolCaller struct { + contract *bind.BoundContract +} + +type BurnToAddressMintTokenPoolTransactor struct { + contract *bind.BoundContract +} + +type BurnToAddressMintTokenPoolFilterer struct { + contract *bind.BoundContract +} + +type BurnToAddressMintTokenPoolSession struct { + Contract *BurnToAddressMintTokenPool + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type BurnToAddressMintTokenPoolCallerSession struct { + Contract *BurnToAddressMintTokenPoolCaller + CallOpts bind.CallOpts +} + +type BurnToAddressMintTokenPoolTransactorSession struct { + Contract *BurnToAddressMintTokenPoolTransactor + TransactOpts bind.TransactOpts +} + +type BurnToAddressMintTokenPoolRaw struct { + Contract *BurnToAddressMintTokenPool +} + +type BurnToAddressMintTokenPoolCallerRaw struct { + Contract *BurnToAddressMintTokenPoolCaller +} + +type BurnToAddressMintTokenPoolTransactorRaw struct { + Contract *BurnToAddressMintTokenPoolTransactor +} + +func NewBurnToAddressMintTokenPool(address common.Address, backend bind.ContractBackend) (*BurnToAddressMintTokenPool, error) { + abi, err := abi.JSON(strings.NewReader(BurnToAddressMintTokenPoolABI)) + if err != nil { + return nil, err + } + contract, err := bindBurnToAddressMintTokenPool(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPool{address: address, abi: abi, BurnToAddressMintTokenPoolCaller: BurnToAddressMintTokenPoolCaller{contract: contract}, BurnToAddressMintTokenPoolTransactor: BurnToAddressMintTokenPoolTransactor{contract: contract}, BurnToAddressMintTokenPoolFilterer: BurnToAddressMintTokenPoolFilterer{contract: contract}}, nil +} + +func NewBurnToAddressMintTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*BurnToAddressMintTokenPoolCaller, error) { + contract, err := bindBurnToAddressMintTokenPool(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolCaller{contract: contract}, nil +} + +func NewBurnToAddressMintTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*BurnToAddressMintTokenPoolTransactor, error) { + contract, err := bindBurnToAddressMintTokenPool(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolTransactor{contract: contract}, nil +} + +func NewBurnToAddressMintTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*BurnToAddressMintTokenPoolFilterer, error) { + contract, err := bindBurnToAddressMintTokenPool(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolFilterer{contract: contract}, nil +} + +func bindBurnToAddressMintTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := BurnToAddressMintTokenPoolMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BurnToAddressMintTokenPool.Contract.BurnToAddressMintTokenPoolCaller.contract.Call(opts, result, method, params...) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.BurnToAddressMintTokenPoolTransactor.contract.Transfer(opts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.BurnToAddressMintTokenPoolTransactor.contract.Transact(opts, method, params...) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BurnToAddressMintTokenPool.Contract.contract.Call(opts, result, method, params...) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.contract.Transfer(opts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.contract.Transact(opts, method, params...) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getAllowList") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetAllowList() ([]common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetAllowList(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetAllowList() ([]common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetAllowList(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getAllowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetAllowListEnabled() (bool, error) { + return _BurnToAddressMintTokenPool.Contract.GetAllowListEnabled(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetAllowListEnabled() (bool, error) { + return _BurnToAddressMintTokenPool.Contract.GetAllowListEnabled(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetBurnAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getBurnAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetBurnAddress() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetBurnAddress(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetBurnAddress() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetBurnAddress(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnToAddressMintTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnToAddressMintTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnToAddressMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnToAddressMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getRateLimitAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetRateLimitAdmin() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetRateLimitAdmin(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetRateLimitAdmin(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _BurnToAddressMintTokenPool.Contract.GetRemotePools(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _BurnToAddressMintTokenPool.Contract.GetRemotePools(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _BurnToAddressMintTokenPool.Contract.GetRemoteToken(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _BurnToAddressMintTokenPool.Contract.GetRemoteToken(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getRmnProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetRmnProxy() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetRmnProxy(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetRmnProxy() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetRmnProxy(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetRouter() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetRouter(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetRouter() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetRouter(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getSupportedChains") + + if err != nil { + return *new([]uint64), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetSupportedChains() ([]uint64, error) { + return _BurnToAddressMintTokenPool.Contract.GetSupportedChains(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) { + return _BurnToAddressMintTokenPool.Contract.GetSupportedChains(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetToken() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetToken(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetToken() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.GetToken(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "getTokenDecimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) GetTokenDecimals() (uint8, error) { + return _BurnToAddressMintTokenPool.Contract.GetTokenDecimals(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) GetTokenDecimals() (uint8, error) { + return _BurnToAddressMintTokenPool.Contract.GetTokenDecimals(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) IBurnAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "i_burnAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) IBurnAddress() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.IBurnAddress(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) IBurnAddress() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.IBurnAddress(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _BurnToAddressMintTokenPool.Contract.IsRemotePool(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _BurnToAddressMintTokenPool.Contract.IsRemotePool(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _BurnToAddressMintTokenPool.Contract.IsSupportedChain(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _BurnToAddressMintTokenPool.Contract.IsSupportedChain(&_BurnToAddressMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "isSupportedToken", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) { + return _BurnToAddressMintTokenPool.Contract.IsSupportedToken(&_BurnToAddressMintTokenPool.CallOpts, token) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) { + return _BurnToAddressMintTokenPool.Contract.IsSupportedToken(&_BurnToAddressMintTokenPool.CallOpts, token) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.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 + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) Owner() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.Owner(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) Owner() (common.Address, error) { + return _BurnToAddressMintTokenPool.Contract.Owner(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _BurnToAddressMintTokenPool.Contract.SupportsInterface(&_BurnToAddressMintTokenPool.CallOpts, interfaceId) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _BurnToAddressMintTokenPool.Contract.SupportsInterface(&_BurnToAddressMintTokenPool.CallOpts, interfaceId) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _BurnToAddressMintTokenPool.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) TypeAndVersion() (string, error) { + return _BurnToAddressMintTokenPool.Contract.TypeAndVersion(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolCallerSession) TypeAndVersion() (string, error) { + return _BurnToAddressMintTokenPool.Contract.TypeAndVersion(&_BurnToAddressMintTokenPool.CallOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "acceptOwnership") +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) AcceptOwnership() (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.AcceptOwnership(&_BurnToAddressMintTokenPool.TransactOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.AcceptOwnership(&_BurnToAddressMintTokenPool.TransactOpts) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.AddRemotePool(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.AddRemotePool(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.ApplyAllowListUpdates(&_BurnToAddressMintTokenPool.TransactOpts, removes, adds) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.ApplyAllowListUpdates(&_BurnToAddressMintTokenPool.TransactOpts, removes, adds) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.ApplyChainUpdates(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.ApplyChainUpdates(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.LockOrBurn(&_BurnToAddressMintTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.LockOrBurn(&_BurnToAddressMintTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.ReleaseOrMint(&_BurnToAddressMintTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.ReleaseOrMint(&_BurnToAddressMintTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.RemoveRemotePool(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.RemoveRemotePool(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "setChainRateLimiterConfigs", remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.SetChainRateLimiterConfigs(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.SetChainRateLimiterConfigs(&_BurnToAddressMintTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.SetRateLimitAdmin(&_BurnToAddressMintTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.SetRateLimitAdmin(&_BurnToAddressMintTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "setRouter", newRouter) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.SetRouter(&_BurnToAddressMintTokenPool.TransactOpts, newRouter) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.SetRouter(&_BurnToAddressMintTokenPool.TransactOpts, newRouter) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.contract.Transact(opts, "transferOwnership", to) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.TransferOwnership(&_BurnToAddressMintTokenPool.TransactOpts, to) +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BurnToAddressMintTokenPool.Contract.TransferOwnership(&_BurnToAddressMintTokenPool.TransactOpts, to) +} + +type BurnToAddressMintTokenPoolAllowListAddIterator struct { + Event *BurnToAddressMintTokenPoolAllowListAdd + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolAllowListAddIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolAllowListAddIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolAllowListAddIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolAllowListAdd struct { + Sender common.Address + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolAllowListAddIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolAllowListAddIterator{contract: _BurnToAddressMintTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolAllowListAdd) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolAllowListAdd) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*BurnToAddressMintTokenPoolAllowListAdd, error) { + event := new(BurnToAddressMintTokenPoolAllowListAdd) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolAllowListRemoveIterator struct { + Event *BurnToAddressMintTokenPoolAllowListRemove + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolAllowListRemoveIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolAllowListRemoveIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolAllowListRemoveIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolAllowListRemove struct { + Sender common.Address + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolAllowListRemoveIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolAllowListRemoveIterator{contract: _BurnToAddressMintTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolAllowListRemove) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolAllowListRemove) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*BurnToAddressMintTokenPoolAllowListRemove, error) { + event := new(BurnToAddressMintTokenPoolAllowListRemove) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolBurnedIterator struct { + Event *BurnToAddressMintTokenPoolBurned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolBurnedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolBurnedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolBurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolBurned struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnToAddressMintTokenPoolBurnedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolBurnedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolBurned, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolBurned) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseBurned(log types.Log) (*BurnToAddressMintTokenPoolBurned, error) { + event := new(BurnToAddressMintTokenPoolBurned) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolChainAddedIterator struct { + Event *BurnToAddressMintTokenPoolChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolChainAddedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolChainAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolChainAddedIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolChainAddedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolChainAdded) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolChainAdded) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseChainAdded(log types.Log) (*BurnToAddressMintTokenPoolChainAdded, error) { + event := new(BurnToAddressMintTokenPoolChainAdded) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolChainConfiguredIterator struct { + Event *BurnToAddressMintTokenPoolChainConfigured + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolChainConfiguredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolChainConfiguredIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolChainConfiguredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolChainConfigured struct { + RemoteChainSelector uint64 + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolChainConfiguredIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolChainConfiguredIterator{contract: _BurnToAddressMintTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolChainConfigured) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolChainConfigured) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseChainConfigured(log types.Log) (*BurnToAddressMintTokenPoolChainConfigured, error) { + event := new(BurnToAddressMintTokenPoolChainConfigured) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolChainRemovedIterator struct { + Event *BurnToAddressMintTokenPoolChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolChainRemovedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolChainRemoved struct { + RemoteChainSelector uint64 + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolChainRemovedIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolChainRemovedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolChainRemoved) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolChainRemoved) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseChainRemoved(log types.Log) (*BurnToAddressMintTokenPoolChainRemoved, error) { + event := new(BurnToAddressMintTokenPoolChainRemoved) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolConfigChangedIterator struct { + Event *BurnToAddressMintTokenPoolConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolConfigChangedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolConfigChangedIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolConfigChangedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolConfigChanged) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolConfigChanged) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseConfigChanged(log types.Log) (*BurnToAddressMintTokenPoolConfigChanged, error) { + event := new(BurnToAddressMintTokenPoolConfigChanged) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolLockedIterator struct { + Event *BurnToAddressMintTokenPoolLocked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolLockedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolLockedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolLockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolLocked struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnToAddressMintTokenPoolLockedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolLockedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolLocked, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolLocked) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseLocked(log types.Log) (*BurnToAddressMintTokenPoolLocked, error) { + event := new(BurnToAddressMintTokenPoolLocked) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolMintedIterator struct { + Event *BurnToAddressMintTokenPoolMinted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolMintedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolMintedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnToAddressMintTokenPoolMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolMintedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolMinted) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseMinted(log types.Log) (*BurnToAddressMintTokenPoolMinted, error) { + event := new(BurnToAddressMintTokenPoolMinted) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolOwnershipTransferRequestedIterator struct { + Event *BurnToAddressMintTokenPoolOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnToAddressMintTokenPoolOwnershipTransferRequestedIterator, 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 := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolOwnershipTransferRequestedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolOwnershipTransferRequested, 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 := _BurnToAddressMintTokenPool.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: + + event := new(BurnToAddressMintTokenPoolOwnershipTransferRequested) + if err := _BurnToAddressMintTokenPool.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 +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*BurnToAddressMintTokenPoolOwnershipTransferRequested, error) { + event := new(BurnToAddressMintTokenPoolOwnershipTransferRequested) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolOwnershipTransferredIterator struct { + Event *BurnToAddressMintTokenPoolOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnToAddressMintTokenPoolOwnershipTransferredIterator, 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 := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolOwnershipTransferredIterator{contract: _BurnToAddressMintTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolOwnershipTransferred, 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 := _BurnToAddressMintTokenPool.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: + + event := new(BurnToAddressMintTokenPoolOwnershipTransferred) + if err := _BurnToAddressMintTokenPool.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 +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*BurnToAddressMintTokenPoolOwnershipTransferred, error) { + event := new(BurnToAddressMintTokenPoolOwnershipTransferred) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolRateLimitAdminSetIterator struct { + Event *BurnToAddressMintTokenPoolRateLimitAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolRateLimitAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolRateLimitAdminSetIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolRateLimitAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolRateLimitAdminSet struct { + RateLimitAdmin common.Address + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolRateLimitAdminSetIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolRateLimitAdminSetIterator{contract: _BurnToAddressMintTokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolRateLimitAdminSet) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolRateLimitAdminSet) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*BurnToAddressMintTokenPoolRateLimitAdminSet, error) { + event := new(BurnToAddressMintTokenPoolRateLimitAdminSet) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolReleasedIterator struct { + Event *BurnToAddressMintTokenPoolReleased + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolReleasedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolReleasedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolReleasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolReleased struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnToAddressMintTokenPoolReleasedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolReleasedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolReleased) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseReleased(log types.Log) (*BurnToAddressMintTokenPoolReleased, error) { + event := new(BurnToAddressMintTokenPoolReleased) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolRemotePoolAddedIterator struct { + Event *BurnToAddressMintTokenPoolRemotePoolAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolRemotePoolAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolRemotePoolAddedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolRemotePoolAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolRemotePoolAdded struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnToAddressMintTokenPoolRemotePoolAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolRemotePoolAddedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolRemotePoolAdded) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*BurnToAddressMintTokenPoolRemotePoolAdded, error) { + event := new(BurnToAddressMintTokenPoolRemotePoolAdded) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolRemotePoolRemovedIterator struct { + Event *BurnToAddressMintTokenPoolRemotePoolRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolRemotePoolRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolRemotePoolRemovedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolRemotePoolRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolRemotePoolRemoved struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnToAddressMintTokenPoolRemotePoolRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolRemotePoolRemovedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolRemotePoolRemoved) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*BurnToAddressMintTokenPoolRemotePoolRemoved, error) { + event := new(BurnToAddressMintTokenPoolRemotePoolRemoved) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolRouterUpdatedIterator struct { + Event *BurnToAddressMintTokenPoolRouterUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolRouterUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolRouterUpdatedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolRouterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolRouterUpdated struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolRouterUpdatedIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolRouterUpdatedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolRouterUpdated) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolRouterUpdated) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*BurnToAddressMintTokenPoolRouterUpdated, error) { + event := new(BurnToAddressMintTokenPoolRouterUpdated) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnToAddressMintTokenPoolTokensConsumedIterator struct { + Event *BurnToAddressMintTokenPoolTokensConsumed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnToAddressMintTokenPoolTokensConsumedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnToAddressMintTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnToAddressMintTokenPoolTokensConsumedIterator) Error() error { + return it.fail +} + +func (it *BurnToAddressMintTokenPoolTokensConsumedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnToAddressMintTokenPoolTokensConsumed struct { + Tokens *big.Int + Raw types.Log +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolTokensConsumedIterator, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.FilterLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return &BurnToAddressMintTokenPoolTokensConsumedIterator{contract: _BurnToAddressMintTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolTokensConsumed) (event.Subscription, error) { + + logs, sub, err := _BurnToAddressMintTokenPool.contract.WatchLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnToAddressMintTokenPoolTokensConsumed) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*BurnToAddressMintTokenPoolTokensConsumed, error) { + event := new(BurnToAddressMintTokenPoolTokensConsumed) + if err := _BurnToAddressMintTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _BurnToAddressMintTokenPool.abi.Events["AllowListAdd"].ID: + return _BurnToAddressMintTokenPool.ParseAllowListAdd(log) + case _BurnToAddressMintTokenPool.abi.Events["AllowListRemove"].ID: + return _BurnToAddressMintTokenPool.ParseAllowListRemove(log) + case _BurnToAddressMintTokenPool.abi.Events["Burned"].ID: + return _BurnToAddressMintTokenPool.ParseBurned(log) + case _BurnToAddressMintTokenPool.abi.Events["ChainAdded"].ID: + return _BurnToAddressMintTokenPool.ParseChainAdded(log) + case _BurnToAddressMintTokenPool.abi.Events["ChainConfigured"].ID: + return _BurnToAddressMintTokenPool.ParseChainConfigured(log) + case _BurnToAddressMintTokenPool.abi.Events["ChainRemoved"].ID: + return _BurnToAddressMintTokenPool.ParseChainRemoved(log) + case _BurnToAddressMintTokenPool.abi.Events["ConfigChanged"].ID: + return _BurnToAddressMintTokenPool.ParseConfigChanged(log) + case _BurnToAddressMintTokenPool.abi.Events["Locked"].ID: + return _BurnToAddressMintTokenPool.ParseLocked(log) + case _BurnToAddressMintTokenPool.abi.Events["Minted"].ID: + return _BurnToAddressMintTokenPool.ParseMinted(log) + case _BurnToAddressMintTokenPool.abi.Events["OwnershipTransferRequested"].ID: + return _BurnToAddressMintTokenPool.ParseOwnershipTransferRequested(log) + case _BurnToAddressMintTokenPool.abi.Events["OwnershipTransferred"].ID: + return _BurnToAddressMintTokenPool.ParseOwnershipTransferred(log) + case _BurnToAddressMintTokenPool.abi.Events["RateLimitAdminSet"].ID: + return _BurnToAddressMintTokenPool.ParseRateLimitAdminSet(log) + case _BurnToAddressMintTokenPool.abi.Events["Released"].ID: + return _BurnToAddressMintTokenPool.ParseReleased(log) + case _BurnToAddressMintTokenPool.abi.Events["RemotePoolAdded"].ID: + return _BurnToAddressMintTokenPool.ParseRemotePoolAdded(log) + case _BurnToAddressMintTokenPool.abi.Events["RemotePoolRemoved"].ID: + return _BurnToAddressMintTokenPool.ParseRemotePoolRemoved(log) + case _BurnToAddressMintTokenPool.abi.Events["RouterUpdated"].ID: + return _BurnToAddressMintTokenPool.ParseRouterUpdated(log) + case _BurnToAddressMintTokenPool.abi.Events["TokensConsumed"].ID: + return _BurnToAddressMintTokenPool.ParseTokensConsumed(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (BurnToAddressMintTokenPoolAllowListAdd) Topic() common.Hash { + return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8") +} + +func (BurnToAddressMintTokenPoolAllowListRemove) Topic() common.Hash { + return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566") +} + +func (BurnToAddressMintTokenPoolBurned) Topic() common.Hash { + return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7") +} + +func (BurnToAddressMintTokenPoolChainAdded) Topic() common.Hash { + return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") +} + +func (BurnToAddressMintTokenPoolChainConfigured) Topic() common.Hash { + return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b") +} + +func (BurnToAddressMintTokenPoolChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (BurnToAddressMintTokenPoolConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (BurnToAddressMintTokenPoolLocked) Topic() common.Hash { + return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008") +} + +func (BurnToAddressMintTokenPoolMinted) Topic() common.Hash { + return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0") +} + +func (BurnToAddressMintTokenPoolOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (BurnToAddressMintTokenPoolOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (BurnToAddressMintTokenPoolRateLimitAdminSet) Topic() common.Hash { + return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174") +} + +func (BurnToAddressMintTokenPoolReleased) Topic() common.Hash { + return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52") +} + +func (BurnToAddressMintTokenPoolRemotePoolAdded) Topic() common.Hash { + return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea") +} + +func (BurnToAddressMintTokenPoolRemotePoolRemoved) Topic() common.Hash { + return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76") +} + +func (BurnToAddressMintTokenPoolRouterUpdated) Topic() common.Hash { + return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684") +} + +func (BurnToAddressMintTokenPoolTokensConsumed) Topic() common.Hash { + return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a") +} + +func (_BurnToAddressMintTokenPool *BurnToAddressMintTokenPool) Address() common.Address { + return _BurnToAddressMintTokenPool.address +} + +type BurnToAddressMintTokenPoolInterface interface { + GetAllowList(opts *bind.CallOpts) ([]common.Address, error) + + GetAllowListEnabled(opts *bind.CallOpts) (bool, error) + + GetBurnAddress(opts *bind.CallOpts) (common.Address, error) + + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) + + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) + + GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) + + GetRmnProxy(opts *bind.CallOpts) (common.Address, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) + + GetToken(opts *bind.CallOpts) (common.Address, error) + + GetTokenDecimals(opts *bind.CallOpts) (uint8, error) + + IBurnAddress(opts *bind.CallOpts) (common.Address, error) + + IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) + + IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) + + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) + + SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) + + SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) + + SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAllowListAdd(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolAllowListAddIterator, error) + + WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolAllowListAdd) (event.Subscription, error) + + ParseAllowListAdd(log types.Log) (*BurnToAddressMintTokenPoolAllowListAdd, error) + + FilterAllowListRemove(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolAllowListRemoveIterator, error) + + WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolAllowListRemove) (event.Subscription, error) + + ParseAllowListRemove(log types.Log) (*BurnToAddressMintTokenPoolAllowListRemove, error) + + FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnToAddressMintTokenPoolBurnedIterator, error) + + WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolBurned, sender []common.Address) (event.Subscription, error) + + ParseBurned(log types.Log) (*BurnToAddressMintTokenPoolBurned, error) + + FilterChainAdded(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*BurnToAddressMintTokenPoolChainAdded, error) + + FilterChainConfigured(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolChainConfiguredIterator, error) + + WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolChainConfigured) (event.Subscription, error) + + ParseChainConfigured(log types.Log) (*BurnToAddressMintTokenPoolChainConfigured, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*BurnToAddressMintTokenPoolChainRemoved, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*BurnToAddressMintTokenPoolConfigChanged, error) + + FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnToAddressMintTokenPoolLockedIterator, error) + + WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolLocked, sender []common.Address) (event.Subscription, error) + + ParseLocked(log types.Log) (*BurnToAddressMintTokenPoolLocked, error) + + FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnToAddressMintTokenPoolMintedIterator, error) + + WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseMinted(log types.Log) (*BurnToAddressMintTokenPoolMinted, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnToAddressMintTokenPoolOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*BurnToAddressMintTokenPoolOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnToAddressMintTokenPoolOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*BurnToAddressMintTokenPoolOwnershipTransferred, error) + + FilterRateLimitAdminSet(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolRateLimitAdminSetIterator, error) + + WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolRateLimitAdminSet) (event.Subscription, error) + + ParseRateLimitAdminSet(log types.Log) (*BurnToAddressMintTokenPoolRateLimitAdminSet, error) + + FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnToAddressMintTokenPoolReleasedIterator, error) + + WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseReleased(log types.Log) (*BurnToAddressMintTokenPoolReleased, error) + + FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnToAddressMintTokenPoolRemotePoolAddedIterator, error) + + WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolAdded(log types.Log) (*BurnToAddressMintTokenPoolRemotePoolAdded, error) + + FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnToAddressMintTokenPoolRemotePoolRemovedIterator, error) + + WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolRemoved(log types.Log) (*BurnToAddressMintTokenPoolRemotePoolRemoved, error) + + FilterRouterUpdated(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolRouterUpdatedIterator, error) + + WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolRouterUpdated) (event.Subscription, error) + + ParseRouterUpdated(log types.Log) (*BurnToAddressMintTokenPoolRouterUpdated, error) + + FilterTokensConsumed(opts *bind.FilterOpts) (*BurnToAddressMintTokenPoolTokensConsumedIterator, error) + + WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnToAddressMintTokenPoolTokensConsumed) (event.Subscription, error) + + ParseTokensConsumed(log types.Log) (*BurnToAddressMintTokenPoolTokensConsumed, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_5_1/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go b/core/gethwrappers/ccip/generated/v1_5_1/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go new file mode 100644 index 00000000000..dcd63a2431c --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_1/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go @@ -0,0 +1,3162 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package burn_with_from_mint_token_pool + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "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" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type PoolLockOrBurnInV1 struct { + Receiver []byte + RemoteChainSelector uint64 + OriginalSender common.Address + Amount *big.Int + LocalToken common.Address +} + +type PoolLockOrBurnOutV1 struct { + DestTokenAddress []byte + DestPoolData []byte +} + +type PoolReleaseOrMintInV1 struct { + OriginalSender []byte + RemoteChainSelector uint64 + Receiver common.Address + Amount *big.Int + LocalToken common.Address + SourcePoolAddress []byte + SourcePoolData []byte + OffchainTokenData []byte +} + +type PoolReleaseOrMintOutV1 struct { + DestinationAmount *big.Int +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type TokenPoolChainUpdate struct { + RemoteChainSelector uint64 + RemotePoolAddresses [][]byte + RemoteTokenAddress []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig +} + +var BurnWithFromMintTokenPoolMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIBurnMintERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x610100806040523461035457614bb5803803809161001d82856105b2565b8339810160a0828203126103545781516001600160a01b03811692908390036103545761004c602082016105d5565b60408201516001600160401b0381116103545782019280601f85011215610354578351936001600160401b038511610359578460051b90602082019561009560405197886105b2565b865260208087019282010192831161035457602001905b82821061059a575050506100ce60806100c7606085016105e3565b93016105e3565b91331561058957600180546001600160a01b0319163317905584158015610578575b8015610567575b61055657608085905260c05260405163313ce56760e01b8152602081600481885afa6000918161051a575b506104ef575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526103d2575b50604051636eb1769f60e11b81523060048201819052602482015290602082604481845afa9182156103c657600092610392575b50600019820180921161037c57604051602081019263095ea7b360e01b84523060248301526044820152604481526101c76064826105b2565b6000806040948551936101da87866105b2565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082865af13d1561036f573d906001600160401b03821161035957845161024b94909261023c601f8201601f1916602001856105b2565b83523d6000602085013e610781565b8051806102d9575b8251614363908161085282396080518181816115fc015281816117e80152818161220e015281816123ea01528181612707015261277f015260a0518181816118a90152818161268e0152818161316801526131eb015260c051818181610bd50152818161169801526122a9015260e051818181610b65015281816116db01526120050152f35b81602091810103126103545760200151801590811503610354576102fe573880610253565b5162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b9161024b92606091610781565b634e487b7160e01b600052601160045260246000fd5b9091506020813d6020116103be575b816103ae602093836105b2565b810103126103545751903861018e565b3d91506103a1565b6040513d6000823e3d90fd5b60206040516103e182826105b2565b60008152600036813760e051156104de5760005b815181101561045c576001906001600160a01b0361041382856105f7565b51168461041f82610639565b61042c575b5050016103f5565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a13884610424565b505060005b82518110156104d5576001906001600160a01b0361047f82866105f7565b511680156104cf578361049182610721565b61049f575b50505b01610461565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a13883610496565b50610499565b5050503861015a565b6335f4a7b360e01b60005260046000fd5b60ff1660ff82168181036105035750610128565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161054e575b81610536602093836105b2565b8101031261035457610547906105d5565b9038610122565b3d9150610529565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038116156100f7565b506001600160a01b038316156100f0565b639b15e16f60e01b60005260046000fd5b602080916105a7846105e3565b8152019101906100ac565b601f909101601f19168101906001600160401b0382119082101761035957604052565b519060ff8216820361035457565b51906001600160a01b038216820361035457565b805182101561060b5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561060b5760005260206000200190600090565b600081815260036020526040902054801561071a57600019810181811161037c5760025460001981019190821161037c578181036106c9575b50505060025480156106b3576000190161068d816002610621565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6107026106da6106eb936002610621565b90549060031b1c9283926002610621565b819391549060031b91821b91600019901b19161790565b90556000526003602052604060002055388080610672565b5050600090565b8060005260036020526040600020541560001461077b5760025468010000000000000000811015610359576107626106eb8260018594016002556002610621565b9055600254906000526003602052604060002055600190565b50600090565b919290156107e35750815115610795575090565b3b1561079e5790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b8251909150156107f65750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b8381106108395750508160006044809484010152601f80199101168101030190fd5b6020828201810151604487840101528593500161081756fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a71461282257508063181f5a77146127a357806321df0da714612734578063240028e8146126b257806324f65ee71461265657806339077537146121685780634c5ef0ed1461214e57806354c8a4f314611fd157806362ddd3c414611f4d5780636d3d1a5814611efb57806379ba509714611e165780637d54534e14611d695780638926f54f14611d055780638da5cb5b14611cb3578063962d402014611b0f5780639a4575b914611554578063a42a7b8b146113cf578063a7cd63b714611303578063acfecf91146111df578063af58d59f14611178578063b0f479a114611126578063b7946580146110cf578063c0d7865514610fd7578063c4bffe2b14610e8e578063c75eea9c14610dc8578063cf7401f314610bf9578063dc0bd97114610b8a578063e0351e1314610b2f578063e8a1da171461025a5763f2fde38b1461016b57600080fd5b346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff6101b7612970565b6101bf6132f5565b1633811461022f57807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102575761026936612a5e565b939190926102756132f5565b82915b80831061099a575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b85821015610996578160051b85013581811215610992578501906101208236031261099257604051956102e387612b66565b823567ffffffffffffffff8116810361098d578752602083013567ffffffffffffffff81116109895783019536601f880112156109895786359661032688612d6a565b97610334604051998a612b9e565b8089526020808a019160051b830101903682116109855760208301905b828210610952575050505060208801968752604084013567ffffffffffffffff811161094e5761038490369086016130c2565b9860408901998a526103ae61039c3660608801612bfc565b9560608b0196875260c0369101612bfc565b9660808a019788526103c0865161376c565b6103ca885161376c565b8a515115610926576103e667ffffffffffffffff8b5116613fbf565b156108ef5767ffffffffffffffff8a5116815260076020526040812061052687516fffffffffffffffffffffffffffffffff604082015116906104e16fffffffffffffffffffffffffffffffff6020830151169151151583608060405161044c81612b66565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b61064c89516fffffffffffffffffffffffffffffffff604082015116906106076fffffffffffffffffffffffffffffffff6020830151169151151583608060405161057081612b66565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff82116108c25761066f8354612e62565b601f8111610887575b50602090601f83116001146107e8576106c692918591836107dd575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b8951805182101561070157906106fb6001926106f4838f67ffffffffffffffff90511692612e4e565b5190613340565b016106cb565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2929593966107cf67ffffffffffffffff600197949c511692519351915161079b61076660405196879687526101006020880152610100870190612911565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a10190939492916102b1565b015190503880610694565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b81811061086f5750908460019594939210610838575b505050811b0190556106c9565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061082b565b92936020600181928786015181550195019301610815565b6108b29084865260208620601f850160051c810191602086106108b8575b601f0160051c0190613069565b38610678565b90915081906108a5565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff81116109815760209161097683928336918901016130c2565b815201910190610351565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff6109ba6109b5878588612dea565b612e29565b16956109c587613cf3565b15610b035786845260076020526109e160056040862001613afa565b94845b8651811015610a1a576001908987526007602052610a1360056040892001610a0c838b612e4e565b5190613e1e565b50016109e4565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610a538154612e62565b80610ac2575b5050500180549086815581610aa4575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a1019190949394610278565b865260208620908101905b81811015610a6957868155600101610aaf565b601f8111600114610ad85750555b863880610a59565b81835260208320610af391601f01861c810190600101613069565b8082528160208120915555610ad0565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610c31612993565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261025757604051610c6881612b82565b6024358015158103610dc45781526044356fffffffffffffffffffffffffffffffff81168103610dc45760208201526064356fffffffffffffffffffffffffffffffff81168103610dc457604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610dc05760405190610cef82612b82565b608435801515810361099257825260a4356fffffffffffffffffffffffffffffffff8116810361099257602083015260c4356fffffffffffffffffffffffffffffffff8116810361099257604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610d9e575b610d7257610d6f92936135aa565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610d61565b5080fd5b8280fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c6040610e8a9367ffffffffffffffff610e15612993565b610e1d612fb6565b50168152600760205220612fe1565b6136e7565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051906005548083528260208101600584526020842092845b818110610fbe575050610eec92500383612b9e565b8151610f10610efa82612d6a565b91610f086040519384612b9e565b808352612d6a565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015610f6f578067ffffffffffffffff610f5c60019388612e4e565b5116610f688286612e4e565b5201610f3d565b50925090604051928392602084019060208552518091526040840192915b818110610f9b575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101610f8d565b8454835260019485019487945060209093019201610ed7565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575773ffffffffffffffffffffffffffffffffffffffff611024612970565b61102c6132f5565b1680156110a75760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e8a61111261110d612993565b613047565b604051918291602083526020830190612911565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757610e31610e2c60026040610e8a9467ffffffffffffffff6111c7612993565b6111cf612fb6565b5016815260076020522001612fe1565b50346102575767ffffffffffffffff6111f7366129aa565b9290916112026132f5565b169161121b836000526006602052604060002054151590565b156112d757828452600760205261124a6005604086200161123d368486612c99565b6020815191012090613e1e565b1561128f57907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691611289604051928392602084526020840191612f77565b0390a280f35b826112d3836040519384937f74f23c7c0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191612f77565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757604051600254808252602082018091600285526020852090855b8181106113b95750505082611362910383612b9e565b604051928392602084019060208552518091526040840192915b81811061138a575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff1684528594506020938401939092019160010161137c565b825484526020909301926001928301920161134c565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575767ffffffffffffffff611410612993565b168152600760205261142760056040832001613afa565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061146c61145683612d6a565b926114646040519485612b9e565b808452612d6a565b01835b818110611543575050825b82518110156114c0578061149060019285612e4e565b51855260086020526114a460408620612eb5565b6114ae8285612e4e565b526114b98184612e4e565b500161147a565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b8282106114f857505050500390f35b91936020611533827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186528851612911565b96019201920185949391926114e9565b80606060208093860101520161146f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc05760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610dc057606060206040516115d281612b4a565b8281520152608481016115e481612cfe565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611ac55750602481019177ffffffffffffffff0000000000000000000000000000000061164b84612e29565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611955578291611a96575b50611a6e576116d960448301612cfe565b7f0000000000000000000000000000000000000000000000000000000000000000611a1b575b5067ffffffffffffffff61171284612e29565b1661172a816000526006602052604060002054151590565b156119ef57602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa801561195557829061198c575b73ffffffffffffffffffffffffffffffffffffffff91501633036119605767ffffffffffffffff60646117bd85612e29565b930135921681526007602052816118106040832073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001692839161406e565b803b15610dc0576040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018490529082908290604490829084905af1801561195557611940575b61190f61189f61110d86866040519081527f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df760203392a2612e29565b610e8a60405160ff7f0000000000000000000000000000000000000000000000000000000000000000166020820152602081526118dd604082612b9e565b604051926118ea84612b4a565b8352602083019081526040519384936020855251604060208601526060850190612911565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612911565b61194b828092612b9e565b6102575780611863565b6040513d84823e3d90fd5b807f728fe07b000000000000000000000000000000000000000000000000000000006024925233600452fd5b506020813d6020116119e7575b816119a660209383612b9e565b81010312610dc0575173ffffffffffffffffffffffffffffffffffffffff81168103610dc05773ffffffffffffffffffffffffffffffffffffffff9061178b565b3d9150611999565b602492507fa9902c7e000000000000000000000000000000000000000000000000000000008252600452fd5b73ffffffffffffffffffffffffffffffffffffffff16808252600360205260408220546116ff57602492507fd0d25976000000000000000000000000000000000000000000000000000000008252600452fd5b807f53ad11d80000000000000000000000000000000000000000000000000000000060049252fd5b611ab8915060203d602011611abe575b611ab08183612b9e565b8101906130dd565b386116c8565b503d611aa6565b8273ffffffffffffffffffffffffffffffffffffffff611ae6602493612cfe565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b50346102575760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057611b5f903690600401612a2d565b60243567ffffffffffffffff811161099257611b7f903690600401612ace565b60449291923567ffffffffffffffff811161098957611ba2903690600401612ace565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611c91575b611c6557818114801590611c5b575b611c3357865b818110611be7578780f35b80611c2d611bfb6109b5600194868c612dea565b611c0683878b612e3e565b611c27611c1f611c17868b8d612e3e565b923690612bfc565b913690612bfc565b916135aa565b01611bdc565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611bd6565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611bc7565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020611d5f67ffffffffffffffff611d4b612993565b166000526006602052604060002054151590565b6040519015158152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611dd9612970565b611de16132f5565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757805473ffffffffffffffffffffffffffffffffffffffff81163303611ed3577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b503461025757611f5c366129aa565b611f68939291936132f5565b67ffffffffffffffff8216611f8a816000526006602052604060002054151590565b15611fa65750610d6f9293611fa0913691612c99565b90613340565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b503461025757611ffb90612003611fe736612a5e565b9591611ff49391936132f5565b3691612d82565b933691612d82565b7f00000000000000000000000000000000000000000000000000000000000000001561212657815b835181101561209e578073ffffffffffffffffffffffffffffffffffffffff61205660019387612e4e565b511661206181613b5d565b61206d575b500161202b565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a138612066565b5090805b8251811015612122578073ffffffffffffffffffffffffffffffffffffffff6120cd60019386612e4e565b5116801561211c576120de81613f5f565b6120eb575b505b016120a2565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1846120e3565b506120e5565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b5034610257576020611d5f612162366129aa565b91612d1f565b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575760043567ffffffffffffffff8111610dc057806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610dc457826040516121e881612aff565b52608482016121f681612cfe565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361263557506024820177ffffffffffffffff0000000000000000000000000000000061225c82612e29565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156125b8578591612616575b506125ee5767ffffffffffffffff6122f082612e29565b16612308816000526006602052604060002054151590565b156125c357602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa9081156125b8578591612599575b501561256d5761237f81612e29565b61239160a48501916121628386612c48565b15612526575061242e67ffffffffffffffff9261242861242361241c6123b8604496612e29565b936064890135978895168a526007602052612412600260408c200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016998a9161406e565b60c4890190612c48565b3691612c99565b6130f5565b906131e8565b9201908361243b83612cfe565b823b15610dc0576040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91909116600482015260248101859052918290604490829084905af1801561251b57916020946124c99273ffffffffffffffffffffffffffffffffffffffff9461250b575b5050612cfe565b166040518281527f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0843392a38060405161250281612aff565b52604051908152f35b8161251591612b9e565b386124c2565b6040513d86823e3d90fd5b6125309083612c48565b6112d36040519283927f24eb47e5000000000000000000000000000000000000000000000000000000008452602060048501526024840191612f77565b6024847f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b6125b2915060203d602011611abe57611ab08183612b9e565b38612370565b6040513d87823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008552600452602484fd5b6004847f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b61262f915060203d602011611abe57611ab08183612b9e565b386122d9565b8373ffffffffffffffffffffffffffffffffffffffff611ae6602493612cfe565b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610257576020906126ed612970565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261025757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461025757807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102575750610e8a6040516127e4604082612b9e565b601f81527f4275726e5769746846726f6d4d696e74546f6b656e506f6f6c20312e352e31006020820152604051918291602083526020830190612911565b905034610dc05760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610dc0576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610dc457602092507faff2afbf0000000000000000000000000000000000000000000000000000000081149081156128e7575b81156128bd575b5015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386128b6565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506128af565b919082519283825260005b84811061295b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161291c565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361098d57565b6004359067ffffffffffffffff8216820361098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff8116810361098d579160243567ffffffffffffffff811161098d578260238201121561098d5780600401359267ffffffffffffffff841161098d576024848301011161098d576024019190565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501948460051b01011161098d57565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261098d5760043567ffffffffffffffff811161098d5781612aa791600401612a2d565b929092916024359067ffffffffffffffff821161098d57612aca91600401612a2d565b9091565b9181601f8401121561098d5782359167ffffffffffffffff831161098d576020808501946060850201011161098d57565b6020810190811067ffffffffffffffff821117612b1b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117612b1b57604052565b60a0810190811067ffffffffffffffff821117612b1b57604052565b6060810190811067ffffffffffffffff821117612b1b57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612b1b57604052565b35906fffffffffffffffffffffffffffffffff8216820361098d57565b919082606091031261098d57604051612c1481612b82565b8092803590811515820361098d576040612c439181938552612c3860208201612bdf565b602086015201612bdf565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561098d570180359067ffffffffffffffff821161098d5760200191813603831361098d57565b92919267ffffffffffffffff8211612b1b5760405191612ce1601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200184612b9e565b82948184528183011161098d578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff8116810361098d5790565b612d67929167ffffffffffffffff612d4a921660005260076020526005604060002001923691612c99565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff8111612b1b5760051b60200190565b9291612d8d82612d6a565b93612d9b6040519586612b9e565b602085848152019260051b810191821161098d57915b818310612dbd57505050565b823573ffffffffffffffffffffffffffffffffffffffff8116810361098d57815260209283019201612db1565b9190811015612dfa5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff8116810361098d5790565b9190811015612dfa576060020190565b8051821015612dfa5760209160051b010190565b90600182811c92168015612eab575b6020831014612e7c57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612e71565b9060405191826000825492612ec984612e62565b8084529360018116908115612f375750600114612ef0575b50612eee92500383612b9e565b565b90506000929192526020600020906000915b818310612f1b575050906020612eee9282010138612ee1565b6020919350806001915483858901015201910190918492612f02565b60209350612eee9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612ee1565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b60405190612fc382612b66565b60006080838281528260208201528260408201528260608201520152565b90604051612fee81612b66565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff166000526007602052612d676004604060002001612eb5565b818110613074575050565b60008155600101613069565b8181029291811591840414171561309357565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f8301121561098d57816020612d6793359101612c99565b9081602091031261098d5751801515810361098d5790565b80518015613164576020036131265760208180518101031261098d5760208101519060ff8211613126575060ff1690565b6112d3906040519182917f953576f7000000000000000000000000000000000000000000000000000000008352602060048401526024830190612911565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161309357565b60ff16604d811161309357600a0a90565b81156131b9570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146132ee578284116132c4579061322d9161318a565b91604d60ff841611801561328b575b6132555750509061324f612d679261319e565b90613080565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b506132958361319e565b80156131b9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04841161323c565b6132cd9161318a565b91604d60ff841611613255575050906132e8612d679261319e565b906131af565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff60015416330361331657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156135805767ffffffffffffffff81516020830120921691826000526007602052613375816005604060002001614019565b1561353c5760005260086020526040600020815167ffffffffffffffff8111612b1b576133a28254612e62565b601f811161350a575b506020601f8211600114613444579161341e827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea959361343495600091613439575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9055604051918291602083526020830190612911565b0390a2565b9050840151386133ed565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106134f25750926134349492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9896106134bb575b5050811b019055611112565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538806134af565b9192602060018192868a015181550194019201613474565b61353690836000526020600020601f840160051c810191602085106108b857601f0160051c0190613069565b386133ab565b50906112d36040519283927f393b8ad20000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190612911565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff1660008181526006602052604090205490929190156136ac57916136a960e092613675856136017f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b9761376c565b8460005260076020526136188160406000206138c7565b6136218361376c565b84600052600760205261363b8360026040600020016138c7565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161309357565b6136ef612fb6565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff808351169161374c602085019361374661373963ffffffff875116426136da565b8560808901511690613080565b90613f52565b8082101561376557505b16825263ffffffff4216905290565b9050613756565b805115613820576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116811090811591613817575b506137b45750565b606490613815604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b905015386137ac565b6fffffffffffffffffffffffffffffffff604082015116158015906138a8575b6138475750565b606490613815604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613840565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1991613a00606092805461390463ffffffff8260801c16426136da565b9081613a3f575b50506fffffffffffffffffffffffffffffffff6001816020860151169282815416808510600014613a3757508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556139b48651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b6136a960405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b83809161393b565b6fffffffffffffffffffffffffffffffff91613a74839283613a6d6001880154948286169560801c90613080565b9116613f52565b80821015613af357505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff0000000000000000000000000000000016178155388061390b565b9050613a7e565b906040519182815491828252602082019060005260206000209260005b818110613b2c575050612eee92500383612b9e565b8454835260019485019487945060209093019201613b17565b8054821015612dfa5760005260206000200190600090565b6000818152600360205260409020548015613cec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161309357600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613c7d575b5050506002548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613c0b816002613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b613cd4613c8e613c9f936002613b45565b90549060031b1c9283926002613b45565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526003602052604060002055388080613bd2565b5050600090565b6000818152600660205260409020548015613cec577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161309357600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613de4575b5050506005548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613da1816005613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b613e06613df5613c9f936005613b45565b90549060031b1c9283926005613b45565b90556000526006602052604060002055388080613d68565b9060018201918160005282602052604060002054801515600014613f49577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613093578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161309357818103613f12575b50505080548015613c4e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613ed38282613b45565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b613f32613f22613c9f9386613b45565b90549060031b1c92839286613b45565b905560005283602052604060002055388080613e9b565b50505050600090565b9190820180921161309357565b80600052600360205260406000205415600014613fb95760025468010000000000000000811015612b1b57613fa0613c9f8260018594016002556002613b45565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014613fb95760055468010000000000000000811015612b1b57614000613c9f8260018594016005556005613b45565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054613cec5780549068010000000000000000821015612b1b5782614057613c9f846001809601855584613b45565b905580549260005201602052604060002055600190565b929192805460ff8160a01c1615801561434e575b614347576fffffffffffffffffffffffffffffffff811690600183019081546140c763ffffffff6fffffffffffffffffffffffffffffffff83169360801c16426136da565b90816142a9575b5050848110614227575083821061415657507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff8061412485602096956136da565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061416892505460801c926136da565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613093576141b66141bb9273ffffffffffffffffffffffffffffffffffffffff94613f52565b6131af565b92169182156141f7577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614279577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b82859293951161431d576142c4926137469160801c90613080565b808310156143185750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806140ce565b6142cf565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b50821561408256fea164736f6c634300081a000a", +} + +var BurnWithFromMintTokenPoolABI = BurnWithFromMintTokenPoolMetaData.ABI + +var BurnWithFromMintTokenPoolBin = BurnWithFromMintTokenPoolMetaData.Bin + +func DeployBurnWithFromMintTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, localTokenDecimals uint8, allowlist []common.Address, rmnProxy common.Address, router common.Address) (common.Address, *types.Transaction, *BurnWithFromMintTokenPool, error) { + parsed, err := BurnWithFromMintTokenPoolMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(BurnWithFromMintTokenPoolBin), backend, token, localTokenDecimals, allowlist, rmnProxy, router) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &BurnWithFromMintTokenPool{address: address, abi: *parsed, BurnWithFromMintTokenPoolCaller: BurnWithFromMintTokenPoolCaller{contract: contract}, BurnWithFromMintTokenPoolTransactor: BurnWithFromMintTokenPoolTransactor{contract: contract}, BurnWithFromMintTokenPoolFilterer: BurnWithFromMintTokenPoolFilterer{contract: contract}}, nil +} + +type BurnWithFromMintTokenPool struct { + address common.Address + abi abi.ABI + BurnWithFromMintTokenPoolCaller + BurnWithFromMintTokenPoolTransactor + BurnWithFromMintTokenPoolFilterer +} + +type BurnWithFromMintTokenPoolCaller struct { + contract *bind.BoundContract +} + +type BurnWithFromMintTokenPoolTransactor struct { + contract *bind.BoundContract +} + +type BurnWithFromMintTokenPoolFilterer struct { + contract *bind.BoundContract +} + +type BurnWithFromMintTokenPoolSession struct { + Contract *BurnWithFromMintTokenPool + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type BurnWithFromMintTokenPoolCallerSession struct { + Contract *BurnWithFromMintTokenPoolCaller + CallOpts bind.CallOpts +} + +type BurnWithFromMintTokenPoolTransactorSession struct { + Contract *BurnWithFromMintTokenPoolTransactor + TransactOpts bind.TransactOpts +} + +type BurnWithFromMintTokenPoolRaw struct { + Contract *BurnWithFromMintTokenPool +} + +type BurnWithFromMintTokenPoolCallerRaw struct { + Contract *BurnWithFromMintTokenPoolCaller +} + +type BurnWithFromMintTokenPoolTransactorRaw struct { + Contract *BurnWithFromMintTokenPoolTransactor +} + +func NewBurnWithFromMintTokenPool(address common.Address, backend bind.ContractBackend) (*BurnWithFromMintTokenPool, error) { + abi, err := abi.JSON(strings.NewReader(BurnWithFromMintTokenPoolABI)) + if err != nil { + return nil, err + } + contract, err := bindBurnWithFromMintTokenPool(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPool{address: address, abi: abi, BurnWithFromMintTokenPoolCaller: BurnWithFromMintTokenPoolCaller{contract: contract}, BurnWithFromMintTokenPoolTransactor: BurnWithFromMintTokenPoolTransactor{contract: contract}, BurnWithFromMintTokenPoolFilterer: BurnWithFromMintTokenPoolFilterer{contract: contract}}, nil +} + +func NewBurnWithFromMintTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*BurnWithFromMintTokenPoolCaller, error) { + contract, err := bindBurnWithFromMintTokenPool(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolCaller{contract: contract}, nil +} + +func NewBurnWithFromMintTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*BurnWithFromMintTokenPoolTransactor, error) { + contract, err := bindBurnWithFromMintTokenPool(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolTransactor{contract: contract}, nil +} + +func NewBurnWithFromMintTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*BurnWithFromMintTokenPoolFilterer, error) { + contract, err := bindBurnWithFromMintTokenPool(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolFilterer{contract: contract}, nil +} + +func bindBurnWithFromMintTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := BurnWithFromMintTokenPoolMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BurnWithFromMintTokenPool.Contract.BurnWithFromMintTokenPoolCaller.contract.Call(opts, result, method, params...) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.BurnWithFromMintTokenPoolTransactor.contract.Transfer(opts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.BurnWithFromMintTokenPoolTransactor.contract.Transact(opts, method, params...) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BurnWithFromMintTokenPool.Contract.contract.Call(opts, result, method, params...) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.contract.Transfer(opts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.contract.Transact(opts, method, params...) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getAllowList") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetAllowList() ([]common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetAllowList(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetAllowList() ([]common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetAllowList(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getAllowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetAllowListEnabled() (bool, error) { + return _BurnWithFromMintTokenPool.Contract.GetAllowListEnabled(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetAllowListEnabled() (bool, error) { + return _BurnWithFromMintTokenPool.Contract.GetAllowListEnabled(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnWithFromMintTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnWithFromMintTokenPool.Contract.GetCurrentInboundRateLimiterState(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnWithFromMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _BurnWithFromMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getRateLimitAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetRateLimitAdmin() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetRateLimitAdmin(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetRateLimitAdmin(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _BurnWithFromMintTokenPool.Contract.GetRemotePools(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _BurnWithFromMintTokenPool.Contract.GetRemotePools(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _BurnWithFromMintTokenPool.Contract.GetRemoteToken(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _BurnWithFromMintTokenPool.Contract.GetRemoteToken(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getRmnProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetRmnProxy() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetRmnProxy(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetRmnProxy() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetRmnProxy(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetRouter() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetRouter(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetRouter() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetRouter(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getSupportedChains") + + if err != nil { + return *new([]uint64), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetSupportedChains() ([]uint64, error) { + return _BurnWithFromMintTokenPool.Contract.GetSupportedChains(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) { + return _BurnWithFromMintTokenPool.Contract.GetSupportedChains(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetToken() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetToken(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetToken() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.GetToken(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getTokenDecimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetTokenDecimals() (uint8, error) { + return _BurnWithFromMintTokenPool.Contract.GetTokenDecimals(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetTokenDecimals() (uint8, error) { + return _BurnWithFromMintTokenPool.Contract.GetTokenDecimals(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _BurnWithFromMintTokenPool.Contract.IsRemotePool(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _BurnWithFromMintTokenPool.Contract.IsRemotePool(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _BurnWithFromMintTokenPool.Contract.IsSupportedChain(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _BurnWithFromMintTokenPool.Contract.IsSupportedChain(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "isSupportedToken", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) { + return _BurnWithFromMintTokenPool.Contract.IsSupportedToken(&_BurnWithFromMintTokenPool.CallOpts, token) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) { + return _BurnWithFromMintTokenPool.Contract.IsSupportedToken(&_BurnWithFromMintTokenPool.CallOpts, token) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.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 + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) Owner() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.Owner(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) Owner() (common.Address, error) { + return _BurnWithFromMintTokenPool.Contract.Owner(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _BurnWithFromMintTokenPool.Contract.SupportsInterface(&_BurnWithFromMintTokenPool.CallOpts, interfaceId) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _BurnWithFromMintTokenPool.Contract.SupportsInterface(&_BurnWithFromMintTokenPool.CallOpts, interfaceId) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) TypeAndVersion() (string, error) { + return _BurnWithFromMintTokenPool.Contract.TypeAndVersion(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) TypeAndVersion() (string, error) { + return _BurnWithFromMintTokenPool.Contract.TypeAndVersion(&_BurnWithFromMintTokenPool.CallOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "acceptOwnership") +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) AcceptOwnership() (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.AcceptOwnership(&_BurnWithFromMintTokenPool.TransactOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.AcceptOwnership(&_BurnWithFromMintTokenPool.TransactOpts) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.AddRemotePool(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.AddRemotePool(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.ApplyAllowListUpdates(&_BurnWithFromMintTokenPool.TransactOpts, removes, adds) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.ApplyAllowListUpdates(&_BurnWithFromMintTokenPool.TransactOpts, removes, adds) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.ApplyChainUpdates(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.ApplyChainUpdates(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.LockOrBurn(&_BurnWithFromMintTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.LockOrBurn(&_BurnWithFromMintTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.ReleaseOrMint(&_BurnWithFromMintTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.ReleaseOrMint(&_BurnWithFromMintTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.RemoveRemotePool(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.RemoveRemotePool(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "setChainRateLimiterConfigs", remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.SetChainRateLimiterConfigs(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.SetChainRateLimiterConfigs(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.SetRateLimitAdmin(&_BurnWithFromMintTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.SetRateLimitAdmin(&_BurnWithFromMintTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "setRouter", newRouter) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.SetRouter(&_BurnWithFromMintTokenPool.TransactOpts, newRouter) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.SetRouter(&_BurnWithFromMintTokenPool.TransactOpts, newRouter) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.contract.Transact(opts, "transferOwnership", to) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.TransferOwnership(&_BurnWithFromMintTokenPool.TransactOpts, to) +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _BurnWithFromMintTokenPool.Contract.TransferOwnership(&_BurnWithFromMintTokenPool.TransactOpts, to) +} + +type BurnWithFromMintTokenPoolAllowListAddIterator struct { + Event *BurnWithFromMintTokenPoolAllowListAdd + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolAllowListAddIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolAllowListAddIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolAllowListAddIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolAllowListAdd struct { + Sender common.Address + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolAllowListAddIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolAllowListAddIterator{contract: _BurnWithFromMintTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolAllowListAdd) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolAllowListAdd) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*BurnWithFromMintTokenPoolAllowListAdd, error) { + event := new(BurnWithFromMintTokenPoolAllowListAdd) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolAllowListRemoveIterator struct { + Event *BurnWithFromMintTokenPoolAllowListRemove + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolAllowListRemoveIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolAllowListRemoveIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolAllowListRemoveIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolAllowListRemove struct { + Sender common.Address + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolAllowListRemoveIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolAllowListRemoveIterator{contract: _BurnWithFromMintTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolAllowListRemove) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolAllowListRemove) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*BurnWithFromMintTokenPoolAllowListRemove, error) { + event := new(BurnWithFromMintTokenPoolAllowListRemove) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolBurnedIterator struct { + Event *BurnWithFromMintTokenPoolBurned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolBurnedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolBurnedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolBurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolBurned struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnWithFromMintTokenPoolBurnedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolBurnedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolBurned, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolBurned) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseBurned(log types.Log) (*BurnWithFromMintTokenPoolBurned, error) { + event := new(BurnWithFromMintTokenPoolBurned) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolChainAddedIterator struct { + Event *BurnWithFromMintTokenPoolChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolChainAddedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolChainAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolChainAddedIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolChainAddedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolChainAdded) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolChainAdded) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseChainAdded(log types.Log) (*BurnWithFromMintTokenPoolChainAdded, error) { + event := new(BurnWithFromMintTokenPoolChainAdded) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolChainConfiguredIterator struct { + Event *BurnWithFromMintTokenPoolChainConfigured + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolChainConfiguredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolChainConfiguredIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolChainConfiguredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolChainConfigured struct { + RemoteChainSelector uint64 + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolChainConfiguredIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolChainConfiguredIterator{contract: _BurnWithFromMintTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolChainConfigured) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolChainConfigured) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseChainConfigured(log types.Log) (*BurnWithFromMintTokenPoolChainConfigured, error) { + event := new(BurnWithFromMintTokenPoolChainConfigured) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolChainRemovedIterator struct { + Event *BurnWithFromMintTokenPoolChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolChainRemovedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolChainRemoved struct { + RemoteChainSelector uint64 + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolChainRemovedIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolChainRemovedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolChainRemoved) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolChainRemoved) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseChainRemoved(log types.Log) (*BurnWithFromMintTokenPoolChainRemoved, error) { + event := new(BurnWithFromMintTokenPoolChainRemoved) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolConfigChangedIterator struct { + Event *BurnWithFromMintTokenPoolConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolConfigChangedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolConfigChangedIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolConfigChangedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolConfigChanged) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolConfigChanged) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseConfigChanged(log types.Log) (*BurnWithFromMintTokenPoolConfigChanged, error) { + event := new(BurnWithFromMintTokenPoolConfigChanged) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolLockedIterator struct { + Event *BurnWithFromMintTokenPoolLocked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolLockedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolLockedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolLockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolLocked struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnWithFromMintTokenPoolLockedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolLockedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolLocked, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolLocked) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseLocked(log types.Log) (*BurnWithFromMintTokenPoolLocked, error) { + event := new(BurnWithFromMintTokenPoolLocked) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolMintedIterator struct { + Event *BurnWithFromMintTokenPoolMinted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolMintedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolMintedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnWithFromMintTokenPoolMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolMintedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolMinted) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseMinted(log types.Log) (*BurnWithFromMintTokenPoolMinted, error) { + event := new(BurnWithFromMintTokenPoolMinted) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolOwnershipTransferRequestedIterator struct { + Event *BurnWithFromMintTokenPoolOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnWithFromMintTokenPoolOwnershipTransferRequestedIterator, 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 := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolOwnershipTransferRequestedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolOwnershipTransferRequested, 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 := _BurnWithFromMintTokenPool.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: + + event := new(BurnWithFromMintTokenPoolOwnershipTransferRequested) + if err := _BurnWithFromMintTokenPool.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 +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*BurnWithFromMintTokenPoolOwnershipTransferRequested, error) { + event := new(BurnWithFromMintTokenPoolOwnershipTransferRequested) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolOwnershipTransferredIterator struct { + Event *BurnWithFromMintTokenPoolOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnWithFromMintTokenPoolOwnershipTransferredIterator, 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 := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolOwnershipTransferredIterator{contract: _BurnWithFromMintTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolOwnershipTransferred, 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 := _BurnWithFromMintTokenPool.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: + + event := new(BurnWithFromMintTokenPoolOwnershipTransferred) + if err := _BurnWithFromMintTokenPool.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 +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*BurnWithFromMintTokenPoolOwnershipTransferred, error) { + event := new(BurnWithFromMintTokenPoolOwnershipTransferred) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolRateLimitAdminSetIterator struct { + Event *BurnWithFromMintTokenPoolRateLimitAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolRateLimitAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolRateLimitAdminSetIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolRateLimitAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolRateLimitAdminSet struct { + RateLimitAdmin common.Address + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolRateLimitAdminSetIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolRateLimitAdminSetIterator{contract: _BurnWithFromMintTokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolRateLimitAdminSet) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolRateLimitAdminSet) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*BurnWithFromMintTokenPoolRateLimitAdminSet, error) { + event := new(BurnWithFromMintTokenPoolRateLimitAdminSet) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolReleasedIterator struct { + Event *BurnWithFromMintTokenPoolReleased + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolReleasedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolReleasedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolReleasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolReleased struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnWithFromMintTokenPoolReleasedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolReleasedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolReleased) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseReleased(log types.Log) (*BurnWithFromMintTokenPoolReleased, error) { + event := new(BurnWithFromMintTokenPoolReleased) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolRemotePoolAddedIterator struct { + Event *BurnWithFromMintTokenPoolRemotePoolAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolRemotePoolAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolRemotePoolAddedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolRemotePoolAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolRemotePoolAdded struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnWithFromMintTokenPoolRemotePoolAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolRemotePoolAddedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolRemotePoolAdded) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*BurnWithFromMintTokenPoolRemotePoolAdded, error) { + event := new(BurnWithFromMintTokenPoolRemotePoolAdded) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolRemotePoolRemovedIterator struct { + Event *BurnWithFromMintTokenPoolRemotePoolRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolRemotePoolRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolRemotePoolRemovedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolRemotePoolRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolRemotePoolRemoved struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnWithFromMintTokenPoolRemotePoolRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolRemotePoolRemovedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolRemotePoolRemoved) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*BurnWithFromMintTokenPoolRemotePoolRemoved, error) { + event := new(BurnWithFromMintTokenPoolRemotePoolRemoved) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolRouterUpdatedIterator struct { + Event *BurnWithFromMintTokenPoolRouterUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolRouterUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolRouterUpdatedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolRouterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolRouterUpdated struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolRouterUpdatedIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolRouterUpdatedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolRouterUpdated) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolRouterUpdated) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*BurnWithFromMintTokenPoolRouterUpdated, error) { + event := new(BurnWithFromMintTokenPoolRouterUpdated) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type BurnWithFromMintTokenPoolTokensConsumedIterator struct { + Event *BurnWithFromMintTokenPoolTokensConsumed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *BurnWithFromMintTokenPoolTokensConsumedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(BurnWithFromMintTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *BurnWithFromMintTokenPoolTokensConsumedIterator) Error() error { + return it.fail +} + +func (it *BurnWithFromMintTokenPoolTokensConsumedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type BurnWithFromMintTokenPoolTokensConsumed struct { + Tokens *big.Int + Raw types.Log +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolTokensConsumedIterator, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.FilterLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return &BurnWithFromMintTokenPoolTokensConsumedIterator{contract: _BurnWithFromMintTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolTokensConsumed) (event.Subscription, error) { + + logs, sub, err := _BurnWithFromMintTokenPool.contract.WatchLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(BurnWithFromMintTokenPoolTokensConsumed) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*BurnWithFromMintTokenPoolTokensConsumed, error) { + event := new(BurnWithFromMintTokenPoolTokensConsumed) + if err := _BurnWithFromMintTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _BurnWithFromMintTokenPool.abi.Events["AllowListAdd"].ID: + return _BurnWithFromMintTokenPool.ParseAllowListAdd(log) + case _BurnWithFromMintTokenPool.abi.Events["AllowListRemove"].ID: + return _BurnWithFromMintTokenPool.ParseAllowListRemove(log) + case _BurnWithFromMintTokenPool.abi.Events["Burned"].ID: + return _BurnWithFromMintTokenPool.ParseBurned(log) + case _BurnWithFromMintTokenPool.abi.Events["ChainAdded"].ID: + return _BurnWithFromMintTokenPool.ParseChainAdded(log) + case _BurnWithFromMintTokenPool.abi.Events["ChainConfigured"].ID: + return _BurnWithFromMintTokenPool.ParseChainConfigured(log) + case _BurnWithFromMintTokenPool.abi.Events["ChainRemoved"].ID: + return _BurnWithFromMintTokenPool.ParseChainRemoved(log) + case _BurnWithFromMintTokenPool.abi.Events["ConfigChanged"].ID: + return _BurnWithFromMintTokenPool.ParseConfigChanged(log) + case _BurnWithFromMintTokenPool.abi.Events["Locked"].ID: + return _BurnWithFromMintTokenPool.ParseLocked(log) + case _BurnWithFromMintTokenPool.abi.Events["Minted"].ID: + return _BurnWithFromMintTokenPool.ParseMinted(log) + case _BurnWithFromMintTokenPool.abi.Events["OwnershipTransferRequested"].ID: + return _BurnWithFromMintTokenPool.ParseOwnershipTransferRequested(log) + case _BurnWithFromMintTokenPool.abi.Events["OwnershipTransferred"].ID: + return _BurnWithFromMintTokenPool.ParseOwnershipTransferred(log) + case _BurnWithFromMintTokenPool.abi.Events["RateLimitAdminSet"].ID: + return _BurnWithFromMintTokenPool.ParseRateLimitAdminSet(log) + case _BurnWithFromMintTokenPool.abi.Events["Released"].ID: + return _BurnWithFromMintTokenPool.ParseReleased(log) + case _BurnWithFromMintTokenPool.abi.Events["RemotePoolAdded"].ID: + return _BurnWithFromMintTokenPool.ParseRemotePoolAdded(log) + case _BurnWithFromMintTokenPool.abi.Events["RemotePoolRemoved"].ID: + return _BurnWithFromMintTokenPool.ParseRemotePoolRemoved(log) + case _BurnWithFromMintTokenPool.abi.Events["RouterUpdated"].ID: + return _BurnWithFromMintTokenPool.ParseRouterUpdated(log) + case _BurnWithFromMintTokenPool.abi.Events["TokensConsumed"].ID: + return _BurnWithFromMintTokenPool.ParseTokensConsumed(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (BurnWithFromMintTokenPoolAllowListAdd) Topic() common.Hash { + return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8") +} + +func (BurnWithFromMintTokenPoolAllowListRemove) Topic() common.Hash { + return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566") +} + +func (BurnWithFromMintTokenPoolBurned) Topic() common.Hash { + return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7") +} + +func (BurnWithFromMintTokenPoolChainAdded) Topic() common.Hash { + return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") +} + +func (BurnWithFromMintTokenPoolChainConfigured) Topic() common.Hash { + return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b") +} + +func (BurnWithFromMintTokenPoolChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (BurnWithFromMintTokenPoolConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (BurnWithFromMintTokenPoolLocked) Topic() common.Hash { + return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008") +} + +func (BurnWithFromMintTokenPoolMinted) Topic() common.Hash { + return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0") +} + +func (BurnWithFromMintTokenPoolOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (BurnWithFromMintTokenPoolOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (BurnWithFromMintTokenPoolRateLimitAdminSet) Topic() common.Hash { + return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174") +} + +func (BurnWithFromMintTokenPoolReleased) Topic() common.Hash { + return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52") +} + +func (BurnWithFromMintTokenPoolRemotePoolAdded) Topic() common.Hash { + return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea") +} + +func (BurnWithFromMintTokenPoolRemotePoolRemoved) Topic() common.Hash { + return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76") +} + +func (BurnWithFromMintTokenPoolRouterUpdated) Topic() common.Hash { + return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684") +} + +func (BurnWithFromMintTokenPoolTokensConsumed) Topic() common.Hash { + return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a") +} + +func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPool) Address() common.Address { + return _BurnWithFromMintTokenPool.address +} + +type BurnWithFromMintTokenPoolInterface interface { + GetAllowList(opts *bind.CallOpts) ([]common.Address, error) + + GetAllowListEnabled(opts *bind.CallOpts) (bool, error) + + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) + + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) + + GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) + + GetRmnProxy(opts *bind.CallOpts) (common.Address, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) + + GetToken(opts *bind.CallOpts) (common.Address, error) + + GetTokenDecimals(opts *bind.CallOpts) (uint8, error) + + IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) + + IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) + + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) + + SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) + + SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) + + SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAllowListAdd(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolAllowListAddIterator, error) + + WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolAllowListAdd) (event.Subscription, error) + + ParseAllowListAdd(log types.Log) (*BurnWithFromMintTokenPoolAllowListAdd, error) + + FilterAllowListRemove(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolAllowListRemoveIterator, error) + + WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolAllowListRemove) (event.Subscription, error) + + ParseAllowListRemove(log types.Log) (*BurnWithFromMintTokenPoolAllowListRemove, error) + + FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*BurnWithFromMintTokenPoolBurnedIterator, error) + + WatchBurned(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolBurned, sender []common.Address) (event.Subscription, error) + + ParseBurned(log types.Log) (*BurnWithFromMintTokenPoolBurned, error) + + FilterChainAdded(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*BurnWithFromMintTokenPoolChainAdded, error) + + FilterChainConfigured(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolChainConfiguredIterator, error) + + WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolChainConfigured) (event.Subscription, error) + + ParseChainConfigured(log types.Log) (*BurnWithFromMintTokenPoolChainConfigured, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*BurnWithFromMintTokenPoolChainRemoved, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*BurnWithFromMintTokenPoolConfigChanged, error) + + FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*BurnWithFromMintTokenPoolLockedIterator, error) + + WatchLocked(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolLocked, sender []common.Address) (event.Subscription, error) + + ParseLocked(log types.Log) (*BurnWithFromMintTokenPoolLocked, error) + + FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnWithFromMintTokenPoolMintedIterator, error) + + WatchMinted(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseMinted(log types.Log) (*BurnWithFromMintTokenPoolMinted, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnWithFromMintTokenPoolOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*BurnWithFromMintTokenPoolOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*BurnWithFromMintTokenPoolOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*BurnWithFromMintTokenPoolOwnershipTransferred, error) + + FilterRateLimitAdminSet(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolRateLimitAdminSetIterator, error) + + WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolRateLimitAdminSet) (event.Subscription, error) + + ParseRateLimitAdminSet(log types.Log) (*BurnWithFromMintTokenPoolRateLimitAdminSet, error) + + FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*BurnWithFromMintTokenPoolReleasedIterator, error) + + WatchReleased(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseReleased(log types.Log) (*BurnWithFromMintTokenPoolReleased, error) + + FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnWithFromMintTokenPoolRemotePoolAddedIterator, error) + + WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolAdded(log types.Log) (*BurnWithFromMintTokenPoolRemotePoolAdded, error) + + FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*BurnWithFromMintTokenPoolRemotePoolRemovedIterator, error) + + WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolRemoved(log types.Log) (*BurnWithFromMintTokenPoolRemotePoolRemoved, error) + + FilterRouterUpdated(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolRouterUpdatedIterator, error) + + WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolRouterUpdated) (event.Subscription, error) + + ParseRouterUpdated(log types.Log) (*BurnWithFromMintTokenPoolRouterUpdated, error) + + FilterTokensConsumed(opts *bind.FilterOpts) (*BurnWithFromMintTokenPoolTokensConsumedIterator, error) + + WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *BurnWithFromMintTokenPoolTokensConsumed) (event.Subscription, error) + + ParseTokensConsumed(log types.Log) (*BurnWithFromMintTokenPoolTokensConsumed, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool/lock_release_token_pool.go b/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool/lock_release_token_pool.go new file mode 100644 index 00000000000..e034cc8a029 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool/lock_release_token_pool.go @@ -0,0 +1,3702 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package lock_release_token_pool + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "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" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type PoolLockOrBurnInV1 struct { + Receiver []byte + RemoteChainSelector uint64 + OriginalSender common.Address + Amount *big.Int + LocalToken common.Address +} + +type PoolLockOrBurnOutV1 struct { + DestTokenAddress []byte + DestPoolData []byte +} + +type PoolReleaseOrMintInV1 struct { + OriginalSender []byte + RemoteChainSelector uint64 + Receiver common.Address + Amount *big.Int + LocalToken common.Address + SourcePoolAddress []byte + SourcePoolData []byte + OffchainTokenData []byte +} + +type PoolReleaseOrMintOutV1 struct { + DestinationAmount *big.Int +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type TokenPoolChainUpdate struct { + RemoteChainSelector uint64 + RemotePoolAddresses [][]byte + RemoteTokenAddress []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig +} + +var LockReleaseTokenPoolMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"acceptLiquidity\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canAcceptLiquidity\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRebalancer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provideLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRebalancer\",\"inputs\":[{\"name\":\"rebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferLiquidity\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityAdded\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityRemoved\",\"inputs\":[{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityTransferred\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InsufficientLiquidity\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"LiquidityNotAccepted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x61012080604052346103945761504f803803809161001d8285610413565b8339810160c0828203126103945781516001600160a01b038116908181036103945761004b60208501610436565b60408501519091906001600160401b0381116103945785019380601f86011215610394578451946001600160401b0386116103fd578560051b9060208201966100976040519889610413565b875260208088019282010192831161039457602001905b8282106103e5575050506100c460608601610444565b9060808601519586151587036103945760a06100e09101610444565b9333156103d457600180546001600160a01b03191633179055801580156103c3575b80156103b2575b6103a15760049260209260805260c0526040519283809263313ce56760e01b82525afa60009181610360575b50610335575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e0819052610218575b5061010052604051614a5690816105f9823960805181818161036301528181611800015281816119f70152818161258301528181612766015281816129e801528181612a600152612b57015260a051818181611a580152818161296f0152818161364f01526136d2015260c051818181610d7e0152818161189c015261261e015260e051818181610d0e015281816118df01526123270152610100518181816102d101526112ae0152f35b60206040516102278282610413565b60008152600036813760e051156103245760005b81518110156102a2576001906001600160a01b036102598285610458565b5116846102658261049a565b610272575b50500161023b565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388461026a565b505060005b825181101561031b576001906001600160a01b036102c58286610458565b5116801561031557836102d782610598565b6102e5575b50505b016102a7565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102dc565b506102df565b5050503861016d565b6335f4a7b360e01b60005260046000fd5b60ff1660ff8216818103610349575061013b565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d602011610399575b8161037c60209383610413565b810103126103945761038d90610436565b9038610135565b600080fd5b3d915061036f565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b03831615610109565b506001600160a01b03851615610102565b639b15e16f60e01b60005260046000fd5b602080916103f284610444565b8152019101906100ae565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103fd57604052565b519060ff8216820361039457565b51906001600160a01b038216820361039457565b805182101561046c5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561046c5760005260206000200190600090565b600081815260036020526040902054801561059157600019810181811161057b5760025460001981019190821161057b5781810361052a575b505050600254801561051457600019016104ee816002610482565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61056361053b61054c936002610482565b90549060031b1c9283926002610482565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104d3565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105f257600254680100000000000000008110156103fd576105d961054c8260018594016002556002610482565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612c67575080630a861f2a14612b03578063181f5a7714612a8457806321df0da714612a15578063240028e81461299357806324f65ee71461293757806339077537146124dc578063432a6ba31461248a5780634c5ef0ed1461247057806354c8a4f3146122f357806362ddd3c41461226f57806366320087146121675780636cfd1553146120e55780636d3d1a581461209357806379ba509714611fae5780637d54534e14611f015780638926f54f14611e9d5780638da5cb5b14611e4b578063962d402014611ca75780639a4575b914611758578063a42a7b8b146115d3578063a7cd63b714611507578063acfecf91146113e3578063af58d59f1461137c578063b0f479a11461132a578063b7946580146112d3578063bb98546b14611278578063c0d7865514611180578063c4bffe2b14611037578063c75eea9c14610f71578063cf7401f314610da2578063dc0bd97114610d33578063e0351e1314610cd8578063e8a1da1714610403578063eb521a4c1461029c5763f2fde38b146101ad57600080fd5b346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995773ffffffffffffffffffffffffffffffffffffffff6101f9612f02565b6102016137dc565b1633811461027157807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b80fd5b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610299576004357f0000000000000000000000000000000000000000000000000000000000000000156103db5773ffffffffffffffffffffffffffffffffffffffff600a541633036103af576103876040517f23b872dd00000000000000000000000000000000000000000000000000000000602082015233602482015230604482015282606482015260648152610361608482612e28565b7f0000000000000000000000000000000000000000000000000000000000000000613dae565b337fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb3120888380a380f35b6024827f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b6004827fe93f8fa4000000000000000000000000000000000000000000000000000000008152fd5b50346102995761041236612ff0565b9391909261041e6137dc565b82915b808310610b43575050508063ffffffff4216917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1843603015b85821015610b3f578160051b85013581811215610b3b5785019061012082360312610b3b576040519561048c87612df0565b823567ffffffffffffffff81168103610b36578752602083013567ffffffffffffffff8111610b325783019536601f88011215610b32578635966104cf886131ee565b976104dd604051998a612e28565b8089526020808a019160051b83010190368211610b2e5760208301905b828210610afb575050505060208801968752604084013567ffffffffffffffff8111610af75761052d9036908601613546565b9860408901998a5261055761054536606088016130ae565b9560608b0196875260c03691016130ae565b9660808a019788526105698651613c53565b6105738851613c53565b8a515115610acf5761058f67ffffffffffffffff8b51166145e6565b15610a985767ffffffffffffffff8a511681526007602052604081206106cf87516fffffffffffffffffffffffffffffffff6040820151169061068a6fffffffffffffffffffffffffffffffff602083015116915115158360806040516105f581612df0565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b6107f589516fffffffffffffffffffffffffffffffff604082015116906107b06fffffffffffffffffffffffffffffffff6020830151169151151583608060405161071981612df0565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b60048c5191019080519067ffffffffffffffff8211610a6b5761081883546132e6565b601f8111610a30575b50602090601f83116001146109915761086f9291859183610986575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b805b895180518210156108aa57906108a460019261089d838f67ffffffffffffffff905116926132d2565b5190613827565b01610874565b5050975097987f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c29295939661097867ffffffffffffffff600197949c511692519351915161094461090f60405196879687526101006020880152610100870190612ea3565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101909394929161045a565b01519050388061083d565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b818110610a1857509084600195949392106109e1575b505050811b019055610872565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806109d4565b929360206001819287860151815501950193016109be565b610a5b9084865260208620601f850160051c81019160208610610a61575b601f0160051c01906134ed565b38610821565b9091508190610a4e565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff8111610b2a57602091610b1f8392833691890101613546565b8152019101906104fa565b8a80fd5b8880fd5b8580fd5b600080fd5b8380fd5b8280f35b9092919367ffffffffffffffff610b63610b5e87858861326e565b6132ad565b1695610b6e8761431a565b15610cac578684526007602052610b8a60056040862001614121565b94845b8651811015610bc3576001908987526007602052610bbc60056040892001610bb5838b6132d2565b5190614445565b5001610b8d565b5093945094909580855260076020526005604086208681558660018201558660028201558660038201558660048201610bfc81546132e6565b80610c6b575b5050500180549086815581610c4d575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a1019190949394610421565b865260208620908101905b81811015610c1257868155600101610c58565b601f8111600114610c815750555b863880610c02565b81835260208320610c9c91601f01861c8101906001016134ed565b8082528160208120915555610c79565b602484887f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102995760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957610dda612f25565b9060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc36011261029957604051610e1181612e0c565b6024358015158103610f6d5781526044356fffffffffffffffffffffffffffffffff81168103610f6d5760208201526064356fffffffffffffffffffffffffffffffff81168103610f6d57604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c360112610f695760405190610e9882612e0c565b6084358015158103610b3b57825260a4356fffffffffffffffffffffffffffffffff81168103610b3b57602083015260c4356fffffffffffffffffffffffffffffffff81168103610b3b57604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610f47575b610f1b57610f189293613a91565b80f35b6024837f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610f0a565b5080fd5b8280fd5b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957610fda610fd560406110339367ffffffffffffffff610fbe612f25565b610fc661343a565b50168152600760205220613465565b613bce565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957604051906005548083528260208101600584526020842092845b81811061116757505061109592500383612e28565b81516110b96110a3826131ee565b916110b16040519384612e28565b8083526131ee565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602083019301368437805b8451811015611118578067ffffffffffffffff611105600193886132d2565b511661111182866132d2565b52016110e6565b50925090604051928392602084019060208552518091526040840192915b818110611144575050500390f35b825167ffffffffffffffff16845285945060209384019390920191600101611136565b8454835260019485019487945060209093019201611080565b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995773ffffffffffffffffffffffffffffffffffffffff6111cd612f02565b6111d56137dc565b1680156112505760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a180f35b6004827f8579befe000000000000000000000000000000000000000000000000000000008152fd5b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957611033611316611311612f25565b6134cb565b604051918291602083526020830190612ea3565b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957610fda610fd5600260406110339467ffffffffffffffff6113cb612f25565b6113d361343a565b5016815260076020522001613465565b50346102995767ffffffffffffffff6113fb36612f3c565b9290916114066137dc565b169161141f836000526006602052604060002054151590565b156114db57828452600760205261144e6005604086200161144136848661314b565b6020815191012090614445565b1561149357907f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d769161148d6040519283926020845260208401916133fb565b0390a280f35b826114d7836040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501526040602485015260448401916133fb565b0390fd5b602484847f1e670e4b000000000000000000000000000000000000000000000000000000008252600452fd5b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957604051600254808252602082018091600285526020852090855b8181106115bd5750505082611566910383612e28565b604051928392602084019060208552518091526040840192915b81811061158e575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611580565b8254845260209093019260019283019201611550565b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995767ffffffffffffffff611614612f25565b168152600760205261162b60056040832001614121565b80517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061167061165a836131ee565b926116686040519485612e28565b8084526131ee565b01835b818110611747575050825b82518110156116c45780611694600192856132d2565b51855260086020526116a860408620613339565b6116b282856132d2565b526116bd81846132d2565b500161167e565b81846040519182916020830160208452825180915260408401602060408360051b870101940192905b8282106116fc57505050500390f35b91936020611737827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186528851612ea3565b96019201920185949391926116ed565b806060602080938601015201611673565b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760043567ffffffffffffffff8111610f695760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610f6957606060206040516117d681612dd4565b8281520152608481016117e881613182565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611c5d5750602481019077ffffffffffffffff0000000000000000000000000000000061184f836132ad565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611b7e578491611c2e575b50611c06576118dd60448201613182565b7f0000000000000000000000000000000000000000000000000000000000000000611bb4575b5067ffffffffffffffff611916836132ad565b1661192e816000526006602052604060002054151590565b15611b8957602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa8015611b7e578490611b1b575b73ffffffffffffffffffffffffffffffffffffffff9150163303611aef578161131191611a1d6040611abe9667ffffffffffffffff60646119d2611a4e996132ad565b950135941681526007602052208273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614695565b6040519081527f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860203392a26132ad565b61103360405160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260208152611a8c604082612e28565b60405192611a9984612dd4565b8352602083019081526040519384936020855251604060208601526060850190612ea3565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612ea3565b6024837f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b506020813d602011611b76575b81611b3560209383612e28565b81010312610b3b575173ffffffffffffffffffffffffffffffffffffffff81168103610b3b5773ffffffffffffffffffffffffffffffffffffffff9061198f565b3d9150611b28565b6040513d86823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008452600452602483fd5b73ffffffffffffffffffffffffffffffffffffffff1680845260036020526040842054611903577fd0d25976000000000000000000000000000000000000000000000000000000008452600452602483fd5b6004837f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b611c50915060203d602011611c56575b611c488183612e28565b8101906135c3565b386118cc565b503d611c3e565b8273ffffffffffffffffffffffffffffffffffffffff611c7e602493613182565b7f961c9a4f00000000000000000000000000000000000000000000000000000000835216600452fd5b50346102995760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760043567ffffffffffffffff8111610f6957611cf7903690600401612fbf565b60243567ffffffffffffffff8111610b3b57611d17903690600401613060565b60449291923567ffffffffffffffff8111610b3257611d3a903690600401613060565b91909273ffffffffffffffffffffffffffffffffffffffff6009541633141580611e29575b611dfd57818114801590611df3575b611dcb57865b818110611d7f578780f35b80611dc5611d93610b5e600194868c61326e565b611d9e83878b6132c2565b611dbf611db7611daf868b8d6132c2565b9236906130ae565b9136906130ae565b91613a91565b01611d74565b6004877f568efce2000000000000000000000000000000000000000000000000000000008152fd5b5082811415611d6e565b6024877f8e4a23d600000000000000000000000000000000000000000000000000000000815233600452fd5b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611d5f565b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610299576020611ef767ffffffffffffffff611ee3612f25565b166000526006602052604060002054151590565b6040519015158152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610299577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff611f71612f02565b611f796137dc565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a180f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957805473ffffffffffffffffffffffffffffffffffffffff8116330361206b577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995773ffffffffffffffffffffffffffffffffffffffff612132612f02565b61213a6137dc565b167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a5580f35b50346102995760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995761219f612f02565b73ffffffffffffffffffffffffffffffffffffffff602435916121c06137dc565b1690813b15610f6d576040517f0a861f2a000000000000000000000000000000000000000000000000000000008152816004820152838160248183875af18015611b7e57612238575b5060207f6fa7abcf1345d1d478e5ea0da6b5f26a90eadb0546ef15ed3833944fbfd1db6291604051908152a280f35b836122677f6fa7abcf1345d1d478e5ea0da6b5f26a90eadb0546ef15ed3833944fbfd1db629395602093612e28565b939150612209565b50346102995761227e36612f3c565b61228a939291936137dc565b67ffffffffffffffff82166122ac816000526006602052604060002054151590565b156122c85750610f1892936122c291369161314b565b90613827565b7f1e670e4b000000000000000000000000000000000000000000000000000000008452600452602483fd5b50346102995761231d9061232561230936612ff0565b95916123169391936137dc565b3691613206565b933691613206565b7f00000000000000000000000000000000000000000000000000000000000000001561244857815b83518110156123c0578073ffffffffffffffffffffffffffffffffffffffff612378600193876132d2565b511661238381614184565b61238f575b500161234d565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a138612388565b5090805b8251811015612444578073ffffffffffffffffffffffffffffffffffffffff6123ef600193866132d2565b5116801561243e5761240081614586565b61240d575b505b016123c4565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a184612405565b50612407565b5080f35b6004827f35f4a7b3000000000000000000000000000000000000000000000000000000008152fd5b5034610299576020611ef761248436612f3c565b916131a3565b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760043567ffffffffffffffff8111610f695780600401916101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8336030112610299578060405161255d81612d89565b526084820161256b81613182565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691160361291657506024820177ffffffffffffffff000000000000000000000000000000006125d1826132ad565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156128995783916128f7575b506128cf5767ffffffffffffffff612665826132ad565b1661267d816000526006602052604060002054151590565b156128a457602073ffffffffffffffffffffffffffffffffffffffff60045416916044604051809481937f83826b2b00000000000000000000000000000000000000000000000000000000835260048301523360248301525afa90811561289957839161287a575b501561284e576126f4816132ad565b61270660a485019161248483886130fa565b1561280757506020936127c06044946127ac73ffffffffffffffffffffffffffffffffffffffff956127a66127a161279a600260406127476127c59b6132ad565b9567ffffffffffffffff60648a01359716815260078f522001976127907f000000000000000000000000000000000000000000000000000000000000000099868d8c1691614695565b60c48701906130fa565b369161314b565b6135db565b906136cf565b95869101926127ba84613182565b90613561565b613182565b166040518281527f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52843392a3806040516127fe81612d89565b52604051908152f35b61281190856130fa565b6114d76040519283927f24eb47e50000000000000000000000000000000000000000000000000000000084526020600485015260248401916133fb565b6024827f728fe07b00000000000000000000000000000000000000000000000000000000815233600452fd5b612893915060203d602011611c5657611c488183612e28565b386126e5565b6040513d85823e3d90fd5b7fa9902c7e000000000000000000000000000000000000000000000000000000008352600452602482fd5b6004827f53ad11d8000000000000000000000000000000000000000000000000000000008152fd5b612910915060203d602011611c5657611c488183612e28565b3861264e565b9073ffffffffffffffffffffffffffffffffffffffff611c7e602493613182565b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610299576020906129ce612f02565b905073ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461029957807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995750611033604051612ac5604082612e28565b601a81527f4c6f636b52656c65617365546f6b656e506f6f6c20312e352e310000000000006020820152604051918291602083526020830190612ea3565b50346102995760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102995760043573ffffffffffffffffffffffffffffffffffffffff600a541633036103af577f00000000000000000000000000000000000000000000000000000000000000006040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260208160248173ffffffffffffffffffffffffffffffffffffffff86165afa8015611b7e5783918591612c32575b5010612c0a5781612be2913390613561565b337fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf98401717198380a380f35b6004837fbb55fd27000000000000000000000000000000000000000000000000000000008152fd5b9150506020813d602011612c5f575b81612c4e60209383612e28565b81010312610b3b5782905138612bd0565b3d9150612c41565b905034610f695760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610f69576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610f6d57602092507fe1d40566000000000000000000000000000000000000000000000000000000008114908115612cfb575b5015158152f35b7faff2afbf00000000000000000000000000000000000000000000000000000000811491508115612d5f575b8115612d35575b5038612cf4565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438612d2e565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150612d27565b6020810190811067ffffffffffffffff821117612da557604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040810190811067ffffffffffffffff821117612da557604052565b60a0810190811067ffffffffffffffff821117612da557604052565b6060810190811067ffffffffffffffff821117612da557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612da557604052565b67ffffffffffffffff8111612da557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b848110612eed5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201612eae565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610b3657565b6004359067ffffffffffffffff82168203610b3657565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610b365760043567ffffffffffffffff81168103610b36579160243567ffffffffffffffff8111610b365782602382011215610b365780600401359267ffffffffffffffff8411610b365760248483010111610b36576024019190565b9181601f84011215610b365782359167ffffffffffffffff8311610b36576020808501948460051b010111610b3657565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc820112610b365760043567ffffffffffffffff8111610b36578161303991600401612fbf565b929092916024359067ffffffffffffffff8211610b365761305c91600401612fbf565b9091565b9181601f84011215610b365782359167ffffffffffffffff8311610b365760208085019460608502010111610b3657565b35906fffffffffffffffffffffffffffffffff82168203610b3657565b9190826060910312610b36576040516130c681612e0c565b80928035908115158203610b365760406130f591819385526130ea60208201613091565b602086015201613091565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610b36570180359067ffffffffffffffff8211610b3657602001918136038313610b3657565b92919261315782612e69565b916131656040519384612e28565b829481845281830111610b36578281602093846000960137010152565b3573ffffffffffffffffffffffffffffffffffffffff81168103610b365790565b6131eb929167ffffffffffffffff6131ce92166000526007602052600560406000200192369161314b565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff8111612da55760051b60200190565b9291613211826131ee565b9361321f6040519586612e28565b602085848152019260051b8101918211610b3657915b81831061324157505050565b823573ffffffffffffffffffffffffffffffffffffffff81168103610b3657815260209283019201613235565b919081101561327e5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff81168103610b365790565b919081101561327e576060020190565b805182101561327e5760209160051b010190565b90600182811c9216801561332f575b602083101461330057565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916132f5565b906040519182600082549261334d846132e6565b80845293600181169081156133bb5750600114613374575b5061337292500383612e28565b565b90506000929192526020600020906000915b81831061339f5750509060206133729282010138613365565b6020919350806001915483858901015201910190918492613386565b602093506133729592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138613365565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b6040519061344782612df0565b60006080838281528260208201528260408201528260608201520152565b9060405161347281612df0565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff1660005260076020526131eb6004604060002001613339565b8181106134f8575050565b600081556001016134ed565b8181029291811591840414171561351757565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9080601f83011215610b36578160206131eb9335910161314b565b6133729273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb0000000000000000000000000000000000000000000000000000000060208601521660248401526044830152604482526135be606483612e28565b613dae565b90816020910312610b3657518015158103610b365790565b8051801561364b5760200361360d578051602082810191830183900312610b3657519060ff821161360d575060ff1690565b6114d7906040519182917f953576f7000000000000000000000000000000000000000000000000000000008352602060048401526024830190612ea3565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161351757565b60ff16604d811161351757600a0a90565b81156136a0570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff8116928284146137d5578284116137ab579061371491613671565b91604d60ff8416118015613772575b61373c575050906137366131eb92613685565b90613504565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b5061377c83613685565b80156136a0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613723565b6137b491613671565b91604d60ff84161161373c575050906137cf6131eb92613685565b90613696565b5050505090565b73ffffffffffffffffffffffffffffffffffffffff6001541633036137fd57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b90805115613a675767ffffffffffffffff8151602083012092169182600052600760205261385c816005604060002001614640565b15613a235760005260086020526040600020815167ffffffffffffffff8111612da55761388982546132e6565b601f81116139f1575b506020601f821160011461392b5791613905827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea959361391b95600091613920575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b9055604051918291602083526020830190612ea3565b0390a2565b9050840151386138d4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b8181106139d957509261391b9492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9896106139a2575b5050811b019055611316565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880613996565b9192602060018192868a01518155019401920161395b565b613a1d90836000526020600020601f840160051c81019160208510610a6157601f0160051c01906134ed565b38613892565b50906114d76040519283927f393b8ad20000000000000000000000000000000000000000000000000000000084526004840152604060248401526044830190612ea3565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff166000818152600660205260409020549092919015613b935791613b9060e092613b5c85613ae87f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b97613c53565b846000526007602052613aff816040600020613eee565b613b0883613c53565b846000526007602052613b22836002604060002001613eee565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b9190820391821161351757565b613bd661343a565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff8083511691613c336020850193613c2d613c2063ffffffff87511642613bc1565b8560808901511690613504565b90614579565b80821015613c4c57505b16825263ffffffff4216905290565b9050613c3d565b805115613d07576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116811090811591613cfe575b50613c9b5750565b606490613cfc604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b90501538613c93565b6fffffffffffffffffffffffffffffffff60408201511615801590613d8f575b613d2e5750565b606490613cfc604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff6020820151161515613d27565b73ffffffffffffffffffffffffffffffffffffffff613e3d911691604092600080855193613ddc8786612e28565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d15613ee6573d91613e2183612e69565b92613e2e87519485612e28565b83523d6000602085013e61497d565b80519081613e4a57505050565b602080613e5b9383010191016135c3565b15613e635750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b60609161497d565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19916140276060928054613f2b63ffffffff8260801c1642613bc1565b9081614066575b50506fffffffffffffffffffffffffffffffff600181602086015116928281541680851060001461405e57508280855b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416178155613fdb8651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b613b9060405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b838091613f62565b6fffffffffffffffffffffffffffffffff9161409b8392836140946001880154948286169560801c90613504565b9116614579565b8082101561411a57505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff00000000000000000000000000000000161781553880613f32565b90506140a5565b906040519182815491828252602082019060005260206000209260005b81811061415357505061337292500383612e28565b845483526001948501948794506020909301920161413e565b805482101561327e5760005260206000200190600090565b6000818152600360205260409020548015614313577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161351757600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613517578181036142a4575b5050506002548015614275577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161423281600261416c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6142fb6142b56142c693600261416c565b90549060031b1c928392600261416c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806141f9565b5050600090565b6000818152600660205260409020548015614313577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161351757600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116135175781810361440b575b5050506005548015614275577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016143c881600561416c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b61442d61441c6142c693600561416c565b90549060031b1c928392600561416c565b9055600052600660205260406000205538808061438f565b9060018201918160005282602052604060002054801515600014614570577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613517578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161351757818103614539575b50505080548015614275577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906144fa828261416c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b6145596145496142c6938661416c565b90549060031b1c9283928661416c565b9055600052836020526040600020553880806144c2565b50505050600090565b9190820180921161351757565b806000526003602052604060002054156000146145e05760025468010000000000000000811015612da5576145c76142c6826001859401600255600261416c565b9055600254906000526003602052604060002055600190565b50600090565b806000526006602052604060002054156000146145e05760055468010000000000000000811015612da5576146276142c6826001859401600555600561416c565b9055600554906000526006602052604060002055600190565b60008281526001820160205260409020546143135780549068010000000000000000821015612da5578261467e6142c684600180960185558461416c565b905580549260005201602052604060002055600190565b929192805460ff8160a01c16158015614975575b61496e576fffffffffffffffffffffffffffffffff811690600183019081546146ee63ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642613bc1565b90816148d0575b505084811061484e575083821061477d57507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff8061474b8560209695613bc1565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b81945061478f92505460801c92613bc1565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190808211613517576147dd6147e29273ffffffffffffffffffffffffffffffffffffffff94614579565b613696565b921691821561481e577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff88169182156148a0577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b828592939511614944576148eb92613c2d9160801c90613504565b8083101561493f5750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806146f5565b6148f6565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b5082156146a9565b919290156149f85750815115614991575090565b3b1561499a5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015614a0b5750805190602001fd5b6114d7906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612ea356fea164736f6c634300081a000a", +} + +var LockReleaseTokenPoolABI = LockReleaseTokenPoolMetaData.ABI + +var LockReleaseTokenPoolBin = LockReleaseTokenPoolMetaData.Bin + +func DeployLockReleaseTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, localTokenDecimals uint8, allowlist []common.Address, rmnProxy common.Address, acceptLiquidity bool, router common.Address) (common.Address, *types.Transaction, *LockReleaseTokenPool, error) { + parsed, err := LockReleaseTokenPoolMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(LockReleaseTokenPoolBin), backend, token, localTokenDecimals, allowlist, rmnProxy, acceptLiquidity, router) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &LockReleaseTokenPool{address: address, abi: *parsed, LockReleaseTokenPoolCaller: LockReleaseTokenPoolCaller{contract: contract}, LockReleaseTokenPoolTransactor: LockReleaseTokenPoolTransactor{contract: contract}, LockReleaseTokenPoolFilterer: LockReleaseTokenPoolFilterer{contract: contract}}, nil +} + +type LockReleaseTokenPool struct { + address common.Address + abi abi.ABI + LockReleaseTokenPoolCaller + LockReleaseTokenPoolTransactor + LockReleaseTokenPoolFilterer +} + +type LockReleaseTokenPoolCaller struct { + contract *bind.BoundContract +} + +type LockReleaseTokenPoolTransactor struct { + contract *bind.BoundContract +} + +type LockReleaseTokenPoolFilterer struct { + contract *bind.BoundContract +} + +type LockReleaseTokenPoolSession struct { + Contract *LockReleaseTokenPool + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type LockReleaseTokenPoolCallerSession struct { + Contract *LockReleaseTokenPoolCaller + CallOpts bind.CallOpts +} + +type LockReleaseTokenPoolTransactorSession struct { + Contract *LockReleaseTokenPoolTransactor + TransactOpts bind.TransactOpts +} + +type LockReleaseTokenPoolRaw struct { + Contract *LockReleaseTokenPool +} + +type LockReleaseTokenPoolCallerRaw struct { + Contract *LockReleaseTokenPoolCaller +} + +type LockReleaseTokenPoolTransactorRaw struct { + Contract *LockReleaseTokenPoolTransactor +} + +func NewLockReleaseTokenPool(address common.Address, backend bind.ContractBackend) (*LockReleaseTokenPool, error) { + abi, err := abi.JSON(strings.NewReader(LockReleaseTokenPoolABI)) + if err != nil { + return nil, err + } + contract, err := bindLockReleaseTokenPool(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &LockReleaseTokenPool{address: address, abi: abi, LockReleaseTokenPoolCaller: LockReleaseTokenPoolCaller{contract: contract}, LockReleaseTokenPoolTransactor: LockReleaseTokenPoolTransactor{contract: contract}, LockReleaseTokenPoolFilterer: LockReleaseTokenPoolFilterer{contract: contract}}, nil +} + +func NewLockReleaseTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*LockReleaseTokenPoolCaller, error) { + contract, err := bindLockReleaseTokenPool(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolCaller{contract: contract}, nil +} + +func NewLockReleaseTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*LockReleaseTokenPoolTransactor, error) { + contract, err := bindLockReleaseTokenPool(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolTransactor{contract: contract}, nil +} + +func NewLockReleaseTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*LockReleaseTokenPoolFilterer, error) { + contract, err := bindLockReleaseTokenPool(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolFilterer{contract: contract}, nil +} + +func bindLockReleaseTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := LockReleaseTokenPoolMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _LockReleaseTokenPool.Contract.LockReleaseTokenPoolCaller.contract.Call(opts, result, method, params...) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.LockReleaseTokenPoolTransactor.contract.Transfer(opts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.LockReleaseTokenPoolTransactor.contract.Transact(opts, method, params...) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _LockReleaseTokenPool.Contract.contract.Call(opts, result, method, params...) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.contract.Transfer(opts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.contract.Transact(opts, method, params...) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) CanAcceptLiquidity(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "canAcceptLiquidity") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) CanAcceptLiquidity() (bool, error) { + return _LockReleaseTokenPool.Contract.CanAcceptLiquidity(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) CanAcceptLiquidity() (bool, error) { + return _LockReleaseTokenPool.Contract.CanAcceptLiquidity(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getAllowList") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetAllowList() ([]common.Address, error) { + return _LockReleaseTokenPool.Contract.GetAllowList(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetAllowList() ([]common.Address, error) { + return _LockReleaseTokenPool.Contract.GetAllowList(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getAllowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetAllowListEnabled() (bool, error) { + return _LockReleaseTokenPool.Contract.GetAllowListEnabled(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetAllowListEnabled() (bool, error) { + return _LockReleaseTokenPool.Contract.GetAllowListEnabled(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _LockReleaseTokenPool.Contract.GetCurrentInboundRateLimiterState(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _LockReleaseTokenPool.Contract.GetCurrentInboundRateLimiterState(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _LockReleaseTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _LockReleaseTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getRateLimitAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetRateLimitAdmin() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetRateLimitAdmin(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetRateLimitAdmin(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetRebalancer(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getRebalancer") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetRebalancer() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetRebalancer(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetRebalancer() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetRebalancer(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _LockReleaseTokenPool.Contract.GetRemotePools(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _LockReleaseTokenPool.Contract.GetRemotePools(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _LockReleaseTokenPool.Contract.GetRemoteToken(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _LockReleaseTokenPool.Contract.GetRemoteToken(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getRmnProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetRmnProxy() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetRmnProxy(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetRmnProxy() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetRmnProxy(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetRouter() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetRouter(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetRouter() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetRouter(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getSupportedChains") + + if err != nil { + return *new([]uint64), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetSupportedChains() ([]uint64, error) { + return _LockReleaseTokenPool.Contract.GetSupportedChains(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) { + return _LockReleaseTokenPool.Contract.GetSupportedChains(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetToken() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetToken(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetToken() (common.Address, error) { + return _LockReleaseTokenPool.Contract.GetToken(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "getTokenDecimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) GetTokenDecimals() (uint8, error) { + return _LockReleaseTokenPool.Contract.GetTokenDecimals(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) GetTokenDecimals() (uint8, error) { + return _LockReleaseTokenPool.Contract.GetTokenDecimals(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _LockReleaseTokenPool.Contract.IsRemotePool(&_LockReleaseTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _LockReleaseTokenPool.Contract.IsRemotePool(&_LockReleaseTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _LockReleaseTokenPool.Contract.IsSupportedChain(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _LockReleaseTokenPool.Contract.IsSupportedChain(&_LockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "isSupportedToken", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) { + return _LockReleaseTokenPool.Contract.IsSupportedToken(&_LockReleaseTokenPool.CallOpts, token) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) { + return _LockReleaseTokenPool.Contract.IsSupportedToken(&_LockReleaseTokenPool.CallOpts, token) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _LockReleaseTokenPool.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 + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) Owner() (common.Address, error) { + return _LockReleaseTokenPool.Contract.Owner(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) Owner() (common.Address, error) { + return _LockReleaseTokenPool.Contract.Owner(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _LockReleaseTokenPool.Contract.SupportsInterface(&_LockReleaseTokenPool.CallOpts, interfaceId) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _LockReleaseTokenPool.Contract.SupportsInterface(&_LockReleaseTokenPool.CallOpts, interfaceId) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _LockReleaseTokenPool.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) TypeAndVersion() (string, error) { + return _LockReleaseTokenPool.Contract.TypeAndVersion(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolCallerSession) TypeAndVersion() (string, error) { + return _LockReleaseTokenPool.Contract.TypeAndVersion(&_LockReleaseTokenPool.CallOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "acceptOwnership") +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) AcceptOwnership() (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.AcceptOwnership(&_LockReleaseTokenPool.TransactOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.AcceptOwnership(&_LockReleaseTokenPool.TransactOpts) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.AddRemotePool(&_LockReleaseTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.AddRemotePool(&_LockReleaseTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.ApplyAllowListUpdates(&_LockReleaseTokenPool.TransactOpts, removes, adds) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.ApplyAllowListUpdates(&_LockReleaseTokenPool.TransactOpts, removes, adds) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.ApplyChainUpdates(&_LockReleaseTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.ApplyChainUpdates(&_LockReleaseTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.LockOrBurn(&_LockReleaseTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.LockOrBurn(&_LockReleaseTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) ProvideLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "provideLiquidity", amount) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) ProvideLiquidity(amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.ProvideLiquidity(&_LockReleaseTokenPool.TransactOpts, amount) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) ProvideLiquidity(amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.ProvideLiquidity(&_LockReleaseTokenPool.TransactOpts, amount) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.ReleaseOrMint(&_LockReleaseTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.ReleaseOrMint(&_LockReleaseTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.RemoveRemotePool(&_LockReleaseTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.RemoveRemotePool(&_LockReleaseTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetChainRateLimiterConfig(&_LockReleaseTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetChainRateLimiterConfig(&_LockReleaseTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "setChainRateLimiterConfigs", remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetChainRateLimiterConfigs(&_LockReleaseTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetChainRateLimiterConfigs(&_LockReleaseTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetRateLimitAdmin(&_LockReleaseTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetRateLimitAdmin(&_LockReleaseTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) SetRebalancer(opts *bind.TransactOpts, rebalancer common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "setRebalancer", rebalancer) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) SetRebalancer(rebalancer common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetRebalancer(&_LockReleaseTokenPool.TransactOpts, rebalancer) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) SetRebalancer(rebalancer common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetRebalancer(&_LockReleaseTokenPool.TransactOpts, rebalancer) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "setRouter", newRouter) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetRouter(&_LockReleaseTokenPool.TransactOpts, newRouter) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.SetRouter(&_LockReleaseTokenPool.TransactOpts, newRouter) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) TransferLiquidity(opts *bind.TransactOpts, from common.Address, amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "transferLiquidity", from, amount) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) TransferLiquidity(from common.Address, amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.TransferLiquidity(&_LockReleaseTokenPool.TransactOpts, from, amount) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) TransferLiquidity(from common.Address, amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.TransferLiquidity(&_LockReleaseTokenPool.TransactOpts, from, amount) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "transferOwnership", to) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.TransferOwnership(&_LockReleaseTokenPool.TransactOpts, to) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.TransferOwnership(&_LockReleaseTokenPool.TransactOpts, to) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) WithdrawLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.contract.Transact(opts, "withdrawLiquidity", amount) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) WithdrawLiquidity(amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.WithdrawLiquidity(&_LockReleaseTokenPool.TransactOpts, amount) +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) WithdrawLiquidity(amount *big.Int) (*types.Transaction, error) { + return _LockReleaseTokenPool.Contract.WithdrawLiquidity(&_LockReleaseTokenPool.TransactOpts, amount) +} + +type LockReleaseTokenPoolAllowListAddIterator struct { + Event *LockReleaseTokenPoolAllowListAdd + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolAllowListAddIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolAllowListAddIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolAllowListAddIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolAllowListAdd struct { + Sender common.Address + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*LockReleaseTokenPoolAllowListAddIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolAllowListAddIterator{contract: _LockReleaseTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolAllowListAdd) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolAllowListAdd) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*LockReleaseTokenPoolAllowListAdd, error) { + event := new(LockReleaseTokenPoolAllowListAdd) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolAllowListRemoveIterator struct { + Event *LockReleaseTokenPoolAllowListRemove + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolAllowListRemoveIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolAllowListRemoveIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolAllowListRemoveIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolAllowListRemove struct { + Sender common.Address + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*LockReleaseTokenPoolAllowListRemoveIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolAllowListRemoveIterator{contract: _LockReleaseTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolAllowListRemove) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolAllowListRemove) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*LockReleaseTokenPoolAllowListRemove, error) { + event := new(LockReleaseTokenPoolAllowListRemove) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolBurnedIterator struct { + Event *LockReleaseTokenPoolBurned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolBurnedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolBurnedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolBurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolBurned struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*LockReleaseTokenPoolBurnedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolBurnedIterator{contract: _LockReleaseTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolBurned, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolBurned) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseBurned(log types.Log) (*LockReleaseTokenPoolBurned, error) { + event := new(LockReleaseTokenPoolBurned) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolChainAddedIterator struct { + Event *LockReleaseTokenPoolChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolChainAddedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolChainAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*LockReleaseTokenPoolChainAddedIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolChainAddedIterator{contract: _LockReleaseTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolChainAdded) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolChainAdded) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseChainAdded(log types.Log) (*LockReleaseTokenPoolChainAdded, error) { + event := new(LockReleaseTokenPoolChainAdded) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolChainConfiguredIterator struct { + Event *LockReleaseTokenPoolChainConfigured + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolChainConfiguredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolChainConfiguredIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolChainConfiguredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolChainConfigured struct { + RemoteChainSelector uint64 + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*LockReleaseTokenPoolChainConfiguredIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolChainConfiguredIterator{contract: _LockReleaseTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolChainConfigured) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolChainConfigured) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseChainConfigured(log types.Log) (*LockReleaseTokenPoolChainConfigured, error) { + event := new(LockReleaseTokenPoolChainConfigured) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolChainRemovedIterator struct { + Event *LockReleaseTokenPoolChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolChainRemovedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolChainRemoved struct { + RemoteChainSelector uint64 + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*LockReleaseTokenPoolChainRemovedIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolChainRemovedIterator{contract: _LockReleaseTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolChainRemoved) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolChainRemoved) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseChainRemoved(log types.Log) (*LockReleaseTokenPoolChainRemoved, error) { + event := new(LockReleaseTokenPoolChainRemoved) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolConfigChangedIterator struct { + Event *LockReleaseTokenPoolConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolConfigChangedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*LockReleaseTokenPoolConfigChangedIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolConfigChangedIterator{contract: _LockReleaseTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolConfigChanged) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolConfigChanged) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseConfigChanged(log types.Log) (*LockReleaseTokenPoolConfigChanged, error) { + event := new(LockReleaseTokenPoolConfigChanged) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolLiquidityAddedIterator struct { + Event *LockReleaseTokenPoolLiquidityAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolLiquidityAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolLiquidityAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolLiquidityAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolLiquidityAddedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolLiquidityAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolLiquidityAdded struct { + Provider common.Address + Amount *big.Int + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterLiquidityAdded(opts *bind.FilterOpts, provider []common.Address, amount []*big.Int) (*LockReleaseTokenPoolLiquidityAddedIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + var amountRule []interface{} + for _, amountItem := range amount { + amountRule = append(amountRule, amountItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "LiquidityAdded", providerRule, amountRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolLiquidityAddedIterator{contract: _LockReleaseTokenPool.contract, event: "LiquidityAdded", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchLiquidityAdded(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLiquidityAdded, provider []common.Address, amount []*big.Int) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + var amountRule []interface{} + for _, amountItem := range amount { + amountRule = append(amountRule, amountItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "LiquidityAdded", providerRule, amountRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolLiquidityAdded) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "LiquidityAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseLiquidityAdded(log types.Log) (*LockReleaseTokenPoolLiquidityAdded, error) { + event := new(LockReleaseTokenPoolLiquidityAdded) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "LiquidityAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolLiquidityRemovedIterator struct { + Event *LockReleaseTokenPoolLiquidityRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolLiquidityRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolLiquidityRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolLiquidityRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolLiquidityRemovedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolLiquidityRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolLiquidityRemoved struct { + Provider common.Address + Amount *big.Int + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterLiquidityRemoved(opts *bind.FilterOpts, provider []common.Address, amount []*big.Int) (*LockReleaseTokenPoolLiquidityRemovedIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + var amountRule []interface{} + for _, amountItem := range amount { + amountRule = append(amountRule, amountItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "LiquidityRemoved", providerRule, amountRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolLiquidityRemovedIterator{contract: _LockReleaseTokenPool.contract, event: "LiquidityRemoved", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchLiquidityRemoved(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLiquidityRemoved, provider []common.Address, amount []*big.Int) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + var amountRule []interface{} + for _, amountItem := range amount { + amountRule = append(amountRule, amountItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "LiquidityRemoved", providerRule, amountRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolLiquidityRemoved) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "LiquidityRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseLiquidityRemoved(log types.Log) (*LockReleaseTokenPoolLiquidityRemoved, error) { + event := new(LockReleaseTokenPoolLiquidityRemoved) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "LiquidityRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolLiquidityTransferredIterator struct { + Event *LockReleaseTokenPoolLiquidityTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolLiquidityTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolLiquidityTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolLiquidityTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolLiquidityTransferredIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolLiquidityTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolLiquidityTransferred struct { + From common.Address + Amount *big.Int + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterLiquidityTransferred(opts *bind.FilterOpts, from []common.Address) (*LockReleaseTokenPoolLiquidityTransferredIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "LiquidityTransferred", fromRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolLiquidityTransferredIterator{contract: _LockReleaseTokenPool.contract, event: "LiquidityTransferred", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchLiquidityTransferred(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLiquidityTransferred, from []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "LiquidityTransferred", fromRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolLiquidityTransferred) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "LiquidityTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseLiquidityTransferred(log types.Log) (*LockReleaseTokenPoolLiquidityTransferred, error) { + event := new(LockReleaseTokenPoolLiquidityTransferred) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "LiquidityTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolLockedIterator struct { + Event *LockReleaseTokenPoolLocked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolLockedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolLockedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolLockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolLocked struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*LockReleaseTokenPoolLockedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolLockedIterator{contract: _LockReleaseTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLocked, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolLocked) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseLocked(log types.Log) (*LockReleaseTokenPoolLocked, error) { + event := new(LockReleaseTokenPoolLocked) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolMintedIterator struct { + Event *LockReleaseTokenPoolMinted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolMintedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolMintedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*LockReleaseTokenPoolMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolMintedIterator{contract: _LockReleaseTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolMinted) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseMinted(log types.Log) (*LockReleaseTokenPoolMinted, error) { + event := new(LockReleaseTokenPoolMinted) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolOwnershipTransferRequestedIterator struct { + Event *LockReleaseTokenPoolOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*LockReleaseTokenPoolOwnershipTransferRequestedIterator, 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 := _LockReleaseTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolOwnershipTransferRequestedIterator{contract: _LockReleaseTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolOwnershipTransferRequested, 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 := _LockReleaseTokenPool.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: + + event := new(LockReleaseTokenPoolOwnershipTransferRequested) + if err := _LockReleaseTokenPool.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 +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*LockReleaseTokenPoolOwnershipTransferRequested, error) { + event := new(LockReleaseTokenPoolOwnershipTransferRequested) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolOwnershipTransferredIterator struct { + Event *LockReleaseTokenPoolOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*LockReleaseTokenPoolOwnershipTransferredIterator, 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 := _LockReleaseTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolOwnershipTransferredIterator{contract: _LockReleaseTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolOwnershipTransferred, 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 := _LockReleaseTokenPool.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: + + event := new(LockReleaseTokenPoolOwnershipTransferred) + if err := _LockReleaseTokenPool.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 +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*LockReleaseTokenPoolOwnershipTransferred, error) { + event := new(LockReleaseTokenPoolOwnershipTransferred) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolRateLimitAdminSetIterator struct { + Event *LockReleaseTokenPoolRateLimitAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolRateLimitAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolRateLimitAdminSetIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolRateLimitAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolRateLimitAdminSet struct { + RateLimitAdmin common.Address + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*LockReleaseTokenPoolRateLimitAdminSetIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolRateLimitAdminSetIterator{contract: _LockReleaseTokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolRateLimitAdminSet) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolRateLimitAdminSet) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*LockReleaseTokenPoolRateLimitAdminSet, error) { + event := new(LockReleaseTokenPoolRateLimitAdminSet) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolReleasedIterator struct { + Event *LockReleaseTokenPoolReleased + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolReleasedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolReleasedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolReleasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolReleased struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*LockReleaseTokenPoolReleasedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolReleasedIterator{contract: _LockReleaseTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolReleased) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseReleased(log types.Log) (*LockReleaseTokenPoolReleased, error) { + event := new(LockReleaseTokenPoolReleased) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolRemotePoolAddedIterator struct { + Event *LockReleaseTokenPoolRemotePoolAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolRemotePoolAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolRemotePoolAddedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolRemotePoolAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolRemotePoolAdded struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LockReleaseTokenPoolRemotePoolAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolRemotePoolAddedIterator{contract: _LockReleaseTokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolRemotePoolAdded) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*LockReleaseTokenPoolRemotePoolAdded, error) { + event := new(LockReleaseTokenPoolRemotePoolAdded) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolRemotePoolRemovedIterator struct { + Event *LockReleaseTokenPoolRemotePoolRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolRemotePoolRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolRemotePoolRemovedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolRemotePoolRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolRemotePoolRemoved struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LockReleaseTokenPoolRemotePoolRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolRemotePoolRemovedIterator{contract: _LockReleaseTokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolRemotePoolRemoved) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*LockReleaseTokenPoolRemotePoolRemoved, error) { + event := new(LockReleaseTokenPoolRemotePoolRemoved) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolRouterUpdatedIterator struct { + Event *LockReleaseTokenPoolRouterUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolRouterUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolRouterUpdatedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolRouterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolRouterUpdated struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*LockReleaseTokenPoolRouterUpdatedIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolRouterUpdatedIterator{contract: _LockReleaseTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolRouterUpdated) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolRouterUpdated) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*LockReleaseTokenPoolRouterUpdated, error) { + event := new(LockReleaseTokenPoolRouterUpdated) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type LockReleaseTokenPoolTokensConsumedIterator struct { + Event *LockReleaseTokenPoolTokensConsumed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *LockReleaseTokenPoolTokensConsumedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(LockReleaseTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *LockReleaseTokenPoolTokensConsumedIterator) Error() error { + return it.fail +} + +func (it *LockReleaseTokenPoolTokensConsumedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type LockReleaseTokenPoolTokensConsumed struct { + Tokens *big.Int + Raw types.Log +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*LockReleaseTokenPoolTokensConsumedIterator, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return &LockReleaseTokenPoolTokensConsumedIterator{contract: _LockReleaseTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolTokensConsumed) (event.Subscription, error) { + + logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(LockReleaseTokenPoolTokensConsumed) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*LockReleaseTokenPoolTokensConsumed, error) { + event := new(LockReleaseTokenPoolTokensConsumed) + if err := _LockReleaseTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_LockReleaseTokenPool *LockReleaseTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _LockReleaseTokenPool.abi.Events["AllowListAdd"].ID: + return _LockReleaseTokenPool.ParseAllowListAdd(log) + case _LockReleaseTokenPool.abi.Events["AllowListRemove"].ID: + return _LockReleaseTokenPool.ParseAllowListRemove(log) + case _LockReleaseTokenPool.abi.Events["Burned"].ID: + return _LockReleaseTokenPool.ParseBurned(log) + case _LockReleaseTokenPool.abi.Events["ChainAdded"].ID: + return _LockReleaseTokenPool.ParseChainAdded(log) + case _LockReleaseTokenPool.abi.Events["ChainConfigured"].ID: + return _LockReleaseTokenPool.ParseChainConfigured(log) + case _LockReleaseTokenPool.abi.Events["ChainRemoved"].ID: + return _LockReleaseTokenPool.ParseChainRemoved(log) + case _LockReleaseTokenPool.abi.Events["ConfigChanged"].ID: + return _LockReleaseTokenPool.ParseConfigChanged(log) + case _LockReleaseTokenPool.abi.Events["LiquidityAdded"].ID: + return _LockReleaseTokenPool.ParseLiquidityAdded(log) + case _LockReleaseTokenPool.abi.Events["LiquidityRemoved"].ID: + return _LockReleaseTokenPool.ParseLiquidityRemoved(log) + case _LockReleaseTokenPool.abi.Events["LiquidityTransferred"].ID: + return _LockReleaseTokenPool.ParseLiquidityTransferred(log) + case _LockReleaseTokenPool.abi.Events["Locked"].ID: + return _LockReleaseTokenPool.ParseLocked(log) + case _LockReleaseTokenPool.abi.Events["Minted"].ID: + return _LockReleaseTokenPool.ParseMinted(log) + case _LockReleaseTokenPool.abi.Events["OwnershipTransferRequested"].ID: + return _LockReleaseTokenPool.ParseOwnershipTransferRequested(log) + case _LockReleaseTokenPool.abi.Events["OwnershipTransferred"].ID: + return _LockReleaseTokenPool.ParseOwnershipTransferred(log) + case _LockReleaseTokenPool.abi.Events["RateLimitAdminSet"].ID: + return _LockReleaseTokenPool.ParseRateLimitAdminSet(log) + case _LockReleaseTokenPool.abi.Events["Released"].ID: + return _LockReleaseTokenPool.ParseReleased(log) + case _LockReleaseTokenPool.abi.Events["RemotePoolAdded"].ID: + return _LockReleaseTokenPool.ParseRemotePoolAdded(log) + case _LockReleaseTokenPool.abi.Events["RemotePoolRemoved"].ID: + return _LockReleaseTokenPool.ParseRemotePoolRemoved(log) + case _LockReleaseTokenPool.abi.Events["RouterUpdated"].ID: + return _LockReleaseTokenPool.ParseRouterUpdated(log) + case _LockReleaseTokenPool.abi.Events["TokensConsumed"].ID: + return _LockReleaseTokenPool.ParseTokensConsumed(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (LockReleaseTokenPoolAllowListAdd) Topic() common.Hash { + return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8") +} + +func (LockReleaseTokenPoolAllowListRemove) Topic() common.Hash { + return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566") +} + +func (LockReleaseTokenPoolBurned) Topic() common.Hash { + return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7") +} + +func (LockReleaseTokenPoolChainAdded) Topic() common.Hash { + return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") +} + +func (LockReleaseTokenPoolChainConfigured) Topic() common.Hash { + return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b") +} + +func (LockReleaseTokenPoolChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (LockReleaseTokenPoolConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (LockReleaseTokenPoolLiquidityAdded) Topic() common.Hash { + return common.HexToHash("0xc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb312088") +} + +func (LockReleaseTokenPoolLiquidityRemoved) Topic() common.Hash { + return common.HexToHash("0xc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf9840171719") +} + +func (LockReleaseTokenPoolLiquidityTransferred) Topic() common.Hash { + return common.HexToHash("0x6fa7abcf1345d1d478e5ea0da6b5f26a90eadb0546ef15ed3833944fbfd1db62") +} + +func (LockReleaseTokenPoolLocked) Topic() common.Hash { + return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008") +} + +func (LockReleaseTokenPoolMinted) Topic() common.Hash { + return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0") +} + +func (LockReleaseTokenPoolOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (LockReleaseTokenPoolOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (LockReleaseTokenPoolRateLimitAdminSet) Topic() common.Hash { + return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174") +} + +func (LockReleaseTokenPoolReleased) Topic() common.Hash { + return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52") +} + +func (LockReleaseTokenPoolRemotePoolAdded) Topic() common.Hash { + return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea") +} + +func (LockReleaseTokenPoolRemotePoolRemoved) Topic() common.Hash { + return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76") +} + +func (LockReleaseTokenPoolRouterUpdated) Topic() common.Hash { + return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684") +} + +func (LockReleaseTokenPoolTokensConsumed) Topic() common.Hash { + return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a") +} + +func (_LockReleaseTokenPool *LockReleaseTokenPool) Address() common.Address { + return _LockReleaseTokenPool.address +} + +type LockReleaseTokenPoolInterface interface { + CanAcceptLiquidity(opts *bind.CallOpts) (bool, error) + + GetAllowList(opts *bind.CallOpts) ([]common.Address, error) + + GetAllowListEnabled(opts *bind.CallOpts) (bool, error) + + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) + + GetRebalancer(opts *bind.CallOpts) (common.Address, error) + + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) + + GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) + + GetRmnProxy(opts *bind.CallOpts) (common.Address, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) + + GetToken(opts *bind.CallOpts) (common.Address, error) + + GetTokenDecimals(opts *bind.CallOpts) (uint8, error) + + IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) + + IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) + + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + + ProvideLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) + + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) + + SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) + + SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) + + SetRebalancer(opts *bind.TransactOpts, rebalancer common.Address) (*types.Transaction, error) + + SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + TransferLiquidity(opts *bind.TransactOpts, from common.Address, amount *big.Int) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + WithdrawLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) + + FilterAllowListAdd(opts *bind.FilterOpts) (*LockReleaseTokenPoolAllowListAddIterator, error) + + WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolAllowListAdd) (event.Subscription, error) + + ParseAllowListAdd(log types.Log) (*LockReleaseTokenPoolAllowListAdd, error) + + FilterAllowListRemove(opts *bind.FilterOpts) (*LockReleaseTokenPoolAllowListRemoveIterator, error) + + WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolAllowListRemove) (event.Subscription, error) + + ParseAllowListRemove(log types.Log) (*LockReleaseTokenPoolAllowListRemove, error) + + FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*LockReleaseTokenPoolBurnedIterator, error) + + WatchBurned(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolBurned, sender []common.Address) (event.Subscription, error) + + ParseBurned(log types.Log) (*LockReleaseTokenPoolBurned, error) + + FilterChainAdded(opts *bind.FilterOpts) (*LockReleaseTokenPoolChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*LockReleaseTokenPoolChainAdded, error) + + FilterChainConfigured(opts *bind.FilterOpts) (*LockReleaseTokenPoolChainConfiguredIterator, error) + + WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolChainConfigured) (event.Subscription, error) + + ParseChainConfigured(log types.Log) (*LockReleaseTokenPoolChainConfigured, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*LockReleaseTokenPoolChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*LockReleaseTokenPoolChainRemoved, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*LockReleaseTokenPoolConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*LockReleaseTokenPoolConfigChanged, error) + + FilterLiquidityAdded(opts *bind.FilterOpts, provider []common.Address, amount []*big.Int) (*LockReleaseTokenPoolLiquidityAddedIterator, error) + + WatchLiquidityAdded(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLiquidityAdded, provider []common.Address, amount []*big.Int) (event.Subscription, error) + + ParseLiquidityAdded(log types.Log) (*LockReleaseTokenPoolLiquidityAdded, error) + + FilterLiquidityRemoved(opts *bind.FilterOpts, provider []common.Address, amount []*big.Int) (*LockReleaseTokenPoolLiquidityRemovedIterator, error) + + WatchLiquidityRemoved(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLiquidityRemoved, provider []common.Address, amount []*big.Int) (event.Subscription, error) + + ParseLiquidityRemoved(log types.Log) (*LockReleaseTokenPoolLiquidityRemoved, error) + + FilterLiquidityTransferred(opts *bind.FilterOpts, from []common.Address) (*LockReleaseTokenPoolLiquidityTransferredIterator, error) + + WatchLiquidityTransferred(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLiquidityTransferred, from []common.Address) (event.Subscription, error) + + ParseLiquidityTransferred(log types.Log) (*LockReleaseTokenPoolLiquidityTransferred, error) + + FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*LockReleaseTokenPoolLockedIterator, error) + + WatchLocked(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLocked, sender []common.Address) (event.Subscription, error) + + ParseLocked(log types.Log) (*LockReleaseTokenPoolLocked, error) + + FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*LockReleaseTokenPoolMintedIterator, error) + + WatchMinted(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseMinted(log types.Log) (*LockReleaseTokenPoolMinted, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*LockReleaseTokenPoolOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*LockReleaseTokenPoolOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*LockReleaseTokenPoolOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*LockReleaseTokenPoolOwnershipTransferred, error) + + FilterRateLimitAdminSet(opts *bind.FilterOpts) (*LockReleaseTokenPoolRateLimitAdminSetIterator, error) + + WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolRateLimitAdminSet) (event.Subscription, error) + + ParseRateLimitAdminSet(log types.Log) (*LockReleaseTokenPoolRateLimitAdminSet, error) + + FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*LockReleaseTokenPoolReleasedIterator, error) + + WatchReleased(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseReleased(log types.Log) (*LockReleaseTokenPoolReleased, error) + + FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LockReleaseTokenPoolRemotePoolAddedIterator, error) + + WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolAdded(log types.Log) (*LockReleaseTokenPoolRemotePoolAdded, error) + + FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*LockReleaseTokenPoolRemotePoolRemovedIterator, error) + + WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolRemoved(log types.Log) (*LockReleaseTokenPoolRemotePoolRemoved, error) + + FilterRouterUpdated(opts *bind.FilterOpts) (*LockReleaseTokenPoolRouterUpdatedIterator, error) + + WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolRouterUpdated) (event.Subscription, error) + + ParseRouterUpdated(log types.Log) (*LockReleaseTokenPoolRouterUpdated, error) + + FilterTokensConsumed(opts *bind.FilterOpts) (*LockReleaseTokenPoolTokensConsumedIterator, error) + + WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolTokensConsumed) (event.Subscription, error) + + ParseTokensConsumed(log types.Log) (*LockReleaseTokenPoolTokensConsumed, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_5_1/token_pool/token_pool.go b/core/gethwrappers/ccip/generated/v1_5_1/token_pool/token_pool.go new file mode 100644 index 00000000000..587f4ebb84b --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_1/token_pool/token_pool.go @@ -0,0 +1,2989 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package token_pool + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type PoolLockOrBurnInV1 struct { + Receiver []byte + RemoteChainSelector uint64 + OriginalSender common.Address + Amount *big.Int + LocalToken common.Address +} + +type PoolLockOrBurnOutV1 struct { + DestTokenAddress []byte + DestPoolData []byte +} + +type PoolReleaseOrMintInV1 struct { + OriginalSender []byte + RemoteChainSelector uint64 + Receiver common.Address + Amount *big.Int + LocalToken common.Address + SourcePoolAddress []byte + SourcePoolData []byte + OffchainTokenData []byte +} + +type PoolReleaseOrMintOutV1 struct { + DestinationAmount *big.Int +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type TokenPoolChainUpdate struct { + RemoteChainSelector uint64 + RemotePoolAddresses [][]byte + RemoteTokenAddress []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig +} + +var TokenPoolMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"lockOrBurnOut\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", +} + +var TokenPoolABI = TokenPoolMetaData.ABI + +type TokenPool struct { + address common.Address + abi abi.ABI + TokenPoolCaller + TokenPoolTransactor + TokenPoolFilterer +} + +type TokenPoolCaller struct { + contract *bind.BoundContract +} + +type TokenPoolTransactor struct { + contract *bind.BoundContract +} + +type TokenPoolFilterer struct { + contract *bind.BoundContract +} + +type TokenPoolSession struct { + Contract *TokenPool + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type TokenPoolCallerSession struct { + Contract *TokenPoolCaller + CallOpts bind.CallOpts +} + +type TokenPoolTransactorSession struct { + Contract *TokenPoolTransactor + TransactOpts bind.TransactOpts +} + +type TokenPoolRaw struct { + Contract *TokenPool +} + +type TokenPoolCallerRaw struct { + Contract *TokenPoolCaller +} + +type TokenPoolTransactorRaw struct { + Contract *TokenPoolTransactor +} + +func NewTokenPool(address common.Address, backend bind.ContractBackend) (*TokenPool, error) { + abi, err := abi.JSON(strings.NewReader(TokenPoolABI)) + if err != nil { + return nil, err + } + contract, err := bindTokenPool(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &TokenPool{address: address, abi: abi, TokenPoolCaller: TokenPoolCaller{contract: contract}, TokenPoolTransactor: TokenPoolTransactor{contract: contract}, TokenPoolFilterer: TokenPoolFilterer{contract: contract}}, nil +} + +func NewTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*TokenPoolCaller, error) { + contract, err := bindTokenPool(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &TokenPoolCaller{contract: contract}, nil +} + +func NewTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*TokenPoolTransactor, error) { + contract, err := bindTokenPool(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &TokenPoolTransactor{contract: contract}, nil +} + +func NewTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*TokenPoolFilterer, error) { + contract, err := bindTokenPool(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &TokenPoolFilterer{contract: contract}, nil +} + +func bindTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := TokenPoolMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_TokenPool *TokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _TokenPool.Contract.TokenPoolCaller.contract.Call(opts, result, method, params...) +} + +func (_TokenPool *TokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TokenPool.Contract.TokenPoolTransactor.contract.Transfer(opts) +} + +func (_TokenPool *TokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _TokenPool.Contract.TokenPoolTransactor.contract.Transact(opts, method, params...) +} + +func (_TokenPool *TokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _TokenPool.Contract.contract.Call(opts, result, method, params...) +} + +func (_TokenPool *TokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TokenPool.Contract.contract.Transfer(opts) +} + +func (_TokenPool *TokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _TokenPool.Contract.contract.Transact(opts, method, params...) +} + +func (_TokenPool *TokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getAllowList") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetAllowList() ([]common.Address, error) { + return _TokenPool.Contract.GetAllowList(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) GetAllowList() ([]common.Address, error) { + return _TokenPool.Contract.GetAllowList(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getAllowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetAllowListEnabled() (bool, error) { + return _TokenPool.Contract.GetAllowListEnabled(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) GetAllowListEnabled() (bool, error) { + return _TokenPool.Contract.GetAllowListEnabled(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _TokenPool.Contract.GetCurrentInboundRateLimiterState(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _TokenPool.Contract.GetCurrentInboundRateLimiterState(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _TokenPool.Contract.GetCurrentOutboundRateLimiterState(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _TokenPool.Contract.GetCurrentOutboundRateLimiterState(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getRateLimitAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetRateLimitAdmin() (common.Address, error) { + return _TokenPool.Contract.GetRateLimitAdmin(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) { + return _TokenPool.Contract.GetRateLimitAdmin(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _TokenPool.Contract.GetRemotePools(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _TokenPool.Contract.GetRemotePools(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _TokenPool.Contract.GetRemoteToken(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _TokenPool.Contract.GetRemoteToken(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getRmnProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetRmnProxy() (common.Address, error) { + return _TokenPool.Contract.GetRmnProxy(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) GetRmnProxy() (common.Address, error) { + return _TokenPool.Contract.GetRmnProxy(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetRouter() (common.Address, error) { + return _TokenPool.Contract.GetRouter(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) GetRouter() (common.Address, error) { + return _TokenPool.Contract.GetRouter(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getSupportedChains") + + if err != nil { + return *new([]uint64), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetSupportedChains() ([]uint64, error) { + return _TokenPool.Contract.GetSupportedChains(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) GetSupportedChains() ([]uint64, error) { + return _TokenPool.Contract.GetSupportedChains(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetToken() (common.Address, error) { + return _TokenPool.Contract.GetToken(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) GetToken() (common.Address, error) { + return _TokenPool.Contract.GetToken(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "getTokenDecimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) GetTokenDecimals() (uint8, error) { + return _TokenPool.Contract.GetTokenDecimals(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) GetTokenDecimals() (uint8, error) { + return _TokenPool.Contract.GetTokenDecimals(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _TokenPool.Contract.IsRemotePool(&_TokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_TokenPool *TokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _TokenPool.Contract.IsRemotePool(&_TokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_TokenPool *TokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _TokenPool.Contract.IsSupportedChain(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _TokenPool.Contract.IsSupportedChain(&_TokenPool.CallOpts, remoteChainSelector) +} + +func (_TokenPool *TokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "isSupportedToken", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) IsSupportedToken(token common.Address) (bool, error) { + return _TokenPool.Contract.IsSupportedToken(&_TokenPool.CallOpts, token) +} + +func (_TokenPool *TokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) { + return _TokenPool.Contract.IsSupportedToken(&_TokenPool.CallOpts, token) +} + +func (_TokenPool *TokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _TokenPool.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 + +} + +func (_TokenPool *TokenPoolSession) Owner() (common.Address, error) { + return _TokenPool.Contract.Owner(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCallerSession) Owner() (common.Address, error) { + return _TokenPool.Contract.Owner(&_TokenPool.CallOpts) +} + +func (_TokenPool *TokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _TokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_TokenPool *TokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _TokenPool.Contract.SupportsInterface(&_TokenPool.CallOpts, interfaceId) +} + +func (_TokenPool *TokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _TokenPool.Contract.SupportsInterface(&_TokenPool.CallOpts, interfaceId) +} + +func (_TokenPool *TokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "acceptOwnership") +} + +func (_TokenPool *TokenPoolSession) AcceptOwnership() (*types.Transaction, error) { + return _TokenPool.Contract.AcceptOwnership(&_TokenPool.TransactOpts) +} + +func (_TokenPool *TokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _TokenPool.Contract.AcceptOwnership(&_TokenPool.TransactOpts) +} + +func (_TokenPool *TokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_TokenPool *TokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _TokenPool.Contract.AddRemotePool(&_TokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_TokenPool *TokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _TokenPool.Contract.AddRemotePool(&_TokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_TokenPool *TokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds) +} + +func (_TokenPool *TokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _TokenPool.Contract.ApplyAllowListUpdates(&_TokenPool.TransactOpts, removes, adds) +} + +func (_TokenPool *TokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _TokenPool.Contract.ApplyAllowListUpdates(&_TokenPool.TransactOpts, removes, adds) +} + +func (_TokenPool *TokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_TokenPool *TokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _TokenPool.Contract.ApplyChainUpdates(&_TokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_TokenPool *TokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _TokenPool.Contract.ApplyChainUpdates(&_TokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_TokenPool *TokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_TokenPool *TokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _TokenPool.Contract.LockOrBurn(&_TokenPool.TransactOpts, lockOrBurnIn) +} + +func (_TokenPool *TokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _TokenPool.Contract.LockOrBurn(&_TokenPool.TransactOpts, lockOrBurnIn) +} + +func (_TokenPool *TokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_TokenPool *TokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _TokenPool.Contract.ReleaseOrMint(&_TokenPool.TransactOpts, releaseOrMintIn) +} + +func (_TokenPool *TokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _TokenPool.Contract.ReleaseOrMint(&_TokenPool.TransactOpts, releaseOrMintIn) +} + +func (_TokenPool *TokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_TokenPool *TokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _TokenPool.Contract.RemoveRemotePool(&_TokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_TokenPool *TokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _TokenPool.Contract.RemoveRemotePool(&_TokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_TokenPool *TokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_TokenPool *TokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _TokenPool.Contract.SetChainRateLimiterConfig(&_TokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_TokenPool *TokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _TokenPool.Contract.SetChainRateLimiterConfig(&_TokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_TokenPool *TokenPoolTransactor) SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "setChainRateLimiterConfigs", remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_TokenPool *TokenPoolSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _TokenPool.Contract.SetChainRateLimiterConfigs(&_TokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_TokenPool *TokenPoolTransactorSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _TokenPool.Contract.SetChainRateLimiterConfigs(&_TokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_TokenPool *TokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin) +} + +func (_TokenPool *TokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _TokenPool.Contract.SetRateLimitAdmin(&_TokenPool.TransactOpts, rateLimitAdmin) +} + +func (_TokenPool *TokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _TokenPool.Contract.SetRateLimitAdmin(&_TokenPool.TransactOpts, rateLimitAdmin) +} + +func (_TokenPool *TokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "setRouter", newRouter) +} + +func (_TokenPool *TokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _TokenPool.Contract.SetRouter(&_TokenPool.TransactOpts, newRouter) +} + +func (_TokenPool *TokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _TokenPool.Contract.SetRouter(&_TokenPool.TransactOpts, newRouter) +} + +func (_TokenPool *TokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _TokenPool.contract.Transact(opts, "transferOwnership", to) +} + +func (_TokenPool *TokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _TokenPool.Contract.TransferOwnership(&_TokenPool.TransactOpts, to) +} + +func (_TokenPool *TokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _TokenPool.Contract.TransferOwnership(&_TokenPool.TransactOpts, to) +} + +type TokenPoolAllowListAddIterator struct { + Event *TokenPoolAllowListAdd + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolAllowListAddIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolAllowListAddIterator) Error() error { + return it.fail +} + +func (it *TokenPoolAllowListAddIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolAllowListAdd struct { + Sender common.Address + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*TokenPoolAllowListAddIterator, error) { + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return &TokenPoolAllowListAddIterator{contract: _TokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *TokenPoolAllowListAdd) (event.Subscription, error) { + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolAllowListAdd) + if err := _TokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseAllowListAdd(log types.Log) (*TokenPoolAllowListAdd, error) { + event := new(TokenPoolAllowListAdd) + if err := _TokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolAllowListRemoveIterator struct { + Event *TokenPoolAllowListRemove + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolAllowListRemoveIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolAllowListRemoveIterator) Error() error { + return it.fail +} + +func (it *TokenPoolAllowListRemoveIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolAllowListRemove struct { + Sender common.Address + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*TokenPoolAllowListRemoveIterator, error) { + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return &TokenPoolAllowListRemoveIterator{contract: _TokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *TokenPoolAllowListRemove) (event.Subscription, error) { + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolAllowListRemove) + if err := _TokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseAllowListRemove(log types.Log) (*TokenPoolAllowListRemove, error) { + event := new(TokenPoolAllowListRemove) + if err := _TokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolBurnedIterator struct { + Event *TokenPoolBurned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolBurnedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolBurnedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolBurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolBurned struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*TokenPoolBurnedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return &TokenPoolBurnedIterator{contract: _TokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *TokenPoolBurned, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolBurned) + if err := _TokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseBurned(log types.Log) (*TokenPoolBurned, error) { + event := new(TokenPoolBurned) + if err := _TokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolChainAddedIterator struct { + Event *TokenPoolChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolChainAddedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolChainAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*TokenPoolChainAddedIterator, error) { + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &TokenPoolChainAddedIterator{contract: _TokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *TokenPoolChainAdded) (event.Subscription, error) { + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolChainAdded) + if err := _TokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseChainAdded(log types.Log) (*TokenPoolChainAdded, error) { + event := new(TokenPoolChainAdded) + if err := _TokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolChainConfiguredIterator struct { + Event *TokenPoolChainConfigured + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolChainConfiguredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolChainConfiguredIterator) Error() error { + return it.fail +} + +func (it *TokenPoolChainConfiguredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolChainConfigured struct { + RemoteChainSelector uint64 + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*TokenPoolChainConfiguredIterator, error) { + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return &TokenPoolChainConfiguredIterator{contract: _TokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *TokenPoolChainConfigured) (event.Subscription, error) { + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolChainConfigured) + if err := _TokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseChainConfigured(log types.Log) (*TokenPoolChainConfigured, error) { + event := new(TokenPoolChainConfigured) + if err := _TokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolChainRemovedIterator struct { + Event *TokenPoolChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolChainRemovedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolChainRemoved struct { + RemoteChainSelector uint64 + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*TokenPoolChainRemovedIterator, error) { + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &TokenPoolChainRemovedIterator{contract: _TokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *TokenPoolChainRemoved) (event.Subscription, error) { + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolChainRemoved) + if err := _TokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseChainRemoved(log types.Log) (*TokenPoolChainRemoved, error) { + event := new(TokenPoolChainRemoved) + if err := _TokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolConfigChangedIterator struct { + Event *TokenPoolConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolConfigChangedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*TokenPoolConfigChangedIterator, error) { + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &TokenPoolConfigChangedIterator{contract: _TokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *TokenPoolConfigChanged) (event.Subscription, error) { + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolConfigChanged) + if err := _TokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseConfigChanged(log types.Log) (*TokenPoolConfigChanged, error) { + event := new(TokenPoolConfigChanged) + if err := _TokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolLockedIterator struct { + Event *TokenPoolLocked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolLockedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolLockedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolLockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolLocked struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*TokenPoolLockedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return &TokenPoolLockedIterator{contract: _TokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *TokenPoolLocked, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolLocked) + if err := _TokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseLocked(log types.Log) (*TokenPoolLocked, error) { + event := new(TokenPoolLocked) + if err := _TokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolMintedIterator struct { + Event *TokenPoolMinted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolMintedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolMintedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*TokenPoolMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &TokenPoolMintedIterator{contract: _TokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *TokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolMinted) + if err := _TokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseMinted(log types.Log) (*TokenPoolMinted, error) { + event := new(TokenPoolMinted) + if err := _TokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolOwnershipTransferRequestedIterator struct { + Event *TokenPoolOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TokenPoolOwnershipTransferRequestedIterator, 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 := _TokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &TokenPoolOwnershipTransferRequestedIterator{contract: _TokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *TokenPoolOwnershipTransferRequested, 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 := _TokenPool.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: + + event := new(TokenPoolOwnershipTransferRequested) + if err := _TokenPool.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 +} + +func (_TokenPool *TokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*TokenPoolOwnershipTransferRequested, error) { + event := new(TokenPoolOwnershipTransferRequested) + if err := _TokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolOwnershipTransferredIterator struct { + Event *TokenPoolOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *TokenPoolOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TokenPoolOwnershipTransferredIterator, 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 := _TokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &TokenPoolOwnershipTransferredIterator{contract: _TokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *TokenPoolOwnershipTransferred, 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 := _TokenPool.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: + + event := new(TokenPoolOwnershipTransferred) + if err := _TokenPool.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 +} + +func (_TokenPool *TokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*TokenPoolOwnershipTransferred, error) { + event := new(TokenPoolOwnershipTransferred) + if err := _TokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolRateLimitAdminSetIterator struct { + Event *TokenPoolRateLimitAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolRateLimitAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolRateLimitAdminSetIterator) Error() error { + return it.fail +} + +func (it *TokenPoolRateLimitAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolRateLimitAdminSet struct { + RateLimitAdmin common.Address + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*TokenPoolRateLimitAdminSetIterator, error) { + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return &TokenPoolRateLimitAdminSetIterator{contract: _TokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *TokenPoolRateLimitAdminSet) (event.Subscription, error) { + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolRateLimitAdminSet) + if err := _TokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*TokenPoolRateLimitAdminSet, error) { + event := new(TokenPoolRateLimitAdminSet) + if err := _TokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolReleasedIterator struct { + Event *TokenPoolReleased + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolReleasedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolReleasedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolReleasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolReleased struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*TokenPoolReleasedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &TokenPoolReleasedIterator{contract: _TokenPool.contract, event: "Released", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *TokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolReleased) + if err := _TokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseReleased(log types.Log) (*TokenPoolReleased, error) { + event := new(TokenPoolReleased) + if err := _TokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolRemotePoolAddedIterator struct { + Event *TokenPoolRemotePoolAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolRemotePoolAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolRemotePoolAddedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolRemotePoolAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolRemotePoolAdded struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*TokenPoolRemotePoolAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &TokenPoolRemotePoolAddedIterator{contract: _TokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *TokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolRemotePoolAdded) + if err := _TokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*TokenPoolRemotePoolAdded, error) { + event := new(TokenPoolRemotePoolAdded) + if err := _TokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolRemotePoolRemovedIterator struct { + Event *TokenPoolRemotePoolRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolRemotePoolRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolRemotePoolRemovedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolRemotePoolRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolRemotePoolRemoved struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*TokenPoolRemotePoolRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &TokenPoolRemotePoolRemovedIterator{contract: _TokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *TokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolRemotePoolRemoved) + if err := _TokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*TokenPoolRemotePoolRemoved, error) { + event := new(TokenPoolRemotePoolRemoved) + if err := _TokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type TokenPoolRouterUpdatedIterator struct { + Event *TokenPoolRouterUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *TokenPoolRouterUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(TokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(TokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *TokenPoolRouterUpdatedIterator) Error() error { + return it.fail +} + +func (it *TokenPoolRouterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type TokenPoolRouterUpdated struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_TokenPool *TokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*TokenPoolRouterUpdatedIterator, error) { + + logs, sub, err := _TokenPool.contract.FilterLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return &TokenPoolRouterUpdatedIterator{contract: _TokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil +} + +func (_TokenPool *TokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *TokenPoolRouterUpdated) (event.Subscription, error) { + + logs, sub, err := _TokenPool.contract.WatchLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(TokenPoolRouterUpdated) + if err := _TokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_TokenPool *TokenPoolFilterer) ParseRouterUpdated(log types.Log) (*TokenPoolRouterUpdated, error) { + event := new(TokenPoolRouterUpdated) + if err := _TokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_TokenPool *TokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _TokenPool.abi.Events["AllowListAdd"].ID: + return _TokenPool.ParseAllowListAdd(log) + case _TokenPool.abi.Events["AllowListRemove"].ID: + return _TokenPool.ParseAllowListRemove(log) + case _TokenPool.abi.Events["Burned"].ID: + return _TokenPool.ParseBurned(log) + case _TokenPool.abi.Events["ChainAdded"].ID: + return _TokenPool.ParseChainAdded(log) + case _TokenPool.abi.Events["ChainConfigured"].ID: + return _TokenPool.ParseChainConfigured(log) + case _TokenPool.abi.Events["ChainRemoved"].ID: + return _TokenPool.ParseChainRemoved(log) + case _TokenPool.abi.Events["ConfigChanged"].ID: + return _TokenPool.ParseConfigChanged(log) + case _TokenPool.abi.Events["Locked"].ID: + return _TokenPool.ParseLocked(log) + case _TokenPool.abi.Events["Minted"].ID: + return _TokenPool.ParseMinted(log) + case _TokenPool.abi.Events["OwnershipTransferRequested"].ID: + return _TokenPool.ParseOwnershipTransferRequested(log) + case _TokenPool.abi.Events["OwnershipTransferred"].ID: + return _TokenPool.ParseOwnershipTransferred(log) + case _TokenPool.abi.Events["RateLimitAdminSet"].ID: + return _TokenPool.ParseRateLimitAdminSet(log) + case _TokenPool.abi.Events["Released"].ID: + return _TokenPool.ParseReleased(log) + case _TokenPool.abi.Events["RemotePoolAdded"].ID: + return _TokenPool.ParseRemotePoolAdded(log) + case _TokenPool.abi.Events["RemotePoolRemoved"].ID: + return _TokenPool.ParseRemotePoolRemoved(log) + case _TokenPool.abi.Events["RouterUpdated"].ID: + return _TokenPool.ParseRouterUpdated(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (TokenPoolAllowListAdd) Topic() common.Hash { + return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8") +} + +func (TokenPoolAllowListRemove) Topic() common.Hash { + return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566") +} + +func (TokenPoolBurned) Topic() common.Hash { + return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7") +} + +func (TokenPoolChainAdded) Topic() common.Hash { + return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") +} + +func (TokenPoolChainConfigured) Topic() common.Hash { + return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b") +} + +func (TokenPoolChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (TokenPoolConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (TokenPoolLocked) Topic() common.Hash { + return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008") +} + +func (TokenPoolMinted) Topic() common.Hash { + return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0") +} + +func (TokenPoolOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (TokenPoolOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (TokenPoolRateLimitAdminSet) Topic() common.Hash { + return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174") +} + +func (TokenPoolReleased) Topic() common.Hash { + return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52") +} + +func (TokenPoolRemotePoolAdded) Topic() common.Hash { + return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea") +} + +func (TokenPoolRemotePoolRemoved) Topic() common.Hash { + return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76") +} + +func (TokenPoolRouterUpdated) Topic() common.Hash { + return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684") +} + +func (_TokenPool *TokenPool) Address() common.Address { + return _TokenPool.address +} + +type TokenPoolInterface interface { + GetAllowList(opts *bind.CallOpts) ([]common.Address, error) + + GetAllowListEnabled(opts *bind.CallOpts) (bool, error) + + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) + + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) + + GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) + + GetRmnProxy(opts *bind.CallOpts) (common.Address, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) + + GetToken(opts *bind.CallOpts) (common.Address, error) + + GetTokenDecimals(opts *bind.CallOpts) (uint8, error) + + IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) + + IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) + + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) + + SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) + + SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) + + SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAllowListAdd(opts *bind.FilterOpts) (*TokenPoolAllowListAddIterator, error) + + WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *TokenPoolAllowListAdd) (event.Subscription, error) + + ParseAllowListAdd(log types.Log) (*TokenPoolAllowListAdd, error) + + FilterAllowListRemove(opts *bind.FilterOpts) (*TokenPoolAllowListRemoveIterator, error) + + WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *TokenPoolAllowListRemove) (event.Subscription, error) + + ParseAllowListRemove(log types.Log) (*TokenPoolAllowListRemove, error) + + FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*TokenPoolBurnedIterator, error) + + WatchBurned(opts *bind.WatchOpts, sink chan<- *TokenPoolBurned, sender []common.Address) (event.Subscription, error) + + ParseBurned(log types.Log) (*TokenPoolBurned, error) + + FilterChainAdded(opts *bind.FilterOpts) (*TokenPoolChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *TokenPoolChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*TokenPoolChainAdded, error) + + FilterChainConfigured(opts *bind.FilterOpts) (*TokenPoolChainConfiguredIterator, error) + + WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *TokenPoolChainConfigured) (event.Subscription, error) + + ParseChainConfigured(log types.Log) (*TokenPoolChainConfigured, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*TokenPoolChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *TokenPoolChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*TokenPoolChainRemoved, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*TokenPoolConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *TokenPoolConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*TokenPoolConfigChanged, error) + + FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*TokenPoolLockedIterator, error) + + WatchLocked(opts *bind.WatchOpts, sink chan<- *TokenPoolLocked, sender []common.Address) (event.Subscription, error) + + ParseLocked(log types.Log) (*TokenPoolLocked, error) + + FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*TokenPoolMintedIterator, error) + + WatchMinted(opts *bind.WatchOpts, sink chan<- *TokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseMinted(log types.Log) (*TokenPoolMinted, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TokenPoolOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *TokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*TokenPoolOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*TokenPoolOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *TokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*TokenPoolOwnershipTransferred, error) + + FilterRateLimitAdminSet(opts *bind.FilterOpts) (*TokenPoolRateLimitAdminSetIterator, error) + + WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *TokenPoolRateLimitAdminSet) (event.Subscription, error) + + ParseRateLimitAdminSet(log types.Log) (*TokenPoolRateLimitAdminSet, error) + + FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*TokenPoolReleasedIterator, error) + + WatchReleased(opts *bind.WatchOpts, sink chan<- *TokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseReleased(log types.Log) (*TokenPoolReleased, error) + + FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*TokenPoolRemotePoolAddedIterator, error) + + WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *TokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolAdded(log types.Log) (*TokenPoolRemotePoolAdded, error) + + FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*TokenPoolRemotePoolRemovedIterator, error) + + WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *TokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolRemoved(log types.Log) (*TokenPoolRemotePoolRemoved, error) + + FilterRouterUpdated(opts *bind.FilterOpts) (*TokenPoolRouterUpdatedIterator, error) + + WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *TokenPoolRouterUpdated) (event.Subscription, error) + + ParseRouterUpdated(log types.Log) (*TokenPoolRouterUpdated, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool/usdc_token_pool.go b/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool/usdc_token_pool.go new file mode 100644 index 00000000000..b9ebc14e30c --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool/usdc_token_pool.go @@ -0,0 +1,3567 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package usdc_token_pool + +import ( + "errors" + "fmt" + "math/big" + "strings" + + "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" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type PoolLockOrBurnInV1 struct { + Receiver []byte + RemoteChainSelector uint64 + OriginalSender common.Address + Amount *big.Int + LocalToken common.Address +} + +type PoolLockOrBurnOutV1 struct { + DestTokenAddress []byte + DestPoolData []byte +} + +type PoolReleaseOrMintInV1 struct { + OriginalSender []byte + RemoteChainSelector uint64 + Receiver common.Address + Amount *big.Int + LocalToken common.Address + SourcePoolAddress []byte + SourcePoolData []byte + OffchainTokenData []byte +} + +type PoolReleaseOrMintOutV1 struct { + DestinationAmount *big.Int +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type TokenPoolChainUpdate struct { + RemoteChainSelector uint64 + RemotePoolAddresses [][]byte + RemoteTokenAddress []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig +} + +type USDCTokenPoolDomain struct { + AllowedCaller [32]byte + DomainIdentifier uint32 + Enabled bool +} + +type USDCTokenPoolDomainUpdate struct { + AllowedCaller [32]byte + DomainIdentifier uint32 + DestChainSelector uint64 + Enabled bool +} + +var USDCTokenPoolMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"tokenMessenger\",\"type\":\"address\",\"internalType\":\"contractITokenMessenger\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"SUPPORTED_USDC_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDomain\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structUSDCTokenPool.Domain\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"domainIdentifier\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_localDomainIdentifier\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_messageTransmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIMessageTransmitter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"i_tokenMessenger\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractITokenMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDomains\",\"inputs\":[{\"name\":\"domains\",\"type\":\"tuple[]\",\"internalType\":\"structUSDCTokenPool.DomainUpdate[]\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"domainIdentifier\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"tokenMessenger\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DomainsSet\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structUSDCTokenPool.DomainUpdate[]\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"domainIdentifier\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidDestinationDomain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"got\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDomain\",\"inputs\":[{\"name\":\"domain\",\"type\":\"tuple\",\"internalType\":\"structUSDCTokenPool.DomainUpdate\",\"components\":[{\"name\":\"allowedCaller\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"domainIdentifier\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"enabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"type\":\"error\",\"name\":\"InvalidMessageVersion\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"got\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidReceiver\",\"inputs\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourceDomain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"got\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidTokenMessengerVersion\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnknownDomain\",\"inputs\":[{\"name\":\"domain\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"UnlockingUSDCFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x610160806040523461049b5761582d803803809161001d82856107dc565b8339810160a08282031261049b5781516001600160a01b0381169290919083830361049b5760208101516001600160a01b038116919082810361049b5760408201516001600160401b03811161049b5782019380601f8601121561049b578451946001600160401b0386116104a0578560051b9060208201966100a360405198896107dc565b875260208088019282010192831161049b57602001905b8282106107c4575050506100dc60806100d5606085016107ff565b93016107ff565b9233156107b357600180546001600160a01b03191633179055801580156107a2575b8015610791575b6107805760049260209260805260c0526040519283809263313ce56760e01b82525afa809160009161073d575b5090610719575b50600660a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526105f7575b5081156105e657604051632c12192160e01b8152602081600481865afa90811561050b576000916105ac575b5060405163054fd4d560e41b81526001600160a01b03919091169190602081600481865afa801561050b5763ffffffff9160009161058d575b5016806105795750604051639cdbb18160e01b8152602081600481875afa801561050b5763ffffffff9160009161055a575b50168061054657506004916020916101005280610120526040519283809263234d8e3d60e21b82525afa90811561050b57600091610517575b506101405260805161010051604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201819052939290911690602081604481855afa90811561050b576000916104d9575b5060001981018091116104c35760405190602082019463095ea7b360e01b865260248301526044820152604481526102c56064826107dc565b6000806040958651936102d888866107dc565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082865af13d156104b6573d906001600160401b0382116104a057855161034994909261033a601f8201601f1916602001856107dc565b83523d6000602085013e6109b9565b80518061041f575b837f2e902d38f15b233cbb63711add0fca4545334d3a169d60c0a616494d7eea95446020858351908152a151614da39081610a8a82396080518181816105fa0152818161069401528181611422015281816140080152614485015260a051816106fc015260c051818181612067015281816136710152613bb4015260e051818181610acd0152818161218d01526142de015261010051818181610ceb015261148501526101205181818161083c0152612710015261014051818181610dcd0152818161152e01526138140152f35b816020918101031261049b576020015180159081150361049b57610444573880610351565b815162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b91610349926060916109b9565b634e487b7160e01b600052601160045260246000fd5b90506020813d602011610503575b816104f4602093836107dc565b8101031261049b57513861028c565b3d91506104e7565b6040513d6000823e3d90fd5b610539915060203d60201161053f575b61053181836107dc565b810190610813565b3861023d565b503d610527565b6316ba39c560e31b60005260045260246000fd5b610573915060203d60201161053f5761053181836107dc565b38610204565b6334697c6b60e11b60005260045260246000fd5b6105a6915060203d60201161053f5761053181836107dc565b386101d2565b90506020813d6020116105de575b816105c7602093836107dc565b8101031261049b576105d8906107ff565b38610199565b3d91506105ba565b6306b7c75960e31b60005260046000fd5b906020906040519061060983836107dc565b60008252600036813760e051156107085760005b8251811015610684576001906001600160a01b0361063b828661082f565b51168561064782610871565b610654575b50500161061d565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388561064c565b5092905060005b81518110156106ff576001906001600160a01b036106a9828561082f565b511680156106f957846106bb82610959565b6106c9575b50505b0161068b565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138846106c0565b506106c3565b5050503861016d565b6335f4a7b360e01b60005260046000fd5b60ff1660068114610139576332ad3e0760e11b600052600660045260245260446000fd5b6020813d602011610778575b81610756602093836107dc565b8101031261077457519060ff82168203610771575038610132565b80fd5b5080fd5b3d9150610749565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b03831615610105565b506001600160a01b038416156100fe565b639b15e16f60e01b60005260046000fd5b602080916107d1846107ff565b8152019101906100ba565b601f909101601f19168101906001600160401b038211908210176104a057604052565b51906001600160a01b038216820361049b57565b9081602091031261049b575163ffffffff8116810361049b5790565b80518210156108435760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156108435760005260206000200190600090565b60008181526003602052604090205480156109525760001981018181116104c3576002546000198101919082116104c357818103610901575b50505060025480156108eb57600019016108c5816002610859565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61093a610912610923936002610859565b90549060031b1c9283926002610859565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806108aa565b5050600090565b806000526003602052604060002054156000146109b357600254680100000000000000008110156104a05761099a6109238260018594016002556002610859565b9055600254906000526003602052604060002055600190565b50600090565b91929015610a1b57508151156109cd575090565b3b156109d65790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610a2e5750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b838110610a715750508160006044809484010152601f80199101168101030190fd5b60208282018101516044878401015285935001610a4f56fe6080604052600436101561001257600080fd5b60003560e01c806241d3c11461025657806301ffc9a714610251578063181f5a771461024c57806321df0da714610247578063240028e81461024257806324f65ee71461023d57806339077537146102385780634c5ef0ed1461023357806354c8a4f31461022e5780636155cda01461022957806362ddd3c4146102245780636b716b0d1461021f5780636d3d1a581461021a57806379ba5097146102155780637d54534e146102105780638926f54f1461020b5780638da5cb5b14610206578063962d4020146102015780639a4575b9146101fc5780639fdf13ff146101f7578063a42a7b8b146101f2578063a7cd63b7146101ed578063acfecf91146101e8578063af58d59f146101e3578063b0f479a1146101de578063b7946580146101d9578063c0d78655146101d4578063c4bffe2b146101cf578063c75eea9c146101ca578063cf7401f3146101c5578063dc0bd971146101c0578063dfadfa35146101bb578063e0351e13146101b6578063e8a1da17146101b1578063f2fde38b146101ac5763fbf84dd7146101a757600080fd5b6126c5565b6125d1565b6121b2565b612157565b61208b565b61201c565b611f00565b611d9d565b611cec565b611bac565b611b57565b611af4565b611a2a565b6118fe565b61186c565b61174c565b611694565b6112ce565b6110bb565b611038565b610fdb565b610f2c565b610e43565b610df1565b610d92565b610d0f565b610ca0565b610a9b565b6109e1565b610720565b6106c4565b61063c565b6105af565b61052e565b6102d8565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760043567ffffffffffffffff81116102d357366023820112156102d357806004013567ffffffffffffffff81116102d3573660248260071b840101116102d35760246102d19201612734565b005b600080fd5b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036102d357807faff2afbf000000000000000000000000000000000000000000000000000000006020921490811561039e575b8115610374575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438610369565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150610362565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761041357604052565b6103c8565b6040810190811067ffffffffffffffff82111761041357604052565b60a0810190811067ffffffffffffffff82111761041357604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761041357604052565b604051906104a0602083610450565b565b604051906104a0604083610450565b604051906104a060a083610450565b604051906104a0606083610450565b919082519283825260005b8481106105195750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016104da565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3576105ab604080519061056f8183610450565b601382527f55534443546f6b656e506f6f6c20312e352e31000000000000000000000000006020830152519182916020835260208301906104cf565b0390f35b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff8116036102d357565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760206106ba60043561067c8161061e565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691161490565b6040519015158152f35b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760043567ffffffffffffffff81116102d357806004016101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83360301126102d3576020610821916107a0612a20565b506107aa816135a3565b6107e66107de6107d66107cb6107c360c4890186612a44565b810190612a95565b9360e4880190612a44565b810190612b4d565b9182516137c9565b8181519101519060405193849283927f57ecfd2800000000000000000000000000000000000000000000000000000000845260048401612bd3565b0381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af190811561094457600091610915575b50156108eb5780606461088560446105ab9401612c04565b60405191909201358082529173ffffffffffffffffffffffffffffffffffffffff169033907f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f090602090a36108d8610491565b8190526040519081529081906020820190565b7fbf969f220000000000000000000000000000000000000000000000000000000060005260046000fd5b610937915060203d60201161093d575b61092f8183610450565b810190612bbe565b3861086d565b503d610925565b612bf8565b67ffffffffffffffff8116036102d357565b35906104a082610949565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102d35760043561099c81610949565b9160243567ffffffffffffffff81116102d357826023820112156102d35780600401359267ffffffffffffffff84116102d357602484830101116102d3576024019190565b346102d35760206106ba6109f436610966565b91612c0e565b9181601f840112156102d35782359167ffffffffffffffff83116102d3576020808501948460051b0101116102d357565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126102d35760043567ffffffffffffffff81116102d35781610a74916004016109fa565b929092916024359067ffffffffffffffff82116102d357610a97916004016109fa565b9091565b346102d357610ac3610acb610aaf36610a2b565b9491610abc939193613558565b3691612c6e565b923691612c6e565b7f000000000000000000000000000000000000000000000000000000000000000015610c765760005b8251811015610bb95780610b27610b0d60019386612dce565b5173ffffffffffffffffffffffffffffffffffffffff1690565b610b63610b5e73ffffffffffffffffffffffffffffffffffffffff83165b73ffffffffffffffffffffffffffffffffffffffff1690565b614637565b610b6f575b5001610af4565b60405173ffffffffffffffffffffffffffffffffffffffff9190911681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756690602090a138610b68565b5060005b81518110156102d15780610bd6610b0d60019385612dce565b73ffffffffffffffffffffffffffffffffffffffff811615610c7057610c19610c1473ffffffffffffffffffffffffffffffffffffffff8316610b45565b6148ed565b610c26575b505b01610bbd565b60405173ffffffffffffffffffffffffffffffffffffffff9190911681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d890602090a183610c1e565b50610c20565b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102d357610d1d36610966565b610d28929192613558565b67ffffffffffffffff8216610d4a816000526006602052604060002054151590565b15610d6557506102d192610d5f913691612acd565b90613975565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760005473ffffffffffffffffffffffffffffffffffffffff81163303610f02577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff600435610f9f8161061e565b610fa7613558565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760206106ba67ffffffffffffffff60043561102481610949565b166000526006602052604060002054151590565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b9181601f840112156102d35782359167ffffffffffffffff83116102d357602080850194606085020101116102d357565b346102d35760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760043567ffffffffffffffff81116102d35761110a9036906004016109fa565b9060243567ffffffffffffffff81116102d35761112b90369060040161108a565b9060443567ffffffffffffffff81116102d35761114c90369060040161108a565b61116e610b4560095473ffffffffffffffffffffffffffffffffffffffff1690565b3314158061124d575b61121b57838614801590611211575b6111e75760005b86811061119657005b806111e16111af6111aa6001948b8b612ce5565b612cf5565b6111ba838989612cff565b6111db6111d36111cb86898b612cff565b923690611eb7565b913690611eb7565b91613a3a565b0161118d565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b5080861415611186565b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6000fd5b50611270610b4560015473ffffffffffffffffffffffffffffffffffffffff1690565b331415611177565b906112cb91602081526020611298835160408385015260608401906104cf565b9201519060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828503019101526104cf565b90565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760043567ffffffffffffffff81116102d3578060040160a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83360301126102d357611347612d0f565b5061135181613b6a565b6024820161138361137e61136483612cf5565b67ffffffffffffffff16600052600a602052604060002090565b612d28565b916113986113946040850151151590565b1590565b6116525760206113a88280612a44565b90500361160e5760646113c86113c083602094612a44565b810190612daa565b940135926113dc8282015163ffffffff1690565b90516040517ff856ddb60000000000000000000000000000000000000000000000000000000081526004810186905263ffffffff909216602483015260448201959095527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1660648201526084810194909452838060a481010381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1918215610944576105ab936000936115cb575b5061150b611506611583936115af937f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7604051806114fe3394829190602083019252565b0390a2612cf5565b612f9b565b926115276115176104a2565b67ffffffffffffffff9092168252565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015260405192839160208301919091602063ffffffff81604084019567ffffffffffffffff8151168552015116910152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610450565b6115b76104a2565b918252602082015260405191829182611278565b6115af919350611506611583936115fc61150b9360203d602011611607575b6115f48183610450565b810190612db9565b9593509350506114ba565b503d6115ea565b8061161891612a44565b9061164e6040519283927fa3c8cf0900000000000000000000000000000000000000000000000000000000845260048401612d99565b0390fd5b61124961165e83612cf5565b7fd201c48a0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405160008152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061170157505050505090565b909192939460208061173d837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301875289516104cf565b970193019301919392906116f2565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35767ffffffffffffffff60043561179081610949565b1660005260076020526117a96005604060002001614541565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06117ef6117d984612c56565b936117e76040519586610450565b808552612c56565b0160005b81811061185b57505060005b815181101561184d578061183161182c61181b60019486612dce565b516000526008602052604060002090565b612e35565b61183b8286612dce565b526118468185612dce565b50016117ff565b604051806105ab85826116ce565b8060606020809387010152016117f3565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3576118a36144ab565b60405180916020820160208352815180915260206040840192019060005b8181106118cf575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff168452859450602093840193909201916001016118c1565b346102d35761190c36610966565b611917929192613558565b67ffffffffffffffff82169161193d611394846000526006602052604060002054151590565b6119f35761198061139460056119678467ffffffffffffffff166000526007602052604060002090565b01611973368689612acd565b60208151910120906147e2565b6119bc57507f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691926119b760405192839283612d99565b0390a2005b61164e84926040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501612ef5565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35767ffffffffffffffff600435611a6e81610949565b611a76612f16565b501660005260076020526105ab611a9b611a966002604060002001612f41565b613c7a565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b9060206112cb9281815201906104cf565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d3576105ab611b9860043561150681610949565b6040519182916020835260208301906104cf565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35773ffffffffffffffffffffffffffffffffffffffff600435611bfc8161061e565b611c04613558565b168015611c7e5760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b602060408183019282815284518094520192019060005b818110611ccc5750505090565b825167ffffffffffffffff16845260209384019390920191600101611cbf565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357611d236144f6565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611d536117d984612c56565b0136602084013760005b8151811015611d8f578067ffffffffffffffff611d7c60019385612dce565b5116611d888286612dce565b5201611d5d565b604051806105ab8582611ca8565b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35767ffffffffffffffff600435611de181610949565b611de9612f16565b501660005260076020526105ab611a9b611a966040600020612f41565b801515036102d357565b35906fffffffffffffffffffffffffffffffff821682036102d357565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60609101126102d35760405190611e64826103f7565b81608435611e7181611e06565b815260a4356fffffffffffffffffffffffffffffffff811681036102d357602082015260c435906fffffffffffffffffffffffffffffffff821682036102d35760400152565b91908260609103126102d357604051611ecf816103f7565b6040611efb8183958035611ee281611e06565b8552611ef060208201611e10565b602086015201611e10565b910152565b346102d35760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357600435611f3b81610949565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102d357604051611f71816103f7565b602435611f7d81611e06565b81526044356fffffffffffffffffffffffffffffffff811681036102d35760208201526064356fffffffffffffffffffffffffffffffff811681036102d3576040820152611fca36611e2d565b9073ffffffffffffffffffffffffffffffffffffffff6009541633141580611ffa575b61121b576102d192613a3a565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611fed565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35767ffffffffffffffff6004356120cf81610949565b6000604080516120de816103f7565b828152826020820152015216600052600a6020526105ab604060002060ff60016040519261210b846103f7565b80548452015463ffffffff8116602084015260201c16151560408201526040519182918291909160408060608301948051845263ffffffff602082015116602085015201511515910152565b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346102d3576121c036610a2b565b9190926121cb613558565b6000915b80831061247d5750505060009163ffffffff4216925b8281106121ee57005b6122016121fc82858561313a565b6131f9565b90606082016122108151613d57565b608083019361221f8551613d57565b604084019081515115611c7e57612259611394612254612247885167ffffffffffffffff1690565b67ffffffffffffffff1690565b61497e565b61243257612392612292612278879a999a5167ffffffffffffffff1690565b67ffffffffffffffff166000526007602052604060002090565b6123558961234f87516123366122bb60408301516fffffffffffffffffffffffffffffffff1690565b9161231d6122e66122df60208401516fffffffffffffffffffffffffffffffff1690565b9251151590565b6123146122f16104b1565b6fffffffffffffffffffffffffffffffff851681529763ffffffff166020890152565b15156040870152565b6fffffffffffffffffffffffffffffffff166060850152565b6fffffffffffffffffffffffffffffffff166080830152565b82613290565b6123878961237e8a516123366122bb60408301516fffffffffffffffffffffffffffffffff1690565b60028301613290565b60048451910161339c565b602085019660005b885180518210156123d557906123cf6001926123c8836123c28c5167ffffffffffffffff1690565b92612dce565b5190613975565b0161239a565b505097965094906124297f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c293926124166001975167ffffffffffffffff1690565b92519351905190604051948594856134c3565b0390a1016121e5565b611249612447865167ffffffffffffffff1690565b7f1d5ad3c50000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b90919261248e6111aa858486612ce5565b946124a561139467ffffffffffffffff881661471b565b612599576124d260056124cc8867ffffffffffffffff166000526007602052604060002090565b01614541565b9360005b855181101561251e5760019061251760056125058b67ffffffffffffffff166000526007602052604060002090565b01612510838a612dce565b51906147e2565b50016124d6565b509350937f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d85991661258b6001939761257061256b8267ffffffffffffffff166000526007602052604060002090565b61308b565b60405167ffffffffffffffff90911681529081906020820190565b0390a10191909392936121cf565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff861660045260246000fd5b346102d35760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d35773ffffffffffffffffffffffffffffffffffffffff6004356126218161061e565b612629613558565b1633811461269b57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102d35760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102d357602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b61273c613558565b60005b82811061277e5750907f1889010d2535a0ab1643678d1da87fbbe8b87b2f585b47ddb72ec622aef9ee5691612779604051928392836129a1565b0390a1565b61279161278c828585612914565b61293a565b80511580156128bf575b61285c57906128568261280661136460406127bf6020600198015163ffffffff1690565b936127f78151956127ef6127d66060850151151590565b916127df6104c0565b98895263ffffffff166020890152565b151586840152565b015167ffffffffffffffff1690565b60019082518155019063ffffffff6020820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000064ff0000000060408554940151151560201b16921617179055565b0161273f565b604080517fa087bd2900000000000000000000000000000000000000000000000000000000815282516004820152602083015163ffffffff1660248201529082015167ffffffffffffffff16604482015260609091015115156064820152608490fd5b5067ffffffffffffffff6128de604083015167ffffffffffffffff1690565b161561279b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156129245760071b0190565b6128e5565b359063ffffffff821682036102d357565b6080813603126102d35760405190608082019082821067ffffffffffffffff831117610413576060916040528035835261297660208201612929565b6020840152604081013561298981610949565b6040840152013561299981611e06565b606082015290565b602080825281018390526040019160005b8181106129bf5750505090565b9091926080806001928635815263ffffffff6129dd60208901612929565b16602082015267ffffffffffffffff60408801356129fa81610949565b1660408201526060870135612a0e81611e06565b151560608201520194019291016129b2565b604051906020820182811067ffffffffffffffff8211176104135760405260008252565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102d3570180359067ffffffffffffffff82116102d3576020019181360383136102d357565b908160409103126102d357612ac5602060405192612ab284610418565b8035612abd81610949565b845201612929565b602082015290565b92919267ffffffffffffffff82116104135760405191612b15601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200184610450565b8294818452818301116102d3578281602093846000960137010152565b9080601f830112156102d3578160206112cb93359101612acd565b6020818303126102d35780359067ffffffffffffffff82116102d357016040818303126102d35760405191612b8183610418565b813567ffffffffffffffff81116102d35781612b9e918401612b32565b8352602082013567ffffffffffffffff81116102d357612ac59201612b32565b908160209103126102d357516112cb81611e06565b9091612bea6112cb936040845260408401906104cf565b9160208184039101526104cf565b6040513d6000823e3d90fd5b356112cb8161061e565b6112cb929167ffffffffffffffff612c39921660005260076020526005604060002001923691612acd565b602081519101209060019160005201602052604060002054151590565b67ffffffffffffffff81116104135760051b60200190565b929190612c7a81612c56565b93612c886040519586610450565b602085838152019160051b81019283116102d357905b828210612caa57505050565b602080918335612cb98161061e565b815201910190612c9e565b67ffffffffffffffff6112cb91166000526006602052604060002054151590565b91908110156129245760051b0190565b356112cb81610949565b9190811015612924576060020190565b60405190612d1c82610418565b60606020838281520152565b90604051612d35816103f7565b604060ff6001839580548552015463ffffffff8116602085015260201c161515910152565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9160206112cb938181520191612d5a565b908160209103126102d3573590565b908160209103126102d357516112cb81610949565b80518210156129245760209160051b010190565b90600182811c92168015612e2b575b6020831014612dfc57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691612df1565b9060405191826000825492612e4984612de2565b8084529360018116908115612eb55750600114612e6e575b506104a092500383610450565b90506000929192526020600020906000915b818310612e995750509060206104a09282010138612e61565b6020919350806001915483858901015201910190918492612e80565b602093506104a09592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138612e61565b60409067ffffffffffffffff6112cb95931681528160208201520191612d5a565b60405190612f2382610434565b60006080838281528260208201528260408201528260608201520152565b90604051612f4e81610434565b60806fffffffffffffffffffffffffffffffff6001839560ff8154848116875263ffffffff81871c16602088015260a01c1615156040860152015481808216166060850152821c16910152565b67ffffffffffffffff1660005260076020526112cb6004604060002001612e35565b91612ff5918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b818110613004575050565b60008155600101612ff9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561305257565b613010565b8054906000815581613067575050565b6000526020600020908101905b81811061307f575050565b60008155600101613074565b60056104a09160008155600060018201556000600282015560006003820155600481016130b88154612de2565b90816130c7575b505001613057565b81601f600093116001146130df5750555b38806130bf565b818352602083206130fa91601f01861c810190600101612ff9565b808252602082209081548360011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8560031b1c1916179055556130d8565b91908110156129245760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1813603018212156102d3570190565b9080601f830112156102d357813561319181612c56565b9261319f6040519485610450565b81845260208085019260051b820101918383116102d35760208201905b8382106131cb57505050505090565b813567ffffffffffffffff81116102d3576020916131ee87848094880101612b32565b8152019101906131bc565b610120813603126102d3576040519061321182610434565b61321a8161095b565b8252602081013567ffffffffffffffff81116102d35761323d903690830161317a565b602083015260408101359067ffffffffffffffff82116102d3576132676132889236908301612b32565b60408401526132793660608301611eb7565b606084015260c0369101611eb7565b608082015290565b8151815460208401516040850151608091821b73ffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffff000000000000000000000000000000000000000000909416939093179290921791151560a01b74ff000000000000000000000000000000000000000016919091178355606084015193810151901b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016921691909117600190910155565b9190601f811161336657505050565b6104a0926000526020600020906020601f840160051c83019310613392575b601f0160051c0190612ff9565b9091508190613385565b919091825167ffffffffffffffff8111610413576133c4816133be8454612de2565b84613357565b6020601f821160011461341e578190612ff5939495600092613413575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b0151905038806133e1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169061345184600052602060002090565b9160005b8181106134ab57509583600195969710613474575b505050811b019055565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061346a565b9192602060018192868b015181550194019201613455565b6135276134f26104a09597969467ffffffffffffffff60a09516845261010060208501526101008401906104cf565b9660408301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b01906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b73ffffffffffffffffffffffffffffffffffffffff60015416330361357957565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b90608082016135b761139461067c83612c04565b61377b5750602082019161365860206135fd6135d561224787612cf5565b60801b7fffffffffffffffffffffffffffffffff000000000000000000000000000000001690565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156109445760009161375c575b50613732576136b86136b384612cf5565b613ead565b6136c183612cf5565b6136d661139460a08401926109f48486612a44565b6136f3575060606136ea6104a09394612cf5565b91013590613fd1565b6136fc91612a44565b9061164e6040519283927f24eb47e500000000000000000000000000000000000000000000000000000000845260048401612d99565b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b613775915060203d60201161093d5761092f8183610450565b386136a2565b61378761124991612c04565b7f961c9a4f0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff16600452602490565b90600482015163ffffffff811661392157506008820151916014600c820151910151926137fd602084015163ffffffff1690565b63ffffffff811663ffffffff8316036138e85750507f000000000000000000000000000000000000000000000000000000000000000063ffffffff811663ffffffff8316036138af5750505167ffffffffffffffff1667ffffffffffffffff811667ffffffffffffffff831603613872575050565b7ff917ffea0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff9081166004521660245260446000fd5b7f77e480260000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7fe366a1170000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7f68d2f8d60000000000000000000000000000000000000000000000000000000060005263ffffffff1660045260246000fd5b60409067ffffffffffffffff6112cb949316815281602082015201906104cf565b90805115611c7e578051602082012067ffffffffffffffff8316928360005260076020526139aa8260056040600020016149d4565b15613a035750816139f27f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea936139ed6139fe946000526008602052604060002090565b61339c565b60405191829182611b46565b0390a2565b905061164e6040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401613954565b67ffffffffffffffff166000818152600660205260409020549092919015613b3c5791613b3960e092613b0585613a917f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b97613d57565b846000526007602052613aa881604060002061402e565b613ab183613d57565b846000526007602052613acb83600260406000200161402e565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b60808101613b7d61139461067c83612c04565b61377b57506020810190613b9b60206135fd6135d561224786612cf5565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561094457600091613c21575b50613732576060613c186104a093613c07613c0260408601612c04565b6142dc565b6111aa613c1382612cf5565b614373565b91013590614451565b613c3a915060203d60201161093d5761092f8183610450565b38613be5565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161305257565b9190820391821161305257565b613c82612f16565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff82511690602083019163ffffffff835116420342811161305257613ce6906fffffffffffffffffffffffffffffffff6080870151169061303f565b810180911161305257613d0c6fffffffffffffffffffffffffffffffff92918392614d84565b161682524263ffffffff16905290565b6104a09092919260608101936fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b805115613e105760408101516fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff613dbb613da660208501516fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff1690565b911690811090811591613e07575b50613dd15750565b61164e906040519182917f8020d12400000000000000000000000000000000000000000000000000000000835260048301613d1c565b90501538613dc9565b6fffffffffffffffffffffffffffffffff613e3e60408301516fffffffffffffffffffffffffffffffff1690565b1615801590613e85575b613e4f5750565b61164e906040519182917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301613d1c565b50613ea6613da660208301516fffffffffffffffffffffffffffffffff1690565b1515613e48565b613eb961139482612cc4565b613f9a576020613f3291613ee5610b4560045473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90921660048301523360248301529092839190829081906044820190565b03915afa90811561094457600091613f7b575b5015613f4d57565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b613f94915060203d60201161093d5761092f8183610450565b38613f45565b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b9067ffffffffffffffff6104a09216600052600760205260026040600020019073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614a62565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199161420d61277992805461407f6140796140708363ffffffff9060801c1690565b63ffffffff1690565b42613c6d565b9081614219575b50506141c760016140aa60208601516fffffffffffffffffffffffffffffffff1690565b926141356140f8613da66fffffffffffffffffffffffffffffffff6140df85546fffffffffffffffffffffffffffffffff1690565b166fffffffffffffffffffffffffffffffff8816614d84565b82906fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b6141886141428751151590565b82547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178255565b019182906fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b604083015181546fffffffffffffffffffffffffffffffff1660809190911b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016179055565b60405191829182613d1c565b613da66140f8916fffffffffffffffffffffffffffffffff61428d614294958261428660018a0154928261427f614278614262876fffffffffffffffffffffffffffffffff1690565b996fffffffffffffffffffffffffffffffff1690565b9560801c90565b169061303f565b91166148c3565b9116614d84565b80547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161781553880614086565b7f00000000000000000000000000000000000000000000000000000000000000006143045750565b73ffffffffffffffffffffffffffffffffffffffff16806000526003602052604060002054156143315750565b7fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b908160209103126102d357516112cb8161061e565b61437f61139482612cc4565b613f9a5760206143f0916143ab610b4560045473ffffffffffffffffffffffffffffffffffffffff1690565b60405180809581947fa8d87a3b0000000000000000000000000000000000000000000000000000000083526004830191909167ffffffffffffffff6020820193169052565b03915afa80156109445773ffffffffffffffffffffffffffffffffffffffff91600091614422575b50163303613f4d57565b614444915060203d60201161444a575b61443c8183610450565b81019061435e565b38614418565b503d614432565b9067ffffffffffffffff6104a09216600052600760205260406000209073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614a62565b604051906002548083528260208101600260005260206000209260005b8181106144dd5750506104a092500383610450565b84548352600194850194879450602090930192016144c8565b604051906005548083528260208101600560005260206000209260005b8181106145285750506104a092500383610450565b8454835260019485019487945060209093019201614513565b906040519182815491828252602082019060005260206000209260005b8181106145735750506104a092500383610450565b845483526001948501948794506020909301920161455e565b80548210156129245760005260206000200190600090565b80548015614608577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906145d9828261458c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081815260036020526040902054908115614714577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019082821161305257600254927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84019384116130525783836000956146d395036146d9575b5050506146c260026145a4565b600390600052602052604060002090565b55600190565b6146c2614705916146fb6146f161470b95600261458c565b90549060031b1c90565b928391600261458c565b90612fbd565b553880806146b5565b5050600090565b600081815260066020526040902054908115614714577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019082821161305257600554927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84019384116130525783836000956146d395036147b7575b5050506147a660056145a4565b600690600052602052604060002090565b6147a6614705916147cf6146f16147d995600561458c565b928391600561458c565b55388080614799565b60018101918060005282602052604060002054928315156000146148ba577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401848111613052578354937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85019485116130525760009585836146d3976148729503614881575b5050506145a4565b90600052602052604060002090565b6148a1614705916148986146f16148b1958861458c565b9283918761458c565b8590600052602052604060002090565b5538808061486a565b50505050600090565b9190820180921161305257565b926148db919261303f565b8101809111613052576112cb91614d84565b60008181526003602052604090205461497857600254680100000000000000008110156104135761495f61492a826001859401600255600261458c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600254906000526003602052604060002055600190565b50600090565b6000818152600660205260409020546149785760055468010000000000000000811015610413576149bb61492a826001859401600555600561458c565b9055600554906000526006602052604060002055600190565b600082815260018201602052604090205461471457805490680100000000000000008210156104135782614a1261492a84600180960185558461458c565b905580549260005201602052604060002055600190565b8115614a33570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9091815490614a786113948360ff9060a01c1690565b8015614d7c575b614d7657614a9e6fffffffffffffffffffffffffffffffff8316613da6565b9160018401908154614ad8614079614070614acb613da6856fffffffffffffffffffffffffffffffff1690565b9460801c63ffffffff1690565b80614ce2575b5050858110614c435750848310614b7257505091614b6261277992614b27613da6847f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a97613c6d565b6fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b6040519081529081906020820190565b84614ba0614b9185614b8b613da6614ba5965460801c90565b93613c6d565b614b9a83613c40565b906148c3565b614a29565b9173ffffffffffffffffffffffffffffffffffffffff821615614c1157611249927fd0c8d23a00000000000000000000000000000000000000000000000000000000600052929173ffffffffffffffffffffffffffffffffffffffff9160649460045260245216604452565b7f15279c0800000000000000000000000000000000000000000000000000000000600052600483905260245260446000fd5b828673ffffffffffffffffffffffffffffffffffffffff821615614cb057611249927f1a76572a00000000000000000000000000000000000000000000000000000000600052929173ffffffffffffffffffffffffffffffffffffffff9160649460045260245216604452565b7ff94ebcd100000000000000000000000000000000000000000000000000000000600052600483905260245260446000fd5b828692939611614d4c57614cfc613da6614d039460801c90565b91866148d0565b84547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178555923880614ade565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b50505050565b508315614a7f565b9080821015614d91575090565b90509056fea164736f6c634300081a000a", +} + +var USDCTokenPoolABI = USDCTokenPoolMetaData.ABI + +var USDCTokenPoolBin = USDCTokenPoolMetaData.Bin + +func DeployUSDCTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, tokenMessenger common.Address, token common.Address, allowlist []common.Address, rmnProxy common.Address, router common.Address) (common.Address, *types.Transaction, *USDCTokenPool, error) { + parsed, err := USDCTokenPoolMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(USDCTokenPoolBin), backend, tokenMessenger, token, allowlist, rmnProxy, router) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &USDCTokenPool{address: address, abi: *parsed, USDCTokenPoolCaller: USDCTokenPoolCaller{contract: contract}, USDCTokenPoolTransactor: USDCTokenPoolTransactor{contract: contract}, USDCTokenPoolFilterer: USDCTokenPoolFilterer{contract: contract}}, nil +} + +type USDCTokenPool struct { + address common.Address + abi abi.ABI + USDCTokenPoolCaller + USDCTokenPoolTransactor + USDCTokenPoolFilterer +} + +type USDCTokenPoolCaller struct { + contract *bind.BoundContract +} + +type USDCTokenPoolTransactor struct { + contract *bind.BoundContract +} + +type USDCTokenPoolFilterer struct { + contract *bind.BoundContract +} + +type USDCTokenPoolSession struct { + Contract *USDCTokenPool + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type USDCTokenPoolCallerSession struct { + Contract *USDCTokenPoolCaller + CallOpts bind.CallOpts +} + +type USDCTokenPoolTransactorSession struct { + Contract *USDCTokenPoolTransactor + TransactOpts bind.TransactOpts +} + +type USDCTokenPoolRaw struct { + Contract *USDCTokenPool +} + +type USDCTokenPoolCallerRaw struct { + Contract *USDCTokenPoolCaller +} + +type USDCTokenPoolTransactorRaw struct { + Contract *USDCTokenPoolTransactor +} + +func NewUSDCTokenPool(address common.Address, backend bind.ContractBackend) (*USDCTokenPool, error) { + abi, err := abi.JSON(strings.NewReader(USDCTokenPoolABI)) + if err != nil { + return nil, err + } + contract, err := bindUSDCTokenPool(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &USDCTokenPool{address: address, abi: abi, USDCTokenPoolCaller: USDCTokenPoolCaller{contract: contract}, USDCTokenPoolTransactor: USDCTokenPoolTransactor{contract: contract}, USDCTokenPoolFilterer: USDCTokenPoolFilterer{contract: contract}}, nil +} + +func NewUSDCTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*USDCTokenPoolCaller, error) { + contract, err := bindUSDCTokenPool(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &USDCTokenPoolCaller{contract: contract}, nil +} + +func NewUSDCTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*USDCTokenPoolTransactor, error) { + contract, err := bindUSDCTokenPool(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &USDCTokenPoolTransactor{contract: contract}, nil +} + +func NewUSDCTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*USDCTokenPoolFilterer, error) { + contract, err := bindUSDCTokenPool(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &USDCTokenPoolFilterer{contract: contract}, nil +} + +func bindUSDCTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := USDCTokenPoolMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_USDCTokenPool *USDCTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _USDCTokenPool.Contract.USDCTokenPoolCaller.contract.Call(opts, result, method, params...) +} + +func (_USDCTokenPool *USDCTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _USDCTokenPool.Contract.USDCTokenPoolTransactor.contract.Transfer(opts) +} + +func (_USDCTokenPool *USDCTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _USDCTokenPool.Contract.USDCTokenPoolTransactor.contract.Transact(opts, method, params...) +} + +func (_USDCTokenPool *USDCTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _USDCTokenPool.Contract.contract.Call(opts, result, method, params...) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _USDCTokenPool.Contract.contract.Transfer(opts) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _USDCTokenPool.Contract.contract.Transact(opts, method, params...) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) SUPPORTEDUSDCVERSION(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "SUPPORTED_USDC_VERSION") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) SUPPORTEDUSDCVERSION() (uint32, error) { + return _USDCTokenPool.Contract.SUPPORTEDUSDCVERSION(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) SUPPORTEDUSDCVERSION() (uint32, error) { + return _USDCTokenPool.Contract.SUPPORTEDUSDCVERSION(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getAllowList") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetAllowList() ([]common.Address, error) { + return _USDCTokenPool.Contract.GetAllowList(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetAllowList() ([]common.Address, error) { + return _USDCTokenPool.Contract.GetAllowList(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getAllowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetAllowListEnabled() (bool, error) { + return _USDCTokenPool.Contract.GetAllowListEnabled(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetAllowListEnabled() (bool, error) { + return _USDCTokenPool.Contract.GetAllowListEnabled(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _USDCTokenPool.Contract.GetCurrentInboundRateLimiterState(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _USDCTokenPool.Contract.GetCurrentInboundRateLimiterState(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _USDCTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _USDCTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetDomain(opts *bind.CallOpts, chainSelector uint64) (USDCTokenPoolDomain, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getDomain", chainSelector) + + if err != nil { + return *new(USDCTokenPoolDomain), err + } + + out0 := *abi.ConvertType(out[0], new(USDCTokenPoolDomain)).(*USDCTokenPoolDomain) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetDomain(chainSelector uint64) (USDCTokenPoolDomain, error) { + return _USDCTokenPool.Contract.GetDomain(&_USDCTokenPool.CallOpts, chainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetDomain(chainSelector uint64) (USDCTokenPoolDomain, error) { + return _USDCTokenPool.Contract.GetDomain(&_USDCTokenPool.CallOpts, chainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getRateLimitAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetRateLimitAdmin() (common.Address, error) { + return _USDCTokenPool.Contract.GetRateLimitAdmin(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) { + return _USDCTokenPool.Contract.GetRateLimitAdmin(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _USDCTokenPool.Contract.GetRemotePools(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _USDCTokenPool.Contract.GetRemotePools(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _USDCTokenPool.Contract.GetRemoteToken(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _USDCTokenPool.Contract.GetRemoteToken(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getRmnProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetRmnProxy() (common.Address, error) { + return _USDCTokenPool.Contract.GetRmnProxy(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetRmnProxy() (common.Address, error) { + return _USDCTokenPool.Contract.GetRmnProxy(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetRouter() (common.Address, error) { + return _USDCTokenPool.Contract.GetRouter(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetRouter() (common.Address, error) { + return _USDCTokenPool.Contract.GetRouter(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getSupportedChains") + + if err != nil { + return *new([]uint64), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetSupportedChains() ([]uint64, error) { + return _USDCTokenPool.Contract.GetSupportedChains(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) { + return _USDCTokenPool.Contract.GetSupportedChains(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetToken() (common.Address, error) { + return _USDCTokenPool.Contract.GetToken(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetToken() (common.Address, error) { + return _USDCTokenPool.Contract.GetToken(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "getTokenDecimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) GetTokenDecimals() (uint8, error) { + return _USDCTokenPool.Contract.GetTokenDecimals(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) GetTokenDecimals() (uint8, error) { + return _USDCTokenPool.Contract.GetTokenDecimals(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) ILocalDomainIdentifier(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "i_localDomainIdentifier") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) ILocalDomainIdentifier() (uint32, error) { + return _USDCTokenPool.Contract.ILocalDomainIdentifier(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) ILocalDomainIdentifier() (uint32, error) { + return _USDCTokenPool.Contract.ILocalDomainIdentifier(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) IMessageTransmitter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "i_messageTransmitter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) IMessageTransmitter() (common.Address, error) { + return _USDCTokenPool.Contract.IMessageTransmitter(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) IMessageTransmitter() (common.Address, error) { + return _USDCTokenPool.Contract.IMessageTransmitter(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) ITokenMessenger(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "i_tokenMessenger") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) ITokenMessenger() (common.Address, error) { + return _USDCTokenPool.Contract.ITokenMessenger(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) ITokenMessenger() (common.Address, error) { + return _USDCTokenPool.Contract.ITokenMessenger(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _USDCTokenPool.Contract.IsRemotePool(&_USDCTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _USDCTokenPool.Contract.IsRemotePool(&_USDCTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _USDCTokenPool.Contract.IsSupportedChain(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _USDCTokenPool.Contract.IsSupportedChain(&_USDCTokenPool.CallOpts, remoteChainSelector) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "isSupportedToken", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) { + return _USDCTokenPool.Contract.IsSupportedToken(&_USDCTokenPool.CallOpts, token) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) { + return _USDCTokenPool.Contract.IsSupportedToken(&_USDCTokenPool.CallOpts, token) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _USDCTokenPool.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 + +} + +func (_USDCTokenPool *USDCTokenPoolSession) Owner() (common.Address, error) { + return _USDCTokenPool.Contract.Owner(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) Owner() (common.Address, error) { + return _USDCTokenPool.Contract.Owner(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _USDCTokenPool.Contract.SupportsInterface(&_USDCTokenPool.CallOpts, interfaceId) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _USDCTokenPool.Contract.SupportsInterface(&_USDCTokenPool.CallOpts, interfaceId) +} + +func (_USDCTokenPool *USDCTokenPoolCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _USDCTokenPool.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_USDCTokenPool *USDCTokenPoolSession) TypeAndVersion() (string, error) { + return _USDCTokenPool.Contract.TypeAndVersion(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolCallerSession) TypeAndVersion() (string, error) { + return _USDCTokenPool.Contract.TypeAndVersion(&_USDCTokenPool.CallOpts) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "acceptOwnership") +} + +func (_USDCTokenPool *USDCTokenPoolSession) AcceptOwnership() (*types.Transaction, error) { + return _USDCTokenPool.Contract.AcceptOwnership(&_USDCTokenPool.TransactOpts) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _USDCTokenPool.Contract.AcceptOwnership(&_USDCTokenPool.TransactOpts) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_USDCTokenPool *USDCTokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _USDCTokenPool.Contract.AddRemotePool(&_USDCTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _USDCTokenPool.Contract.AddRemotePool(&_USDCTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds) +} + +func (_USDCTokenPool *USDCTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _USDCTokenPool.Contract.ApplyAllowListUpdates(&_USDCTokenPool.TransactOpts, removes, adds) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _USDCTokenPool.Contract.ApplyAllowListUpdates(&_USDCTokenPool.TransactOpts, removes, adds) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_USDCTokenPool *USDCTokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _USDCTokenPool.Contract.ApplyChainUpdates(&_USDCTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _USDCTokenPool.Contract.ApplyChainUpdates(&_USDCTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_USDCTokenPool *USDCTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _USDCTokenPool.Contract.LockOrBurn(&_USDCTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _USDCTokenPool.Contract.LockOrBurn(&_USDCTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_USDCTokenPool *USDCTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _USDCTokenPool.Contract.ReleaseOrMint(&_USDCTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _USDCTokenPool.Contract.ReleaseOrMint(&_USDCTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_USDCTokenPool *USDCTokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _USDCTokenPool.Contract.RemoveRemotePool(&_USDCTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _USDCTokenPool.Contract.RemoveRemotePool(&_USDCTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_USDCTokenPool *USDCTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetChainRateLimiterConfig(&_USDCTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetChainRateLimiterConfig(&_USDCTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "setChainRateLimiterConfigs", remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_USDCTokenPool *USDCTokenPoolSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetChainRateLimiterConfigs(&_USDCTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetChainRateLimiterConfigs(&_USDCTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) SetDomains(opts *bind.TransactOpts, domains []USDCTokenPoolDomainUpdate) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "setDomains", domains) +} + +func (_USDCTokenPool *USDCTokenPoolSession) SetDomains(domains []USDCTokenPoolDomainUpdate) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetDomains(&_USDCTokenPool.TransactOpts, domains) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) SetDomains(domains []USDCTokenPoolDomainUpdate) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetDomains(&_USDCTokenPool.TransactOpts, domains) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin) +} + +func (_USDCTokenPool *USDCTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetRateLimitAdmin(&_USDCTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetRateLimitAdmin(&_USDCTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "setRouter", newRouter) +} + +func (_USDCTokenPool *USDCTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetRouter(&_USDCTokenPool.TransactOpts, newRouter) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _USDCTokenPool.Contract.SetRouter(&_USDCTokenPool.TransactOpts, newRouter) +} + +func (_USDCTokenPool *USDCTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _USDCTokenPool.contract.Transact(opts, "transferOwnership", to) +} + +func (_USDCTokenPool *USDCTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _USDCTokenPool.Contract.TransferOwnership(&_USDCTokenPool.TransactOpts, to) +} + +func (_USDCTokenPool *USDCTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _USDCTokenPool.Contract.TransferOwnership(&_USDCTokenPool.TransactOpts, to) +} + +type USDCTokenPoolAllowListAddIterator struct { + Event *USDCTokenPoolAllowListAdd + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolAllowListAddIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolAllowListAddIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolAllowListAddIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolAllowListAdd struct { + Sender common.Address + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*USDCTokenPoolAllowListAddIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return &USDCTokenPoolAllowListAddIterator{contract: _USDCTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolAllowListAdd) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolAllowListAdd) + if err := _USDCTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*USDCTokenPoolAllowListAdd, error) { + event := new(USDCTokenPoolAllowListAdd) + if err := _USDCTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolAllowListRemoveIterator struct { + Event *USDCTokenPoolAllowListRemove + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolAllowListRemoveIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolAllowListRemoveIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolAllowListRemoveIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolAllowListRemove struct { + Sender common.Address + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*USDCTokenPoolAllowListRemoveIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return &USDCTokenPoolAllowListRemoveIterator{contract: _USDCTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolAllowListRemove) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolAllowListRemove) + if err := _USDCTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*USDCTokenPoolAllowListRemove, error) { + event := new(USDCTokenPoolAllowListRemove) + if err := _USDCTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolBurnedIterator struct { + Event *USDCTokenPoolBurned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolBurnedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolBurnedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolBurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolBurned struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*USDCTokenPoolBurnedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return &USDCTokenPoolBurnedIterator{contract: _USDCTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolBurned, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolBurned) + if err := _USDCTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseBurned(log types.Log) (*USDCTokenPoolBurned, error) { + event := new(USDCTokenPoolBurned) + if err := _USDCTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolChainAddedIterator struct { + Event *USDCTokenPoolChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolChainAddedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolChainAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*USDCTokenPoolChainAddedIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &USDCTokenPoolChainAddedIterator{contract: _USDCTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolChainAdded) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolChainAdded) + if err := _USDCTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseChainAdded(log types.Log) (*USDCTokenPoolChainAdded, error) { + event := new(USDCTokenPoolChainAdded) + if err := _USDCTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolChainConfiguredIterator struct { + Event *USDCTokenPoolChainConfigured + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolChainConfiguredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolChainConfiguredIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolChainConfiguredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolChainConfigured struct { + RemoteChainSelector uint64 + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*USDCTokenPoolChainConfiguredIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return &USDCTokenPoolChainConfiguredIterator{contract: _USDCTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolChainConfigured) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolChainConfigured) + if err := _USDCTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseChainConfigured(log types.Log) (*USDCTokenPoolChainConfigured, error) { + event := new(USDCTokenPoolChainConfigured) + if err := _USDCTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolChainRemovedIterator struct { + Event *USDCTokenPoolChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolChainRemovedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolChainRemoved struct { + RemoteChainSelector uint64 + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*USDCTokenPoolChainRemovedIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &USDCTokenPoolChainRemovedIterator{contract: _USDCTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolChainRemoved) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolChainRemoved) + if err := _USDCTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseChainRemoved(log types.Log) (*USDCTokenPoolChainRemoved, error) { + event := new(USDCTokenPoolChainRemoved) + if err := _USDCTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolConfigChangedIterator struct { + Event *USDCTokenPoolConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolConfigChangedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*USDCTokenPoolConfigChangedIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &USDCTokenPoolConfigChangedIterator{contract: _USDCTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolConfigChanged) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolConfigChanged) + if err := _USDCTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseConfigChanged(log types.Log) (*USDCTokenPoolConfigChanged, error) { + event := new(USDCTokenPoolConfigChanged) + if err := _USDCTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolConfigSetIterator struct { + Event *USDCTokenPoolConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolConfigSetIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolConfigSet struct { + TokenMessenger common.Address + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterConfigSet(opts *bind.FilterOpts) (*USDCTokenPoolConfigSetIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "ConfigSet") + if err != nil { + return nil, err + } + return &USDCTokenPoolConfigSetIterator{contract: _USDCTokenPool.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolConfigSet) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.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: + + event := new(USDCTokenPoolConfigSet) + if err := _USDCTokenPool.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 +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseConfigSet(log types.Log) (*USDCTokenPoolConfigSet, error) { + event := new(USDCTokenPoolConfigSet) + if err := _USDCTokenPool.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolDomainsSetIterator struct { + Event *USDCTokenPoolDomainsSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolDomainsSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolDomainsSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolDomainsSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolDomainsSetIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolDomainsSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolDomainsSet struct { + Arg0 []USDCTokenPoolDomainUpdate + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterDomainsSet(opts *bind.FilterOpts) (*USDCTokenPoolDomainsSetIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "DomainsSet") + if err != nil { + return nil, err + } + return &USDCTokenPoolDomainsSetIterator{contract: _USDCTokenPool.contract, event: "DomainsSet", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchDomainsSet(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolDomainsSet) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "DomainsSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolDomainsSet) + if err := _USDCTokenPool.contract.UnpackLog(event, "DomainsSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseDomainsSet(log types.Log) (*USDCTokenPoolDomainsSet, error) { + event := new(USDCTokenPoolDomainsSet) + if err := _USDCTokenPool.contract.UnpackLog(event, "DomainsSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolLockedIterator struct { + Event *USDCTokenPoolLocked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolLockedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolLockedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolLockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolLocked struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*USDCTokenPoolLockedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return &USDCTokenPoolLockedIterator{contract: _USDCTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolLocked, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolLocked) + if err := _USDCTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseLocked(log types.Log) (*USDCTokenPoolLocked, error) { + event := new(USDCTokenPoolLocked) + if err := _USDCTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolMintedIterator struct { + Event *USDCTokenPoolMinted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolMintedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolMintedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*USDCTokenPoolMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &USDCTokenPoolMintedIterator{contract: _USDCTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolMinted) + if err := _USDCTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseMinted(log types.Log) (*USDCTokenPoolMinted, error) { + event := new(USDCTokenPoolMinted) + if err := _USDCTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolOwnershipTransferRequestedIterator struct { + Event *USDCTokenPoolOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*USDCTokenPoolOwnershipTransferRequestedIterator, 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 := _USDCTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &USDCTokenPoolOwnershipTransferRequestedIterator{contract: _USDCTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolOwnershipTransferRequested, 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 := _USDCTokenPool.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: + + event := new(USDCTokenPoolOwnershipTransferRequested) + if err := _USDCTokenPool.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 +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*USDCTokenPoolOwnershipTransferRequested, error) { + event := new(USDCTokenPoolOwnershipTransferRequested) + if err := _USDCTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolOwnershipTransferredIterator struct { + Event *USDCTokenPoolOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*USDCTokenPoolOwnershipTransferredIterator, 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 := _USDCTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &USDCTokenPoolOwnershipTransferredIterator{contract: _USDCTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolOwnershipTransferred, 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 := _USDCTokenPool.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: + + event := new(USDCTokenPoolOwnershipTransferred) + if err := _USDCTokenPool.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 +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*USDCTokenPoolOwnershipTransferred, error) { + event := new(USDCTokenPoolOwnershipTransferred) + if err := _USDCTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolRateLimitAdminSetIterator struct { + Event *USDCTokenPoolRateLimitAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolRateLimitAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolRateLimitAdminSetIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolRateLimitAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolRateLimitAdminSet struct { + RateLimitAdmin common.Address + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*USDCTokenPoolRateLimitAdminSetIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return &USDCTokenPoolRateLimitAdminSetIterator{contract: _USDCTokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolRateLimitAdminSet) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolRateLimitAdminSet) + if err := _USDCTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*USDCTokenPoolRateLimitAdminSet, error) { + event := new(USDCTokenPoolRateLimitAdminSet) + if err := _USDCTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolReleasedIterator struct { + Event *USDCTokenPoolReleased + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolReleasedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolReleasedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolReleasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolReleased struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*USDCTokenPoolReleasedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &USDCTokenPoolReleasedIterator{contract: _USDCTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolReleased) + if err := _USDCTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseReleased(log types.Log) (*USDCTokenPoolReleased, error) { + event := new(USDCTokenPoolReleased) + if err := _USDCTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolRemotePoolAddedIterator struct { + Event *USDCTokenPoolRemotePoolAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolRemotePoolAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolRemotePoolAddedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolRemotePoolAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolRemotePoolAdded struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*USDCTokenPoolRemotePoolAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &USDCTokenPoolRemotePoolAddedIterator{contract: _USDCTokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolRemotePoolAdded) + if err := _USDCTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*USDCTokenPoolRemotePoolAdded, error) { + event := new(USDCTokenPoolRemotePoolAdded) + if err := _USDCTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolRemotePoolRemovedIterator struct { + Event *USDCTokenPoolRemotePoolRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolRemotePoolRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolRemotePoolRemovedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolRemotePoolRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolRemotePoolRemoved struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*USDCTokenPoolRemotePoolRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &USDCTokenPoolRemotePoolRemovedIterator{contract: _USDCTokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolRemotePoolRemoved) + if err := _USDCTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*USDCTokenPoolRemotePoolRemoved, error) { + event := new(USDCTokenPoolRemotePoolRemoved) + if err := _USDCTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolRouterUpdatedIterator struct { + Event *USDCTokenPoolRouterUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolRouterUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolRouterUpdatedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolRouterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolRouterUpdated struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*USDCTokenPoolRouterUpdatedIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return &USDCTokenPoolRouterUpdatedIterator{contract: _USDCTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolRouterUpdated) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolRouterUpdated) + if err := _USDCTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*USDCTokenPoolRouterUpdated, error) { + event := new(USDCTokenPoolRouterUpdated) + if err := _USDCTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type USDCTokenPoolTokensConsumedIterator struct { + Event *USDCTokenPoolTokensConsumed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *USDCTokenPoolTokensConsumedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(USDCTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *USDCTokenPoolTokensConsumedIterator) Error() error { + return it.fail +} + +func (it *USDCTokenPoolTokensConsumedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type USDCTokenPoolTokensConsumed struct { + Tokens *big.Int + Raw types.Log +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*USDCTokenPoolTokensConsumedIterator, error) { + + logs, sub, err := _USDCTokenPool.contract.FilterLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return &USDCTokenPoolTokensConsumedIterator{contract: _USDCTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolTokensConsumed) (event.Subscription, error) { + + logs, sub, err := _USDCTokenPool.contract.WatchLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(USDCTokenPoolTokensConsumed) + if err := _USDCTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_USDCTokenPool *USDCTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*USDCTokenPoolTokensConsumed, error) { + event := new(USDCTokenPoolTokensConsumed) + if err := _USDCTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_USDCTokenPool *USDCTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _USDCTokenPool.abi.Events["AllowListAdd"].ID: + return _USDCTokenPool.ParseAllowListAdd(log) + case _USDCTokenPool.abi.Events["AllowListRemove"].ID: + return _USDCTokenPool.ParseAllowListRemove(log) + case _USDCTokenPool.abi.Events["Burned"].ID: + return _USDCTokenPool.ParseBurned(log) + case _USDCTokenPool.abi.Events["ChainAdded"].ID: + return _USDCTokenPool.ParseChainAdded(log) + case _USDCTokenPool.abi.Events["ChainConfigured"].ID: + return _USDCTokenPool.ParseChainConfigured(log) + case _USDCTokenPool.abi.Events["ChainRemoved"].ID: + return _USDCTokenPool.ParseChainRemoved(log) + case _USDCTokenPool.abi.Events["ConfigChanged"].ID: + return _USDCTokenPool.ParseConfigChanged(log) + case _USDCTokenPool.abi.Events["ConfigSet"].ID: + return _USDCTokenPool.ParseConfigSet(log) + case _USDCTokenPool.abi.Events["DomainsSet"].ID: + return _USDCTokenPool.ParseDomainsSet(log) + case _USDCTokenPool.abi.Events["Locked"].ID: + return _USDCTokenPool.ParseLocked(log) + case _USDCTokenPool.abi.Events["Minted"].ID: + return _USDCTokenPool.ParseMinted(log) + case _USDCTokenPool.abi.Events["OwnershipTransferRequested"].ID: + return _USDCTokenPool.ParseOwnershipTransferRequested(log) + case _USDCTokenPool.abi.Events["OwnershipTransferred"].ID: + return _USDCTokenPool.ParseOwnershipTransferred(log) + case _USDCTokenPool.abi.Events["RateLimitAdminSet"].ID: + return _USDCTokenPool.ParseRateLimitAdminSet(log) + case _USDCTokenPool.abi.Events["Released"].ID: + return _USDCTokenPool.ParseReleased(log) + case _USDCTokenPool.abi.Events["RemotePoolAdded"].ID: + return _USDCTokenPool.ParseRemotePoolAdded(log) + case _USDCTokenPool.abi.Events["RemotePoolRemoved"].ID: + return _USDCTokenPool.ParseRemotePoolRemoved(log) + case _USDCTokenPool.abi.Events["RouterUpdated"].ID: + return _USDCTokenPool.ParseRouterUpdated(log) + case _USDCTokenPool.abi.Events["TokensConsumed"].ID: + return _USDCTokenPool.ParseTokensConsumed(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (USDCTokenPoolAllowListAdd) Topic() common.Hash { + return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8") +} + +func (USDCTokenPoolAllowListRemove) Topic() common.Hash { + return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566") +} + +func (USDCTokenPoolBurned) Topic() common.Hash { + return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7") +} + +func (USDCTokenPoolChainAdded) Topic() common.Hash { + return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") +} + +func (USDCTokenPoolChainConfigured) Topic() common.Hash { + return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b") +} + +func (USDCTokenPoolChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (USDCTokenPoolConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (USDCTokenPoolConfigSet) Topic() common.Hash { + return common.HexToHash("0x2e902d38f15b233cbb63711add0fca4545334d3a169d60c0a616494d7eea9544") +} + +func (USDCTokenPoolDomainsSet) Topic() common.Hash { + return common.HexToHash("0x1889010d2535a0ab1643678d1da87fbbe8b87b2f585b47ddb72ec622aef9ee56") +} + +func (USDCTokenPoolLocked) Topic() common.Hash { + return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008") +} + +func (USDCTokenPoolMinted) Topic() common.Hash { + return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0") +} + +func (USDCTokenPoolOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (USDCTokenPoolOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (USDCTokenPoolRateLimitAdminSet) Topic() common.Hash { + return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174") +} + +func (USDCTokenPoolReleased) Topic() common.Hash { + return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52") +} + +func (USDCTokenPoolRemotePoolAdded) Topic() common.Hash { + return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea") +} + +func (USDCTokenPoolRemotePoolRemoved) Topic() common.Hash { + return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76") +} + +func (USDCTokenPoolRouterUpdated) Topic() common.Hash { + return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684") +} + +func (USDCTokenPoolTokensConsumed) Topic() common.Hash { + return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a") +} + +func (_USDCTokenPool *USDCTokenPool) Address() common.Address { + return _USDCTokenPool.address +} + +type USDCTokenPoolInterface interface { + SUPPORTEDUSDCVERSION(opts *bind.CallOpts) (uint32, error) + + GetAllowList(opts *bind.CallOpts) ([]common.Address, error) + + GetAllowListEnabled(opts *bind.CallOpts) (bool, error) + + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetDomain(opts *bind.CallOpts, chainSelector uint64) (USDCTokenPoolDomain, error) + + GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) + + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) + + GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) + + GetRmnProxy(opts *bind.CallOpts) (common.Address, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) + + GetToken(opts *bind.CallOpts) (common.Address, error) + + GetTokenDecimals(opts *bind.CallOpts) (uint8, error) + + ILocalDomainIdentifier(opts *bind.CallOpts) (uint32, error) + + IMessageTransmitter(opts *bind.CallOpts) (common.Address, error) + + ITokenMessenger(opts *bind.CallOpts) (common.Address, error) + + IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) + + IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) + + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) + + SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) + + SetDomains(opts *bind.TransactOpts, domains []USDCTokenPoolDomainUpdate) (*types.Transaction, error) + + SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) + + SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAllowListAdd(opts *bind.FilterOpts) (*USDCTokenPoolAllowListAddIterator, error) + + WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolAllowListAdd) (event.Subscription, error) + + ParseAllowListAdd(log types.Log) (*USDCTokenPoolAllowListAdd, error) + + FilterAllowListRemove(opts *bind.FilterOpts) (*USDCTokenPoolAllowListRemoveIterator, error) + + WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolAllowListRemove) (event.Subscription, error) + + ParseAllowListRemove(log types.Log) (*USDCTokenPoolAllowListRemove, error) + + FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*USDCTokenPoolBurnedIterator, error) + + WatchBurned(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolBurned, sender []common.Address) (event.Subscription, error) + + ParseBurned(log types.Log) (*USDCTokenPoolBurned, error) + + FilterChainAdded(opts *bind.FilterOpts) (*USDCTokenPoolChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*USDCTokenPoolChainAdded, error) + + FilterChainConfigured(opts *bind.FilterOpts) (*USDCTokenPoolChainConfiguredIterator, error) + + WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolChainConfigured) (event.Subscription, error) + + ParseChainConfigured(log types.Log) (*USDCTokenPoolChainConfigured, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*USDCTokenPoolChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*USDCTokenPoolChainRemoved, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*USDCTokenPoolConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*USDCTokenPoolConfigChanged, error) + + FilterConfigSet(opts *bind.FilterOpts) (*USDCTokenPoolConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolConfigSet) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*USDCTokenPoolConfigSet, error) + + FilterDomainsSet(opts *bind.FilterOpts) (*USDCTokenPoolDomainsSetIterator, error) + + WatchDomainsSet(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolDomainsSet) (event.Subscription, error) + + ParseDomainsSet(log types.Log) (*USDCTokenPoolDomainsSet, error) + + FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*USDCTokenPoolLockedIterator, error) + + WatchLocked(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolLocked, sender []common.Address) (event.Subscription, error) + + ParseLocked(log types.Log) (*USDCTokenPoolLocked, error) + + FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*USDCTokenPoolMintedIterator, error) + + WatchMinted(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseMinted(log types.Log) (*USDCTokenPoolMinted, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*USDCTokenPoolOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*USDCTokenPoolOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*USDCTokenPoolOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*USDCTokenPoolOwnershipTransferred, error) + + FilterRateLimitAdminSet(opts *bind.FilterOpts) (*USDCTokenPoolRateLimitAdminSetIterator, error) + + WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolRateLimitAdminSet) (event.Subscription, error) + + ParseRateLimitAdminSet(log types.Log) (*USDCTokenPoolRateLimitAdminSet, error) + + FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*USDCTokenPoolReleasedIterator, error) + + WatchReleased(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseReleased(log types.Log) (*USDCTokenPoolReleased, error) + + FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*USDCTokenPoolRemotePoolAddedIterator, error) + + WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolAdded(log types.Log) (*USDCTokenPoolRemotePoolAdded, error) + + FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*USDCTokenPoolRemotePoolRemovedIterator, error) + + WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolRemoved(log types.Log) (*USDCTokenPoolRemotePoolRemoved, error) + + FilterRouterUpdated(opts *bind.FilterOpts) (*USDCTokenPoolRouterUpdatedIterator, error) + + WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolRouterUpdated) (event.Subscription, error) + + ParseRouterUpdated(log types.Log) (*USDCTokenPoolRouterUpdated, error) + + FilterTokensConsumed(opts *bind.FilterOpts) (*USDCTokenPoolTokensConsumedIterator, error) + + WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *USDCTokenPoolTokensConsumed) (event.Subscription, error) + + ParseTokensConsumed(log types.Log) (*USDCTokenPoolTokensConsumed, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/ccip_encoding_utils/ccip_encoding_utils.go b/core/gethwrappers/ccip/generated/v1_6_0/ccip_encoding_utils/ccip_encoding_utils.go new file mode 100644 index 00000000000..2b4d589656f --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/ccip_encoding_utils/ccip_encoding_utils.go @@ -0,0 +1,282 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccip_encoding_utils + +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" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type CCIPHomeOCR3Config struct { + PluginType uint8 + ChainSelector uint64 + FRoleDON uint8 + OffchainConfigVersion uint64 + OfframpAddress []byte + RmnHomeAddress []byte + Nodes []CCIPHomeOCR3Node + OffchainConfig []byte +} + +type CCIPHomeOCR3Node struct { + P2pId [32]byte + SignerKey []byte + TransmitterKey []byte +} + +type IRMNRemoteSignature struct { + R [32]byte + S [32]byte +} + +type InternalGasPriceUpdate struct { + DestChainSelector uint64 + UsdPerUnitGas *big.Int +} + +type InternalMerkleRoot struct { + SourceChainSelector uint64 + OnRampAddress []byte + MinSeqNr uint64 + MaxSeqNr uint64 + MerkleRoot [32]byte +} + +type InternalPriceUpdates struct { + TokenPriceUpdates []InternalTokenPriceUpdate + GasPriceUpdates []InternalGasPriceUpdate +} + +type InternalTokenPriceUpdate struct { + SourceToken common.Address + UsdPerToken *big.Int +} + +type OffRampCommitReport struct { + PriceUpdates InternalPriceUpdates + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + RmnSignatures []IRMNRemoteSignature +} + +type RMNRemoteReport struct { + DestChainId *big.Int + DestChainSelector uint64 + RmnRemoteContractAddress common.Address + OfframpAddress common.Address + RmnHomeContractConfigDigest [32]byte + MerkleRoots []InternalMerkleRoot +} + +var EncodingUtilsMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"exposeCommitReport\",\"inputs\":[{\"name\":\"commitReport\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exposeOCR3Config\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Config[]\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"exposeRmnReport\",\"inputs\":[{\"name\":\"rmnReportVersion\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rmnReport\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Report\",\"components\":[{\"name\":\"destChainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemoteContractAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"offrampAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"}]", +} + +var EncodingUtilsABI = EncodingUtilsMetaData.ABI + +type EncodingUtils struct { + address common.Address + abi abi.ABI + EncodingUtilsCaller + EncodingUtilsTransactor + EncodingUtilsFilterer +} + +type EncodingUtilsCaller struct { + contract *bind.BoundContract +} + +type EncodingUtilsTransactor struct { + contract *bind.BoundContract +} + +type EncodingUtilsFilterer struct { + contract *bind.BoundContract +} + +type EncodingUtilsSession struct { + Contract *EncodingUtils + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type EncodingUtilsCallerSession struct { + Contract *EncodingUtilsCaller + CallOpts bind.CallOpts +} + +type EncodingUtilsTransactorSession struct { + Contract *EncodingUtilsTransactor + TransactOpts bind.TransactOpts +} + +type EncodingUtilsRaw struct { + Contract *EncodingUtils +} + +type EncodingUtilsCallerRaw struct { + Contract *EncodingUtilsCaller +} + +type EncodingUtilsTransactorRaw struct { + Contract *EncodingUtilsTransactor +} + +func NewEncodingUtils(address common.Address, backend bind.ContractBackend) (*EncodingUtils, error) { + abi, err := abi.JSON(strings.NewReader(EncodingUtilsABI)) + if err != nil { + return nil, err + } + contract, err := bindEncodingUtils(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &EncodingUtils{address: address, abi: abi, EncodingUtilsCaller: EncodingUtilsCaller{contract: contract}, EncodingUtilsTransactor: EncodingUtilsTransactor{contract: contract}, EncodingUtilsFilterer: EncodingUtilsFilterer{contract: contract}}, nil +} + +func NewEncodingUtilsCaller(address common.Address, caller bind.ContractCaller) (*EncodingUtilsCaller, error) { + contract, err := bindEncodingUtils(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &EncodingUtilsCaller{contract: contract}, nil +} + +func NewEncodingUtilsTransactor(address common.Address, transactor bind.ContractTransactor) (*EncodingUtilsTransactor, error) { + contract, err := bindEncodingUtils(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &EncodingUtilsTransactor{contract: contract}, nil +} + +func NewEncodingUtilsFilterer(address common.Address, filterer bind.ContractFilterer) (*EncodingUtilsFilterer, error) { + contract, err := bindEncodingUtils(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &EncodingUtilsFilterer{contract: contract}, nil +} + +func bindEncodingUtils(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := EncodingUtilsMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_EncodingUtils *EncodingUtilsRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EncodingUtils.Contract.EncodingUtilsCaller.contract.Call(opts, result, method, params...) +} + +func (_EncodingUtils *EncodingUtilsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EncodingUtils.Contract.EncodingUtilsTransactor.contract.Transfer(opts) +} + +func (_EncodingUtils *EncodingUtilsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EncodingUtils.Contract.EncodingUtilsTransactor.contract.Transact(opts, method, params...) +} + +func (_EncodingUtils *EncodingUtilsCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _EncodingUtils.Contract.contract.Call(opts, result, method, params...) +} + +func (_EncodingUtils *EncodingUtilsTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _EncodingUtils.Contract.contract.Transfer(opts) +} + +func (_EncodingUtils *EncodingUtilsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _EncodingUtils.Contract.contract.Transact(opts, method, params...) +} + +func (_EncodingUtils *EncodingUtilsCaller) ExposeCommitReport(opts *bind.CallOpts, commitReport OffRampCommitReport) ([]byte, error) { + var out []interface{} + err := _EncodingUtils.contract.Call(opts, &out, "exposeCommitReport", commitReport) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_EncodingUtils *EncodingUtilsSession) ExposeCommitReport(commitReport OffRampCommitReport) ([]byte, error) { + return _EncodingUtils.Contract.ExposeCommitReport(&_EncodingUtils.CallOpts, commitReport) +} + +func (_EncodingUtils *EncodingUtilsCallerSession) ExposeCommitReport(commitReport OffRampCommitReport) ([]byte, error) { + return _EncodingUtils.Contract.ExposeCommitReport(&_EncodingUtils.CallOpts, commitReport) +} + +func (_EncodingUtils *EncodingUtilsCaller) ExposeOCR3Config(opts *bind.CallOpts, config []CCIPHomeOCR3Config) ([]byte, error) { + var out []interface{} + err := _EncodingUtils.contract.Call(opts, &out, "exposeOCR3Config", config) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_EncodingUtils *EncodingUtilsSession) ExposeOCR3Config(config []CCIPHomeOCR3Config) ([]byte, error) { + return _EncodingUtils.Contract.ExposeOCR3Config(&_EncodingUtils.CallOpts, config) +} + +func (_EncodingUtils *EncodingUtilsCallerSession) ExposeOCR3Config(config []CCIPHomeOCR3Config) ([]byte, error) { + return _EncodingUtils.Contract.ExposeOCR3Config(&_EncodingUtils.CallOpts, config) +} + +func (_EncodingUtils *EncodingUtilsTransactor) ExposeRmnReport(opts *bind.TransactOpts, rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) { + return _EncodingUtils.contract.Transact(opts, "exposeRmnReport", rmnReportVersion, rmnReport) +} + +func (_EncodingUtils *EncodingUtilsSession) ExposeRmnReport(rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) { + return _EncodingUtils.Contract.ExposeRmnReport(&_EncodingUtils.TransactOpts, rmnReportVersion, rmnReport) +} + +func (_EncodingUtils *EncodingUtilsTransactorSession) ExposeRmnReport(rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) { + return _EncodingUtils.Contract.ExposeRmnReport(&_EncodingUtils.TransactOpts, rmnReportVersion, rmnReport) +} + +func (_EncodingUtils *EncodingUtils) Address() common.Address { + return _EncodingUtils.address +} + +type EncodingUtilsInterface interface { + ExposeCommitReport(opts *bind.CallOpts, commitReport OffRampCommitReport) ([]byte, error) + + ExposeOCR3Config(opts *bind.CallOpts, config []CCIPHomeOCR3Config) ([]byte, error) + + ExposeRmnReport(opts *bind.TransactOpts, rmnReportVersion [32]byte, rmnReport RMNRemoteReport) (*types.Transaction, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/ccip_home/ccip_home.go b/core/gethwrappers/ccip/generated/v1_6_0/ccip_home/ccip_home.go new file mode 100644 index 00000000000..bd4cce655d9 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/ccip_home/ccip_home.go @@ -0,0 +1,1918 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccip_home + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type CCIPHomeChainConfig struct { + Readers [][32]byte + FChain uint8 + Config []byte +} + +type CCIPHomeChainConfigArgs struct { + ChainSelector uint64 + ChainConfig CCIPHomeChainConfig +} + +type CCIPHomeOCR3Config struct { + PluginType uint8 + ChainSelector uint64 + FRoleDON uint8 + OffchainConfigVersion uint64 + OfframpAddress []byte + RmnHomeAddress []byte + Nodes []CCIPHomeOCR3Node + OffchainConfig []byte +} + +type CCIPHomeOCR3Node struct { + P2pId [32]byte + SignerKey []byte + TransmitterKey []byte +} + +type CCIPHomeVersionedConfig struct { + Version uint32 + ConfigDigest [32]byte + Config CCIPHomeOCR3Config +} + +var CCIPHomeMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"capabilitiesRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainConfigUpdates\",\"inputs\":[{\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beforeCapabilityConfigSet\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"update\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveDigest\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllChainConfigs\",\"inputs\":[{\"name\":\"pageIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pageSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.ChainConfigArgs[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllConfigs\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"activeConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"candidateConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCandidateDigest\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCapabilityConfiguration\",\"inputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"configuration\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getCapabilityRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChainConfig\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"versionedConfig\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"ok\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfigDigests\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"}],\"outputs\":[{\"name\":\"activeConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNumChainConfigurations\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"promoteCandidateAndRevokeActive\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"digestToPromote\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestToRevoke\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeCandidate\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCandidate\",\"inputs\":[{\"name\":\"donId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"digestToOverwrite\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"newConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ActiveConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CandidateConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CapabilityConfigurationSet\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigRemoved\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigSet\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"chainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCCIPHome.ChainConfig\",\"components\":[{\"name\":\"readers\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"fChain\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"config\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigPromoted\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structCCIPHome.OCR3Config\",\"components\":[{\"name\":\"pluginType\",\"type\":\"uint8\",\"internalType\":\"enumInternal.OCRPluginType\"},{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"FRoleDON\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"offchainConfigVersion\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"offrampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"rmnHomeAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structCCIPHome.OCR3Node[]\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"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\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainSelectorNotFound\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainSelectorNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"gotConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DONIdMismatch\",\"inputs\":[{\"name\":\"callDonId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"capabilityRegistryDonId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"FChainMustBePositive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FChainTooHigh\",\"inputs\":[{\"name\":\"fChain\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"FRoleDON\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"FTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNode\",\"inputs\":[{\"name\":\"node\",\"type\":\"tuple\",\"internalType\":\"structCCIPHome.OCR3Node\",\"components\":[{\"name\":\"p2pId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signerKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"transmitterKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"type\":\"error\",\"name\":\"InvalidPluginType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSelector\",\"inputs\":[{\"name\":\"selector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoOpStateTransitionNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughTransmitters\",\"inputs\":[{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimum\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OfframpAddressCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RMNHomeAddressCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RevokingZeroDigestNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TooManySigners\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x60a03460bf57601f613d6638819003918201601f19168301916001600160401b0383118484101760c45780849260209460405283398101031260bf57516001600160a01b03811680820360bf57331560ae57600180546001600160a01b031916331790556006805463ffffffff1916905515609d57608052604051613c8b90816100db823960805181818161026601528181612f3901526139bd0152f35b6342bcdf7f60e11b60005260046000fd5b639b15e16f60e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610157578063020330e614610152578063181f5a771461014d57806333d9704a146101485780633df45a72146101435780634851d5491461013e5780635a837f97146101395780635f1edd9c146101345780637524051a1461012f57806379ba50971461012a5780637ac0d41e146101255780638318ed5d146101205780638da5cb5b1461011b578063922ea40614610116578063b149092b14610111578063b74b23561461010c578063bae4e0fa14610107578063f2fde38b14610102578063f442c89a146100fd5763fba64a7c146100f857600080fd5b61172d565b611472565b61134e565b6110e5565b61100a565b610f90565b610ee2565b610e90565b610e2f565b610df3565b610d0a565b610c0f565b610bbb565b610934565b6108ae565b6107ce565b61072c565b610415565b61021b565b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361021657807f78bea72100000000000000000000000000000000000000000000000000000000602092149081156101ec575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386101e1565b600080fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176102d557604052565b61028a565b610100810190811067ffffffffffffffff8211176102d557604052565b6040810190811067ffffffffffffffff8211176102d557604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d557604052565b60405190610363604083610313565b565b6040519061036361010083610313565b67ffffffffffffffff81116102d557601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381106103c25750506000910152565b81810151838201526020016103b2565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361040e815180928187528780880191016103af565b0116010190565b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165761049260408051906104568183610313565b600e82527f43434950486f6d6520312e362e300000000000000000000000000000000000006020830152519182916020835260208301906103d2565b0390f35b63ffffffff81160361021657565b6064359061036382610496565b6002111561021657565b3590610363826104b1565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6060910112610216576004356104fc81610496565b90602435610509816104b1565b9060443590565b6002111561051a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90600282101561051a5752565b61058a9181518152604061057960208401516060602085015260608401906103d2565b9201519060408184039101526103d2565b90565b9080602083519182815201916020808360051b8301019401926000915b8383106105b957505050505090565b90919293946020806105f5837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528951610556565b970193019301919392906105aa565b90604061058a9263ffffffff81511683526020810151602084015201519060606040820152610637606082018351610549565b602082015167ffffffffffffffff166080820152604082015160ff1660a0820152606082015167ffffffffffffffff1660c082015260e06106f86106c361068e6080860151610100858701526101608601906103d2565b60a08601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0868303016101008701526103d2565b60c08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08583030161012086015261058d565b920151906101407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0828503019101526103d2565b346102165761075a610746610740366104c6565b91611b23565b604051928392604084526040840190610604565b90151560208301520390f35b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc60409101126102165760043561079c81610496565b9060243561058a816104b1565b90916107c061058a93604084526040840190610604565b916020818403910152610604565b34610216576107dc36610766565b906107e56117dc565b906107ee6117dc565b9261083d61083763ffffffff841680600052600560205261081384604060002061183b565b90600052600760205263ffffffff61082f85604060002061183b565b541690611882565b50611a52565b60208101516108a4575b508161087c82610876610837946108716108829763ffffffff166000526005602052604060002090565b61183b565b9261312a565b90611882565b602081015161089c575b50610492604051928392836107a9565b91503861088c565b9250610882610847565b346102165761091f60016108c136610766565b929061087c63ffffffff821694856000526005602052846109056108e983604060002061183b565b88600052600760205263ffffffff61082f85604060002061183b565b50015495600052600560205261087681604060002061183b565b50015460408051928352602083019190915290f35b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043561096f81610496565b6024359061097c826104b1565b604435916064359161098c613150565b831580610bb3575b610b89576109ae6109a5838361312a565b63ffffffff1690565b8460016109d8836109d3876108718863ffffffff166000526005602052604060002090565b611882565b50015403610b2f57506001610a2f610a04846108718563ffffffff166000526005602052604060002090565b61087c610a25866108718763ffffffff166000526007602052604060002090565b5463ffffffff1690565b50018054848103610af9575091610871610a60926000610aa0955563ffffffff166000526007602052604060002090565b6001610a70825463ffffffff1690565b1863ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055565b80610ace575b507ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e600080a2005b7f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8600080a238610aa6565b7f93df584c00000000000000000000000000000000000000000000000000000000600052600452602484905260446000fd5b6000fd5b610b576001916109d3610b2b95610871899663ffffffff166000526005602052604060002090565b5001547f93df584c00000000000000000000000000000000000000000000000000000000600052600452602452604490565b7f7b4d1e4f0000000000000000000000000000000000000000000000000000000060005260046000fd5b508215610994565b346102165760206001610c0463ffffffff8061082f610bd936610766565b9316928360005260058752610bf281604060002061183b565b9360005260078752604060002061183b565b500154604051908152f35b3461021657610c1d366104c6565b91610c26613150565b8215610ce05763ffffffff610c3b838361312a565b169263ffffffff82166000526005602052806001610c61866109d387604060002061183b565b50015403610cb957926109d3600193610871610cb4946000977f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b8980a263ffffffff166000526005602052604060002090565b500155005b6001610b57856109d386610871610b2b9763ffffffff166000526005602052604060002090565b7f0849d8cc0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760005473ffffffffffffffffffffffffffffffffffffffff81163303610dc9577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610216576020600354604051908152f35b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657610e69600435610496565b6040516020610e788183610313565b600082526104926040519282849384528301906103d2565b346102165760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b34610216576020610efb610ef536610766565b90611bed565b604051908152f35b67ffffffffffffffff81160361021657565b6044359061036382610f03565b359061036382610f03565b9190606081019083519160608252825180915260206080830193019060005b818110610f7a5750505060408460ff602061058a9697015116602084015201519060408184039101526103d2565b8251855260209485019490920191600101610f4c565b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165767ffffffffffffffff600435610fd481610f03565b610fdc611c1a565b50166000526002602052610492610ff66040600020611c3a565b604051918291602083526020830190610f2d565b346102165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261021657611047602435600435611e24565b6040518091602082016020835281518091526040830190602060408260051b8601019301916000905b82821061107f57505050500390f35b919360206110d5827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc060019597998495030186526040838a5167ffffffffffffffff815116845201519181858201520190610f2d565b9601920192018594939192611070565b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043561112081610496565b60243561112c816104b1565b60443567ffffffffffffffff8111610216576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc826004019236030112610216576064359261117b613150565b61118d611188368461206f565b613231565b6111978382611bed565b9380850361131c57917f94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c69161087c9493610492966112f1575b506112cf8260026112936111f16111ec60065463ffffffff1690565b612158565b946112278663ffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000006006541617600655565b6112728660405161126b8161123f8960208301612418565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610313565b8b846135b0565b99896108768c9b6108718563ffffffff166000526005602052604060002090565b506001810188905580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff861617815501612936565b6112de60405192839283612abe565b0390a26040519081529081906020820190565b7f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b600080a2386111d0565b7f93df584c00000000000000000000000000000000000000000000000000000000600052600485905260245260446000fd5b346102165760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043573ffffffffffffffffffffffffffffffffffffffff8116809103610216576113a66136c5565b33811461141757807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b9181601f840112156102165782359167ffffffffffffffff8311610216576020808501948460051b01011161021657565b346102165760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043567ffffffffffffffff8111610216576114c1903690600401611441565b60243567ffffffffffffffff8111610216576114e1903690600401611441565b9190926114ec6136c5565b60005b8281106116015750505060005b81811061150557005b611525611520611516838587612b7a565b6020810190612662565b612bba565b90611539611534828587612b7a565b612429565b6115438351613948565b61155a611554602085015160ff1690565b60ff1690565b156115d75782816115ab6001956115a67f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e09567ffffffffffffffff166000526002602052604060002090565b612d9a565b6115be67ffffffffffffffff8216613bed565b506115ce60405192839283612e2d565b0390a1016114fc565b7fa9b3766e0000000000000000000000000000000000000000000000000000000060005260046000fd5b61163c611638611625611618611534858888612adb565b67ffffffffffffffff1690565b6000526004602052604060002054151590565b1590565b6116e657806116766116716116576115346001958888612adb565b67ffffffffffffffff166000526002602052604060002090565b612b33565b61168f61168a611618611534848888612adb565b613b09565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f06116dd6116c2611534848888612adb565b60405167ffffffffffffffff90911681529081906020820190565b0390a1016114ef565b61153490610b2b936116f793612adb565b7f1bd4d2d20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b346102165760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102165760043567ffffffffffffffff81116102165761177c903690600401611441565b505060243567ffffffffffffffff811161021657366023820112156102165780600401359067ffffffffffffffff8211610216573660248383010111610216576117da916117c8610f15565b5060246117d36104a4565b9201612f20565b005b604051906117e9826102b9565b8160008152600060208201526040805191611803836102da565b60008352600060208401526000828401526000606084015260606080840152606060a0840152606060c0840152606060e08401520152565b90600281101561051a57600052602052604060002090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906002811015611896576007020190600090565b611853565b600282101561051a5752565b90600182811c921680156118f0575b60208310146118c157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916118b6565b906040519182600082549261190e846118a7565b808452936001811690811561197a5750600114611933575b5061036392500383610313565b90506000929192526020600020906000915b81831061195e5750509060206103639282010138611926565b6020919350806001915483858901015201910190918492611945565b602093506103639592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611926565b67ffffffffffffffff81116102d55760051b60200190565b9081546119de816119ba565b926119ec6040519485610313565b818452602084019060005260206000206000915b838310611a0d5750505050565b60036020600192604051611a20816102b9565b85548152611a2f8587016118fa565b83820152611a3f600287016118fa565b6040820152815201920192019190611a00565b9060405191611a60836102b9565b60408363ffffffff835416815260018301546020820152611b1a6006835194611a88866102da565b611ae1611ad06002830154611aa060ff82168a61189b565b67ffffffffffffffff600882901c1660208a015260ff604882901c16888a015260501c67ffffffffffffffff1690565b67ffffffffffffffff166060880152565b611aed600382016118fa565b6080870152611afe600482016118fa565b60a0870152611b0f600582016119d2565b60c0870152016118fa565b60e08401520152565b90611b2c6117dc565b9260005b60028110611b42575050505090600090565b63ffffffff8416806000526005602052826001611b67846109d388604060002061183b565b5001541480611ba8575b611b7e5750600101611b30565b611ba2955061083794506109d392506000939193526005602052604060002061183b565b90600190565b50821515611b71565b91611be9918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b611c149061087c60019363ffffffff8316600052600560205261087681604060002061183b565b50015490565b60405190611c27826102b9565b6060604083828152600060208201520152565b90604051611c47816102b9565b809260405180602083549182815201908360005260206000209060005b818110611cab5750505060409282611c83611ca6946002940382610313565b8552611ca0611c96600183015460ff1690565b60ff166020870152565b016118fa565b910152565b8254845260209093019260019283019201611c64565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9081600302916003830403611d0157565b611cc1565b81810292918115918404141715611d0157565b60405190611d28602083610313565b600080835282815b828110611d3c57505050565b602090604051611d4b816102f7565b60008152611d57611c1a565b8382015282828501015201611d30565b90611d71826119ba565b611d7e6040519182610313565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611dac82946119ba565b019060005b828110611dbd57505050565b602090604051611dcc816102f7565b60008152611dd8611c1a565b8382015282828501015201611db1565b9060018201809211611d0157565b91908201809211611d0157565b91908203918211611d0157565b80518210156118965760209160051b010190565b611e318260035492611d06565b9180158015611f03575b611ef857611e499083611df6565b90808211611ef0575b50611e65611e608383611e03565b611d67565b91805b828110611e755750505090565b80611ee9611e87611618600194613a41565b611ec8611ea88267ffffffffffffffff166000526002602052604060002090565b611ec3611eb3610354565b67ffffffffffffffff9094168452565b611c3a565b6020820152611ed78584611e03565b90611ee28289611e10565b5286611e10565b5001611e68565b905038611e52565b50505061058a611d19565b5081831015611e3b565b60ff81160361021657565b359061036382611f0d565b81601f8201121561021657803590611f3a82610375565b92611f486040519485610313565b8284526020838301011161021657816000926020809301838601378301015290565b9080601f8301121561021657813591611f82836119ba565b92611f906040519485610313565b80845260208085019160051b830101918383116102165760208101915b838310611fbc57505050505090565b823567ffffffffffffffff81116102165782019060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126102165760405190612009826102b9565b60208301358252604083013567ffffffffffffffff81116102165787602061203392860101611f23565b602083015260608301359167ffffffffffffffff83116102165761205f88602080969581960101611f23565b6040820152815201920191611fad565b9190916101008184031261021657612085610365565b9261208f826104bb565b845261209d60208301610f22565b60208501526120ae60408301611f18565b60408501526120bf60608301610f22565b6060850152608082013567ffffffffffffffff811161021657816120e4918401611f23565b608085015260a082013567ffffffffffffffff81116102165781612109918401611f23565b60a085015260c082013567ffffffffffffffff8111610216578161212e918401611f6a565b60c085015260e082013567ffffffffffffffff8111610216576121519201611f23565b60e0830152565b63ffffffff1663ffffffff8114611d015760010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561021657016020813591019167ffffffffffffffff821161021657813603831361021657565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561021657016020813591019167ffffffffffffffff8211610216578160051b3603831361021657565b90602083828152019060208160051b85010193836000915b8383106122795750505050505090565b9091929394957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820301865286357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1843603018112156102165760206123206001938683940190813581526123126123076122f78685018561216f565b60608886015260608501916121bf565b92604081019061216f565b9160408185039101526121bf565b980196019493019190612269565b61058a916123448161233f846104bb565b610549565b61236461235360208401610f22565b67ffffffffffffffff166020830152565b61237d61237360408401611f18565b60ff166040830152565b61239d61238c60608401610f22565b67ffffffffffffffff166060830152565b61240a6123ff6123e46123c96123b6608087018761216f565b61010060808801526101008701916121bf565b6123d660a087018761216f565b9086830360a08801526121bf565b6123f160c08601866121fe565b9085830360c0870152612251565b9260e081019061216f565b9160e08185039101526121bf565b90602061058a92818152019061232e565b3561058a81610f03565b3561058a81611f0d565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610216570180359067ffffffffffffffff82116102165760200191813603831361021657565b818110612499575050565b6000815560010161248e565b9190601f81116124b457505050565b610363926000526020600020906020601f840160051c830193106124e0575b601f0160051c019061248e565b90915081906124d3565b90929167ffffffffffffffff81116102d5576125108161250a84546118a7565b846124a5565b6000601f821160011461256a578190611be993949560009261255f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b01359050388061252d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169461259d84600052602060002090565b91805b8781106125f65750836001959697106125be575b505050811b019055565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c199101351690553880806125b4565b909260206001819286860135815501940191016125a0565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610216570180359067ffffffffffffffff821161021657602001918160051b3603831361021657565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa181360301821215610216570190565b61269f81546118a7565b90816126a9575050565b81601f600093116001146126bb575055565b818352602083206126d791601f0160051c81019060010161248e565b808252602082209081548360011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8560031b1c191617905555565b90803582556001820161272a602083018361243d565b9067ffffffffffffffff82116102d55761274e8261274885546118a7565b856124a5565b600090601f83116001146127bd57926127a7836127b49460029794610363999760009261255f5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b604081019061243d565b929091016124ea565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08316916127f085600052602060002090565b92815b81811061285957509360029693610363989693600193836127b49810612821575b505050811b0190556127aa565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080612814565b919360206001819287870135815501950192016127f3565b6801000000000000000083116102d55780548382558084106128d9575b50906128a08192600052602060002090565b906000925b8484106128b3575050505050565b60036020826128cd6128c760019587612662565b87612714565b019301930192916128a5565b80600302906003820403611d015783600302600381048503611d015782600052602060002091820191015b818110612911575061288e565b6003906000815561292460018201612695565b61293060028201612695565b01612904565b90803591612943836104b1565b600283101561051a576127b46004926103639460ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0085541691161783556129ca61299060208301612429565b84547fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff1660089190911b68ffffffffffffffff0016178455565b612a146129d960408301612433565b84547fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1660489190911b69ff00000000000000000016178455565b612a66612a2360608301612429565b84547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178455565b612a80612a76608083018361243d565b90600186016124ea565b612a9a612a9060a083018361243d565b90600286016124ea565b612ab4612aaa60c083018361260e565b9060038601612871565b60e081019061243d565b60409063ffffffff61058a9493168152816020820152019061232e565b91908110156118965760051b0190565b906801000000000000000081116102d557815491818155828210612b0e57505050565b600052602060002091820191015b818110612b27575050565b60008155600101612b1c565b80546000825580612b53575b506002816000600161036394015501612695565b816000526020600020908101905b818110612b6e5750612b3f565b60008155600101612b61565b91908110156118965760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc181360301821215610216570190565b6060813603126102165760405190612bd1826102b9565b803567ffffffffffffffff811161021657810136601f8201121561021657803590612bfb826119ba565b91612c096040519384610313565b80835260208084019160051b8301019136831161021657602001905b828210612c6b575050508252612c3d60208201611f18565b602083015260408101359067ffffffffffffffff821161021657612c6391369101611f23565b604082015290565b8135815260209182019101612c25565b919091825167ffffffffffffffff81116102d557612c9d8161250a84546118a7565b6020601f8211600114612cf6578190611be9939495600092612ceb5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b01519050388061252d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0821690612d2984600052602060002090565b9160005b818110612d8257509583600195969710612d4b57505050811b019055565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880806125b4565b9192602060018192868b015181550194019201612d2d565b90805180519067ffffffffffffffff82116102d557602090612dbc8386612aeb565b0183600052602060002060005b838110612e1957505050509060026040610363936001840160ff6020830151167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905501519101612c7b565b600190602084519401938184015501612dc9565b60409067ffffffffffffffff61058a94931681528160208201520190610f2d565b906004116102165790600490565b906024116102165760040190602090565b919091357fffffffff0000000000000000000000000000000000000000000000000000000081169260048110612ea1575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b90816020910312610216573590565b908092918237016000815290565b3d15612f1b573d90612f0182610375565b91612f0f6040519384610313565b82523d6000602084013e565b606090565b909173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361310057612f72612f6c8484612e4e565b90612e6d565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbae4e0fa0000000000000000000000000000000000000000000000000000000081141590816130d5575b816130aa575b5061305b5750612fe1612fd98484612e5c565b810190612ed3565b63ffffffff82168103613022575050600091829161300460405180938193612ee2565b039082305af1613012612ef0565b901561301b5750565b60203d9101fd5b7f8a6e4ce80000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7f12ba286f000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7f5a837f97000000000000000000000000000000000000000000000000000000009150141538612fc6565b7f7524051a000000000000000000000000000000000000000000000000000000008114159150612fc0565b7fac7a7efd0000000000000000000000000000000000000000000000000000000060005260046000fd5b61314a60019263ffffffff8093166000526007602052604060002061183b565b54161890565b30330361315957565b7f371a73280000000000000000000000000000000000000000000000000000000060005260046000fd5b6040516020810190600082526020815261319e604082610313565b51902090565b906131ae826119ba565b6131bb6040519182610313565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06131e982946119ba565b0190602036910137565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611d015760010190565b90602061058a928181520190610556565b6020810167ffffffffffffffff613250825167ffffffffffffffff1690565b161561358657815161326181610510565b61326a81610510565b151580613568575b61353e57608082015180518015918215613528575b50506134fe5760a0820151805180159182156134e8575b50506134be576132bf611638611625611618845167ffffffffffffffff1690565b6134aa576132f961155460016132f16116576132e2611554604089015160ff1690565b955167ffffffffffffffff1690565b015460ff1690565b918183116134765760c0019182515191610100831161344c5761331b90611cf0565b8211156134225760009161332e816131a4565b9360005b8281106133905750505061334861334d91611cf0565b611de8565b9081811061336057505061036390613948565b7f548dd21f0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b61339b818351611e10565b51604081015151613412575b602081015151158015613409575b6133cf5790600191516133c88289611e10565b5201613332565b613405906040519182917f9fa4031400000000000000000000000000000000000000000000000000000000835260048301613220565b0390fd5b508051156133b5565b9461341c906131f3565b946133a7565b7f4856694e0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f1b925da60000000000000000000000000000000000000000000000000000000060005260046000fd5b507f2db220400000000000000000000000000000000000000000000000000000000060005260049190915260245260446000fd5b51610b2b9067ffffffffffffffff166116f7565b7fdee985740000000000000000000000000000000000000000000000000000000060005260046000fd5b6020012090506134f6613183565b14388061329e565b7f358c19270000000000000000000000000000000000000000000000000000000060005260046000fd5b602001209050613536613183565b143880613287565b7f3302dbd70000000000000000000000000000000000000000000000000000000060005260046000fd5b506001825161357681610510565b61357f81610510565b1415613272565b7f698cf8e00000000000000000000000000000000000000000000000000000000060005260046000fd5b90613677929361360663ffffffff9283604051957f45564d0000000000000000000000000000000000000000000000000000000000602088015246604088015230606088015216608086015260a0850190610549565b1660c082015260c0815261361b60e082610313565b6020604051938261363586945180928580880191016103af565b8301613649825180938580850191016103af565b0101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610313565b602081519101207fffff00000000000000000000000000000000000000000000000000000000000019167e0a0000000000000000000000000000000000000000000000000000000000001790565b73ffffffffffffffffffffffffffffffffffffffff6001541633036136e657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b519061036382610496565b9080601f83011215610216578151613732816119ba565b926137406040519485610313565b81845260208085019260051b82010192831161021657602001905b8282106137685750505090565b815181526020918201910161375b565b9080601f8301121561021657815161378f816119ba565b9261379d6040519485610313565b81845260208085019260051b82010192831161021657602001905b8282106137c55750505090565b81518152602091820191016137b8565b6020818303126102165780519067ffffffffffffffff821161021657019080601f830112156102165781519161380a836119ba565b926138186040519485610313565b80845260208085019160051b830101918383116102165760208101915b83831061384457505050505090565b825167ffffffffffffffff8111610216578201906101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083880301126102165761388d610365565b9061389a60208401613710565b82526138a860408401613710565b60208301526138b960608401613710565b60408301526080830151606083015260a0830151608083015260c083015160a083015260e083015167ffffffffffffffff8111610216578760206138ff9286010161371b565b60c08301526101008301519167ffffffffffffffff83116102165761392c88602080969581960101613778565b60e0820152815201920191613835565b6040513d6000823e3d90fd5b80516139515750565b60405180917f05a519660000000000000000000000000000000000000000000000000000000082526024820160206004840152815180915260206044840192019060005b818110613a10575050509080600092038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015613a0b576139ec5750565b613a08903d806000833e613a008183610313565b8101906137d5565b50565b61393c565b8251845285945060209384019390920191600101613995565b80548210156118965760005260206000200190600090565b6003548110156118965760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b015490565b80548015613ada577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190613aab8282613a29565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081815260046020526040902054908115613be6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820190828211611d0157600354927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8401938411611d01578383600095613ba59503613bab575b505050613b946003613a76565b600490600052602052604060002090565b55600190565b613b94613bd791613bcd613bc3613bdd956003613a29565b90549060031b1c90565b9283916003613a29565b90611bb1565b55388080613b87565b5050600090565b600081815260046020526040902054613c7857600354680100000000000000008110156102d557613c5f613c2a8260018594016003556003613a29565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600354906000526004602052604060002055600190565b5060009056fea164736f6c634300081a000a", +} + +var CCIPHomeABI = CCIPHomeMetaData.ABI + +var CCIPHomeBin = CCIPHomeMetaData.Bin + +func DeployCCIPHome(auth *bind.TransactOpts, backend bind.ContractBackend, capabilitiesRegistry common.Address) (common.Address, *types.Transaction, *CCIPHome, error) { + parsed, err := CCIPHomeMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPHomeBin), backend, capabilitiesRegistry) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CCIPHome{address: address, abi: *parsed, CCIPHomeCaller: CCIPHomeCaller{contract: contract}, CCIPHomeTransactor: CCIPHomeTransactor{contract: contract}, CCIPHomeFilterer: CCIPHomeFilterer{contract: contract}}, nil +} + +type CCIPHome struct { + address common.Address + abi abi.ABI + CCIPHomeCaller + CCIPHomeTransactor + CCIPHomeFilterer +} + +type CCIPHomeCaller struct { + contract *bind.BoundContract +} + +type CCIPHomeTransactor struct { + contract *bind.BoundContract +} + +type CCIPHomeFilterer struct { + contract *bind.BoundContract +} + +type CCIPHomeSession struct { + Contract *CCIPHome + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type CCIPHomeCallerSession struct { + Contract *CCIPHomeCaller + CallOpts bind.CallOpts +} + +type CCIPHomeTransactorSession struct { + Contract *CCIPHomeTransactor + TransactOpts bind.TransactOpts +} + +type CCIPHomeRaw struct { + Contract *CCIPHome +} + +type CCIPHomeCallerRaw struct { + Contract *CCIPHomeCaller +} + +type CCIPHomeTransactorRaw struct { + Contract *CCIPHomeTransactor +} + +func NewCCIPHome(address common.Address, backend bind.ContractBackend) (*CCIPHome, error) { + abi, err := abi.JSON(strings.NewReader(CCIPHomeABI)) + if err != nil { + return nil, err + } + contract, err := bindCCIPHome(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CCIPHome{address: address, abi: abi, CCIPHomeCaller: CCIPHomeCaller{contract: contract}, CCIPHomeTransactor: CCIPHomeTransactor{contract: contract}, CCIPHomeFilterer: CCIPHomeFilterer{contract: contract}}, nil +} + +func NewCCIPHomeCaller(address common.Address, caller bind.ContractCaller) (*CCIPHomeCaller, error) { + contract, err := bindCCIPHome(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CCIPHomeCaller{contract: contract}, nil +} + +func NewCCIPHomeTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPHomeTransactor, error) { + contract, err := bindCCIPHome(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CCIPHomeTransactor{contract: contract}, nil +} + +func NewCCIPHomeFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPHomeFilterer, error) { + contract, err := bindCCIPHome(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CCIPHomeFilterer{contract: contract}, nil +} + +func bindCCIPHome(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CCIPHomeMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_CCIPHome *CCIPHomeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPHome.Contract.CCIPHomeCaller.contract.Call(opts, result, method, params...) +} + +func (_CCIPHome *CCIPHomeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPHome.Contract.CCIPHomeTransactor.contract.Transfer(opts) +} + +func (_CCIPHome *CCIPHomeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPHome.Contract.CCIPHomeTransactor.contract.Transact(opts, method, params...) +} + +func (_CCIPHome *CCIPHomeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPHome.Contract.contract.Call(opts, result, method, params...) +} + +func (_CCIPHome *CCIPHomeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPHome.Contract.contract.Transfer(opts) +} + +func (_CCIPHome *CCIPHomeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPHome.Contract.contract.Transact(opts, method, params...) +} + +func (_CCIPHome *CCIPHomeCaller) GetActiveDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getActiveDigest", donId, pluginType) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetActiveDigest(donId uint32, pluginType uint8) ([32]byte, error) { + return _CCIPHome.Contract.GetActiveDigest(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetActiveDigest(donId uint32, pluginType uint8) ([32]byte, error) { + return _CCIPHome.Contract.GetActiveDigest(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCaller) GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getAllChainConfigs", pageIndex, pageSize) + + if err != nil { + return *new([]CCIPHomeChainConfigArgs), err + } + + out0 := *abi.ConvertType(out[0], new([]CCIPHomeChainConfigArgs)).(*[]CCIPHomeChainConfigArgs) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) { + return _CCIPHome.Contract.GetAllChainConfigs(&_CCIPHome.CallOpts, pageIndex, pageSize) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetAllChainConfigs(pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) { + return _CCIPHome.Contract.GetAllChainConfigs(&_CCIPHome.CallOpts, pageIndex, pageSize) +} + +func (_CCIPHome *CCIPHomeCaller) GetAllConfigs(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetAllConfigs, + + error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getAllConfigs", donId, pluginType) + + outstruct := new(GetAllConfigs) + if err != nil { + return *outstruct, err + } + + outstruct.ActiveConfig = *abi.ConvertType(out[0], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig) + outstruct.CandidateConfig = *abi.ConvertType(out[1], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig) + + return *outstruct, err + +} + +func (_CCIPHome *CCIPHomeSession) GetAllConfigs(donId uint32, pluginType uint8) (GetAllConfigs, + + error) { + return _CCIPHome.Contract.GetAllConfigs(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetAllConfigs(donId uint32, pluginType uint8) (GetAllConfigs, + + error) { + return _CCIPHome.Contract.GetAllConfigs(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCaller) GetCandidateDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getCandidateDigest", donId, pluginType) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetCandidateDigest(donId uint32, pluginType uint8) ([32]byte, error) { + return _CCIPHome.Contract.GetCandidateDigest(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetCandidateDigest(donId uint32, pluginType uint8) ([32]byte, error) { + return _CCIPHome.Contract.GetCandidateDigest(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCaller) GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getCapabilityConfiguration", arg0) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) { + return _CCIPHome.Contract.GetCapabilityConfiguration(&_CCIPHome.CallOpts, arg0) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetCapabilityConfiguration(arg0 uint32) ([]byte, error) { + return _CCIPHome.Contract.GetCapabilityConfiguration(&_CCIPHome.CallOpts, arg0) +} + +func (_CCIPHome *CCIPHomeCaller) GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getCapabilityRegistry") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetCapabilityRegistry() (common.Address, error) { + return _CCIPHome.Contract.GetCapabilityRegistry(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetCapabilityRegistry() (common.Address, error) { + return _CCIPHome.Contract.GetCapabilityRegistry(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCaller) GetChainConfig(opts *bind.CallOpts, chainSelector uint64) (CCIPHomeChainConfig, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getChainConfig", chainSelector) + + if err != nil { + return *new(CCIPHomeChainConfig), err + } + + out0 := *abi.ConvertType(out[0], new(CCIPHomeChainConfig)).(*CCIPHomeChainConfig) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetChainConfig(chainSelector uint64) (CCIPHomeChainConfig, error) { + return _CCIPHome.Contract.GetChainConfig(&_CCIPHome.CallOpts, chainSelector) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetChainConfig(chainSelector uint64) (CCIPHomeChainConfig, error) { + return _CCIPHome.Contract.GetChainConfig(&_CCIPHome.CallOpts, chainSelector) +} + +func (_CCIPHome *CCIPHomeCaller) GetConfig(opts *bind.CallOpts, donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig, + + error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getConfig", donId, pluginType, configDigest) + + outstruct := new(GetConfig) + if err != nil { + return *outstruct, err + } + + outstruct.VersionedConfig = *abi.ConvertType(out[0], new(CCIPHomeVersionedConfig)).(*CCIPHomeVersionedConfig) + outstruct.Ok = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +func (_CCIPHome *CCIPHomeSession) GetConfig(donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig, + + error) { + return _CCIPHome.Contract.GetConfig(&_CCIPHome.CallOpts, donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetConfig(donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig, + + error) { + return _CCIPHome.Contract.GetConfig(&_CCIPHome.CallOpts, donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeCaller) GetConfigDigests(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetConfigDigests, + + error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getConfigDigests", donId, pluginType) + + outstruct := new(GetConfigDigests) + if err != nil { + return *outstruct, err + } + + outstruct.ActiveConfigDigest = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + outstruct.CandidateConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +func (_CCIPHome *CCIPHomeSession) GetConfigDigests(donId uint32, pluginType uint8) (GetConfigDigests, + + error) { + return _CCIPHome.Contract.GetConfigDigests(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetConfigDigests(donId uint32, pluginType uint8) (GetConfigDigests, + + error) { + return _CCIPHome.Contract.GetConfigDigests(&_CCIPHome.CallOpts, donId, pluginType) +} + +func (_CCIPHome *CCIPHomeCaller) GetNumChainConfigurations(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "getNumChainConfigurations") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) GetNumChainConfigurations() (*big.Int, error) { + return _CCIPHome.Contract.GetNumChainConfigurations(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCallerSession) GetNumChainConfigurations() (*big.Int, error) { + return _CCIPHome.Contract.GetNumChainConfigurations(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _CCIPHome.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 + +} + +func (_CCIPHome *CCIPHomeSession) Owner() (common.Address, error) { + return _CCIPHome.Contract.Owner(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCallerSession) Owner() (common.Address, error) { + return _CCIPHome.Contract.Owner(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _CCIPHome.Contract.SupportsInterface(&_CCIPHome.CallOpts, interfaceId) +} + +func (_CCIPHome *CCIPHomeCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _CCIPHome.Contract.SupportsInterface(&_CCIPHome.CallOpts, interfaceId) +} + +func (_CCIPHome *CCIPHomeCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _CCIPHome.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_CCIPHome *CCIPHomeSession) TypeAndVersion() (string, error) { + return _CCIPHome.Contract.TypeAndVersion(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeCallerSession) TypeAndVersion() (string, error) { + return _CCIPHome.Contract.TypeAndVersion(&_CCIPHome.CallOpts) +} + +func (_CCIPHome *CCIPHomeTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "acceptOwnership") +} + +func (_CCIPHome *CCIPHomeSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPHome.Contract.AcceptOwnership(&_CCIPHome.TransactOpts) +} + +func (_CCIPHome *CCIPHomeTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _CCIPHome.Contract.AcceptOwnership(&_CCIPHome.TransactOpts) +} + +func (_CCIPHome *CCIPHomeTransactor) ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "applyChainConfigUpdates", chainSelectorRemoves, chainConfigAdds) +} + +func (_CCIPHome *CCIPHomeSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) { + return _CCIPHome.Contract.ApplyChainConfigUpdates(&_CCIPHome.TransactOpts, chainSelectorRemoves, chainConfigAdds) +} + +func (_CCIPHome *CCIPHomeTransactorSession) ApplyChainConfigUpdates(chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) { + return _CCIPHome.Contract.ApplyChainConfigUpdates(&_CCIPHome.TransactOpts, chainSelectorRemoves, chainConfigAdds) +} + +func (_CCIPHome *CCIPHomeTransactor) BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "beforeCapabilityConfigSet", arg0, update, arg2, donId) +} + +func (_CCIPHome *CCIPHomeSession) BeforeCapabilityConfigSet(arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { + return _CCIPHome.Contract.BeforeCapabilityConfigSet(&_CCIPHome.TransactOpts, arg0, update, arg2, donId) +} + +func (_CCIPHome *CCIPHomeTransactorSession) BeforeCapabilityConfigSet(arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) { + return _CCIPHome.Contract.BeforeCapabilityConfigSet(&_CCIPHome.TransactOpts, arg0, update, arg2, donId) +} + +func (_CCIPHome *CCIPHomeTransactor) PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "promoteCandidateAndRevokeActive", donId, pluginType, digestToPromote, digestToRevoke) +} + +func (_CCIPHome *CCIPHomeSession) PromoteCandidateAndRevokeActive(donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.PromoteCandidateAndRevokeActive(&_CCIPHome.TransactOpts, donId, pluginType, digestToPromote, digestToRevoke) +} + +func (_CCIPHome *CCIPHomeTransactorSession) PromoteCandidateAndRevokeActive(donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.PromoteCandidateAndRevokeActive(&_CCIPHome.TransactOpts, donId, pluginType, digestToPromote, digestToRevoke) +} + +func (_CCIPHome *CCIPHomeTransactor) RevokeCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "revokeCandidate", donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeSession) RevokeCandidate(donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.RevokeCandidate(&_CCIPHome.TransactOpts, donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeTransactorSession) RevokeCandidate(donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.RevokeCandidate(&_CCIPHome.TransactOpts, donId, pluginType, configDigest) +} + +func (_CCIPHome *CCIPHomeTransactor) SetCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "setCandidate", donId, pluginType, config, digestToOverwrite) +} + +func (_CCIPHome *CCIPHomeSession) SetCandidate(donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.SetCandidate(&_CCIPHome.TransactOpts, donId, pluginType, config, digestToOverwrite) +} + +func (_CCIPHome *CCIPHomeTransactorSession) SetCandidate(donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _CCIPHome.Contract.SetCandidate(&_CCIPHome.TransactOpts, donId, pluginType, config, digestToOverwrite) +} + +func (_CCIPHome *CCIPHomeTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _CCIPHome.contract.Transact(opts, "transferOwnership", to) +} + +func (_CCIPHome *CCIPHomeSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPHome.Contract.TransferOwnership(&_CCIPHome.TransactOpts, to) +} + +func (_CCIPHome *CCIPHomeTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _CCIPHome.Contract.TransferOwnership(&_CCIPHome.TransactOpts, to) +} + +type CCIPHomeActiveConfigRevokedIterator struct { + Event *CCIPHomeActiveConfigRevoked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeActiveConfigRevokedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeActiveConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeActiveConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeActiveConfigRevokedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeActiveConfigRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeActiveConfigRevoked struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeActiveConfigRevokedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ActiveConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return &CCIPHomeActiveConfigRevokedIterator{contract: _CCIPHome.contract, event: "ActiveConfigRevoked", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ActiveConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeActiveConfigRevoked) + if err := _CCIPHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseActiveConfigRevoked(log types.Log) (*CCIPHomeActiveConfigRevoked, error) { + event := new(CCIPHomeActiveConfigRevoked) + if err := _CCIPHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeCandidateConfigRevokedIterator struct { + Event *CCIPHomeCandidateConfigRevoked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeCandidateConfigRevokedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeCandidateConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeCandidateConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeCandidateConfigRevokedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeCandidateConfigRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeCandidateConfigRevoked struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeCandidateConfigRevokedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "CandidateConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return &CCIPHomeCandidateConfigRevokedIterator{contract: _CCIPHome.contract, event: "CandidateConfigRevoked", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "CandidateConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeCandidateConfigRevoked) + if err := _CCIPHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseCandidateConfigRevoked(log types.Log) (*CCIPHomeCandidateConfigRevoked, error) { + event := new(CCIPHomeCandidateConfigRevoked) + if err := _CCIPHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeCapabilityConfigurationSetIterator struct { + Event *CCIPHomeCapabilityConfigurationSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeCapabilityConfigurationSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeCapabilityConfigurationSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeCapabilityConfigurationSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeCapabilityConfigurationSetIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeCapabilityConfigurationSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeCapabilityConfigurationSet struct { + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPHomeCapabilityConfigurationSetIterator, error) { + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "CapabilityConfigurationSet") + if err != nil { + return nil, err + } + return &CCIPHomeCapabilityConfigurationSetIterator{contract: _CCIPHome.contract, event: "CapabilityConfigurationSet", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeCapabilityConfigurationSet) (event.Subscription, error) { + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "CapabilityConfigurationSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeCapabilityConfigurationSet) + if err := _CCIPHome.contract.UnpackLog(event, "CapabilityConfigurationSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseCapabilityConfigurationSet(log types.Log) (*CCIPHomeCapabilityConfigurationSet, error) { + event := new(CCIPHomeCapabilityConfigurationSet) + if err := _CCIPHome.contract.UnpackLog(event, "CapabilityConfigurationSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeChainConfigRemovedIterator struct { + Event *CCIPHomeChainConfigRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeChainConfigRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeChainConfigRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeChainConfigRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeChainConfigRemovedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeChainConfigRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeChainConfigRemoved struct { + ChainSelector uint64 + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPHomeChainConfigRemovedIterator, error) { + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ChainConfigRemoved") + if err != nil { + return nil, err + } + return &CCIPHomeChainConfigRemovedIterator{contract: _CCIPHome.contract, event: "ChainConfigRemoved", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigRemoved) (event.Subscription, error) { + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ChainConfigRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeChainConfigRemoved) + if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseChainConfigRemoved(log types.Log) (*CCIPHomeChainConfigRemoved, error) { + event := new(CCIPHomeChainConfigRemoved) + if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeChainConfigSetIterator struct { + Event *CCIPHomeChainConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeChainConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeChainConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeChainConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeChainConfigSetIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeChainConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeChainConfigSet struct { + ChainSelector uint64 + ChainConfig CCIPHomeChainConfig + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPHomeChainConfigSetIterator, error) { + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ChainConfigSet") + if err != nil { + return nil, err + } + return &CCIPHomeChainConfigSetIterator{contract: _CCIPHome.contract, event: "ChainConfigSet", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigSet) (event.Subscription, error) { + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ChainConfigSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeChainConfigSet) + if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseChainConfigSet(log types.Log) (*CCIPHomeChainConfigSet, error) { + event := new(CCIPHomeChainConfigSet) + if err := _CCIPHome.contract.UnpackLog(event, "ChainConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeConfigPromotedIterator struct { + Event *CCIPHomeConfigPromoted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeConfigPromotedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeConfigPromoted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeConfigPromoted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeConfigPromotedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeConfigPromotedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeConfigPromoted struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigPromotedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ConfigPromoted", configDigestRule) + if err != nil { + return nil, err + } + return &CCIPHomeConfigPromotedIterator{contract: _CCIPHome.contract, event: "ConfigPromoted", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ConfigPromoted", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeConfigPromoted) + if err := _CCIPHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPHome *CCIPHomeFilterer) ParseConfigPromoted(log types.Log) (*CCIPHomeConfigPromoted, error) { + event := new(CCIPHomeConfigPromoted) + if err := _CCIPHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeConfigSetIterator struct { + Event *CCIPHomeConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeConfigSetIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeConfigSet struct { + ConfigDigest [32]byte + Version uint32 + Config CCIPHomeOCR3Config + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigSetIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.FilterLogs(opts, "ConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return &CCIPHomeConfigSetIterator{contract: _CCIPHome.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _CCIPHome.contract.WatchLogs(opts, "ConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPHomeConfigSet) + if err := _CCIPHome.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 +} + +func (_CCIPHome *CCIPHomeFilterer) ParseConfigSet(log types.Log) (*CCIPHomeConfigSet, error) { + event := new(CCIPHomeConfigSet) + if err := _CCIPHome.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeOwnershipTransferRequestedIterator struct { + Event *CCIPHomeOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferRequestedIterator, 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 := _CCIPHome.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPHomeOwnershipTransferRequestedIterator{contract: _CCIPHome.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferRequested, 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 := _CCIPHome.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: + + event := new(CCIPHomeOwnershipTransferRequested) + if err := _CCIPHome.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 +} + +func (_CCIPHome *CCIPHomeFilterer) ParseOwnershipTransferRequested(log types.Log) (*CCIPHomeOwnershipTransferRequested, error) { + event := new(CCIPHomeOwnershipTransferRequested) + if err := _CCIPHome.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPHomeOwnershipTransferredIterator struct { + Event *CCIPHomeOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPHomeOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPHomeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPHomeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPHomeOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *CCIPHomeOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPHomeOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_CCIPHome *CCIPHomeFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferredIterator, 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 := _CCIPHome.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &CCIPHomeOwnershipTransferredIterator{contract: _CCIPHome.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_CCIPHome *CCIPHomeFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferred, 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 := _CCIPHome.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: + + event := new(CCIPHomeOwnershipTransferred) + if err := _CCIPHome.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 +} + +func (_CCIPHome *CCIPHomeFilterer) ParseOwnershipTransferred(log types.Log) (*CCIPHomeOwnershipTransferred, error) { + event := new(CCIPHomeOwnershipTransferred) + if err := _CCIPHome.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetAllConfigs struct { + ActiveConfig CCIPHomeVersionedConfig + CandidateConfig CCIPHomeVersionedConfig +} +type GetConfig struct { + VersionedConfig CCIPHomeVersionedConfig + Ok bool +} +type GetConfigDigests struct { + ActiveConfigDigest [32]byte + CandidateConfigDigest [32]byte +} + +func (_CCIPHome *CCIPHome) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPHome.abi.Events["ActiveConfigRevoked"].ID: + return _CCIPHome.ParseActiveConfigRevoked(log) + case _CCIPHome.abi.Events["CandidateConfigRevoked"].ID: + return _CCIPHome.ParseCandidateConfigRevoked(log) + case _CCIPHome.abi.Events["CapabilityConfigurationSet"].ID: + return _CCIPHome.ParseCapabilityConfigurationSet(log) + case _CCIPHome.abi.Events["ChainConfigRemoved"].ID: + return _CCIPHome.ParseChainConfigRemoved(log) + case _CCIPHome.abi.Events["ChainConfigSet"].ID: + return _CCIPHome.ParseChainConfigSet(log) + case _CCIPHome.abi.Events["ConfigPromoted"].ID: + return _CCIPHome.ParseConfigPromoted(log) + case _CCIPHome.abi.Events["ConfigSet"].ID: + return _CCIPHome.ParseConfigSet(log) + case _CCIPHome.abi.Events["OwnershipTransferRequested"].ID: + return _CCIPHome.ParseOwnershipTransferRequested(log) + case _CCIPHome.abi.Events["OwnershipTransferred"].ID: + return _CCIPHome.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPHomeActiveConfigRevoked) Topic() common.Hash { + return common.HexToHash("0x0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8") +} + +func (CCIPHomeCandidateConfigRevoked) Topic() common.Hash { + return common.HexToHash("0x53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b") +} + +func (CCIPHomeCapabilityConfigurationSet) Topic() common.Hash { + return common.HexToHash("0x84ad7751b744c9e2ee77da1d902b428aec7f0a343d67a24bbe2142e6f58a8d0f") +} + +func (CCIPHomeChainConfigRemoved) Topic() common.Hash { + return common.HexToHash("0x2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0") +} + +func (CCIPHomeChainConfigSet) Topic() common.Hash { + return common.HexToHash("0x05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e0") +} + +func (CCIPHomeConfigPromoted) Topic() common.Hash { + return common.HexToHash("0xfc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e") +} + +func (CCIPHomeConfigSet) Topic() common.Hash { + return common.HexToHash("0x94f085b7c57ec2a270befd0b7b2ec7452580040edee8bb0fb04609c81f0359c6") +} + +func (CCIPHomeOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (CCIPHomeOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_CCIPHome *CCIPHome) Address() common.Address { + return _CCIPHome.address +} + +type CCIPHomeInterface interface { + GetActiveDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) + + GetAllChainConfigs(opts *bind.CallOpts, pageIndex *big.Int, pageSize *big.Int) ([]CCIPHomeChainConfigArgs, error) + + GetAllConfigs(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetAllConfigs, + + error) + + GetCandidateDigest(opts *bind.CallOpts, donId uint32, pluginType uint8) ([32]byte, error) + + GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error) + + GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) + + GetChainConfig(opts *bind.CallOpts, chainSelector uint64) (CCIPHomeChainConfig, error) + + GetConfig(opts *bind.CallOpts, donId uint32, pluginType uint8, configDigest [32]byte) (GetConfig, + + error) + + GetConfigDigests(opts *bind.CallOpts, donId uint32, pluginType uint8) (GetConfigDigests, + + error) + + GetNumChainConfigurations(opts *bind.CallOpts) (*big.Int, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyChainConfigUpdates(opts *bind.TransactOpts, chainSelectorRemoves []uint64, chainConfigAdds []CCIPHomeChainConfigArgs) (*types.Transaction, error) + + BeforeCapabilityConfigSet(opts *bind.TransactOpts, arg0 [][32]byte, update []byte, arg2 uint64, donId uint32) (*types.Transaction, error) + + PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, donId uint32, pluginType uint8, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) + + RevokeCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, configDigest [32]byte) (*types.Transaction, error) + + SetCandidate(opts *bind.TransactOpts, donId uint32, pluginType uint8, config CCIPHomeOCR3Config, digestToOverwrite [32]byte) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeActiveConfigRevokedIterator, error) + + WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) + + ParseActiveConfigRevoked(log types.Log) (*CCIPHomeActiveConfigRevoked, error) + + FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeCandidateConfigRevokedIterator, error) + + WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *CCIPHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) + + ParseCandidateConfigRevoked(log types.Log) (*CCIPHomeCandidateConfigRevoked, error) + + FilterCapabilityConfigurationSet(opts *bind.FilterOpts) (*CCIPHomeCapabilityConfigurationSetIterator, error) + + WatchCapabilityConfigurationSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeCapabilityConfigurationSet) (event.Subscription, error) + + ParseCapabilityConfigurationSet(log types.Log) (*CCIPHomeCapabilityConfigurationSet, error) + + FilterChainConfigRemoved(opts *bind.FilterOpts) (*CCIPHomeChainConfigRemovedIterator, error) + + WatchChainConfigRemoved(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigRemoved) (event.Subscription, error) + + ParseChainConfigRemoved(log types.Log) (*CCIPHomeChainConfigRemoved, error) + + FilterChainConfigSet(opts *bind.FilterOpts) (*CCIPHomeChainConfigSetIterator, error) + + WatchChainConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeChainConfigSet) (event.Subscription, error) + + ParseChainConfigSet(log types.Log) (*CCIPHomeChainConfigSet, error) + + FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigPromotedIterator, error) + + WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) + + ParseConfigPromoted(log types.Log) (*CCIPHomeConfigPromoted, error) + + FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*CCIPHomeConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *CCIPHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*CCIPHomeConfigSet, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*CCIPHomeOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*CCIPHomeOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *CCIPHomeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*CCIPHomeOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/ccip_reader_tester/ccip_reader_tester.go b/core/gethwrappers/ccip/generated/v1_6_0/ccip_reader_tester/ccip_reader_tester.go new file mode 100644 index 00000000000..550e680e81e --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/ccip_reader_tester/ccip_reader_tester.go @@ -0,0 +1,896 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package ccip_reader_tester + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type IRMNRemoteSignature struct { + R [32]byte + S [32]byte +} + +type InternalEVM2AnyRampMessage struct { + Header InternalRampMessageHeader + Sender common.Address + Data []byte + Receiver []byte + ExtraArgs []byte + FeeToken common.Address + FeeTokenAmount *big.Int + FeeValueJuels *big.Int + TokenAmounts []InternalEVM2AnyTokenTransfer +} + +type InternalEVM2AnyTokenTransfer struct { + SourcePoolAddress common.Address + DestTokenAddress []byte + ExtraData []byte + Amount *big.Int + DestExecData []byte +} + +type InternalGasPriceUpdate struct { + DestChainSelector uint64 + UsdPerUnitGas *big.Int +} + +type InternalMerkleRoot struct { + SourceChainSelector uint64 + OnRampAddress []byte + MinSeqNr uint64 + MaxSeqNr uint64 + MerkleRoot [32]byte +} + +type InternalPriceUpdates struct { + TokenPriceUpdates []InternalTokenPriceUpdate + GasPriceUpdates []InternalGasPriceUpdate +} + +type InternalRampMessageHeader struct { + MessageId [32]byte + SourceChainSelector uint64 + DestChainSelector uint64 + SequenceNumber uint64 + Nonce uint64 +} + +type InternalTokenPriceUpdate struct { + SourceToken common.Address + UsdPerToken *big.Int +} + +type OffRampCommitReport struct { + PriceUpdates InternalPriceUpdates + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + RmnSignatures []IRMNRemoteSignature +} + +type OffRampSourceChainConfig struct { + Router common.Address + IsEnabled bool + MinSeqNr uint64 + IsRMNVerificationDisabled bool + OnRamp []byte +} + +var CCIPReaderTesterMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"emitCCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"emitCommitReportAccepted\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"emitExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getExpectedNextSequenceNumber\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDestChainSeqNr\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"testNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setLatestPriceSequenceNumber\",\"inputs\":[{\"name\":\"seqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sourceChainConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"CCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60808060405234601557611883908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c90816319c979a414610fc3575080633f4b04aa14610f7d5780634bf78697146109ee57806369600bca1461097f5780639041be3d146108d057806393df286714610811578063b4cb273b14610487578063c1a5a355146103f9578063c7c1cba114610329578063c9223625146102985763e9d68a8e1461009857600080fd5b346102935760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102935767ffffffffffffffff6100d86114ff565b606060806040516100e881611440565b6000815260006020820152600060408201526000838201520152166000526000602052604060002060405161011c81611440565b815473ffffffffffffffffffffffffffffffffffffffff81168252602082019260ff8260a01c16151584526001604084019167ffffffffffffffff8460a81c16835260ff606086019460e81c161515845201936040519460009080549061018282611823565b808952916001811690811561024e5750600114610210575b73ffffffffffffffffffffffffffffffffffffffff8761020c8a8967ffffffffffffffff8a8a6101cc858c038661145c565b60808701948552604051978897602089525116602088015251151560408701525116606085015251151560808401525160a08084015260c08301906116fe565b0390f35b6000908152602081209092505b81831061023457505085016020018261020c61019a565b6001816020929493945483858c010152019101919061021d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166020808b019190915292151560051b8901909201925084915061020c905061019a565b600080fd5b346102935760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576102cf6114ff565b60243567ffffffffffffffff81116102935767ffffffffffffffff602080936102fd839436906004016116c3565b939091166000526002825260406000208360405194859384378201908152030190205416604051908152f35b346102935760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576103606114ff565b610368611516565b9060843560048110156102935760a43567ffffffffffffffff8111610293576103d86103b97f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b923690600401611542565b60405193606435855260208501526080604085015260808401906116fe565b9160c43560608201528067ffffffffffffffff8060443597169516930390a4005b346102935760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576104306114ff565b67ffffffffffffffff610441611516565b9116600052600160205267ffffffffffffffff604060002091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600080f35b346102935760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576104be6114ff565b60243567ffffffffffffffff81116102935760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126102935760405161050881611440565b816004013573ffffffffffffffffffffffffffffffffffffffff81168103610293578152610538602483016116f1565b6020820190815261054b6044840161152d565b6040830190815261055e606485016116f1565b906060840191825260848501359467ffffffffffffffff86116102935761059667ffffffffffffffff91600460019836920101611542565b96608086019788521660005260006020527fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff60406000209551167fffffff00000000000000000000000000000000000000000000000000000000007dff00000000000000000000000000000000000000000000000000000000007cffffffffffffffff00000000000000000000000000000000000000000074ff000000000000000000000000000000000000000089549851151560a01b16955160a81b169551151560e81b1695161716171717815501905190815167ffffffffffffffff81116107e2576106998254611823565b601f811161079a575b50602092601f82116001146106fe57928192936000926106f3575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c1916179055600080f35b0151905083806106bd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169383600052806000209160005b868110610782575083600195961061074b575b505050811b019055005b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c19169055838080610741565b9192602060018192868501518155019401920161072e565b826000526020600020601f830160051c810191602084106107d8575b601f0160051c01905b8181106107cc57506106a2565b600081556001016107bf565b90915081906107b6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b346102935760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610293576108486114ff565b610850611516565b906044359067ffffffffffffffff821161029357602067ffffffffffffffff9291610880849336906004016116c3565b9390911660005260028252604060002083604051948593843782019081520301902091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600080f35b346102935760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102935767ffffffffffffffff6109106114ff565b166000526001602052600167ffffffffffffffff604060002054160167ffffffffffffffff81116109505760209067ffffffffffffffff60405191168152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b346102935760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102935767ffffffffffffffff6109bf6114ff565b167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355600080f35b346102935760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029357610a256114ff565b60243567ffffffffffffffff8111610293577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc813603016101a08112610293576040519061012082019082821067ffffffffffffffff8311176107e25760a0916040521261029357604051610a9981611440565b82600401358152610aac6024840161152d565b6020820152610abd6044840161152d565b6040820152610ace6064840161152d565b6060820152610adf6084840161152d565b60808201528152610af260a483016114b5565b926020820193845260c483013567ffffffffffffffff811161029357610b1e9060043691860101611542565b6040830190815260e484013567ffffffffffffffff811161029357610b499060043691870101611542565b936060840194855261010481013567ffffffffffffffff811161029357610b769060043691840101611542565b9460808501958652610b8b61012483016114b5565b9560a0860196875260c0860191610144840135835260e087019361016481013585526101848101359067ffffffffffffffff821161029357019436602387011215610293576004860135610bde8161149d565b96610bec604051988961145c565b81885260206004818a019360051b83010101903682116102935760248101925b828410610e8b5750505050610100880195865287516060015167ffffffffffffffff16996040519860208a5251805160208b0152602081015167ffffffffffffffff1660408b0152604081015167ffffffffffffffff1660608b0152606081015167ffffffffffffffff1660808b01526080015167ffffffffffffffff1660a08a01525173ffffffffffffffffffffffffffffffffffffffff1660c08901525160e088016101a090526101c08801610cc3916116fe565b9051908781037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610100890152610cfa916116fe565b9051908681037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001610120880152610d31916116fe565b955173ffffffffffffffffffffffffffffffffffffffff16610140860152516101608501525161018084015251928281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0016101a0840152835180825260208201918160051b810160200195602001926000915b838310610de1578867ffffffffffffffff87167f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32898b038aa3005b9091929396602080610e7c837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528b519073ffffffffffffffffffffffffffffffffffffffff82511681526080610e61610e4f8685015160a08886015260a08501906116fe565b604085015184820360408601526116fe565b926060810151606084015201519060808184039101526116fe565b99019301930191939290610da6565b833567ffffffffffffffff81116102935760049083010160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082360301126102935760405191610edb83611440565b610ee7602083016114b5565b8352604082013567ffffffffffffffff811161029357610f0d9060203691850101611542565b6020840152606082013567ffffffffffffffff811161029357610f369060203691850101611542565b60408401526080820135606084015260a08201359267ffffffffffffffff841161029357610f6d6020949385809536920101611542565b6080820152815201930192610c0c565b346102935760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261029357602067ffffffffffffffff60035416604051908152f35b346102935760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102935760043567ffffffffffffffff81116102935760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610293576080820182811067ffffffffffffffff8211176107e257604052806004013567ffffffffffffffff811161029357810160407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610293576040519061109982611424565b600481013567ffffffffffffffff81116102935760049082010136601f820112156102935780356110c98161149d565b916110d7604051938461145c565b81835260208084019260061b8201019036821161029357602001915b8183106113e5575050508252602481013567ffffffffffffffff811161029357600491010136601f8201121561029357803561112e8161149d565b9161113c604051938461145c565b81835260208084019260061b8201019036821161029357602001915b8183106113a65750505060208201528252602481013567ffffffffffffffff81116102935761118d90600436918401016115b7565b60208301908152604482013567ffffffffffffffff8111610293576111b890600436918501016115b7565b916040840192835260648101359067ffffffffffffffff82116102935701366023820112156102935760048101356111ef8161149d565b916111fd604051938461145c565b818352602060048185019360061b830101019036821161029357602401915b818310611375575050509061125991606085015251915192519261124b6040519360608552606085019061175d565b90838203602085015261175d565b918183036040830152604083019080519160408552825180915260206060860193019060005b81811061131f57505050602001519260208183039101526020808451928381520193019060005b8181106112d5577fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e4784860385a1005b8251805167ffffffffffffffff1686526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681870152604090950194909201916001016112a6565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16818701526040909501949092019160010161127f565b604083360312610293576020604091825161138f81611424565b85358152828601358382015281520192019161121c565b60408336031261029357602060409182516113c081611424565b6113c98661152d565b81526113d68387016114d6565b83820152815201920191611158565b60408336031261029357602060409182516113ff81611424565b611408866114b5565b81526114158387016114d6565b838201528152019201916110f3565b6040810190811067ffffffffffffffff8211176107e257604052565b60a0810190811067ffffffffffffffff8211176107e257604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176107e257604052565b67ffffffffffffffff81116107e25760051b60200190565b359073ffffffffffffffffffffffffffffffffffffffff8216820361029357565b35907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361029357565b6004359067ffffffffffffffff8216820361029357565b6024359067ffffffffffffffff8216820361029357565b359067ffffffffffffffff8216820361029357565b81601f820112156102935780359067ffffffffffffffff82116107e2576040519261159560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116018561145c565b8284526020838301011161029357816000926020809301838601378301015290565b81601f82011215610293578035906115ce8261149d565b926115dc604051948561145c565b82845260208085019360051b830101918183116102935760208101935b83851061160857505050505090565b843567ffffffffffffffff811161029357820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08286030112610293576040519161165483611440565b6116606020830161152d565b835260408201359267ffffffffffffffff84116102935760a08361168b886020809881980101611542565b8584015261169b6060820161152d565b60408401526116ac6080820161152d565b6060840152013560808201528152019401936115f9565b9181601f840112156102935782359167ffffffffffffffff8311610293576020838186019501011161029357565b3590811515820361029357565b919082519283825260005b8481106117485750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611709565b9080602083519182815201916020808360051b8301019401926000915b83831061178957505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865288519067ffffffffffffffff82511681526080806117e68585015160a08786015260a08501906116fe565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff606082015116606085015201519101529701930193019193929061177a565b90600182811c9216801561186c575b602083101461183d57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f169161183256fea164736f6c634300081a000a", +} + +var CCIPReaderTesterABI = CCIPReaderTesterMetaData.ABI + +var CCIPReaderTesterBin = CCIPReaderTesterMetaData.Bin + +func DeployCCIPReaderTester(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *CCIPReaderTester, error) { + parsed, err := CCIPReaderTesterMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(CCIPReaderTesterBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CCIPReaderTester{address: address, abi: *parsed, CCIPReaderTesterCaller: CCIPReaderTesterCaller{contract: contract}, CCIPReaderTesterTransactor: CCIPReaderTesterTransactor{contract: contract}, CCIPReaderTesterFilterer: CCIPReaderTesterFilterer{contract: contract}}, nil +} + +type CCIPReaderTester struct { + address common.Address + abi abi.ABI + CCIPReaderTesterCaller + CCIPReaderTesterTransactor + CCIPReaderTesterFilterer +} + +type CCIPReaderTesterCaller struct { + contract *bind.BoundContract +} + +type CCIPReaderTesterTransactor struct { + contract *bind.BoundContract +} + +type CCIPReaderTesterFilterer struct { + contract *bind.BoundContract +} + +type CCIPReaderTesterSession struct { + Contract *CCIPReaderTester + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type CCIPReaderTesterCallerSession struct { + Contract *CCIPReaderTesterCaller + CallOpts bind.CallOpts +} + +type CCIPReaderTesterTransactorSession struct { + Contract *CCIPReaderTesterTransactor + TransactOpts bind.TransactOpts +} + +type CCIPReaderTesterRaw struct { + Contract *CCIPReaderTester +} + +type CCIPReaderTesterCallerRaw struct { + Contract *CCIPReaderTesterCaller +} + +type CCIPReaderTesterTransactorRaw struct { + Contract *CCIPReaderTesterTransactor +} + +func NewCCIPReaderTester(address common.Address, backend bind.ContractBackend) (*CCIPReaderTester, error) { + abi, err := abi.JSON(strings.NewReader(CCIPReaderTesterABI)) + if err != nil { + return nil, err + } + contract, err := bindCCIPReaderTester(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CCIPReaderTester{address: address, abi: abi, CCIPReaderTesterCaller: CCIPReaderTesterCaller{contract: contract}, CCIPReaderTesterTransactor: CCIPReaderTesterTransactor{contract: contract}, CCIPReaderTesterFilterer: CCIPReaderTesterFilterer{contract: contract}}, nil +} + +func NewCCIPReaderTesterCaller(address common.Address, caller bind.ContractCaller) (*CCIPReaderTesterCaller, error) { + contract, err := bindCCIPReaderTester(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CCIPReaderTesterCaller{contract: contract}, nil +} + +func NewCCIPReaderTesterTransactor(address common.Address, transactor bind.ContractTransactor) (*CCIPReaderTesterTransactor, error) { + contract, err := bindCCIPReaderTester(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CCIPReaderTesterTransactor{contract: contract}, nil +} + +func NewCCIPReaderTesterFilterer(address common.Address, filterer bind.ContractFilterer) (*CCIPReaderTesterFilterer, error) { + contract, err := bindCCIPReaderTester(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CCIPReaderTesterFilterer{contract: contract}, nil +} + +func bindCCIPReaderTester(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := CCIPReaderTesterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_CCIPReaderTester *CCIPReaderTesterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPReaderTester.Contract.CCIPReaderTesterCaller.contract.Call(opts, result, method, params...) +} + +func (_CCIPReaderTester *CCIPReaderTesterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.CCIPReaderTesterTransactor.contract.Transfer(opts) +} + +func (_CCIPReaderTester *CCIPReaderTesterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.CCIPReaderTesterTransactor.contract.Transact(opts, method, params...) +} + +func (_CCIPReaderTester *CCIPReaderTesterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _CCIPReaderTester.Contract.contract.Call(opts, result, method, params...) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.contract.Transfer(opts) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.contract.Transact(opts, method, params...) +} + +func (_CCIPReaderTester *CCIPReaderTesterCaller) GetExpectedNextSequenceNumber(opts *bind.CallOpts, destChainSelector uint64) (uint64, error) { + var out []interface{} + err := _CCIPReaderTester.contract.Call(opts, &out, "getExpectedNextSequenceNumber", destChainSelector) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) GetExpectedNextSequenceNumber(destChainSelector uint64) (uint64, error) { + return _CCIPReaderTester.Contract.GetExpectedNextSequenceNumber(&_CCIPReaderTester.CallOpts, destChainSelector) +} + +func (_CCIPReaderTester *CCIPReaderTesterCallerSession) GetExpectedNextSequenceNumber(destChainSelector uint64) (uint64, error) { + return _CCIPReaderTester.Contract.GetExpectedNextSequenceNumber(&_CCIPReaderTester.CallOpts, destChainSelector) +} + +func (_CCIPReaderTester *CCIPReaderTesterCaller) GetInboundNonce(opts *bind.CallOpts, sourceChainSelector uint64, sender []byte) (uint64, error) { + var out []interface{} + err := _CCIPReaderTester.contract.Call(opts, &out, "getInboundNonce", sourceChainSelector, sender) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) GetInboundNonce(sourceChainSelector uint64, sender []byte) (uint64, error) { + return _CCIPReaderTester.Contract.GetInboundNonce(&_CCIPReaderTester.CallOpts, sourceChainSelector, sender) +} + +func (_CCIPReaderTester *CCIPReaderTesterCallerSession) GetInboundNonce(sourceChainSelector uint64, sender []byte) (uint64, error) { + return _CCIPReaderTester.Contract.GetInboundNonce(&_CCIPReaderTester.CallOpts, sourceChainSelector, sender) +} + +func (_CCIPReaderTester *CCIPReaderTesterCaller) GetLatestPriceSequenceNumber(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _CCIPReaderTester.contract.Call(opts, &out, "getLatestPriceSequenceNumber") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) GetLatestPriceSequenceNumber() (uint64, error) { + return _CCIPReaderTester.Contract.GetLatestPriceSequenceNumber(&_CCIPReaderTester.CallOpts) +} + +func (_CCIPReaderTester *CCIPReaderTesterCallerSession) GetLatestPriceSequenceNumber() (uint64, error) { + return _CCIPReaderTester.Contract.GetLatestPriceSequenceNumber(&_CCIPReaderTester.CallOpts) +} + +func (_CCIPReaderTester *CCIPReaderTesterCaller) GetSourceChainConfig(opts *bind.CallOpts, sourceChainSelector uint64) (OffRampSourceChainConfig, error) { + var out []interface{} + err := _CCIPReaderTester.contract.Call(opts, &out, "getSourceChainConfig", sourceChainSelector) + + if err != nil { + return *new(OffRampSourceChainConfig), err + } + + out0 := *abi.ConvertType(out[0], new(OffRampSourceChainConfig)).(*OffRampSourceChainConfig) + + return out0, err + +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) GetSourceChainConfig(sourceChainSelector uint64) (OffRampSourceChainConfig, error) { + return _CCIPReaderTester.Contract.GetSourceChainConfig(&_CCIPReaderTester.CallOpts, sourceChainSelector) +} + +func (_CCIPReaderTester *CCIPReaderTesterCallerSession) GetSourceChainConfig(sourceChainSelector uint64) (OffRampSourceChainConfig, error) { + return _CCIPReaderTester.Contract.GetSourceChainConfig(&_CCIPReaderTester.CallOpts, sourceChainSelector) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactor) EmitCCIPMessageSent(opts *bind.TransactOpts, destChainSelector uint64, message InternalEVM2AnyRampMessage) (*types.Transaction, error) { + return _CCIPReaderTester.contract.Transact(opts, "emitCCIPMessageSent", destChainSelector, message) +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) EmitCCIPMessageSent(destChainSelector uint64, message InternalEVM2AnyRampMessage) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.EmitCCIPMessageSent(&_CCIPReaderTester.TransactOpts, destChainSelector, message) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorSession) EmitCCIPMessageSent(destChainSelector uint64, message InternalEVM2AnyRampMessage) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.EmitCCIPMessageSent(&_CCIPReaderTester.TransactOpts, destChainSelector, message) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactor) EmitCommitReportAccepted(opts *bind.TransactOpts, report OffRampCommitReport) (*types.Transaction, error) { + return _CCIPReaderTester.contract.Transact(opts, "emitCommitReportAccepted", report) +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) EmitCommitReportAccepted(report OffRampCommitReport) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.EmitCommitReportAccepted(&_CCIPReaderTester.TransactOpts, report) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorSession) EmitCommitReportAccepted(report OffRampCommitReport) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.EmitCommitReportAccepted(&_CCIPReaderTester.TransactOpts, report) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactor) EmitExecutionStateChanged(opts *bind.TransactOpts, sourceChainSelector uint64, sequenceNumber uint64, messageId [32]byte, messageHash [32]byte, state uint8, returnData []byte, gasUsed *big.Int) (*types.Transaction, error) { + return _CCIPReaderTester.contract.Transact(opts, "emitExecutionStateChanged", sourceChainSelector, sequenceNumber, messageId, messageHash, state, returnData, gasUsed) +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) EmitExecutionStateChanged(sourceChainSelector uint64, sequenceNumber uint64, messageId [32]byte, messageHash [32]byte, state uint8, returnData []byte, gasUsed *big.Int) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.EmitExecutionStateChanged(&_CCIPReaderTester.TransactOpts, sourceChainSelector, sequenceNumber, messageId, messageHash, state, returnData, gasUsed) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorSession) EmitExecutionStateChanged(sourceChainSelector uint64, sequenceNumber uint64, messageId [32]byte, messageHash [32]byte, state uint8, returnData []byte, gasUsed *big.Int) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.EmitExecutionStateChanged(&_CCIPReaderTester.TransactOpts, sourceChainSelector, sequenceNumber, messageId, messageHash, state, returnData, gasUsed) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactor) SetDestChainSeqNr(opts *bind.TransactOpts, destChainSelector uint64, sequenceNumber uint64) (*types.Transaction, error) { + return _CCIPReaderTester.contract.Transact(opts, "setDestChainSeqNr", destChainSelector, sequenceNumber) +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) SetDestChainSeqNr(destChainSelector uint64, sequenceNumber uint64) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.SetDestChainSeqNr(&_CCIPReaderTester.TransactOpts, destChainSelector, sequenceNumber) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorSession) SetDestChainSeqNr(destChainSelector uint64, sequenceNumber uint64) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.SetDestChainSeqNr(&_CCIPReaderTester.TransactOpts, destChainSelector, sequenceNumber) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactor) SetInboundNonce(opts *bind.TransactOpts, sourceChainSelector uint64, testNonce uint64, sender []byte) (*types.Transaction, error) { + return _CCIPReaderTester.contract.Transact(opts, "setInboundNonce", sourceChainSelector, testNonce, sender) +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) SetInboundNonce(sourceChainSelector uint64, testNonce uint64, sender []byte) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.SetInboundNonce(&_CCIPReaderTester.TransactOpts, sourceChainSelector, testNonce, sender) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorSession) SetInboundNonce(sourceChainSelector uint64, testNonce uint64, sender []byte) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.SetInboundNonce(&_CCIPReaderTester.TransactOpts, sourceChainSelector, testNonce, sender) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactor) SetLatestPriceSequenceNumber(opts *bind.TransactOpts, seqNr uint64) (*types.Transaction, error) { + return _CCIPReaderTester.contract.Transact(opts, "setLatestPriceSequenceNumber", seqNr) +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) SetLatestPriceSequenceNumber(seqNr uint64) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.SetLatestPriceSequenceNumber(&_CCIPReaderTester.TransactOpts, seqNr) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorSession) SetLatestPriceSequenceNumber(seqNr uint64) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.SetLatestPriceSequenceNumber(&_CCIPReaderTester.TransactOpts, seqNr) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactor) SetSourceChainConfig(opts *bind.TransactOpts, sourceChainSelector uint64, sourceChainConfig OffRampSourceChainConfig) (*types.Transaction, error) { + return _CCIPReaderTester.contract.Transact(opts, "setSourceChainConfig", sourceChainSelector, sourceChainConfig) +} + +func (_CCIPReaderTester *CCIPReaderTesterSession) SetSourceChainConfig(sourceChainSelector uint64, sourceChainConfig OffRampSourceChainConfig) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.SetSourceChainConfig(&_CCIPReaderTester.TransactOpts, sourceChainSelector, sourceChainConfig) +} + +func (_CCIPReaderTester *CCIPReaderTesterTransactorSession) SetSourceChainConfig(sourceChainSelector uint64, sourceChainConfig OffRampSourceChainConfig) (*types.Transaction, error) { + return _CCIPReaderTester.Contract.SetSourceChainConfig(&_CCIPReaderTester.TransactOpts, sourceChainSelector, sourceChainConfig) +} + +type CCIPReaderTesterCCIPMessageSentIterator struct { + Event *CCIPReaderTesterCCIPMessageSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReaderTesterCCIPMessageSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReaderTesterCCIPMessageSent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPReaderTesterCCIPMessageSent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPReaderTesterCCIPMessageSentIterator) Error() error { + return it.fail +} + +func (it *CCIPReaderTesterCCIPMessageSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReaderTesterCCIPMessageSent struct { + DestChainSelector uint64 + SequenceNumber uint64 + Message InternalEVM2AnyRampMessage + Raw types.Log +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) FilterCCIPMessageSent(opts *bind.FilterOpts, destChainSelector []uint64, sequenceNumber []uint64) (*CCIPReaderTesterCCIPMessageSentIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var sequenceNumberRule []interface{} + for _, sequenceNumberItem := range sequenceNumber { + sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem) + } + + logs, sub, err := _CCIPReaderTester.contract.FilterLogs(opts, "CCIPMessageSent", destChainSelectorRule, sequenceNumberRule) + if err != nil { + return nil, err + } + return &CCIPReaderTesterCCIPMessageSentIterator{contract: _CCIPReaderTester.contract, event: "CCIPMessageSent", logs: logs, sub: sub}, nil +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) WatchCCIPMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPReaderTesterCCIPMessageSent, destChainSelector []uint64, sequenceNumber []uint64) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var sequenceNumberRule []interface{} + for _, sequenceNumberItem := range sequenceNumber { + sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem) + } + + logs, sub, err := _CCIPReaderTester.contract.WatchLogs(opts, "CCIPMessageSent", destChainSelectorRule, sequenceNumberRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReaderTesterCCIPMessageSent) + if err := _CCIPReaderTester.contract.UnpackLog(event, "CCIPMessageSent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) ParseCCIPMessageSent(log types.Log) (*CCIPReaderTesterCCIPMessageSent, error) { + event := new(CCIPReaderTesterCCIPMessageSent) + if err := _CCIPReaderTester.contract.UnpackLog(event, "CCIPMessageSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReaderTesterCommitReportAcceptedIterator struct { + Event *CCIPReaderTesterCommitReportAccepted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReaderTesterCommitReportAcceptedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReaderTesterCommitReportAccepted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPReaderTesterCommitReportAccepted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPReaderTesterCommitReportAcceptedIterator) Error() error { + return it.fail +} + +func (it *CCIPReaderTesterCommitReportAcceptedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReaderTesterCommitReportAccepted struct { + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + PriceUpdates InternalPriceUpdates + Raw types.Log +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) FilterCommitReportAccepted(opts *bind.FilterOpts) (*CCIPReaderTesterCommitReportAcceptedIterator, error) { + + logs, sub, err := _CCIPReaderTester.contract.FilterLogs(opts, "CommitReportAccepted") + if err != nil { + return nil, err + } + return &CCIPReaderTesterCommitReportAcceptedIterator{contract: _CCIPReaderTester.contract, event: "CommitReportAccepted", logs: logs, sub: sub}, nil +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) WatchCommitReportAccepted(opts *bind.WatchOpts, sink chan<- *CCIPReaderTesterCommitReportAccepted) (event.Subscription, error) { + + logs, sub, err := _CCIPReaderTester.contract.WatchLogs(opts, "CommitReportAccepted") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReaderTesterCommitReportAccepted) + if err := _CCIPReaderTester.contract.UnpackLog(event, "CommitReportAccepted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) ParseCommitReportAccepted(log types.Log) (*CCIPReaderTesterCommitReportAccepted, error) { + event := new(CCIPReaderTesterCommitReportAccepted) + if err := _CCIPReaderTester.contract.UnpackLog(event, "CommitReportAccepted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type CCIPReaderTesterExecutionStateChangedIterator struct { + Event *CCIPReaderTesterExecutionStateChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *CCIPReaderTesterExecutionStateChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(CCIPReaderTesterExecutionStateChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(CCIPReaderTesterExecutionStateChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *CCIPReaderTesterExecutionStateChangedIterator) Error() error { + return it.fail +} + +func (it *CCIPReaderTesterExecutionStateChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type CCIPReaderTesterExecutionStateChanged struct { + SourceChainSelector uint64 + SequenceNumber uint64 + MessageId [32]byte + MessageHash [32]byte + State uint8 + ReturnData []byte + GasUsed *big.Int + Raw types.Log +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) FilterExecutionStateChanged(opts *bind.FilterOpts, sourceChainSelector []uint64, sequenceNumber []uint64, messageId [][32]byte) (*CCIPReaderTesterExecutionStateChangedIterator, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + var sequenceNumberRule []interface{} + for _, sequenceNumberItem := range sequenceNumber { + sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem) + } + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReaderTester.contract.FilterLogs(opts, "ExecutionStateChanged", sourceChainSelectorRule, sequenceNumberRule, messageIdRule) + if err != nil { + return nil, err + } + return &CCIPReaderTesterExecutionStateChangedIterator{contract: _CCIPReaderTester.contract, event: "ExecutionStateChanged", logs: logs, sub: sub}, nil +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) WatchExecutionStateChanged(opts *bind.WatchOpts, sink chan<- *CCIPReaderTesterExecutionStateChanged, sourceChainSelector []uint64, sequenceNumber []uint64, messageId [][32]byte) (event.Subscription, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + var sequenceNumberRule []interface{} + for _, sequenceNumberItem := range sequenceNumber { + sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem) + } + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _CCIPReaderTester.contract.WatchLogs(opts, "ExecutionStateChanged", sourceChainSelectorRule, sequenceNumberRule, messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(CCIPReaderTesterExecutionStateChanged) + if err := _CCIPReaderTester.contract.UnpackLog(event, "ExecutionStateChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_CCIPReaderTester *CCIPReaderTesterFilterer) ParseExecutionStateChanged(log types.Log) (*CCIPReaderTesterExecutionStateChanged, error) { + event := new(CCIPReaderTesterExecutionStateChanged) + if err := _CCIPReaderTester.contract.UnpackLog(event, "ExecutionStateChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_CCIPReaderTester *CCIPReaderTester) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _CCIPReaderTester.abi.Events["CCIPMessageSent"].ID: + return _CCIPReaderTester.ParseCCIPMessageSent(log) + case _CCIPReaderTester.abi.Events["CommitReportAccepted"].ID: + return _CCIPReaderTester.ParseCommitReportAccepted(log) + case _CCIPReaderTester.abi.Events["ExecutionStateChanged"].ID: + return _CCIPReaderTester.ParseExecutionStateChanged(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (CCIPReaderTesterCCIPMessageSent) Topic() common.Hash { + return common.HexToHash("0x192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32") +} + +func (CCIPReaderTesterCommitReportAccepted) Topic() common.Hash { + return common.HexToHash("0xb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47") +} + +func (CCIPReaderTesterExecutionStateChanged) Topic() common.Hash { + return common.HexToHash("0x05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b") +} + +func (_CCIPReaderTester *CCIPReaderTester) Address() common.Address { + return _CCIPReaderTester.address +} + +type CCIPReaderTesterInterface interface { + GetExpectedNextSequenceNumber(opts *bind.CallOpts, destChainSelector uint64) (uint64, error) + + GetInboundNonce(opts *bind.CallOpts, sourceChainSelector uint64, sender []byte) (uint64, error) + + GetLatestPriceSequenceNumber(opts *bind.CallOpts) (uint64, error) + + GetSourceChainConfig(opts *bind.CallOpts, sourceChainSelector uint64) (OffRampSourceChainConfig, error) + + EmitCCIPMessageSent(opts *bind.TransactOpts, destChainSelector uint64, message InternalEVM2AnyRampMessage) (*types.Transaction, error) + + EmitCommitReportAccepted(opts *bind.TransactOpts, report OffRampCommitReport) (*types.Transaction, error) + + EmitExecutionStateChanged(opts *bind.TransactOpts, sourceChainSelector uint64, sequenceNumber uint64, messageId [32]byte, messageHash [32]byte, state uint8, returnData []byte, gasUsed *big.Int) (*types.Transaction, error) + + SetDestChainSeqNr(opts *bind.TransactOpts, destChainSelector uint64, sequenceNumber uint64) (*types.Transaction, error) + + SetInboundNonce(opts *bind.TransactOpts, sourceChainSelector uint64, testNonce uint64, sender []byte) (*types.Transaction, error) + + SetLatestPriceSequenceNumber(opts *bind.TransactOpts, seqNr uint64) (*types.Transaction, error) + + SetSourceChainConfig(opts *bind.TransactOpts, sourceChainSelector uint64, sourceChainConfig OffRampSourceChainConfig) (*types.Transaction, error) + + FilterCCIPMessageSent(opts *bind.FilterOpts, destChainSelector []uint64, sequenceNumber []uint64) (*CCIPReaderTesterCCIPMessageSentIterator, error) + + WatchCCIPMessageSent(opts *bind.WatchOpts, sink chan<- *CCIPReaderTesterCCIPMessageSent, destChainSelector []uint64, sequenceNumber []uint64) (event.Subscription, error) + + ParseCCIPMessageSent(log types.Log) (*CCIPReaderTesterCCIPMessageSent, error) + + FilterCommitReportAccepted(opts *bind.FilterOpts) (*CCIPReaderTesterCommitReportAcceptedIterator, error) + + WatchCommitReportAccepted(opts *bind.WatchOpts, sink chan<- *CCIPReaderTesterCommitReportAccepted) (event.Subscription, error) + + ParseCommitReportAccepted(log types.Log) (*CCIPReaderTesterCommitReportAccepted, error) + + FilterExecutionStateChanged(opts *bind.FilterOpts, sourceChainSelector []uint64, sequenceNumber []uint64, messageId [][32]byte) (*CCIPReaderTesterExecutionStateChangedIterator, error) + + WatchExecutionStateChanged(opts *bind.WatchOpts, sink chan<- *CCIPReaderTesterExecutionStateChanged, sourceChainSelector []uint64, sequenceNumber []uint64, messageId [][32]byte) (event.Subscription, error) + + ParseExecutionStateChanged(log types.Log) (*CCIPReaderTesterExecutionStateChanged, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter/fee_quoter.go b/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter/fee_quoter.go new file mode 100644 index 00000000000..668483e5ed9 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter/fee_quoter.go @@ -0,0 +1,3119 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package fee_quoter + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type AuthorizedCallersAuthorizedCallerArgs struct { + AddedCallers []common.Address + RemovedCallers []common.Address +} + +type ClientEVM2AnyMessage struct { + Receiver []byte + Data []byte + TokenAmounts []ClientEVMTokenAmount + FeeToken common.Address + ExtraArgs []byte +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type FeeQuoterDestChainConfig struct { + IsEnabled bool + MaxNumberOfTokensPerMsg uint16 + MaxDataBytes uint32 + MaxPerMsgGasLimit uint32 + DestGasOverhead uint32 + DestGasPerPayloadByteBase uint8 + DestGasPerPayloadByteHigh uint8 + DestGasPerPayloadByteThreshold uint16 + DestDataAvailabilityOverheadGas uint32 + DestGasPerDataAvailabilityByte uint16 + DestDataAvailabilityMultiplierBps uint16 + ChainFamilySelector [4]byte + EnforceOutOfOrder bool + DefaultTokenFeeUSDCents uint16 + DefaultTokenDestGasOverhead uint32 + DefaultTxGasLimit uint32 + GasMultiplierWeiPerEth uint64 + GasPriceStalenessThreshold uint32 + NetworkFeeUSDCents uint32 +} + +type FeeQuoterDestChainConfigArgs struct { + DestChainSelector uint64 + DestChainConfig FeeQuoterDestChainConfig +} + +type FeeQuoterPremiumMultiplierWeiPerEthArgs struct { + Token common.Address + PremiumMultiplierWeiPerEth uint64 +} + +type FeeQuoterStaticConfig struct { + MaxFeeJuelsPerMsg *big.Int + LinkToken common.Address + TokenPriceStalenessThreshold uint32 +} + +type FeeQuoterTokenPriceFeedConfig struct { + DataFeedAddress common.Address + TokenDecimals uint8 + IsEnabled bool +} + +type FeeQuoterTokenPriceFeedUpdate struct { + SourceToken common.Address + FeedConfig FeeQuoterTokenPriceFeedConfig +} + +type FeeQuoterTokenTransferFeeConfig struct { + MinFeeUSDCents uint32 + MaxFeeUSDCents uint32 + DeciBps uint16 + DestGasOverhead uint32 + DestBytesOverhead uint32 + IsEnabled bool +} + +type FeeQuoterTokenTransferFeeConfigArgs struct { + DestChainSelector uint64 + TokenTransferFeeConfigs []FeeQuoterTokenTransferFeeConfigSingleTokenArgs +} + +type FeeQuoterTokenTransferFeeConfigRemoveArgs struct { + DestChainSelector uint64 + Token common.Address +} + +type FeeQuoterTokenTransferFeeConfigSingleTokenArgs struct { + Token common.Address + TokenTransferFeeConfig FeeQuoterTokenTransferFeeConfig +} + +type InternalEVM2AnyTokenTransfer struct { + SourcePoolAddress common.Address + DestTokenAddress []byte + ExtraData []byte + Amount *big.Int + DestExecData []byte +} + +type InternalGasPriceUpdate struct { + DestChainSelector uint64 + UsdPerUnitGas *big.Int +} + +type InternalPriceUpdates struct { + TokenPriceUpdates []InternalTokenPriceUpdate + GasPriceUpdates []InternalGasPriceUpdate +} + +type InternalTimestampedPackedUint224 struct { + Value *big.Int + Timestamp uint32 +} + +type InternalTokenPriceUpdate struct { + SourceToken common.Address + UsdPerToken *big.Int +} + +type KeystoneFeedsPermissionHandlerPermission struct { + Forwarder common.Address + WorkflowName [10]byte + ReportName [2]byte + WorkflowOwner common.Address + IsAllowed bool +} + +var FeeQuoterMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"priceUpdaters\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]},{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"FEE_BASE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"KEYSTONE_PRICE_DECIMALS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyFeeTokensUpdates\",\"inputs\":[{\"name\":\"feeTokensToRemove\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"feeTokensToAdd\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"inputs\":[{\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.PremiumMultiplierWeiPerEthArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyTokenTransferFeeConfigUpdates\",\"inputs\":[{\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigSingleTokenArgs[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}]},{\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfigRemoveArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"convertTokenAmount\",\"inputs\":[{\"name\":\"fromToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"fromTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"toToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestinationChainGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeTokens\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPremiumMultiplierWeiPerEth\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.StaticConfig\",\"components\":[{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"linkToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenAndGasPrices\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"tokenPrice\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"gasPriceValue\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structInternal.TimestampedPackedUint224\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPriceFeedConfig\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenPrices\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"components\":[{\"name\":\"value\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"timestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenTransferFeeConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatedTokenPrice\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint224\",\"internalType\":\"uint224\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onReport\",\"inputs\":[{\"name\":\"metadata\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processMessageArgs\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"messageReceiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"convertedExtraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenReceiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processPoolReturnData\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampTokenTransfers\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"destExecDataPerToken\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setReportPermissions\",\"inputs\":[{\"name\":\"permissions\",\"type\":\"tuple[]\",\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission[]\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updatePrices\",\"inputs\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateTokenPriceFeeds\",\"inputs\":[{\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structFeeQuoter.TokenPriceFeedUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feedConfig\",\"type\":\"tuple\",\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"destChainConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.DestChainConfig\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"maxDataBytes\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerPayloadByteBase\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteHigh\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"destGasPerPayloadByteThreshold\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"enforceOutOfOrder\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasPriceStalenessThreshold\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenAdded\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenRemoved\",\"inputs\":[{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"PremiumMultiplierWeiPerEthUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PriceFeedPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"priceFeedConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenPriceFeedConfig\",\"components\":[{\"name\":\"dataFeedAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReportPermissionSet\",\"inputs\":[{\"name\":\"reportId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"permission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structKeystoneFeedsPermissionHandler.Permission\",\"components\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"isAllowed\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigDeleted\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeeConfigUpdated\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structFeeQuoter.TokenTransferFeeConfig\",\"components\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"deciBps\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"destGasOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerTokenUpdated\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UsdPerUnitGasUpdated\",\"inputs\":[{\"name\":\"destChain\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DataFeedValueOutOfUint224Range\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DestinationChainNotEnabled\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeTokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidChainFamilySelector\",\"inputs\":[{\"name\":\"chainFamilySelector\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidDestBytesOverhead\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destBytesOverhead\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidEVMAddress\",\"inputs\":[{\"name\":\"encodedAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExtraArgsTag\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidFeeRange\",\"inputs\":[{\"name\":\"minFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeUSDCents\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidSVMAddress\",\"inputs\":[{\"name\":\"SVMAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSVMExtraArgsWritableBitmap\",\"inputs\":[{\"name\":\"accountIsWritableBitmap\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"numAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidStaticConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenReceiver\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageComputeUnitLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageFeeTooHigh\",\"inputs\":[{\"name\":\"msgFeeJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MessageGasLimitTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MessageTooLarge\",\"inputs\":[{\"name\":\"maxSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actualSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReportForwarderUnauthorized\",\"inputs\":[{\"name\":\"forwarder\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"workflowName\",\"type\":\"bytes10\",\"internalType\":\"bytes10\"},{\"name\":\"reportName\",\"type\":\"bytes2\",\"internalType\":\"bytes2\"}]},{\"type\":\"error\",\"name\":\"SourceTokenDataTooLarge\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"StaleGasPrice\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"threshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"timePassed\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"TokenNotSupported\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TooManySVMExtraArgsAccounts\",\"inputs\":[{\"name\":\"numAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxAccounts\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedNumberOfTokens\",\"inputs\":[{\"name\":\"numberOfTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x60e06040523461106a576172d580380380610019816112d6565b928339810190808203610120811261106a5760601361106a5761003a611298565b81516001600160601b038116810361106a57815261005a602083016112fb565b906020810191825261006e6040840161130f565b6040820190815260608401516001600160401b03811161106a5785610094918601611337565b60808501519094906001600160401b03811161106a57866100b6918301611337565b60a08201519096906001600160401b03811161106a5782019080601f8301121561106a5781516100ed6100e882611320565b6112d6565b9260208085848152019260071b8201019083821161106a57602001915b8183106112235750505060c08301516001600160401b03811161106a5783019781601f8a01121561106a578851986101446100e88b611320565b996020808c838152019160051b8301019184831161106a5760208101915b8383106110c1575050505060e08401516001600160401b03811161106a5784019382601f8601121561106a57845161019c6100e882611320565b9560208088848152019260061b8201019085821161106a57602001915b81831061108557505050610100810151906001600160401b03821161106a570182601f8201121561106a578051906101f36100e883611320565b93602061028081878681520194028301019181831161106a57602001925b828410610ea857505050503315610e9757600180546001600160a01b031916331790556020986102408a6112d6565b976000895260003681376102526112b7565b998a52888b8b015260005b89518110156102c4576001906001600160a01b0361027b828d6113d0565b51168d610287826115bc565b610294575b50500161025d565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1388d61028c565b508a985089519660005b885181101561033f576001600160a01b036102e9828b6113d0565b511690811561032e577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef8c83610320600195611544565b50604051908152a1016102ce565b6342bcdf7f60e11b60005260046000fd5b5081518a985089906001600160a01b0316158015610e85575b8015610e76575b610e655791516001600160a01b031660a05290516001600160601b03166080525163ffffffff1660c052610392866112d6565b9360008552600036813760005b855181101561040e576001906103c76001600160a01b036103c0838a6113d0565b5116611451565b6103d2575b0161039f565b818060a01b036103e282896113d0565b51167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26103cc565b508694508560005b84518110156104855760019061043e6001600160a01b0361043783896113d0565b5116611583565b610449575b01610416565b818060a01b0361045982886113d0565b51167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a2610443565b508593508460005b835181101561054757806104a3600192866113d0565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf606089858060a01b038451169301518360005260078b5260406000209060ff878060a01b038251169283898060a01b03198254161781558d8301908151604082549501948460a81b8651151560a81b16918560a01b9060a01b169061ffff60a01b19161717905560405193845251168c8301525115156040820152a20161048d565b5091509160005b8251811015610afd5761056181846113d0565b51856001600160401b0361057584876113d0565b5151169101519080158015610aea575b8015610acc575b8015610a92575b610a7e57600081815260098852604090205460019392919060081b6001600160e01b03191661093657807f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806106fc868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a25b60005260098752826040600020825115158382549162ffff008c83015160081b169066ffffffff000000604084015160181b166affffffff00000000000000606085015160381b16926effffffff0000000000000000000000608086015160581b169260ff60781b60a087015160781b169460ff60801b60c088015160801b169161ffff60881b60e089015160881b169063ffffffff60981b6101008a015160981b169361ffff60b81b6101208b015160b81b169661ffff60c81b6101408c015160c81b169963ffffffff60d81b6101608d015160081c169b61018060ff60f81b910151151560f81b169c8f8060f81b039a63ffffffff60d81b199961ffff60c81b199861ffff60b81b199763ffffffff60981b199661ffff60881b199560ff60801b199460ff60781b19936effffffff0000000000000000000000199260ff6affffffff000000000000001992169066ffffffffffffff19161716171617161716171617161716171617161716179063ffffffff60d81b1617178155019061ffff6101a0820151169082549165ffffffff00006101c083015160101b169269ffffffff0000000000006101e084015160301b166a01000000000000000000008860901b0361020085015160501b169263ffffffff60901b61022086015160901b169461024063ffffffff60b01b91015160b01b169563ffffffff60b01b199363ffffffff60901b19926a01000000000000000000008c60901b0319918c8060501b03191617161716171617171790550161054e565b807f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e360405180610a76868291909161024063ffffffff8161026084019580511515855261ffff602082015116602086015282604082015116604086015282606082015116606086015282608082015116608086015260ff60a08201511660a086015260ff60c08201511660c086015261ffff60e08201511660e0860152826101008201511661010086015261ffff6101208201511661012086015261ffff610140820151166101408601528260e01b61016082015116610160860152610180810151151561018086015261ffff6101a0820151166101a0860152826101c0820151166101c0860152826101e0820151166101e086015260018060401b03610200820151166102008601528261022082015116610220860152015116910152565b0390a2610700565b63c35aa79d60e01b60005260045260246000fd5b5063ffffffff60e01b61016083015116630a04b54b60e21b8114159081610aba575b50610593565b6307842f7160e21b1415905088610ab4565b5063ffffffff6101e08301511663ffffffff6060840151161061058c565b5063ffffffff6101e08301511615610585565b84828560005b8151811015610b83576001906001600160a01b03610b2182856113d0565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d86848060401b0381610b5786896113d0565b510151168360005260088252604060002081878060401b0319825416179055604051908152a201610b03565b83600184610b90836112d6565b9060008252600092610e60575b909282935b8251851015610d9f57610bb585846113d0565b5180516001600160401b0316939083019190855b83518051821015610d8e57610bdf8287926113d0565b51015184516001600160a01b0390610bf89084906113d0565b5151169063ffffffff815116908781019163ffffffff8351169081811015610d795750506080810163ffffffff815116898110610d62575090899291838c52600a8a5260408c20600160a01b6001900386168d528a5260408c2092825163ffffffff169380549180518d1b67ffffffff0000000016916040860192835160401b69ffff000000000000000016966060810195865160501b6dffffffff00000000000000000000169063ffffffff60701b895160701b169260a001998b60ff60901b8c51151560901b169560ff60901b199363ffffffff60701b19926dffffffff000000000000000000001991600160501b60019003191617161716171617171790556040519586525163ffffffff168c8601525161ffff1660408501525163ffffffff1660608401525163ffffffff16608083015251151560a082015260c07f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b591a3600101610bc9565b6312766e0160e11b8c52600485905260245260448bfd5b6305a7b3d160e11b8c5260045260245260448afd5b505060019096019593509050610ba2565b9150825b8251811015610e21576001906001600160401b03610dc182866113d0565b515116828060a01b0384610dd584886113d0565b5101511690808752600a855260408720848060a01b038316885285528660408120557f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b8780a301610da3565b604051615c84908161165182396080518181816106240152610c93015260a05181818161065a0152610c44015260c05181818161068101526139220152f35b610b9d565b63d794ef9560e01b60005260046000fd5b5063ffffffff8251161561035f565b5080516001600160601b031615610358565b639b15e16f60e01b60005260046000fd5b838203610280811261106a57610260610ebf6112b7565b91610ec9876113ad565b8352601f19011261106a576040519161026083016001600160401b0381118482101761106f57604052610efe602087016113a0565b8352610f0c604087016113c1565b6020840152610f1d6060870161130f565b6040840152610f2e6080870161130f565b6060840152610f3f60a0870161130f565b6080840152610f5060c08701611392565b60a0840152610f6160e08701611392565b60c0840152610f7361010087016113c1565b60e0840152610f85610120870161130f565b610100840152610f9861014087016113c1565b610120840152610fab61016087016113c1565b610140840152610180860151916001600160e01b03198316830361106a5783602093610160610280960152610fe36101a089016113a0565b610180820152610ff66101c089016113c1565b6101a08201526110096101e0890161130f565b6101c082015261101c610200890161130f565b6101e082015261102f61022089016113ad565b610200820152611042610240890161130f565b610220820152611055610260890161130f565b61024082015283820152815201930192610211565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60408387031261106a57602060409161109c6112b7565b6110a5866112fb565b81526110b28387016113ad565b838201528152019201916101b9565b82516001600160401b03811161106a5782016040818803601f19011261106a576110e96112b7565b906110f6602082016113ad565b825260408101516001600160401b03811161106a57602091010187601f8201121561106a5780516111296100e882611320565b91602060e08185858152019302820101908a821161106a57602001915b8183106111655750505091816020938480940152815201920191610162565b828b0360e0811261106a5760c061117a6112b7565b91611184866112fb565b8352601f19011261106a576040519160c08301916001600160401b0383118484101761106f5760e0936020936040526111be84880161130f565b81526111cc6040880161130f565b848201526111dc606088016113c1565b60408201526111ed6080880161130f565b60608201526111fe60a0880161130f565b608082015261120f60c088016113a0565b60a082015283820152815201920191611146565b8284036080811261106a5760606112386112b7565b91611242866112fb565b8352601f19011261106a5760809160209161125b611298565b6112668488016112fb565b815261127460408801611392565b84820152611284606088016113a0565b60408201528382015281520192019161010a565b60405190606082016001600160401b0381118382101761106f57604052565b60408051919082016001600160401b0381118382101761106f57604052565b6040519190601f01601f191682016001600160401b0381118382101761106f57604052565b51906001600160a01b038216820361106a57565b519063ffffffff8216820361106a57565b6001600160401b03811161106f5760051b60200190565b9080601f8301121561106a5781516113516100e882611320565b9260208085848152019260051b82010192831161106a57602001905b82821061137a5750505090565b60208091611387846112fb565b81520191019061136d565b519060ff8216820361106a57565b5190811515820361106a57565b51906001600160401b038216820361106a57565b519061ffff8216820361106a57565b80518210156113e45760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156113e45760005260206000200190600090565b8054801561143b57600019019061142982826113fa565b8154906000199060031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b6000818152600c602052604090205480156115125760001981018181116114fc57600b546000198101919082116114fc578181036114ab575b505050611497600b611412565b600052600c60205260006040812055600190565b6114e46114bc6114cd93600b6113fa565b90549060031b1c928392600b6113fa565b819391549060031b91821b91600019901b19161790565b9055600052600c60205260406000205538808061148a565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8054906801000000000000000082101561106f57816114cd916001611540940181556113fa565b9055565b8060005260036020526040600020541560001461157d57611566816002611519565b600254906000526003602052604060002055600190565b50600090565b80600052600c6020526040600020541560001461157d576115a581600b611519565b600b5490600052600c602052604060002055600190565b60008181526003602052604090205480156115125760001981018181116114fc576002546000198101919082116114fc57808203611616575b5050506116026002611412565b600052600360205260006040812055600190565b6116386116276114cd9360026113fa565b90549060031b1c92839260026113fa565b905560005260036020526040600020553880806115f556fe6080604052600436101561001257600080fd5b60003560e01c806241e5be1461021657806301447eaa1461021157806301ffc9a71461020c578063061877e31461020757806306285c6914610202578063181f5a77146101fd5780632451a627146101f8578063325c868e146101f35780633937306f146101ee5780633a49bb49146101e957806341ed29e7146101e457806345ac924d146101df5780634ab35b0b146101da578063514e8cff146101d55780636def4ce7146101d0578063770e2dc4146101cb57806379ba5097146101c65780637afac322146101c1578063805f2132146101bc57806382b49eb0146101b757806387b8d879146101b25780638da5cb5b146101ad57806391a2749a146101a8578063a69c64c0146101a3578063bf78e03f1461019e578063cdc73d5114610199578063d02641a014610194578063d63d3af21461018f578063d8694ccd1461018a578063f2fde38b14610185578063fbe3f778146101805763ffdb4b371461017b57600080fd5b6126eb565b6125ee565b612532565b6120ce565b6120b2565b612069565b611ff2565b611f4c565b611e93565b611dff565b611dd8565b611bbc565b611a3f565b6117a4565b61166b565b611553565b611334565b6111b5565b610fde565b610fa6565b610edd565b610d48565b610bd2565b6108e0565b6108c4565b610841565b61079f565b6105e8565b6105a0565b61047c565b6103b0565b61023e565b6001600160a01b0381160361022c57565b600080fd5b359061023c8261021b565b565b3461022c57606060031936011261022c5760206102756004356102608161021b565b602435604435916102708361021b565b61286d565b604051908152f35b6004359067ffffffffffffffff8216820361022c57565b6024359067ffffffffffffffff8216820361022c57565b359067ffffffffffffffff8216820361022c57565b9181601f8401121561022c5782359167ffffffffffffffff831161022c576020808501948460051b01011161022c57565b919082519283825260005b84811061031d575050601f19601f8460006020809697860101520116010190565b806020809284010151828286010152016102fc565b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061036557505050505090565b90919293946020806103a1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0866001960301875289516102f1565b97019301930191939290610356565b3461022c57606060031936011261022c576103c961027d565b60243567ffffffffffffffff811161022c576103e99036906004016102c0565b6044929192359167ffffffffffffffff831161022c573660238401121561022c5782600401359167ffffffffffffffff831161022c573660248460061b8601011161022c5761044b94602461043f950192612a7b565b60405191829182610332565b0390f35b35907fffffffff000000000000000000000000000000000000000000000000000000008216820361022c57565b3461022c57602060031936011261022c576004357fffffffff000000000000000000000000000000000000000000000000000000008116810361022c577fffffffff00000000000000000000000000000000000000000000000000000000602091167f805f2132000000000000000000000000000000000000000000000000000000008114908115610576575b811561054c575b8115610522575b506040519015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501438610517565b7f181f5a770000000000000000000000000000000000000000000000000000000081149150610510565b7fe364892e0000000000000000000000000000000000000000000000000000000081149150610509565b3461022c57602060031936011261022c576001600160a01b036004356105c58161021b565b166000526008602052602067ffffffffffffffff60406000205416604051908152f35b3461022c57600060031936011261022c57610601612ca5565b506060604051610610816106e8565b63ffffffff6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016918281526001600160a01b0360406020830192827f00000000000000000000000000000000000000000000000000000000000000001684520191837f00000000000000000000000000000000000000000000000000000000000000001683526040519485525116602084015251166040820152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff82111761070457604052565b6106b9565b60a0810190811067ffffffffffffffff82111761070457604052565b6040810190811067ffffffffffffffff82111761070457604052565b60c0810190811067ffffffffffffffff82111761070457604052565b90601f601f19910116810190811067ffffffffffffffff82111761070457604052565b6040519061023c60408361075d565b6040519061023c6102608361075d565b3461022c57600060031936011261022c5761044b60408051906107c2818361075d565b600f82527f46656551756f74657220312e362e3000000000000000000000000000000000006020830152519182916020835260208301906102f1565b602060408183019282815284518094520192019060005b8181106108225750505090565b82516001600160a01b0316845260209384019390920191600101610815565b3461022c57600060031936011261022c5760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b8181106108ae5761044b856108a28187038261075d565b604051918291826107fe565b825484526020909301926001928301920161088b565b3461022c57600060031936011261022c57602060405160248152f35b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c5780600401906040600319823603011261022c5761091e613e45565b6109288280612cc4565b4263ffffffff1692915060005b818110610a995750506024019061094c8284612cc4565b92905060005b83811061095b57005b8061097a61097560019361096f868a612cc4565b90612916565b612d63565b7fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e67ffffffffffffffff610a75610a676020850194610a596109c387516001600160e01b031690565b6109dd6109ce610780565b6001600160e01b039092168252565b63ffffffff8c166020820152610a186109fe845167ffffffffffffffff1690565b67ffffffffffffffff166000526005602052604060002090565b815160209092015160e01b7fffffffff00000000000000000000000000000000000000000000000000000000166001600160e01b0392909216919091179055565b5167ffffffffffffffff1690565b93516001600160e01b031690565b604080516001600160e01b039290921682524260208301529190931692a201610952565b80610ab2610aad60019361096f8980612cc4565b612d2c565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b03610b4b610a676020850194610b3e610afa87516001600160e01b031690565b610b056109ce610780565b63ffffffff8d166020820152610a18610b2584516001600160a01b031690565b6001600160a01b03166000526006602052604060002090565b516001600160a01b031690565b604080516001600160e01b039290921682524260208301529190931692a201610935565b9181601f8401121561022c5782359167ffffffffffffffff831161022c576020838186019501011161022c57565b92610bcf9492610bc1928552151560208501526080604085015260808401906102f1565b9160608184039101526102f1565b90565b3461022c5760a060031936011261022c57610beb61027d565b60243590610bf88261021b565b6044359160643567ffffffffffffffff811161022c57610c1c903690600401610b6f565b93909160843567ffffffffffffffff811161022c57610c3f903690600401610b6f565b9290917f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382166001600160a01b03821614600014610d0b575050935b6bffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016808611610cda575091610ccb939161044b9693613e89565b90939160405194859485610b9d565b857f6a92a4830000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b91610d159261286d565b93610c84565b67ffffffffffffffff81116107045760051b60200190565b8015150361022c57565b359061023c82610d33565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590610d8582610d1b565b90610d93604051928361075d565b828252602460a06020840194028201019036821161022c57602401925b818410610dc257610dc083612d88565b005b60a08436031261022c5760405190610dd982610709565b8435610de48161021b565b825260208501357fffffffffffffffffffff000000000000000000000000000000000000000000008116810361022c5760208301526040850135907fffff0000000000000000000000000000000000000000000000000000000000008216820361022c5782602092604060a0950152610e5f60608801610231565b6060820152610e7060808801610d3d565b6080820152815201930192610db0565b602060408183019282815284518094520192019060005b818110610ea45750505090565b9091926020604082610ed2600194885163ffffffff602080926001600160e01b038151168552015116910152565b019401929101610e97565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c57610f0e9036906004016102c0565b610f1781610d1b565b91610f25604051938461075d565b818352601f19610f3483610d1b565b0160005b818110610f8f57505060005b82811015610f8157600190610f65610f608260051b850161292b565b6138ce565b610f6f8287612a67565b52610f7a8186612a67565b5001610f44565b6040518061044b8682610e80565b602090610f9a612ee6565b82828801015201610f38565b3461022c57602060031936011261022c576020610fcd600435610fc88161021b565b613b92565b6001600160e01b0360405191168152f35b3461022c57602060031936011261022c5767ffffffffffffffff61100061027d565b611008612ee6565b5016600052600560205260406000206040519061102482610725565b546001600160e01b038116825260e01c6020820152604051809161044b82604081019263ffffffff602080926001600160e01b038151168552015116910152565b61023c909291926102408061026083019561108284825115159052565b60208181015161ffff169085015260408181015163ffffffff169085015260608181015163ffffffff169085015260808181015163ffffffff169085015260a08181015160ff169085015260c08181015160ff169085015260e08181015161ffff16908501526101008181015163ffffffff16908501526101208181015161ffff16908501526101408181015161ffff1690850152610160818101517fffffffff000000000000000000000000000000000000000000000000000000001690850152610180818101511515908501526101a08181015161ffff16908501526101c08181015163ffffffff16908501526101e08181015163ffffffff16908501526102008181015167ffffffffffffffff16908501526102208181015163ffffffff1690850152015163ffffffff16910152565b3461022c57602060031936011261022c5761044b6112786112736111d761027d565b60006102406111e461078f565b8281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e08201528261010082015282610120820152826101408201528261016082015282610180820152826101a0820152826101c0820152826101e08201528261020082015282610220820152015267ffffffffffffffff166000526009602052604060002090565b612f24565b60405191829182611065565b359063ffffffff8216820361022c57565b359061ffff8216820361022c57565b81601f8201121561022c578035906112bb82610d1b565b926112c9604051948561075d565b82845260208085019360061b8301019181831161022c57602001925b8284106112f3575050505090565b60408483031261022c576020604091825161130d81610725565b611316876102ab565b8152828701356113258161021b565b838201528152019301926112e5565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013561137081610d1b565b9161137e604051938461075d565b8183526024602084019260051b8201019036821161022c5760248101925b8284106113cd576024358567ffffffffffffffff821161022c576113c7610dc09236906004016112a4565b90613092565b833567ffffffffffffffff811161022c57820160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc823603011261022c576040519061141982610725565b611425602482016102ab565b8252604481013567ffffffffffffffff811161022c57602491010136601f8201121561022c57803561145681610d1b565b91611464604051938461075d565b818352602060e081850193028201019036821161022c57602001915b81831061149f575050509181602093848094015281520193019261139c565b82360360e0811261022c5760c0601f19604051926114bc84610725565b86356114c78161021b565b8452011261022c5760e0916020916040516114e181610741565b6114ec848801611284565b81526114fa60408801611284565b8482015261150a60608801611295565b604082015261151b60808801611284565b606082015261152c60a08801611284565b608082015260c087013561153f81610d33565b60a082015283820152815201920191611480565b3461022c57600060031936011261022c576000546001600160a01b03811633036115da577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b9080601f8301121561022c57813561161b81610d1b565b92611629604051948561075d565b81845260208085019260051b82010192831161022c57602001905b8282106116515750505090565b6020809183356116608161021b565b815201910190611644565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c5761169c903690600401611604565b60243567ffffffffffffffff811161022c576116bc903690600401611604565b906116c56140c6565b60005b815181101561173457806116e96116e4610b3e60019486612a67565b61593d565b6116f4575b016116c8565b6001600160a01b03611709610b3e8386612a67565b167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91600080a26116ee565b8260005b8151811015610dc05780611759611754610b3e60019486612a67565b615951565b611764575b01611738565b6001600160a01b03611779610b3e8386612a67565b167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23600080a261175e565b3461022c57604060031936011261022c5760043567ffffffffffffffff811161022c576117d5903690600401610b6f565b6024359167ffffffffffffffff831161022c5761182e61182661180c611802611836963690600401610b6f565b94909536916129c6565b90604082015190605e604a84015160601c93015191929190565b919033614258565b810190613341565b60005b8151811015610dc05761188161187c6118636118558486612a67565b51516001600160a01b031690565b6001600160a01b03166000526007602052604060002090565b613400565b6118956118916040830151151590565b1590565b6119f657906118e06118ad6020600194015160ff1690565b6118da6118ce60206118bf8689612a67565b5101516001600160e01b031690565b6001600160e01b031690565b90614326565b6118fb60406118ef8487612a67565b51015163ffffffff1690565b63ffffffff61192661191d611916610b25611855888b612a67565b5460e01c90565b63ffffffff1690565b9116106119f05761197461193f60406118ef8588612a67565b61196461194a610780565b6001600160e01b03851681529163ffffffff166020830152565b610a18610b256118558689612a67565b7f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a6001600160a01b036119aa6118558588612a67565b6119e66119bc60406118ef888b612a67565b60405193849316958390929163ffffffff6020916001600160e01b03604085019616845216910152565b0390a25b01611839565b506119ea565b611a3b611a066118558486612a67565b7f06439c6b000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b6000fd5b3461022c57604060031936011261022c5761044b611ac7611a5e61027d565b67ffffffffffffffff60243591611a748361021b565b600060a0604051611a8481610741565b828152826020820152826040820152826060820152826080820152015216600052600a6020526040600020906001600160a01b0316600052602052604060002090565b611b43611b3a60405192611ada84610741565b5463ffffffff8116845263ffffffff8160201c16602085015261ffff8160401c166040850152611b21611b148263ffffffff9060501c1690565b63ffffffff166060860152565b63ffffffff607082901c16608085015260901c60ff1690565b151560a0830152565b6040519182918291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b60ff81160361022c57565b359061023c82611ba6565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590611bf982610d1b565b90611c07604051928361075d565b82825260246102806020840194028201019036821161022c57602401925b818410611c3557610dc083613436565b833603610280811261022c57610260601f1960405192611c5484610725565b611c5d886102ab565b8452011261022c5761028091602091611c7461078f565b611c7f848901610d3d565b8152611c8d60408901611295565b84820152611c9d60608901611284565b6040820152611cae60808901611284565b6060820152611cbf60a08901611284565b6080820152611cd060c08901611bb1565b60a0820152611ce160e08901611bb1565b60c0820152611cf36101008901611295565b60e0820152611d056101208901611284565b610100820152611d186101408901611295565b610120820152611d2b6101608901611295565b610140820152611d3e610180890161044f565b610160820152611d516101a08901610d3d565b610180820152611d646101c08901611295565b6101a0820152611d776101e08901611284565b6101c0820152611d8a6102008901611284565b6101e0820152611d9d61022089016102ab565b610200820152611db06102408901611284565b610220820152611dc36102608901611284565b61024082015283820152815201930192611c25565b3461022c57600060031936011261022c5760206001600160a01b0360015416604051908152f35b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c576040600319823603011261022c57604051611e3c81610725565b816004013567ffffffffffffffff811161022c57611e609060043691850101611604565b8152602482013567ffffffffffffffff811161022c57610dc0926004611e899236920101611604565b60208201526136a0565b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c57806004013590611ed082610d1b565b90611ede604051928361075d565b8282526024602083019360061b8201019036821161022c57602401925b818410611f0b57610dc0836137f2565b60408436031261022c5760206040918251611f2581610725565b8635611f308161021b565b8152611f3d8388016102ab565b83820152815201930192611efb565b3461022c57602060031936011261022c576001600160a01b03600435611f718161021b565b611f79612ca5565b5016600052600760205261044b604060002060ff60405191611f9a836106e8565b546001600160a01b0381168352818160a01c16602084015260a81c16151560408201526040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b3461022c57600060031936011261022c57604051806020600b54918281520190600b6000527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99060005b8181106120535761044b856108a28187038261075d565b825484526020909301926001928301920161203c565b3461022c57602060031936011261022c57604061208b600435610f608161021b565b6120b08251809263ffffffff602080926001600160e01b038151168552015116910152565bf35b3461022c57600060031936011261022c57602060405160128152f35b3461022c57604060031936011261022c576120e761027d565b60243567ffffffffffffffff811161022c57806004019060a0600319823603011261022c5761212d6112738467ffffffffffffffff166000526009602052604060002090565b61213a6118918251151590565b6124fa57606482016121706118916121518361292b565b6001600160a01b03166000526001600b01602052604060002054151590565b6124b95790839160448401956121868785612cc4565b9590506121c760248201916121aa60846121a0858a612975565b9390500188612975565b90896121c06121b98b80612975565b36916129c6565b9389614c68565b92846121d5610fc88361292b565b9889946121f36121ed61022085015163ffffffff1690565b82614fa0565b9b6000808c1561247f57505061225961ffff8561227e996122659998966122999661228c966122506122406101c06122346101a061229f9f015161ffff1690565b97015163ffffffff1690565b9161224a8c61292b565b94612cc4565b96909516615091565b9891989790989461292b565b6001600160a01b03166000526008602052604060002090565b5467ffffffffffffffff1690565b67ffffffffffffffff1690565b90612821565b9560009761ffff6122b661014089015161ffff1690565b16612424575b509461229961228c61020061238a61044b9d6dffffffffffffffffffffffffffff6123826123a29f9e9b61237d6001600160e01b039f9b9c61239a9f61237d9e63ffffffff61231161237d9f61231b94612975565b92905016906139ea565b908b60a0810161233e612338612332835160ff1690565b60ff1690565b85612821565b9360e0830191612350835161ffff1690565b9061ffff821683116123b2575b505050506080015161237d9161191d9163ffffffff16613a28565b613a28565b6139ea565b911690612821565b93015167ffffffffffffffff1690565b911690612834565b6040519081529081906020820190565b61191d94965061237d959361ffff612413612402612378966123fc6123f56123ec60809960ff6123e661241a9b5160ff1690565b166139f7565b965161ffff1690565b61ffff1690565b906138c1565b61229961233260c08d015160ff1690565b91166139ea565b959383955061235d565b9095949897508261244a8b989495986dffffffffffffffffffffffffffff9060701c1690565b6dffffffffffffffffffffffffffff16916124658489612975565b905061247193886152b3565b9697939438969392966122bc565b969593509650505061229961228c61227e6122656124b36124ae61191d61024061229f99015163ffffffff1690565b6127da565b9461292b565b6124c5611a3b9161292b565b7f2502348c000000000000000000000000000000000000000000000000000000006000526001600160a01b0316600452602490565b7f99ac52f20000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff841660045260246000fd5b3461022c57602060031936011261022c576001600160a01b036004356125578161021b565b61255f6140c6565b163381146125c457807fffffffffffffffffffffffff000000000000000000000000000000000000000060005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461022c57602060031936011261022c5760043567ffffffffffffffff811161022c573660238201121561022c5780600401359061262b82610d1b565b90612639604051928361075d565b8282526024602083019360071b8201019036821161022c57602401925b81841061266657610dc083613a42565b8336036080811261022c576060601f196040519261268384610725565b873561268e8161021b565b8452011261022c576080916020916040516126a8816106e8565b838801356126b58161021b565b815260408801356126c581611ba6565b8482015260608801356126d781610d33565b604082015283820152815201930192612656565b3461022c57604060031936011261022c576004356127088161021b565b612710610294565b9067ffffffffffffffff82169182600052600960205260ff604060002054161561277d5761274061276192613b92565b92600052600960205263ffffffff60016040600020015460901c1690614fa0565b604080516001600160e01b039384168152919092166020820152f35b827f99ac52f20000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90662386f26fc10000820291808304662386f26fc1000014901517156127fc57565b6127ab565b90655af3107a4000820291808304655af3107a400014901517156127fc57565b818102929181159184041417156127fc57565b811561283e570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b612897612891610bcf94936001600160e01b0361288a8195613b92565b1690612821565b92613b92565b1690612834565b906128a882610d1b565b6128b5604051918261075d565b828152601f196128c58294610d1b565b019060005b8281106128d657505050565b8060606020809385010152016128ca565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156129265760061b0190565b6128e7565b35610bcf8161021b565b91908110156129265760051b810135907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618136030182121561022c570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561022c570180359067ffffffffffffffff821161022c5760200191813603831361022c57565b92919267ffffffffffffffff821161070457604051916129f0601f8201601f19166020018461075d565b82948184528183011161022c578281602093846000960137010152565b9061023c604051612a1d81610741565b925463ffffffff8082168552602082811c821690860152604082811c61ffff1690860152605082901c81166060860152607082901c16608085015260901c60ff16151560a0840152565b80518210156129265760209160051b010190565b909291612ac8612a9f8367ffffffffffffffff166000526009602052604060002090565b5460081b7fffffffff000000000000000000000000000000000000000000000000000000001690565b90612ad28161289e565b9560005b828110612ae7575050505050505090565b612afa612af5828489612916565b61292b565b8388612b14612b0a858484612935565b6040810190612975565b905060208111612c2a575b508392612b4e612b486121b9612b3e600198612b8997612b8497612935565b6020810190612975565b89613c0a565b612b6c8967ffffffffffffffff16600052600a602052604060002090565b906001600160a01b0316600052602052604060002090565b612a0d565b60a081015115612bee57612bd2612baa6060612bc493015163ffffffff1690565b6040805163ffffffff909216602083015290928391820190565b03601f19810183528261075d565b612bdc828b612a67565b52612be7818a612a67565b5001612ad6565b50612bc4612bd2612c2584612c178a67ffffffffffffffff166000526009602052604060002090565b015460101c63ffffffff1690565b612baa565b915050612c6261191d612c5584612b6c8b67ffffffffffffffff16600052600a602052604060002090565b5460701c63ffffffff1690565b10612c6f57838838612b1f565b7f36f536ca000000000000000000000000000000000000000000000000000000006000526001600160a01b031660045260246000fd5b60405190612cb2826106e8565b60006040838281528260208201520152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561022c570180359067ffffffffffffffff821161022c57602001918160061b3603831361022c57565b35906001600160e01b038216820361022c57565b60408136031261022c57612d5b602060405192612d4884610725565b8035612d538161021b565b845201612d18565b602082015290565b60408136031261022c57612d5b602060405192612d7f84610725565b612d53816102ab565b90612d916140c6565b60005b8251811015612ee15780612daa60019285612a67565b517f32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a360a06001600160a01b038351169260608101936001600160a01b0380865116957fffff000000000000000000000000000000000000000000000000000000000000612e4860208601947fffffffffffffffffffff00000000000000000000000000000000000000000000865116604088019a848c5116926158b9565b977fffffffffffffffffffff000000000000000000000000000000000000000000006080870195612eb4875115158c600052600460205260406000209060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b8560405198511688525116602087015251166040850152511660608301525115156080820152a201612d94565b509050565b60405190612ef382610725565b60006020838281520152565b90604051612f0c81610725565b91546001600160e01b038116835260e01c6020830152565b9061023c6130846001612f3561078f565b946130236130198254612f51612f4b8260ff1690565b15158a52565b61ffff600882901c1660208a015263ffffffff601882901c1660408a015263ffffffff603882901c1660608a015263ffffffff605882901c1660808a015260ff607882901c1660a08a015260ff608082901c1660c08a015261ffff608882901c1660e08a015263ffffffff609882901c166101008a015261ffff60b882901c166101208a015261ffff60c882901c166101408a01527fffffffff00000000000000000000000000000000000000000000000000000000600882901b166101608a015260f81c90565b1515610180880152565b015461ffff81166101a086015263ffffffff601082901c166101c086015263ffffffff603082901c166101e086015267ffffffffffffffff605082901c1661020086015263ffffffff609082901c1661022086015260b01c63ffffffff1690565b63ffffffff16610240840152565b9061309b6140c6565b6000915b805183101561328d576130b28382612a67565b51906130c6825167ffffffffffffffff1690565b946020600093019367ffffffffffffffff8716935b85518051821015613278576130f282602092612a67565b510151613103611855838951612a67565b8151602083015163ffffffff90811691168181101561323f575050608082015163ffffffff16602081106131fe575090867f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b56001600160a01b038461318d858f60019998612b6c6131889267ffffffffffffffff16600052600a602052604060002090565b614104565b6131f560405192839216958291909160a08060c083019463ffffffff815116845263ffffffff602082015116602085015261ffff604082015116604085015263ffffffff606082015116606085015263ffffffff608082015116608085015201511515910152565b0390a3016130db565b7f24ecdc02000000000000000000000000000000000000000000000000000000006000526001600160a01b0390911660045263ffffffff1660245260446000fd5b7f0b4f67a20000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b5050955092509260019150019192909261309f565b50905060005b815181101561333d57806132bb6132ac60019385612a67565b515167ffffffffffffffff1690565b67ffffffffffffffff6001600160a01b036132ea60206132db8689612a67565b5101516001600160a01b031690565b600061330e82612b6c8767ffffffffffffffff16600052600a602052604060002090565b551691167f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b600080a301613293565b5050565b60208183031261022c5780359067ffffffffffffffff821161022c570181601f8201121561022c5780359061337582610d1b565b92613383604051948561075d565b8284526020606081860194028301019181831161022c57602001925b8284106133ad575050505090565b60608483031261022c5760206060916040516133c8816106e8565b86356133d38161021b565b81526133e0838801612d18565b838201526133f060408801611284565b604082015281520193019261339f565b9060405161340d816106e8565b604060ff8294546001600160a01b0381168452818160a01c16602085015260a81c161515910152565b9061343f6140c6565b60005b8251811015612ee1576134558184612a67565b5160206134656132ac8487612a67565b9101519067ffffffffffffffff811680158015613681575b8015613653575b80156135a6575b61356e579161353482600195946134e46134bf612a9f6135399767ffffffffffffffff166000526009602052604060002090565b7fffffffff000000000000000000000000000000000000000000000000000000001690565b61353f577f71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad604051806135178782611065565b0390a267ffffffffffffffff166000526009602052604060002090565b614433565b01613442565b7f2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e3604051806135178782611065565b7fc35aa79d0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff821660045260246000fd5b507fffffffff000000000000000000000000000000000000000000000000000000006135f66101608501517fffffffff000000000000000000000000000000000000000000000000000000001690565b167f2812d52c000000000000000000000000000000000000000000000000000000008114159081613628575b5061348b565b7f1e10bdc4000000000000000000000000000000000000000000000000000000009150141538613622565b506101e083015163ffffffff1663ffffffff61367961191d606087015163ffffffff1690565b911611613484565b5063ffffffff6136996101e085015163ffffffff1690565b161561347d565b6136a86140c6565b60208101519160005b835181101561373557806136ca610b3e60019387612a67565b6136ec6136e76001600160a01b0383165b6001600160a01b031690565b615bec565b6136f8575b50016136b1565b6040516001600160a01b039190911681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758090602090a1386136f1565b5091505160005b815181101561333d57613752610b3e8284612a67565b906001600160a01b038216156137c8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6137bf836137a461379f6136db6001976001600160a01b031690565b615b73565b506040516001600160a01b0390911681529081906020820190565b0390a10161373c565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b6137fa6140c6565b60005b815181101561333d57806001600160a01b0361381b60019385612a67565b5151167fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d6138b867ffffffffffffffff60206138578689612a67565b51015116836000526008602052604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790556040519182918291909167ffffffffffffffff6020820193169052565b0390a2016137fd565b919082039182116127fc57565b6138d6612ee6565b506138fc6138f7826001600160a01b03166000526006602052604060002090565b612eff565b602081019161391b61391561191d855163ffffffff1690565b426138c1565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016116139c35761187c613967916001600160a01b03166000526007602052604060002090565b6139776118916040830151151590565b80156139c9575b6139c35761398b90614b01565b9163ffffffff6139b361191d6139a8602087015163ffffffff1690565b935163ffffffff1690565b9116106139be575090565b905090565b50905090565b506001600160a01b036139e382516001600160a01b031690565b161561397e565b919082018092116127fc57565b9061ffff8091169116029061ffff82169182036127fc57565b63ffffffff60209116019063ffffffff82116127fc57565b9063ffffffff8091169116019063ffffffff82116127fc57565b90613a4b6140c6565b60005b8251811015612ee15780613a6460019285612a67565b517fe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf613b8960206001600160a01b038451169301518360005260076020526040600020613ae96001600160a01b0383511682906001600160a01b03167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b602082015181547fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff74ff000000000000000000000000000000000000000075ff0000000000000000000000000000000000000000006040870151151560a81b169360a01b169116171790556040519182918291909160408060608301946001600160a01b03815116845260ff602082015116602085015201511515910152565b0390a201613a4e565b613b9b816138ce565b9063ffffffff602083015116158015613bf8575b613bc15750516001600160e01b031690565b6001600160a01b03907f06439c6b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506001600160e01b0382511615613baf565b907fffffffff0000000000000000000000000000000000000000000000000000000082167f2812d52c000000000000000000000000000000000000000000000000000000008114613cd8577f1e10bdc40000000000000000000000000000000000000000000000000000000014613ccb577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000821660045260246000fd5b61023c9150600190615378565b5090506020815103613d1157613cf76020825183010160208301615369565b6001600160a01b038111908115613d4b575b50613d115750565b613d47906040519182917f8d666f6000000000000000000000000000000000000000000000000000000000835260048301615358565b0390fd5b61040091501038613d09565b917fffffffff0000000000000000000000000000000000000000000000000000000083167f2812d52c000000000000000000000000000000000000000000000000000000008114613e25577f1e10bdc40000000000000000000000000000000000000000000000000000000014613e18577f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff00000000000000000000000000000000000000000000000000000000831660045260246000fd5b61023c9250151590615378565b505090506020815103613d1157613cf76020825183010160208301615369565b33600052600360205260406000205415613e5b57565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b611273613eb09196949395929667ffffffffffffffff166000526009602052604060002090565b946101608601947f2812d52c000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613f2388517fffffffff000000000000000000000000000000000000000000000000000000001690565b16146140815750507f1e10bdc4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000613f9786517fffffffff000000000000000000000000000000000000000000000000000000001690565b161461401857611a3b613fca85517fffffffff000000000000000000000000000000000000000000000000000000001690565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff0000000000000000000000000000000000000000000000000000000016600452602490565b61406c93506121b960606140568763ffffffff61404d6101806140458661407a9b9d015163ffffffff1690565b930151151590565b91168587615754565b0151604051958691602083019190602083019252565b03601f19810186528561075d565b9160019190565b945094916140a7916140a161191d6101e0610bcf96015163ffffffff1690565b916154d5565b936140be60206140b6876155f6565b960151151590565b9336916129c6565b6001600160a01b036001541633036140da57565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b815181546020808501516040808701517fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000090941663ffffffff958616179190921b67ffffffff00000000161791901b69ffff000000000000000016178255606083015161023c936142149260a0926141b6911685547fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff1660509190911b6dffffffff0000000000000000000016178555565b61420d6141ca608083015163ffffffff1690565b85547fffffffffffffffffffffffffffff00000000ffffffffffffffffffffffffffff1660709190911b71ffffffff000000000000000000000000000016178555565b0151151590565b81547fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1690151560901b72ff00000000000000000000000000000000000016179055565b91929092614268828286866158b9565b600052600460205260ff60406000205416156142845750505050565b6040517f097e17ff0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529390921660248401527fffffffffffffffffffff0000000000000000000000000000000000000000000090911660448301527fffff000000000000000000000000000000000000000000000000000000000000166064820152608490fd5b604d81116127fc57600a0a90565b60ff1660120160ff81116127fc5760ff169060248211156143c1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116127fc5761437761437d92614318565b90612834565b6001600160e01b038111614397576001600160e01b031690565b7f10cb51d10000000000000000000000000000000000000000000000000000000060005260046000fd5b9060240390602482116127fc576122996143da92614318565b61437d565b9060ff80911691160160ff81116127fc5760ff169060248211156143c1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82019182116127fc5761437761437d92614318565b90614a4d610240600161023c9461447e61444d8651151590565b829060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083541691151516179055565b6144c4614490602087015161ffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ff1660089190911b62ffff0016178255565b6145106144d8604087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffff1660189190911b66ffffffff00000016178255565b614560614524606087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffff1660389190911b6affffffff0000000000000016178255565b6145b4614574608087015163ffffffff1690565b82547fffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffff1660589190911b6effffffff000000000000000000000016178255565b6146066145c560a087015160ff1690565b82547fffffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffff1660789190911b6fff00000000000000000000000000000016178255565b61465961461760c087015160ff1690565b82547fffffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffff1660809190911b70ff0000000000000000000000000000000016178255565b6146af61466b60e087015161ffff1690565b82547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff1660889190911b72ffff000000000000000000000000000000000016178255565b61470c6146c461010087015163ffffffff1690565b82547fffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff1660989190911b76ffffffff0000000000000000000000000000000000000016178255565b61476961471f61012087015161ffff1690565b82547fffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffff1660b89190911b78ffff000000000000000000000000000000000000000000000016178255565b6147c861477c61014087015161ffff1690565b82547fffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffff1660c89190911b7affff0000000000000000000000000000000000000000000000000016178255565b6148496147f96101608701517fffffffff000000000000000000000000000000000000000000000000000000001690565b82547fff00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffff1660089190911c7effffffff00000000000000000000000000000000000000000000000000000016178255565b6148aa61485a610180870151151590565b82547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560f81b7fff0000000000000000000000000000000000000000000000000000000000000016178255565b01926148ee6148bf6101a083015161ffff1690565b859061ffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000825416179055565b61493a6149036101c083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff1660109190911b65ffffffff000016178555565b61498a61494f6101e083015163ffffffff1690565b85547fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1660309190911b69ffffffff00000000000016178555565b6149e66149a361020083015167ffffffffffffffff1690565b85547fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff1660509190911b71ffffffffffffffff0000000000000000000016178555565b614a426149fb61022083015163ffffffff1690565b85547fffffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffff1660909190911b75ffffffff00000000000000000000000000000000000016178555565b015163ffffffff1690565b7fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff79ffffffff0000000000000000000000000000000000000000000083549260b01b169116179055565b519069ffffffffffffffffffff8216820361022c57565b908160a091031261022c57614ac281614a97565b91602082015191604081015191610bcf608060608401519301614a97565b6040513d6000823e3d90fd5b9081602091031261022c5751610bcf81611ba6565b614b09612ee6565b50614b216136db6136db83516001600160a01b031690565b90604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a082600481865afa928315614c2957600092600094614c2e575b5060008312614397576020600491604051928380927f313ce5670000000000000000000000000000000000000000000000000000000082525afa928315614c2957610bcf9363ffffffff93614bca93600092614bf3575b506020015160ff165b906143df565b92614be5614bd6610780565b6001600160e01b039095168552565b1663ffffffff166020830152565b614bc4919250614c1a602091823d8411614c22575b614c12818361075d565b810190614aec565b929150614bbb565b503d614c08565b614ae0565b909350614c5491925060a03d60a011614c61575b614c4c818361075d565b810190614aae565b5093925050919238614b64565b503d614c42565b9291949390614c8161191d604086015163ffffffff1690565b808211614f70575050602083015161ffff16808611614f3a5750610160830194614ccb86517fffffffff000000000000000000000000000000000000000000000000000000001690565b7fffffffff0000000000000000000000000000000000000000000000000000000081167f2812d52c000000000000000000000000000000000000000000000000000000008103614d8d5750505082610bcf9492614d5d92614d386101e0614d889997015163ffffffff1690565b9063ffffffff614d556101806140b6606088015163ffffffff1690565b941692615965565b519384925b517fffffffff000000000000000000000000000000000000000000000000000000001690565b613d57565b91949392917f1e10bdc40000000000000000000000000000000000000000000000000000000003614eeb575090829163ffffffff614de3610180614ddb6060614deb98015163ffffffff1690565b950151151590565b931691615754565b90151580614edf575b614eb5576080810180515160408111614e83575060208201519051519067ffffffffffffffff9081169081831c16614e4957505091610bcf91614e4161191d614d88955163ffffffff1690565b938492614d62565b7fafa933080000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260245260446000fd5b7f8a0d71f700000000000000000000000000000000000000000000000000000000600052600452604060245260446000fd5b7f5bed51920000000000000000000000000000000000000000000000000000000060005260046000fd5b50606081015115614df4565b7f2ee82075000000000000000000000000000000000000000000000000000000006000527fffffffff000000000000000000000000000000000000000000000000000000001660045260246000fd5b7fd88dddd600000000000000000000000000000000000000000000000000000000600052600486905261ffff1660245260446000fd5b7f869337890000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b67ffffffffffffffff8116600052600560205260406000209160405192614fc684610725565b546001600160e01b038116845260e01c9182602085015263ffffffff82169283615000575b50505050610bcf90516001600160e01b031690565b63ffffffff1642908103939084116127fc57831161501e5780614feb565b7ff08bcb3e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045263ffffffff1660245260445260646000fd5b60408136031261022c5760206040519161507a83610725565b80356150858161021b565b83520135602082015290565b9694919695929390956000946000986000986000965b8088106150bb575050505050505050929190565b9091929394959697999a6150d86150d38a848b612916565b615061565b9a615126612b848d61510f6151018967ffffffffffffffff16600052600a602052604060002090565b91516001600160a01b031690565b6001600160a01b0316600052602052604060002090565b9161513761189160a0850151151590565b6152805760009c60408401906151526123f5835161ffff1690565b615208575b5050606083015163ffffffff1661516d91613a28565b9c60808301516151809063ffffffff1690565b61518991613a28565b9b82516151999063ffffffff1690565b63ffffffff166151a8906127da565b600193908083106151fc57506124ae61191d60206151cb93015163ffffffff1690565b8082116151eb57506151dc916139ea565b985b01969594939291906150a7565b90506151f6916139ea565b986151de565b9150506151f6916139ea565b90612299615271939f61525f6152689460208f8e6123f595506001600160a01b0361523a85516001600160a01b031690565b91166001600160a01b03821614615279576152559150613b92565b915b0151906159cd565b925161ffff1690565b620186a0900490565b9b3880615157565b5091615257565b999b50600191506152a7846152a16152ad9361529b8b6127da565b906139ea565b9b613a28565b9c613a10565b9a6151de565b91939093806101e00193846101e0116127fc5761012081029080820461012014901517156127fc576101e09101018093116127fc576123f5610140615349610bcf966dffffffffffffffffffffffffffff6123826153346153216153539a63ffffffff6122999a16906139ea565b6122996123f56101208c015161ffff1690565b61529b61191d6101008b015163ffffffff1690565b93015161ffff1690565b612801565b906020610bcf9281815201906102f1565b9081602091031261022c575190565b9060208251036153e0576153895750565b60208180518101031261022c576020810151156153a35750565b613d47906040519182917fff828faa00000000000000000000000000000000000000000000000000000000835260206004840181815201906102f1565b6040517fff828faa0000000000000000000000000000000000000000000000000000000081526020600482015280613d4760248201856102f1565b919091357fffffffff000000000000000000000000000000000000000000000000000000008116926004811061544f575050565b7fffffffff00000000000000000000000000000000000000000000000000000000929350829060040360031b1b161690565b909291928360041161022c57831161022c57600401916003190190565b9060041161022c5790600490565b9081604091031261022c576020604051916154c683610725565b805183520151612d5b81610d33565b916154de612ee6565b5081156155d4575061551f6121b982806155197fffffffff00000000000000000000000000000000000000000000000000000000958761541b565b95615481565b91167f181dcf1000000000000000000000000000000000000000000000000000000000810361555c575080602080610bcf935183010191016154ac565b7f97a657c900000000000000000000000000000000000000000000000000000000146155ac577f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b806020806155bf93518301019101615369565b6155c7610780565b9081526000602082015290565b91505067ffffffffffffffff6155e8610780565b911681526000602082015290565b6020604051917f181dcf1000000000000000000000000000000000000000000000000000000000828401528051602484015201511515604482015260448152610bcf60648261075d565b6040519061564d82610709565b60606080836000815260006020820152600060408201526000838201520152565b60208183031261022c5780359067ffffffffffffffff821161022c57019060a08282031261022c57604051916156a383610709565b6156ac81611284565b83526156ba602082016102ab565b602084015260408101356156cd81610d33565b60408401526060810135606084015260808101359067ffffffffffffffff821161022c57019080601f8301121561022c57813561570981610d1b565b92615717604051948561075d565b81845260208085019260051b82010192831161022c57602001905b82821061574457505050608082015290565b8135815260209182019101615732565b61575c615640565b50811561588f577f1f3b3aba000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000006157b86157b2858561549e565b9061541b565b160361586557816157d4926157cc92615481565b81019061566e565b918061584f575b6158255763ffffffff6157f2835163ffffffff1690565b16116157fb5790565b7f2e2b0c290000000000000000000000000000000000000000000000000000000060005260046000fd5b7fee433e990000000000000000000000000000000000000000000000000000000060005260046000fd5b506158606118916040840151151590565b6157db565b7f5247fdce0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fb00b53dc0000000000000000000000000000000000000000000000000000000060005260046000fd5b604080516001600160a01b039283166020820190815292909316908301527fffffffffffffffffffff0000000000000000000000000000000000000000000090921660608201527fffff0000000000000000000000000000000000000000000000000000000000009092166080830152906159378160a08101612bc4565b51902090565b6001600160a01b03610bcf9116600b615a7a565b6001600160a01b03610bcf9116600b615bae565b9063ffffffff6159829395949561597a612ee6565b5016916154d5565b918251116159a35780615997575b6158255790565b50602081015115615990565b7f4c4fc93a0000000000000000000000000000000000000000000000000000000060005260046000fd5b670de0b6b3a7640000916001600160e01b036159e99216612821565b0490565b80548210156129265760005260206000200190600090565b91615a1f918354906000199060031b92831b921b19161790565b9055565b80548015615a4b576000190190615a3a82826159ed565b60001982549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001810191806000528260205260406000205492831515600014615b2c5760001984018481116127fc5783549360001985019485116127fc576000958583615add97615ace9503615ae3575b505050615a23565b90600052602052604060002090565b55600190565b615b13615b0d91615b04615afa615b2395886159ed565b90549060031b1c90565b928391876159ed565b90615a05565b8590600052602052604060002090565b55388080615ac6565b50505050600090565b805490680100000000000000008210156107045781615b5c916001615a1f940181556159ed565b81939154906000199060031b92831b921b19161790565b600081815260036020526040902054615ba857615b91816002615b35565b600254906000526003602052604060002055600190565b50600090565b6000828152600182016020526040902054615be55780615bd083600193615b35565b80549260005201602052604060002055600190565b5050600090565b600081815260036020526040902054908115615be5576000198201908282116127fc576002549260001984019384116127fc578383615add9460009603615c4c575b505050615c3b6002615a23565b600390600052602052604060002090565b615c3b615b0d91615c64615afa615c6e9560026159ed565b92839160026159ed565b55388080615c2e56fea164736f6c634300081a000a", +} + +var FeeQuoterABI = FeeQuoterMetaData.ABI + +var FeeQuoterBin = FeeQuoterMetaData.Bin + +func DeployFeeQuoter(auth *bind.TransactOpts, backend bind.ContractBackend, staticConfig FeeQuoterStaticConfig, priceUpdaters []common.Address, feeTokens []common.Address, tokenPriceFeeds []FeeQuoterTokenPriceFeedUpdate, tokenTransferFeeConfigArgs []FeeQuoterTokenTransferFeeConfigArgs, premiumMultiplierWeiPerEthArgs []FeeQuoterPremiumMultiplierWeiPerEthArgs, destChainConfigArgs []FeeQuoterDestChainConfigArgs) (common.Address, *types.Transaction, *FeeQuoter, error) { + parsed, err := FeeQuoterMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(FeeQuoterBin), backend, staticConfig, priceUpdaters, feeTokens, tokenPriceFeeds, tokenTransferFeeConfigArgs, premiumMultiplierWeiPerEthArgs, destChainConfigArgs) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &FeeQuoter{address: address, abi: *parsed, FeeQuoterCaller: FeeQuoterCaller{contract: contract}, FeeQuoterTransactor: FeeQuoterTransactor{contract: contract}, FeeQuoterFilterer: FeeQuoterFilterer{contract: contract}}, nil +} + +type FeeQuoter struct { + address common.Address + abi abi.ABI + FeeQuoterCaller + FeeQuoterTransactor + FeeQuoterFilterer +} + +type FeeQuoterCaller struct { + contract *bind.BoundContract +} + +type FeeQuoterTransactor struct { + contract *bind.BoundContract +} + +type FeeQuoterFilterer struct { + contract *bind.BoundContract +} + +type FeeQuoterSession struct { + Contract *FeeQuoter + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type FeeQuoterCallerSession struct { + Contract *FeeQuoterCaller + CallOpts bind.CallOpts +} + +type FeeQuoterTransactorSession struct { + Contract *FeeQuoterTransactor + TransactOpts bind.TransactOpts +} + +type FeeQuoterRaw struct { + Contract *FeeQuoter +} + +type FeeQuoterCallerRaw struct { + Contract *FeeQuoterCaller +} + +type FeeQuoterTransactorRaw struct { + Contract *FeeQuoterTransactor +} + +func NewFeeQuoter(address common.Address, backend bind.ContractBackend) (*FeeQuoter, error) { + abi, err := abi.JSON(strings.NewReader(FeeQuoterABI)) + if err != nil { + return nil, err + } + contract, err := bindFeeQuoter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &FeeQuoter{address: address, abi: abi, FeeQuoterCaller: FeeQuoterCaller{contract: contract}, FeeQuoterTransactor: FeeQuoterTransactor{contract: contract}, FeeQuoterFilterer: FeeQuoterFilterer{contract: contract}}, nil +} + +func NewFeeQuoterCaller(address common.Address, caller bind.ContractCaller) (*FeeQuoterCaller, error) { + contract, err := bindFeeQuoter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &FeeQuoterCaller{contract: contract}, nil +} + +func NewFeeQuoterTransactor(address common.Address, transactor bind.ContractTransactor) (*FeeQuoterTransactor, error) { + contract, err := bindFeeQuoter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &FeeQuoterTransactor{contract: contract}, nil +} + +func NewFeeQuoterFilterer(address common.Address, filterer bind.ContractFilterer) (*FeeQuoterFilterer, error) { + contract, err := bindFeeQuoter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &FeeQuoterFilterer{contract: contract}, nil +} + +func bindFeeQuoter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := FeeQuoterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_FeeQuoter *FeeQuoterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _FeeQuoter.Contract.FeeQuoterCaller.contract.Call(opts, result, method, params...) +} + +func (_FeeQuoter *FeeQuoterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _FeeQuoter.Contract.FeeQuoterTransactor.contract.Transfer(opts) +} + +func (_FeeQuoter *FeeQuoterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _FeeQuoter.Contract.FeeQuoterTransactor.contract.Transact(opts, method, params...) +} + +func (_FeeQuoter *FeeQuoterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _FeeQuoter.Contract.contract.Call(opts, result, method, params...) +} + +func (_FeeQuoter *FeeQuoterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _FeeQuoter.Contract.contract.Transfer(opts) +} + +func (_FeeQuoter *FeeQuoterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _FeeQuoter.Contract.contract.Transact(opts, method, params...) +} + +func (_FeeQuoter *FeeQuoterCaller) FEEBASEDECIMALS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "FEE_BASE_DECIMALS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) FEEBASEDECIMALS() (*big.Int, error) { + return _FeeQuoter.Contract.FEEBASEDECIMALS(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) FEEBASEDECIMALS() (*big.Int, error) { + return _FeeQuoter.Contract.FEEBASEDECIMALS(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCaller) KEYSTONEPRICEDECIMALS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "KEYSTONE_PRICE_DECIMALS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) KEYSTONEPRICEDECIMALS() (*big.Int, error) { + return _FeeQuoter.Contract.KEYSTONEPRICEDECIMALS(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) KEYSTONEPRICEDECIMALS() (*big.Int, error) { + return _FeeQuoter.Contract.KEYSTONEPRICEDECIMALS(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCaller) ConvertTokenAmount(opts *bind.CallOpts, fromToken common.Address, fromTokenAmount *big.Int, toToken common.Address) (*big.Int, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "convertTokenAmount", fromToken, fromTokenAmount, toToken) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) ConvertTokenAmount(fromToken common.Address, fromTokenAmount *big.Int, toToken common.Address) (*big.Int, error) { + return _FeeQuoter.Contract.ConvertTokenAmount(&_FeeQuoter.CallOpts, fromToken, fromTokenAmount, toToken) +} + +func (_FeeQuoter *FeeQuoterCallerSession) ConvertTokenAmount(fromToken common.Address, fromTokenAmount *big.Int, toToken common.Address) (*big.Int, error) { + return _FeeQuoter.Contract.ConvertTokenAmount(&_FeeQuoter.CallOpts, fromToken, fromTokenAmount, toToken) +} + +func (_FeeQuoter *FeeQuoterCaller) GetAllAuthorizedCallers(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getAllAuthorizedCallers") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetAllAuthorizedCallers() ([]common.Address, error) { + return _FeeQuoter.Contract.GetAllAuthorizedCallers(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetAllAuthorizedCallers() ([]common.Address, error) { + return _FeeQuoter.Contract.GetAllAuthorizedCallers(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCaller) GetDestChainConfig(opts *bind.CallOpts, destChainSelector uint64) (FeeQuoterDestChainConfig, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getDestChainConfig", destChainSelector) + + if err != nil { + return *new(FeeQuoterDestChainConfig), err + } + + out0 := *abi.ConvertType(out[0], new(FeeQuoterDestChainConfig)).(*FeeQuoterDestChainConfig) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetDestChainConfig(destChainSelector uint64) (FeeQuoterDestChainConfig, error) { + return _FeeQuoter.Contract.GetDestChainConfig(&_FeeQuoter.CallOpts, destChainSelector) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetDestChainConfig(destChainSelector uint64) (FeeQuoterDestChainConfig, error) { + return _FeeQuoter.Contract.GetDestChainConfig(&_FeeQuoter.CallOpts, destChainSelector) +} + +func (_FeeQuoter *FeeQuoterCaller) GetDestinationChainGasPrice(opts *bind.CallOpts, destChainSelector uint64) (InternalTimestampedPackedUint224, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getDestinationChainGasPrice", destChainSelector) + + if err != nil { + return *new(InternalTimestampedPackedUint224), err + } + + out0 := *abi.ConvertType(out[0], new(InternalTimestampedPackedUint224)).(*InternalTimestampedPackedUint224) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetDestinationChainGasPrice(destChainSelector uint64) (InternalTimestampedPackedUint224, error) { + return _FeeQuoter.Contract.GetDestinationChainGasPrice(&_FeeQuoter.CallOpts, destChainSelector) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetDestinationChainGasPrice(destChainSelector uint64) (InternalTimestampedPackedUint224, error) { + return _FeeQuoter.Contract.GetDestinationChainGasPrice(&_FeeQuoter.CallOpts, destChainSelector) +} + +func (_FeeQuoter *FeeQuoterCaller) GetFeeTokens(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getFeeTokens") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetFeeTokens() ([]common.Address, error) { + return _FeeQuoter.Contract.GetFeeTokens(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetFeeTokens() ([]common.Address, error) { + return _FeeQuoter.Contract.GetFeeTokens(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCaller) GetPremiumMultiplierWeiPerEth(opts *bind.CallOpts, token common.Address) (uint64, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getPremiumMultiplierWeiPerEth", token) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetPremiumMultiplierWeiPerEth(token common.Address) (uint64, error) { + return _FeeQuoter.Contract.GetPremiumMultiplierWeiPerEth(&_FeeQuoter.CallOpts, token) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetPremiumMultiplierWeiPerEth(token common.Address) (uint64, error) { + return _FeeQuoter.Contract.GetPremiumMultiplierWeiPerEth(&_FeeQuoter.CallOpts, token) +} + +func (_FeeQuoter *FeeQuoterCaller) GetStaticConfig(opts *bind.CallOpts) (FeeQuoterStaticConfig, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getStaticConfig") + + if err != nil { + return *new(FeeQuoterStaticConfig), err + } + + out0 := *abi.ConvertType(out[0], new(FeeQuoterStaticConfig)).(*FeeQuoterStaticConfig) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetStaticConfig() (FeeQuoterStaticConfig, error) { + return _FeeQuoter.Contract.GetStaticConfig(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetStaticConfig() (FeeQuoterStaticConfig, error) { + return _FeeQuoter.Contract.GetStaticConfig(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCaller) GetTokenAndGasPrices(opts *bind.CallOpts, token common.Address, destChainSelector uint64) (GetTokenAndGasPrices, + + error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getTokenAndGasPrices", token, destChainSelector) + + outstruct := new(GetTokenAndGasPrices) + if err != nil { + return *outstruct, err + } + + outstruct.TokenPrice = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.GasPriceValue = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetTokenAndGasPrices(token common.Address, destChainSelector uint64) (GetTokenAndGasPrices, + + error) { + return _FeeQuoter.Contract.GetTokenAndGasPrices(&_FeeQuoter.CallOpts, token, destChainSelector) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetTokenAndGasPrices(token common.Address, destChainSelector uint64) (GetTokenAndGasPrices, + + error) { + return _FeeQuoter.Contract.GetTokenAndGasPrices(&_FeeQuoter.CallOpts, token, destChainSelector) +} + +func (_FeeQuoter *FeeQuoterCaller) GetTokenPrice(opts *bind.CallOpts, token common.Address) (InternalTimestampedPackedUint224, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getTokenPrice", token) + + if err != nil { + return *new(InternalTimestampedPackedUint224), err + } + + out0 := *abi.ConvertType(out[0], new(InternalTimestampedPackedUint224)).(*InternalTimestampedPackedUint224) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetTokenPrice(token common.Address) (InternalTimestampedPackedUint224, error) { + return _FeeQuoter.Contract.GetTokenPrice(&_FeeQuoter.CallOpts, token) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetTokenPrice(token common.Address) (InternalTimestampedPackedUint224, error) { + return _FeeQuoter.Contract.GetTokenPrice(&_FeeQuoter.CallOpts, token) +} + +func (_FeeQuoter *FeeQuoterCaller) GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (FeeQuoterTokenPriceFeedConfig, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getTokenPriceFeedConfig", token) + + if err != nil { + return *new(FeeQuoterTokenPriceFeedConfig), err + } + + out0 := *abi.ConvertType(out[0], new(FeeQuoterTokenPriceFeedConfig)).(*FeeQuoterTokenPriceFeedConfig) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetTokenPriceFeedConfig(token common.Address) (FeeQuoterTokenPriceFeedConfig, error) { + return _FeeQuoter.Contract.GetTokenPriceFeedConfig(&_FeeQuoter.CallOpts, token) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetTokenPriceFeedConfig(token common.Address) (FeeQuoterTokenPriceFeedConfig, error) { + return _FeeQuoter.Contract.GetTokenPriceFeedConfig(&_FeeQuoter.CallOpts, token) +} + +func (_FeeQuoter *FeeQuoterCaller) GetTokenPrices(opts *bind.CallOpts, tokens []common.Address) ([]InternalTimestampedPackedUint224, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getTokenPrices", tokens) + + if err != nil { + return *new([]InternalTimestampedPackedUint224), err + } + + out0 := *abi.ConvertType(out[0], new([]InternalTimestampedPackedUint224)).(*[]InternalTimestampedPackedUint224) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetTokenPrices(tokens []common.Address) ([]InternalTimestampedPackedUint224, error) { + return _FeeQuoter.Contract.GetTokenPrices(&_FeeQuoter.CallOpts, tokens) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetTokenPrices(tokens []common.Address) ([]InternalTimestampedPackedUint224, error) { + return _FeeQuoter.Contract.GetTokenPrices(&_FeeQuoter.CallOpts, tokens) +} + +func (_FeeQuoter *FeeQuoterCaller) GetTokenTransferFeeConfig(opts *bind.CallOpts, destChainSelector uint64, token common.Address) (FeeQuoterTokenTransferFeeConfig, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getTokenTransferFeeConfig", destChainSelector, token) + + if err != nil { + return *new(FeeQuoterTokenTransferFeeConfig), err + } + + out0 := *abi.ConvertType(out[0], new(FeeQuoterTokenTransferFeeConfig)).(*FeeQuoterTokenTransferFeeConfig) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetTokenTransferFeeConfig(destChainSelector uint64, token common.Address) (FeeQuoterTokenTransferFeeConfig, error) { + return _FeeQuoter.Contract.GetTokenTransferFeeConfig(&_FeeQuoter.CallOpts, destChainSelector, token) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetTokenTransferFeeConfig(destChainSelector uint64, token common.Address) (FeeQuoterTokenTransferFeeConfig, error) { + return _FeeQuoter.Contract.GetTokenTransferFeeConfig(&_FeeQuoter.CallOpts, destChainSelector, token) +} + +func (_FeeQuoter *FeeQuoterCaller) GetValidatedFee(opts *bind.CallOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getValidatedFee", destChainSelector, message) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetValidatedFee(destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + return _FeeQuoter.Contract.GetValidatedFee(&_FeeQuoter.CallOpts, destChainSelector, message) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetValidatedFee(destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + return _FeeQuoter.Contract.GetValidatedFee(&_FeeQuoter.CallOpts, destChainSelector, message) +} + +func (_FeeQuoter *FeeQuoterCaller) GetValidatedTokenPrice(opts *bind.CallOpts, token common.Address) (*big.Int, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "getValidatedTokenPrice", token) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) GetValidatedTokenPrice(token common.Address) (*big.Int, error) { + return _FeeQuoter.Contract.GetValidatedTokenPrice(&_FeeQuoter.CallOpts, token) +} + +func (_FeeQuoter *FeeQuoterCallerSession) GetValidatedTokenPrice(token common.Address) (*big.Int, error) { + return _FeeQuoter.Contract.GetValidatedTokenPrice(&_FeeQuoter.CallOpts, token) +} + +func (_FeeQuoter *FeeQuoterCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _FeeQuoter.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 + +} + +func (_FeeQuoter *FeeQuoterSession) Owner() (common.Address, error) { + return _FeeQuoter.Contract.Owner(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) Owner() (common.Address, error) { + return _FeeQuoter.Contract.Owner(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCaller) ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, messageReceiver []byte) (ProcessMessageArgs, + + error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "processMessageArgs", destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver) + + outstruct := new(ProcessMessageArgs) + if err != nil { + return *outstruct, err + } + + outstruct.MsgFeeJuels = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.IsOutOfOrderExecution = *abi.ConvertType(out[1], new(bool)).(*bool) + outstruct.ConvertedExtraArgs = *abi.ConvertType(out[2], new([]byte)).(*[]byte) + outstruct.TokenReceiver = *abi.ConvertType(out[3], new([]byte)).(*[]byte) + + return *outstruct, err + +} + +func (_FeeQuoter *FeeQuoterSession) ProcessMessageArgs(destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, messageReceiver []byte) (ProcessMessageArgs, + + error) { + return _FeeQuoter.Contract.ProcessMessageArgs(&_FeeQuoter.CallOpts, destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver) +} + +func (_FeeQuoter *FeeQuoterCallerSession) ProcessMessageArgs(destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, messageReceiver []byte) (ProcessMessageArgs, + + error) { + return _FeeQuoter.Contract.ProcessMessageArgs(&_FeeQuoter.CallOpts, destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver) +} + +func (_FeeQuoter *FeeQuoterCaller) ProcessPoolReturnData(opts *bind.CallOpts, destChainSelector uint64, onRampTokenTransfers []InternalEVM2AnyTokenTransfer, sourceTokenAmounts []ClientEVMTokenAmount) ([][]byte, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "processPoolReturnData", destChainSelector, onRampTokenTransfers, sourceTokenAmounts) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) ProcessPoolReturnData(destChainSelector uint64, onRampTokenTransfers []InternalEVM2AnyTokenTransfer, sourceTokenAmounts []ClientEVMTokenAmount) ([][]byte, error) { + return _FeeQuoter.Contract.ProcessPoolReturnData(&_FeeQuoter.CallOpts, destChainSelector, onRampTokenTransfers, sourceTokenAmounts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) ProcessPoolReturnData(destChainSelector uint64, onRampTokenTransfers []InternalEVM2AnyTokenTransfer, sourceTokenAmounts []ClientEVMTokenAmount) ([][]byte, error) { + return _FeeQuoter.Contract.ProcessPoolReturnData(&_FeeQuoter.CallOpts, destChainSelector, onRampTokenTransfers, sourceTokenAmounts) +} + +func (_FeeQuoter *FeeQuoterCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _FeeQuoter.Contract.SupportsInterface(&_FeeQuoter.CallOpts, interfaceId) +} + +func (_FeeQuoter *FeeQuoterCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _FeeQuoter.Contract.SupportsInterface(&_FeeQuoter.CallOpts, interfaceId) +} + +func (_FeeQuoter *FeeQuoterCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _FeeQuoter.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_FeeQuoter *FeeQuoterSession) TypeAndVersion() (string, error) { + return _FeeQuoter.Contract.TypeAndVersion(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterCallerSession) TypeAndVersion() (string, error) { + return _FeeQuoter.Contract.TypeAndVersion(&_FeeQuoter.CallOpts) +} + +func (_FeeQuoter *FeeQuoterTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "acceptOwnership") +} + +func (_FeeQuoter *FeeQuoterSession) AcceptOwnership() (*types.Transaction, error) { + return _FeeQuoter.Contract.AcceptOwnership(&_FeeQuoter.TransactOpts) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _FeeQuoter.Contract.AcceptOwnership(&_FeeQuoter.TransactOpts) +} + +func (_FeeQuoter *FeeQuoterTransactor) ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "applyAuthorizedCallerUpdates", authorizedCallerArgs) +} + +func (_FeeQuoter *FeeQuoterSession) ApplyAuthorizedCallerUpdates(authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyAuthorizedCallerUpdates(&_FeeQuoter.TransactOpts, authorizedCallerArgs) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) ApplyAuthorizedCallerUpdates(authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyAuthorizedCallerUpdates(&_FeeQuoter.TransactOpts, authorizedCallerArgs) +} + +func (_FeeQuoter *FeeQuoterTransactor) ApplyDestChainConfigUpdates(opts *bind.TransactOpts, destChainConfigArgs []FeeQuoterDestChainConfigArgs) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "applyDestChainConfigUpdates", destChainConfigArgs) +} + +func (_FeeQuoter *FeeQuoterSession) ApplyDestChainConfigUpdates(destChainConfigArgs []FeeQuoterDestChainConfigArgs) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyDestChainConfigUpdates(&_FeeQuoter.TransactOpts, destChainConfigArgs) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) ApplyDestChainConfigUpdates(destChainConfigArgs []FeeQuoterDestChainConfigArgs) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyDestChainConfigUpdates(&_FeeQuoter.TransactOpts, destChainConfigArgs) +} + +func (_FeeQuoter *FeeQuoterTransactor) ApplyFeeTokensUpdates(opts *bind.TransactOpts, feeTokensToRemove []common.Address, feeTokensToAdd []common.Address) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "applyFeeTokensUpdates", feeTokensToRemove, feeTokensToAdd) +} + +func (_FeeQuoter *FeeQuoterSession) ApplyFeeTokensUpdates(feeTokensToRemove []common.Address, feeTokensToAdd []common.Address) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyFeeTokensUpdates(&_FeeQuoter.TransactOpts, feeTokensToRemove, feeTokensToAdd) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) ApplyFeeTokensUpdates(feeTokensToRemove []common.Address, feeTokensToAdd []common.Address) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyFeeTokensUpdates(&_FeeQuoter.TransactOpts, feeTokensToRemove, feeTokensToAdd) +} + +func (_FeeQuoter *FeeQuoterTransactor) ApplyPremiumMultiplierWeiPerEthUpdates(opts *bind.TransactOpts, premiumMultiplierWeiPerEthArgs []FeeQuoterPremiumMultiplierWeiPerEthArgs) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "applyPremiumMultiplierWeiPerEthUpdates", premiumMultiplierWeiPerEthArgs) +} + +func (_FeeQuoter *FeeQuoterSession) ApplyPremiumMultiplierWeiPerEthUpdates(premiumMultiplierWeiPerEthArgs []FeeQuoterPremiumMultiplierWeiPerEthArgs) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyPremiumMultiplierWeiPerEthUpdates(&_FeeQuoter.TransactOpts, premiumMultiplierWeiPerEthArgs) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) ApplyPremiumMultiplierWeiPerEthUpdates(premiumMultiplierWeiPerEthArgs []FeeQuoterPremiumMultiplierWeiPerEthArgs) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyPremiumMultiplierWeiPerEthUpdates(&_FeeQuoter.TransactOpts, premiumMultiplierWeiPerEthArgs) +} + +func (_FeeQuoter *FeeQuoterTransactor) ApplyTokenTransferFeeConfigUpdates(opts *bind.TransactOpts, tokenTransferFeeConfigArgs []FeeQuoterTokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs []FeeQuoterTokenTransferFeeConfigRemoveArgs) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "applyTokenTransferFeeConfigUpdates", tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs) +} + +func (_FeeQuoter *FeeQuoterSession) ApplyTokenTransferFeeConfigUpdates(tokenTransferFeeConfigArgs []FeeQuoterTokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs []FeeQuoterTokenTransferFeeConfigRemoveArgs) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyTokenTransferFeeConfigUpdates(&_FeeQuoter.TransactOpts, tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) ApplyTokenTransferFeeConfigUpdates(tokenTransferFeeConfigArgs []FeeQuoterTokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs []FeeQuoterTokenTransferFeeConfigRemoveArgs) (*types.Transaction, error) { + return _FeeQuoter.Contract.ApplyTokenTransferFeeConfigUpdates(&_FeeQuoter.TransactOpts, tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs) +} + +func (_FeeQuoter *FeeQuoterTransactor) OnReport(opts *bind.TransactOpts, metadata []byte, report []byte) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "onReport", metadata, report) +} + +func (_FeeQuoter *FeeQuoterSession) OnReport(metadata []byte, report []byte) (*types.Transaction, error) { + return _FeeQuoter.Contract.OnReport(&_FeeQuoter.TransactOpts, metadata, report) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) OnReport(metadata []byte, report []byte) (*types.Transaction, error) { + return _FeeQuoter.Contract.OnReport(&_FeeQuoter.TransactOpts, metadata, report) +} + +func (_FeeQuoter *FeeQuoterTransactor) SetReportPermissions(opts *bind.TransactOpts, permissions []KeystoneFeedsPermissionHandlerPermission) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "setReportPermissions", permissions) +} + +func (_FeeQuoter *FeeQuoterSession) SetReportPermissions(permissions []KeystoneFeedsPermissionHandlerPermission) (*types.Transaction, error) { + return _FeeQuoter.Contract.SetReportPermissions(&_FeeQuoter.TransactOpts, permissions) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) SetReportPermissions(permissions []KeystoneFeedsPermissionHandlerPermission) (*types.Transaction, error) { + return _FeeQuoter.Contract.SetReportPermissions(&_FeeQuoter.TransactOpts, permissions) +} + +func (_FeeQuoter *FeeQuoterTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "transferOwnership", to) +} + +func (_FeeQuoter *FeeQuoterSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _FeeQuoter.Contract.TransferOwnership(&_FeeQuoter.TransactOpts, to) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _FeeQuoter.Contract.TransferOwnership(&_FeeQuoter.TransactOpts, to) +} + +func (_FeeQuoter *FeeQuoterTransactor) UpdatePrices(opts *bind.TransactOpts, priceUpdates InternalPriceUpdates) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "updatePrices", priceUpdates) +} + +func (_FeeQuoter *FeeQuoterSession) UpdatePrices(priceUpdates InternalPriceUpdates) (*types.Transaction, error) { + return _FeeQuoter.Contract.UpdatePrices(&_FeeQuoter.TransactOpts, priceUpdates) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) UpdatePrices(priceUpdates InternalPriceUpdates) (*types.Transaction, error) { + return _FeeQuoter.Contract.UpdatePrices(&_FeeQuoter.TransactOpts, priceUpdates) +} + +func (_FeeQuoter *FeeQuoterTransactor) UpdateTokenPriceFeeds(opts *bind.TransactOpts, tokenPriceFeedUpdates []FeeQuoterTokenPriceFeedUpdate) (*types.Transaction, error) { + return _FeeQuoter.contract.Transact(opts, "updateTokenPriceFeeds", tokenPriceFeedUpdates) +} + +func (_FeeQuoter *FeeQuoterSession) UpdateTokenPriceFeeds(tokenPriceFeedUpdates []FeeQuoterTokenPriceFeedUpdate) (*types.Transaction, error) { + return _FeeQuoter.Contract.UpdateTokenPriceFeeds(&_FeeQuoter.TransactOpts, tokenPriceFeedUpdates) +} + +func (_FeeQuoter *FeeQuoterTransactorSession) UpdateTokenPriceFeeds(tokenPriceFeedUpdates []FeeQuoterTokenPriceFeedUpdate) (*types.Transaction, error) { + return _FeeQuoter.Contract.UpdateTokenPriceFeeds(&_FeeQuoter.TransactOpts, tokenPriceFeedUpdates) +} + +type FeeQuoterAuthorizedCallerAddedIterator struct { + Event *FeeQuoterAuthorizedCallerAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterAuthorizedCallerAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterAuthorizedCallerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterAuthorizedCallerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterAuthorizedCallerAddedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterAuthorizedCallerAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterAuthorizedCallerAdded struct { + Caller common.Address + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterAuthorizedCallerAdded(opts *bind.FilterOpts) (*FeeQuoterAuthorizedCallerAddedIterator, error) { + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "AuthorizedCallerAdded") + if err != nil { + return nil, err + } + return &FeeQuoterAuthorizedCallerAddedIterator{contract: _FeeQuoter.contract, event: "AuthorizedCallerAdded", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchAuthorizedCallerAdded(opts *bind.WatchOpts, sink chan<- *FeeQuoterAuthorizedCallerAdded) (event.Subscription, error) { + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "AuthorizedCallerAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterAuthorizedCallerAdded) + if err := _FeeQuoter.contract.UnpackLog(event, "AuthorizedCallerAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseAuthorizedCallerAdded(log types.Log) (*FeeQuoterAuthorizedCallerAdded, error) { + event := new(FeeQuoterAuthorizedCallerAdded) + if err := _FeeQuoter.contract.UnpackLog(event, "AuthorizedCallerAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterAuthorizedCallerRemovedIterator struct { + Event *FeeQuoterAuthorizedCallerRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterAuthorizedCallerRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterAuthorizedCallerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterAuthorizedCallerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterAuthorizedCallerRemovedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterAuthorizedCallerRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterAuthorizedCallerRemoved struct { + Caller common.Address + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterAuthorizedCallerRemoved(opts *bind.FilterOpts) (*FeeQuoterAuthorizedCallerRemovedIterator, error) { + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "AuthorizedCallerRemoved") + if err != nil { + return nil, err + } + return &FeeQuoterAuthorizedCallerRemovedIterator{contract: _FeeQuoter.contract, event: "AuthorizedCallerRemoved", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchAuthorizedCallerRemoved(opts *bind.WatchOpts, sink chan<- *FeeQuoterAuthorizedCallerRemoved) (event.Subscription, error) { + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "AuthorizedCallerRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterAuthorizedCallerRemoved) + if err := _FeeQuoter.contract.UnpackLog(event, "AuthorizedCallerRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseAuthorizedCallerRemoved(log types.Log) (*FeeQuoterAuthorizedCallerRemoved, error) { + event := new(FeeQuoterAuthorizedCallerRemoved) + if err := _FeeQuoter.contract.UnpackLog(event, "AuthorizedCallerRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterDestChainAddedIterator struct { + Event *FeeQuoterDestChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterDestChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterDestChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterDestChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterDestChainAddedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterDestChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterDestChainAdded struct { + DestChainSelector uint64 + DestChainConfig FeeQuoterDestChainConfig + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterDestChainAdded(opts *bind.FilterOpts, destChainSelector []uint64) (*FeeQuoterDestChainAddedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "DestChainAdded", destChainSelectorRule) + if err != nil { + return nil, err + } + return &FeeQuoterDestChainAddedIterator{contract: _FeeQuoter.contract, event: "DestChainAdded", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchDestChainAdded(opts *bind.WatchOpts, sink chan<- *FeeQuoterDestChainAdded, destChainSelector []uint64) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "DestChainAdded", destChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterDestChainAdded) + if err := _FeeQuoter.contract.UnpackLog(event, "DestChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseDestChainAdded(log types.Log) (*FeeQuoterDestChainAdded, error) { + event := new(FeeQuoterDestChainAdded) + if err := _FeeQuoter.contract.UnpackLog(event, "DestChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterDestChainConfigUpdatedIterator struct { + Event *FeeQuoterDestChainConfigUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterDestChainConfigUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterDestChainConfigUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterDestChainConfigUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterDestChainConfigUpdatedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterDestChainConfigUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterDestChainConfigUpdated struct { + DestChainSelector uint64 + DestChainConfig FeeQuoterDestChainConfig + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterDestChainConfigUpdated(opts *bind.FilterOpts, destChainSelector []uint64) (*FeeQuoterDestChainConfigUpdatedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "DestChainConfigUpdated", destChainSelectorRule) + if err != nil { + return nil, err + } + return &FeeQuoterDestChainConfigUpdatedIterator{contract: _FeeQuoter.contract, event: "DestChainConfigUpdated", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchDestChainConfigUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterDestChainConfigUpdated, destChainSelector []uint64) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "DestChainConfigUpdated", destChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterDestChainConfigUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "DestChainConfigUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseDestChainConfigUpdated(log types.Log) (*FeeQuoterDestChainConfigUpdated, error) { + event := new(FeeQuoterDestChainConfigUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "DestChainConfigUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterFeeTokenAddedIterator struct { + Event *FeeQuoterFeeTokenAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterFeeTokenAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterFeeTokenAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterFeeTokenAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterFeeTokenAddedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterFeeTokenAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterFeeTokenAdded struct { + FeeToken common.Address + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterFeeTokenAdded(opts *bind.FilterOpts, feeToken []common.Address) (*FeeQuoterFeeTokenAddedIterator, error) { + + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "FeeTokenAdded", feeTokenRule) + if err != nil { + return nil, err + } + return &FeeQuoterFeeTokenAddedIterator{contract: _FeeQuoter.contract, event: "FeeTokenAdded", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchFeeTokenAdded(opts *bind.WatchOpts, sink chan<- *FeeQuoterFeeTokenAdded, feeToken []common.Address) (event.Subscription, error) { + + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "FeeTokenAdded", feeTokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterFeeTokenAdded) + if err := _FeeQuoter.contract.UnpackLog(event, "FeeTokenAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseFeeTokenAdded(log types.Log) (*FeeQuoterFeeTokenAdded, error) { + event := new(FeeQuoterFeeTokenAdded) + if err := _FeeQuoter.contract.UnpackLog(event, "FeeTokenAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterFeeTokenRemovedIterator struct { + Event *FeeQuoterFeeTokenRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterFeeTokenRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterFeeTokenRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterFeeTokenRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterFeeTokenRemovedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterFeeTokenRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterFeeTokenRemoved struct { + FeeToken common.Address + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterFeeTokenRemoved(opts *bind.FilterOpts, feeToken []common.Address) (*FeeQuoterFeeTokenRemovedIterator, error) { + + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "FeeTokenRemoved", feeTokenRule) + if err != nil { + return nil, err + } + return &FeeQuoterFeeTokenRemovedIterator{contract: _FeeQuoter.contract, event: "FeeTokenRemoved", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchFeeTokenRemoved(opts *bind.WatchOpts, sink chan<- *FeeQuoterFeeTokenRemoved, feeToken []common.Address) (event.Subscription, error) { + + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "FeeTokenRemoved", feeTokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterFeeTokenRemoved) + if err := _FeeQuoter.contract.UnpackLog(event, "FeeTokenRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseFeeTokenRemoved(log types.Log) (*FeeQuoterFeeTokenRemoved, error) { + event := new(FeeQuoterFeeTokenRemoved) + if err := _FeeQuoter.contract.UnpackLog(event, "FeeTokenRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterOwnershipTransferRequestedIterator struct { + Event *FeeQuoterOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*FeeQuoterOwnershipTransferRequestedIterator, 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 := _FeeQuoter.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &FeeQuoterOwnershipTransferRequestedIterator{contract: _FeeQuoter.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *FeeQuoterOwnershipTransferRequested, 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 := _FeeQuoter.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: + + event := new(FeeQuoterOwnershipTransferRequested) + if err := _FeeQuoter.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 +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseOwnershipTransferRequested(log types.Log) (*FeeQuoterOwnershipTransferRequested, error) { + event := new(FeeQuoterOwnershipTransferRequested) + if err := _FeeQuoter.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterOwnershipTransferredIterator struct { + Event *FeeQuoterOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*FeeQuoterOwnershipTransferredIterator, 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 := _FeeQuoter.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &FeeQuoterOwnershipTransferredIterator{contract: _FeeQuoter.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *FeeQuoterOwnershipTransferred, 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 := _FeeQuoter.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: + + event := new(FeeQuoterOwnershipTransferred) + if err := _FeeQuoter.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 +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseOwnershipTransferred(log types.Log) (*FeeQuoterOwnershipTransferred, error) { + event := new(FeeQuoterOwnershipTransferred) + if err := _FeeQuoter.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator struct { + Event *FeeQuoterPremiumMultiplierWeiPerEthUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterPremiumMultiplierWeiPerEthUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterPremiumMultiplierWeiPerEthUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterPremiumMultiplierWeiPerEthUpdated struct { + Token common.Address + PremiumMultiplierWeiPerEth uint64 + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterPremiumMultiplierWeiPerEthUpdated(opts *bind.FilterOpts, token []common.Address) (*FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "PremiumMultiplierWeiPerEthUpdated", tokenRule) + if err != nil { + return nil, err + } + return &FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator{contract: _FeeQuoter.contract, event: "PremiumMultiplierWeiPerEthUpdated", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchPremiumMultiplierWeiPerEthUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterPremiumMultiplierWeiPerEthUpdated, token []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "PremiumMultiplierWeiPerEthUpdated", tokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterPremiumMultiplierWeiPerEthUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "PremiumMultiplierWeiPerEthUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParsePremiumMultiplierWeiPerEthUpdated(log types.Log) (*FeeQuoterPremiumMultiplierWeiPerEthUpdated, error) { + event := new(FeeQuoterPremiumMultiplierWeiPerEthUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "PremiumMultiplierWeiPerEthUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterPriceFeedPerTokenUpdatedIterator struct { + Event *FeeQuoterPriceFeedPerTokenUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterPriceFeedPerTokenUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterPriceFeedPerTokenUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterPriceFeedPerTokenUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterPriceFeedPerTokenUpdatedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterPriceFeedPerTokenUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterPriceFeedPerTokenUpdated struct { + Token common.Address + PriceFeedConfig FeeQuoterTokenPriceFeedConfig + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterPriceFeedPerTokenUpdated(opts *bind.FilterOpts, token []common.Address) (*FeeQuoterPriceFeedPerTokenUpdatedIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "PriceFeedPerTokenUpdated", tokenRule) + if err != nil { + return nil, err + } + return &FeeQuoterPriceFeedPerTokenUpdatedIterator{contract: _FeeQuoter.contract, event: "PriceFeedPerTokenUpdated", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchPriceFeedPerTokenUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterPriceFeedPerTokenUpdated, token []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "PriceFeedPerTokenUpdated", tokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterPriceFeedPerTokenUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "PriceFeedPerTokenUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParsePriceFeedPerTokenUpdated(log types.Log) (*FeeQuoterPriceFeedPerTokenUpdated, error) { + event := new(FeeQuoterPriceFeedPerTokenUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "PriceFeedPerTokenUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterReportPermissionSetIterator struct { + Event *FeeQuoterReportPermissionSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterReportPermissionSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterReportPermissionSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterReportPermissionSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterReportPermissionSetIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterReportPermissionSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterReportPermissionSet struct { + ReportId [32]byte + Permission KeystoneFeedsPermissionHandlerPermission + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterReportPermissionSet(opts *bind.FilterOpts, reportId [][32]byte) (*FeeQuoterReportPermissionSetIterator, error) { + + var reportIdRule []interface{} + for _, reportIdItem := range reportId { + reportIdRule = append(reportIdRule, reportIdItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "ReportPermissionSet", reportIdRule) + if err != nil { + return nil, err + } + return &FeeQuoterReportPermissionSetIterator{contract: _FeeQuoter.contract, event: "ReportPermissionSet", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchReportPermissionSet(opts *bind.WatchOpts, sink chan<- *FeeQuoterReportPermissionSet, reportId [][32]byte) (event.Subscription, error) { + + var reportIdRule []interface{} + for _, reportIdItem := range reportId { + reportIdRule = append(reportIdRule, reportIdItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "ReportPermissionSet", reportIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterReportPermissionSet) + if err := _FeeQuoter.contract.UnpackLog(event, "ReportPermissionSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseReportPermissionSet(log types.Log) (*FeeQuoterReportPermissionSet, error) { + event := new(FeeQuoterReportPermissionSet) + if err := _FeeQuoter.contract.UnpackLog(event, "ReportPermissionSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterTokenTransferFeeConfigDeletedIterator struct { + Event *FeeQuoterTokenTransferFeeConfigDeleted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterTokenTransferFeeConfigDeletedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterTokenTransferFeeConfigDeleted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterTokenTransferFeeConfigDeleted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterTokenTransferFeeConfigDeletedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterTokenTransferFeeConfigDeletedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterTokenTransferFeeConfigDeleted struct { + DestChainSelector uint64 + Token common.Address + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterTokenTransferFeeConfigDeleted(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address) (*FeeQuoterTokenTransferFeeConfigDeletedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "TokenTransferFeeConfigDeleted", destChainSelectorRule, tokenRule) + if err != nil { + return nil, err + } + return &FeeQuoterTokenTransferFeeConfigDeletedIterator{contract: _FeeQuoter.contract, event: "TokenTransferFeeConfigDeleted", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchTokenTransferFeeConfigDeleted(opts *bind.WatchOpts, sink chan<- *FeeQuoterTokenTransferFeeConfigDeleted, destChainSelector []uint64, token []common.Address) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "TokenTransferFeeConfigDeleted", destChainSelectorRule, tokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterTokenTransferFeeConfigDeleted) + if err := _FeeQuoter.contract.UnpackLog(event, "TokenTransferFeeConfigDeleted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseTokenTransferFeeConfigDeleted(log types.Log) (*FeeQuoterTokenTransferFeeConfigDeleted, error) { + event := new(FeeQuoterTokenTransferFeeConfigDeleted) + if err := _FeeQuoter.contract.UnpackLog(event, "TokenTransferFeeConfigDeleted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterTokenTransferFeeConfigUpdatedIterator struct { + Event *FeeQuoterTokenTransferFeeConfigUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterTokenTransferFeeConfigUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterTokenTransferFeeConfigUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterTokenTransferFeeConfigUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterTokenTransferFeeConfigUpdatedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterTokenTransferFeeConfigUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterTokenTransferFeeConfigUpdated struct { + DestChainSelector uint64 + Token common.Address + TokenTransferFeeConfig FeeQuoterTokenTransferFeeConfig + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterTokenTransferFeeConfigUpdated(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address) (*FeeQuoterTokenTransferFeeConfigUpdatedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "TokenTransferFeeConfigUpdated", destChainSelectorRule, tokenRule) + if err != nil { + return nil, err + } + return &FeeQuoterTokenTransferFeeConfigUpdatedIterator{contract: _FeeQuoter.contract, event: "TokenTransferFeeConfigUpdated", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchTokenTransferFeeConfigUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterTokenTransferFeeConfigUpdated, destChainSelector []uint64, token []common.Address) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "TokenTransferFeeConfigUpdated", destChainSelectorRule, tokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterTokenTransferFeeConfigUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "TokenTransferFeeConfigUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseTokenTransferFeeConfigUpdated(log types.Log) (*FeeQuoterTokenTransferFeeConfigUpdated, error) { + event := new(FeeQuoterTokenTransferFeeConfigUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "TokenTransferFeeConfigUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterUsdPerTokenUpdatedIterator struct { + Event *FeeQuoterUsdPerTokenUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterUsdPerTokenUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterUsdPerTokenUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterUsdPerTokenUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterUsdPerTokenUpdatedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterUsdPerTokenUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterUsdPerTokenUpdated struct { + Token common.Address + Value *big.Int + Timestamp *big.Int + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterUsdPerTokenUpdated(opts *bind.FilterOpts, token []common.Address) (*FeeQuoterUsdPerTokenUpdatedIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "UsdPerTokenUpdated", tokenRule) + if err != nil { + return nil, err + } + return &FeeQuoterUsdPerTokenUpdatedIterator{contract: _FeeQuoter.contract, event: "UsdPerTokenUpdated", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchUsdPerTokenUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterUsdPerTokenUpdated, token []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "UsdPerTokenUpdated", tokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterUsdPerTokenUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "UsdPerTokenUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseUsdPerTokenUpdated(log types.Log) (*FeeQuoterUsdPerTokenUpdated, error) { + event := new(FeeQuoterUsdPerTokenUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "UsdPerTokenUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeQuoterUsdPerUnitGasUpdatedIterator struct { + Event *FeeQuoterUsdPerUnitGasUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeQuoterUsdPerUnitGasUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeQuoterUsdPerUnitGasUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeQuoterUsdPerUnitGasUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeQuoterUsdPerUnitGasUpdatedIterator) Error() error { + return it.fail +} + +func (it *FeeQuoterUsdPerUnitGasUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeQuoterUsdPerUnitGasUpdated struct { + DestChain uint64 + Value *big.Int + Timestamp *big.Int + Raw types.Log +} + +func (_FeeQuoter *FeeQuoterFilterer) FilterUsdPerUnitGasUpdated(opts *bind.FilterOpts, destChain []uint64) (*FeeQuoterUsdPerUnitGasUpdatedIterator, error) { + + var destChainRule []interface{} + for _, destChainItem := range destChain { + destChainRule = append(destChainRule, destChainItem) + } + + logs, sub, err := _FeeQuoter.contract.FilterLogs(opts, "UsdPerUnitGasUpdated", destChainRule) + if err != nil { + return nil, err + } + return &FeeQuoterUsdPerUnitGasUpdatedIterator{contract: _FeeQuoter.contract, event: "UsdPerUnitGasUpdated", logs: logs, sub: sub}, nil +} + +func (_FeeQuoter *FeeQuoterFilterer) WatchUsdPerUnitGasUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterUsdPerUnitGasUpdated, destChain []uint64) (event.Subscription, error) { + + var destChainRule []interface{} + for _, destChainItem := range destChain { + destChainRule = append(destChainRule, destChainItem) + } + + logs, sub, err := _FeeQuoter.contract.WatchLogs(opts, "UsdPerUnitGasUpdated", destChainRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeQuoterUsdPerUnitGasUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "UsdPerUnitGasUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeQuoter *FeeQuoterFilterer) ParseUsdPerUnitGasUpdated(log types.Log) (*FeeQuoterUsdPerUnitGasUpdated, error) { + event := new(FeeQuoterUsdPerUnitGasUpdated) + if err := _FeeQuoter.contract.UnpackLog(event, "UsdPerUnitGasUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetTokenAndGasPrices struct { + TokenPrice *big.Int + GasPriceValue *big.Int +} +type ProcessMessageArgs struct { + MsgFeeJuels *big.Int + IsOutOfOrderExecution bool + ConvertedExtraArgs []byte + TokenReceiver []byte +} + +func (_FeeQuoter *FeeQuoter) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _FeeQuoter.abi.Events["AuthorizedCallerAdded"].ID: + return _FeeQuoter.ParseAuthorizedCallerAdded(log) + case _FeeQuoter.abi.Events["AuthorizedCallerRemoved"].ID: + return _FeeQuoter.ParseAuthorizedCallerRemoved(log) + case _FeeQuoter.abi.Events["DestChainAdded"].ID: + return _FeeQuoter.ParseDestChainAdded(log) + case _FeeQuoter.abi.Events["DestChainConfigUpdated"].ID: + return _FeeQuoter.ParseDestChainConfigUpdated(log) + case _FeeQuoter.abi.Events["FeeTokenAdded"].ID: + return _FeeQuoter.ParseFeeTokenAdded(log) + case _FeeQuoter.abi.Events["FeeTokenRemoved"].ID: + return _FeeQuoter.ParseFeeTokenRemoved(log) + case _FeeQuoter.abi.Events["OwnershipTransferRequested"].ID: + return _FeeQuoter.ParseOwnershipTransferRequested(log) + case _FeeQuoter.abi.Events["OwnershipTransferred"].ID: + return _FeeQuoter.ParseOwnershipTransferred(log) + case _FeeQuoter.abi.Events["PremiumMultiplierWeiPerEthUpdated"].ID: + return _FeeQuoter.ParsePremiumMultiplierWeiPerEthUpdated(log) + case _FeeQuoter.abi.Events["PriceFeedPerTokenUpdated"].ID: + return _FeeQuoter.ParsePriceFeedPerTokenUpdated(log) + case _FeeQuoter.abi.Events["ReportPermissionSet"].ID: + return _FeeQuoter.ParseReportPermissionSet(log) + case _FeeQuoter.abi.Events["TokenTransferFeeConfigDeleted"].ID: + return _FeeQuoter.ParseTokenTransferFeeConfigDeleted(log) + case _FeeQuoter.abi.Events["TokenTransferFeeConfigUpdated"].ID: + return _FeeQuoter.ParseTokenTransferFeeConfigUpdated(log) + case _FeeQuoter.abi.Events["UsdPerTokenUpdated"].ID: + return _FeeQuoter.ParseUsdPerTokenUpdated(log) + case _FeeQuoter.abi.Events["UsdPerUnitGasUpdated"].ID: + return _FeeQuoter.ParseUsdPerUnitGasUpdated(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (FeeQuoterAuthorizedCallerAdded) Topic() common.Hash { + return common.HexToHash("0xeb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef") +} + +func (FeeQuoterAuthorizedCallerRemoved) Topic() common.Hash { + return common.HexToHash("0xc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda77580") +} + +func (FeeQuoterDestChainAdded) Topic() common.Hash { + return common.HexToHash("0x71e9302ab4e912a9678ae7f5a8542856706806f2817e1bf2a20b171e265cb4ad") +} + +func (FeeQuoterDestChainConfigUpdated) Topic() common.Hash { + return common.HexToHash("0x2431cc0363f2f66b21782c7e3d54dd9085927981a21bd0cc6be45a51b19689e3") +} + +func (FeeQuoterFeeTokenAdded) Topic() common.Hash { + return common.HexToHash("0xdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba23") +} + +func (FeeQuoterFeeTokenRemoved) Topic() common.Hash { + return common.HexToHash("0x1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f91") +} + +func (FeeQuoterOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (FeeQuoterOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (FeeQuoterPremiumMultiplierWeiPerEthUpdated) Topic() common.Hash { + return common.HexToHash("0xbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d") +} + +func (FeeQuoterPriceFeedPerTokenUpdated) Topic() common.Hash { + return common.HexToHash("0xe6a7a17d710bf0b2cd05e5397dc6f97a5da4ee79e31e234bf5f965ee2bd9a5bf") +} + +func (FeeQuoterReportPermissionSet) Topic() common.Hash { + return common.HexToHash("0x32a4ba3fa3351b11ad555d4c8ec70a744e8705607077a946807030d64b6ab1a3") +} + +func (FeeQuoterTokenTransferFeeConfigDeleted) Topic() common.Hash { + return common.HexToHash("0x4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b") +} + +func (FeeQuoterTokenTransferFeeConfigUpdated) Topic() common.Hash { + return common.HexToHash("0x94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b5") +} + +func (FeeQuoterUsdPerTokenUpdated) Topic() common.Hash { + return common.HexToHash("0x52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a") +} + +func (FeeQuoterUsdPerUnitGasUpdated) Topic() common.Hash { + return common.HexToHash("0xdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e") +} + +func (_FeeQuoter *FeeQuoter) Address() common.Address { + return _FeeQuoter.address +} + +type FeeQuoterInterface interface { + FEEBASEDECIMALS(opts *bind.CallOpts) (*big.Int, error) + + KEYSTONEPRICEDECIMALS(opts *bind.CallOpts) (*big.Int, error) + + ConvertTokenAmount(opts *bind.CallOpts, fromToken common.Address, fromTokenAmount *big.Int, toToken common.Address) (*big.Int, error) + + GetAllAuthorizedCallers(opts *bind.CallOpts) ([]common.Address, error) + + GetDestChainConfig(opts *bind.CallOpts, destChainSelector uint64) (FeeQuoterDestChainConfig, error) + + GetDestinationChainGasPrice(opts *bind.CallOpts, destChainSelector uint64) (InternalTimestampedPackedUint224, error) + + GetFeeTokens(opts *bind.CallOpts) ([]common.Address, error) + + GetPremiumMultiplierWeiPerEth(opts *bind.CallOpts, token common.Address) (uint64, error) + + GetStaticConfig(opts *bind.CallOpts) (FeeQuoterStaticConfig, error) + + GetTokenAndGasPrices(opts *bind.CallOpts, token common.Address, destChainSelector uint64) (GetTokenAndGasPrices, + + error) + + GetTokenPrice(opts *bind.CallOpts, token common.Address) (InternalTimestampedPackedUint224, error) + + GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (FeeQuoterTokenPriceFeedConfig, error) + + GetTokenPrices(opts *bind.CallOpts, tokens []common.Address) ([]InternalTimestampedPackedUint224, error) + + GetTokenTransferFeeConfig(opts *bind.CallOpts, destChainSelector uint64, token common.Address) (FeeQuoterTokenTransferFeeConfig, error) + + GetValidatedFee(opts *bind.CallOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) + + GetValidatedTokenPrice(opts *bind.CallOpts, token common.Address) (*big.Int, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, messageReceiver []byte) (ProcessMessageArgs, + + error) + + ProcessPoolReturnData(opts *bind.CallOpts, destChainSelector uint64, onRampTokenTransfers []InternalEVM2AnyTokenTransfer, sourceTokenAmounts []ClientEVMTokenAmount) ([][]byte, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) + + ApplyDestChainConfigUpdates(opts *bind.TransactOpts, destChainConfigArgs []FeeQuoterDestChainConfigArgs) (*types.Transaction, error) + + ApplyFeeTokensUpdates(opts *bind.TransactOpts, feeTokensToRemove []common.Address, feeTokensToAdd []common.Address) (*types.Transaction, error) + + ApplyPremiumMultiplierWeiPerEthUpdates(opts *bind.TransactOpts, premiumMultiplierWeiPerEthArgs []FeeQuoterPremiumMultiplierWeiPerEthArgs) (*types.Transaction, error) + + ApplyTokenTransferFeeConfigUpdates(opts *bind.TransactOpts, tokenTransferFeeConfigArgs []FeeQuoterTokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs []FeeQuoterTokenTransferFeeConfigRemoveArgs) (*types.Transaction, error) + + OnReport(opts *bind.TransactOpts, metadata []byte, report []byte) (*types.Transaction, error) + + SetReportPermissions(opts *bind.TransactOpts, permissions []KeystoneFeedsPermissionHandlerPermission) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdatePrices(opts *bind.TransactOpts, priceUpdates InternalPriceUpdates) (*types.Transaction, error) + + UpdateTokenPriceFeeds(opts *bind.TransactOpts, tokenPriceFeedUpdates []FeeQuoterTokenPriceFeedUpdate) (*types.Transaction, error) + + FilterAuthorizedCallerAdded(opts *bind.FilterOpts) (*FeeQuoterAuthorizedCallerAddedIterator, error) + + WatchAuthorizedCallerAdded(opts *bind.WatchOpts, sink chan<- *FeeQuoterAuthorizedCallerAdded) (event.Subscription, error) + + ParseAuthorizedCallerAdded(log types.Log) (*FeeQuoterAuthorizedCallerAdded, error) + + FilterAuthorizedCallerRemoved(opts *bind.FilterOpts) (*FeeQuoterAuthorizedCallerRemovedIterator, error) + + WatchAuthorizedCallerRemoved(opts *bind.WatchOpts, sink chan<- *FeeQuoterAuthorizedCallerRemoved) (event.Subscription, error) + + ParseAuthorizedCallerRemoved(log types.Log) (*FeeQuoterAuthorizedCallerRemoved, error) + + FilterDestChainAdded(opts *bind.FilterOpts, destChainSelector []uint64) (*FeeQuoterDestChainAddedIterator, error) + + WatchDestChainAdded(opts *bind.WatchOpts, sink chan<- *FeeQuoterDestChainAdded, destChainSelector []uint64) (event.Subscription, error) + + ParseDestChainAdded(log types.Log) (*FeeQuoterDestChainAdded, error) + + FilterDestChainConfigUpdated(opts *bind.FilterOpts, destChainSelector []uint64) (*FeeQuoterDestChainConfigUpdatedIterator, error) + + WatchDestChainConfigUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterDestChainConfigUpdated, destChainSelector []uint64) (event.Subscription, error) + + ParseDestChainConfigUpdated(log types.Log) (*FeeQuoterDestChainConfigUpdated, error) + + FilterFeeTokenAdded(opts *bind.FilterOpts, feeToken []common.Address) (*FeeQuoterFeeTokenAddedIterator, error) + + WatchFeeTokenAdded(opts *bind.WatchOpts, sink chan<- *FeeQuoterFeeTokenAdded, feeToken []common.Address) (event.Subscription, error) + + ParseFeeTokenAdded(log types.Log) (*FeeQuoterFeeTokenAdded, error) + + FilterFeeTokenRemoved(opts *bind.FilterOpts, feeToken []common.Address) (*FeeQuoterFeeTokenRemovedIterator, error) + + WatchFeeTokenRemoved(opts *bind.WatchOpts, sink chan<- *FeeQuoterFeeTokenRemoved, feeToken []common.Address) (event.Subscription, error) + + ParseFeeTokenRemoved(log types.Log) (*FeeQuoterFeeTokenRemoved, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*FeeQuoterOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *FeeQuoterOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*FeeQuoterOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*FeeQuoterOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *FeeQuoterOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*FeeQuoterOwnershipTransferred, error) + + FilterPremiumMultiplierWeiPerEthUpdated(opts *bind.FilterOpts, token []common.Address) (*FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator, error) + + WatchPremiumMultiplierWeiPerEthUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterPremiumMultiplierWeiPerEthUpdated, token []common.Address) (event.Subscription, error) + + ParsePremiumMultiplierWeiPerEthUpdated(log types.Log) (*FeeQuoterPremiumMultiplierWeiPerEthUpdated, error) + + FilterPriceFeedPerTokenUpdated(opts *bind.FilterOpts, token []common.Address) (*FeeQuoterPriceFeedPerTokenUpdatedIterator, error) + + WatchPriceFeedPerTokenUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterPriceFeedPerTokenUpdated, token []common.Address) (event.Subscription, error) + + ParsePriceFeedPerTokenUpdated(log types.Log) (*FeeQuoterPriceFeedPerTokenUpdated, error) + + FilterReportPermissionSet(opts *bind.FilterOpts, reportId [][32]byte) (*FeeQuoterReportPermissionSetIterator, error) + + WatchReportPermissionSet(opts *bind.WatchOpts, sink chan<- *FeeQuoterReportPermissionSet, reportId [][32]byte) (event.Subscription, error) + + ParseReportPermissionSet(log types.Log) (*FeeQuoterReportPermissionSet, error) + + FilterTokenTransferFeeConfigDeleted(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address) (*FeeQuoterTokenTransferFeeConfigDeletedIterator, error) + + WatchTokenTransferFeeConfigDeleted(opts *bind.WatchOpts, sink chan<- *FeeQuoterTokenTransferFeeConfigDeleted, destChainSelector []uint64, token []common.Address) (event.Subscription, error) + + ParseTokenTransferFeeConfigDeleted(log types.Log) (*FeeQuoterTokenTransferFeeConfigDeleted, error) + + FilterTokenTransferFeeConfigUpdated(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address) (*FeeQuoterTokenTransferFeeConfigUpdatedIterator, error) + + WatchTokenTransferFeeConfigUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterTokenTransferFeeConfigUpdated, destChainSelector []uint64, token []common.Address) (event.Subscription, error) + + ParseTokenTransferFeeConfigUpdated(log types.Log) (*FeeQuoterTokenTransferFeeConfigUpdated, error) + + FilterUsdPerTokenUpdated(opts *bind.FilterOpts, token []common.Address) (*FeeQuoterUsdPerTokenUpdatedIterator, error) + + WatchUsdPerTokenUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterUsdPerTokenUpdated, token []common.Address) (event.Subscription, error) + + ParseUsdPerTokenUpdated(log types.Log) (*FeeQuoterUsdPerTokenUpdated, error) + + FilterUsdPerUnitGasUpdated(opts *bind.FilterOpts, destChain []uint64) (*FeeQuoterUsdPerUnitGasUpdatedIterator, error) + + WatchUsdPerUnitGasUpdated(opts *bind.WatchOpts, sink chan<- *FeeQuoterUsdPerUnitGasUpdated, destChain []uint64) (event.Subscription, error) + + ParseUsdPerUnitGasUpdated(log types.Log) (*FeeQuoterUsdPerUnitGasUpdated, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/message_hasher/message_hasher.go b/core/gethwrappers/ccip/generated/v1_6_0/message_hasher/message_hasher.go new file mode 100644 index 00000000000..ee87a43f782 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/message_hasher/message_hasher.go @@ -0,0 +1,516 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package message_hasher + +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" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type ClientEVMExtraArgsV1 struct { + GasLimit *big.Int +} + +type ClientEVMExtraArgsV2 struct { + GasLimit *big.Int + AllowOutOfOrderExecution bool +} + +type ClientSVMExtraArgsV1 struct { + ComputeUnits uint32 + AccountIsWritableBitmap uint64 + AllowOutOfOrderExecution bool + TokenReceiver [32]byte + Accounts [][32]byte +} + +type InternalAny2EVMRampMessage struct { + Header InternalRampMessageHeader + Sender []byte + Data []byte + Receiver common.Address + GasLimit *big.Int + TokenAmounts []InternalAny2EVMTokenTransfer +} + +type InternalAny2EVMTokenTransfer struct { + SourcePoolAddress []byte + DestTokenAddress common.Address + DestGasAmount uint32 + ExtraData []byte + Amount *big.Int +} + +type InternalEVM2AnyTokenTransfer struct { + SourcePoolAddress common.Address + DestTokenAddress []byte + ExtraData []byte + Amount *big.Int + DestExecData []byte +} + +type InternalRampMessageHeader struct { + MessageId [32]byte + SourceChainSelector uint64 + DestChainSelector uint64 + SequenceNumber uint64 + Nonce uint64 +} + +var MessageHasherMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"decodeEVMExtraArgsV1\",\"inputs\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.EVMExtraArgsV1\",\"components\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"decodeEVMExtraArgsV2\",\"inputs\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.EVMExtraArgsV2\",\"components\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"decodeSVMExtraArgsV1\",\"inputs\":[{\"name\":\"computeUnits\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"accountIsWritableBitmap\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"tokenReceiver\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"accounts\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.SVMExtraArgsV1\",\"components\":[{\"name\":\"computeUnits\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"accountIsWritableBitmap\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"tokenReceiver\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"accounts\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeAny2EVMTokenAmountsHashPreimage\",\"inputs\":[{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeEVM2AnyTokenAmountsHashPreimage\",\"inputs\":[{\"name\":\"tokenAmount\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeEVMExtraArgsV1\",\"inputs\":[{\"name\":\"extraArgs\",\"type\":\"tuple\",\"internalType\":\"structClient.EVMExtraArgsV1\",\"components\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeEVMExtraArgsV2\",\"inputs\":[{\"name\":\"extraArgs\",\"type\":\"tuple\",\"internalType\":\"structClient.EVMExtraArgsV2\",\"components\":[{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeFinalHashPreimage\",\"inputs\":[{\"name\":\"leafDomainSeparator\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"metaDataHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"fixedSizeFieldsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"senderHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"dataHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenAmountsHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeFixedSizeFieldsHashPreimage\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeMetadataHashPreimage\",\"inputs\":[{\"name\":\"any2EVMMessageHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"encodeSVMExtraArgsV1\",\"inputs\":[{\"name\":\"extraArgs\",\"type\":\"tuple\",\"internalType\":\"structClient.SVMExtraArgsV1\",\"components\":[{\"name\":\"computeUnits\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"accountIsWritableBitmap\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowOutOfOrderExecution\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"tokenReceiver\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"accounts\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"hash\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"}]", + Bin: "0x60808060405234601557611196908161001b8239f35b600080fdfe608080604052600436101561001357600080fd5b60003560e01c9081631914fbd214610b96575080633ec7c37714610acf57806357ac4454146109ed5780638503839d146106ce57806394b6624b14610442578063ae5663d7146103db578063b17df71414610382578063bf0619ad1461030e578063c63641bd14610287578063c7ca9a18146101bd578063e04767b8146101425763e733d209146100a357600080fd5b3461013d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d576101396040516100e181610ccd565b6004358152604051907f97a657c900000000000000000000000000000000000000000000000000000000602083015251602482015260248152610125604482610d05565b604051918291602083526020830190610e1e565b0390f35b600080fd5b3461013d5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d5761013961017c610d6e565b67ffffffffffffffff61018d610d57565b8160405193600435602086015216604084015216606082015260643560808201526080815261012560a082610d05565b3461013d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d5761013961025b61012560405161020181610ce9565b600435815261020e610d9a565b60208201526040519283917f181dcf100000000000000000000000000000000000000000000000000000000060208401526024830191909160208060408301948051845201511515910152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d05565b3461013d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d576101396102c1610d9a565b600060206040516102d181610ce9565b8281520152604051906102e382610ce9565b6004358252151560208201526040519182918291909160208060408301948051845201511515910152565b3461013d5760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d57610139604051600435602082015260243560408201526044356060820152606435608082015260843560a082015260a43560c082015260c0815261012560e082610d05565b3461013d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d57602060043560006040516103c481610ccd565b52806040516103d281610ccd565b52604051908152f35b3461013d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d5760043567ffffffffffffffff811161013d5761025b610125610433610139933690600401610f8f565b604051928391602083016110b3565b3461013d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d5760043567ffffffffffffffff811161013d573660238201121561013d5780600401359061049d82610da9565b906104ab6040519283610d05565b82825260208201906024829460051b8201019036821161013d5760248101925b8284106105df57858560405190604082019060208084015251809152606082019060608160051b84010193916000905b82821061053757610139856101258189037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610d05565b909192946020806105d1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0896001960301865289519073ffffffffffffffffffffffffffffffffffffffff825116815260806105b66105a48685015160a08886015260a0850190610e1e565b60408501518482036040860152610e1e565b92606081015160608401520151906080818403910152610e1e565b9701920192019092916104fb565b833567ffffffffffffffff811161013d57820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc823603011261013d576040519161062b83610cb1565b61063760248301610e7d565b8352604482013567ffffffffffffffff811161013d5761065d9060243691850101610f1a565b6020840152606482013567ffffffffffffffff811161013d576106869060243691850101610f1a565b60408401526084820135606084015260a48201359267ffffffffffffffff841161013d576106be602094936024869536920101610f1a565b60808201528152019301926104cb565b3461013d5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d5760043567ffffffffffffffff811161013d577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc81360301610140811261013d576040519060c082019082821067ffffffffffffffff8311176109be5760a0916040521261013d5760405161077081610cb1565b8260040135815261078360248401610d85565b602082015261079460448401610d85565b60408201526107a560648401610d85565b60608201526107b660848401610d85565b6080820152815260a482013567ffffffffffffffff811161013d576107e19060043691850101610f1a565b6020820190815260c483013567ffffffffffffffff811161013d5761080c9060043691860101610f1a565b6040830190815261081f60e48501610e7d565b60608401908152608084019461010481013586526101248101359067ffffffffffffffff821161013d5760046108589236920101610f8f565b9060a085019182526024359567ffffffffffffffff871161013d576109526108866020983690600401610f1a565b87519067ffffffffffffffff6040818c8501511693015116908a8151910120604051918b8301937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f8552604084015260608301526080820152608081526108ee60a082610d05565b5190209651805193516060808301519451608093840151604080518e8101998a5273ffffffffffffffffffffffffffffffffffffffff9590951660208a015267ffffffffffffffff9788169089015291870152909316908401528160a0840161025b565b51902092518581519101209151858151910120905160405161097b8161025b89820194856110b3565b5190209160405193868501956000875260408601526060850152608084015260a083015260c082015260c081526109b360e082610d05565b519020604051908152f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b3461013d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d5760043563ffffffff811680910361013d57610a35610d6e565b906044359182151580930361013d576084359267ffffffffffffffff841161013d5767ffffffffffffffff610a71610139953690600401610dc1565b9260606080604051610a8281610cb1565b600081526000602082015260006040820152600083820152015260405194610aa986610cb1565b855216602084015260408301526064356060830152608082015260405191829182610e9e565b3461013d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d5760243573ffffffffffffffffffffffffffffffffffffffff8116810361013d57610b26610d57565b9060843567ffffffffffffffff8116810361013d5760408051600435602082015273ffffffffffffffffffffffffffffffffffffffff9093169083015267ffffffffffffffff928316606083015260643560808301529190911660a0820152610139906101258160c0810161025b565b3461013d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013d5760043567ffffffffffffffff811161013d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261013d57610c0c82610cb1565b610c1881600401610d46565b8252610c2660248201610d85565b60208301526044810135801515810361013d5760408301526064810135606083015260848101359067ffffffffffffffff821161013d5761013992610c7761012592600461025b9536920101610dc1565b60808201526040519283917f1f3b3aba00000000000000000000000000000000000000000000000000000000602084015260248301610e9e565b60a0810190811067ffffffffffffffff8211176109be57604052565b6020810190811067ffffffffffffffff8211176109be57604052565b6040810190811067ffffffffffffffff8211176109be57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176109be57604052565b359063ffffffff8216820361013d57565b6044359067ffffffffffffffff8216820361013d57565b6024359067ffffffffffffffff8216820361013d57565b359067ffffffffffffffff8216820361013d57565b60243590811515820361013d57565b67ffffffffffffffff81116109be5760051b60200190565b9080601f8301121561013d578135610dd881610da9565b92610de66040519485610d05565b81845260208085019260051b82010192831161013d57602001905b828210610e0e5750505090565b8135815260209182019101610e01565b919082519283825260005b848110610e685750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201610e29565b359073ffffffffffffffffffffffffffffffffffffffff8216820361013d57565b9060208252602060e0608060c085019363ffffffff8151168487015267ffffffffffffffff8482015116604087015260408101511515606087015260608101518287015201519360a08082015284518094520192019060005b818110610f045750505090565b8251845260209384019390920191600101610ef7565b81601f8201121561013d5780359067ffffffffffffffff82116109be5760405192610f6d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160185610d05565b8284526020838301011161013d57816000926020809301838601378301015290565b81601f8201121561013d57803590610fa682610da9565b92610fb46040519485610d05565b82845260208085019360051b8301019181831161013d5760208101935b838510610fe057505050505090565b843567ffffffffffffffff811161013d57820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828603011261013d576040519161102c83610cb1565b602082013567ffffffffffffffff811161013d5785602061104f92850101610f1a565b835261105d60408301610e7d565b602084015261106e60608301610d46565b604084015260808201359267ffffffffffffffff841161013d5760a08361109c886020809881980101610f1a565b606084015201356080820152815201940193610fd1565b602081016020825282518091526040820191602060408360051b8301019401926000915b8383106110e657505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08560019503018652885190608080611174611134855160a0865260a0860190610e1e565b73ffffffffffffffffffffffffffffffffffffffff87870151168786015263ffffffff604087015116604086015260608601518582036060870152610e1e565b930151910152970193019301919392906110d756fea164736f6c634300081a000a", +} + +var MessageHasherABI = MessageHasherMetaData.ABI + +var MessageHasherBin = MessageHasherMetaData.Bin + +func DeployMessageHasher(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *MessageHasher, error) { + parsed, err := MessageHasherMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MessageHasherBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MessageHasher{address: address, abi: *parsed, MessageHasherCaller: MessageHasherCaller{contract: contract}, MessageHasherTransactor: MessageHasherTransactor{contract: contract}, MessageHasherFilterer: MessageHasherFilterer{contract: contract}}, nil +} + +type MessageHasher struct { + address common.Address + abi abi.ABI + MessageHasherCaller + MessageHasherTransactor + MessageHasherFilterer +} + +type MessageHasherCaller struct { + contract *bind.BoundContract +} + +type MessageHasherTransactor struct { + contract *bind.BoundContract +} + +type MessageHasherFilterer struct { + contract *bind.BoundContract +} + +type MessageHasherSession struct { + Contract *MessageHasher + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type MessageHasherCallerSession struct { + Contract *MessageHasherCaller + CallOpts bind.CallOpts +} + +type MessageHasherTransactorSession struct { + Contract *MessageHasherTransactor + TransactOpts bind.TransactOpts +} + +type MessageHasherRaw struct { + Contract *MessageHasher +} + +type MessageHasherCallerRaw struct { + Contract *MessageHasherCaller +} + +type MessageHasherTransactorRaw struct { + Contract *MessageHasherTransactor +} + +func NewMessageHasher(address common.Address, backend bind.ContractBackend) (*MessageHasher, error) { + abi, err := abi.JSON(strings.NewReader(MessageHasherABI)) + if err != nil { + return nil, err + } + contract, err := bindMessageHasher(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MessageHasher{address: address, abi: abi, MessageHasherCaller: MessageHasherCaller{contract: contract}, MessageHasherTransactor: MessageHasherTransactor{contract: contract}, MessageHasherFilterer: MessageHasherFilterer{contract: contract}}, nil +} + +func NewMessageHasherCaller(address common.Address, caller bind.ContractCaller) (*MessageHasherCaller, error) { + contract, err := bindMessageHasher(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MessageHasherCaller{contract: contract}, nil +} + +func NewMessageHasherTransactor(address common.Address, transactor bind.ContractTransactor) (*MessageHasherTransactor, error) { + contract, err := bindMessageHasher(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MessageHasherTransactor{contract: contract}, nil +} + +func NewMessageHasherFilterer(address common.Address, filterer bind.ContractFilterer) (*MessageHasherFilterer, error) { + contract, err := bindMessageHasher(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MessageHasherFilterer{contract: contract}, nil +} + +func bindMessageHasher(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MessageHasherMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_MessageHasher *MessageHasherRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MessageHasher.Contract.MessageHasherCaller.contract.Call(opts, result, method, params...) +} + +func (_MessageHasher *MessageHasherRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MessageHasher.Contract.MessageHasherTransactor.contract.Transfer(opts) +} + +func (_MessageHasher *MessageHasherRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MessageHasher.Contract.MessageHasherTransactor.contract.Transact(opts, method, params...) +} + +func (_MessageHasher *MessageHasherCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MessageHasher.Contract.contract.Call(opts, result, method, params...) +} + +func (_MessageHasher *MessageHasherTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MessageHasher.Contract.contract.Transfer(opts) +} + +func (_MessageHasher *MessageHasherTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MessageHasher.Contract.contract.Transact(opts, method, params...) +} + +func (_MessageHasher *MessageHasherCaller) DecodeEVMExtraArgsV1(opts *bind.CallOpts, gasLimit *big.Int) (ClientEVMExtraArgsV1, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "decodeEVMExtraArgsV1", gasLimit) + + if err != nil { + return *new(ClientEVMExtraArgsV1), err + } + + out0 := *abi.ConvertType(out[0], new(ClientEVMExtraArgsV1)).(*ClientEVMExtraArgsV1) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) DecodeEVMExtraArgsV1(gasLimit *big.Int) (ClientEVMExtraArgsV1, error) { + return _MessageHasher.Contract.DecodeEVMExtraArgsV1(&_MessageHasher.CallOpts, gasLimit) +} + +func (_MessageHasher *MessageHasherCallerSession) DecodeEVMExtraArgsV1(gasLimit *big.Int) (ClientEVMExtraArgsV1, error) { + return _MessageHasher.Contract.DecodeEVMExtraArgsV1(&_MessageHasher.CallOpts, gasLimit) +} + +func (_MessageHasher *MessageHasherCaller) DecodeEVMExtraArgsV2(opts *bind.CallOpts, gasLimit *big.Int, allowOutOfOrderExecution bool) (ClientEVMExtraArgsV2, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "decodeEVMExtraArgsV2", gasLimit, allowOutOfOrderExecution) + + if err != nil { + return *new(ClientEVMExtraArgsV2), err + } + + out0 := *abi.ConvertType(out[0], new(ClientEVMExtraArgsV2)).(*ClientEVMExtraArgsV2) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) DecodeEVMExtraArgsV2(gasLimit *big.Int, allowOutOfOrderExecution bool) (ClientEVMExtraArgsV2, error) { + return _MessageHasher.Contract.DecodeEVMExtraArgsV2(&_MessageHasher.CallOpts, gasLimit, allowOutOfOrderExecution) +} + +func (_MessageHasher *MessageHasherCallerSession) DecodeEVMExtraArgsV2(gasLimit *big.Int, allowOutOfOrderExecution bool) (ClientEVMExtraArgsV2, error) { + return _MessageHasher.Contract.DecodeEVMExtraArgsV2(&_MessageHasher.CallOpts, gasLimit, allowOutOfOrderExecution) +} + +func (_MessageHasher *MessageHasherCaller) DecodeSVMExtraArgsV1(opts *bind.CallOpts, computeUnits uint32, accountIsWritableBitmap uint64, allowOutOfOrderExecution bool, tokenReceiver [32]byte, accounts [][32]byte) (ClientSVMExtraArgsV1, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "decodeSVMExtraArgsV1", computeUnits, accountIsWritableBitmap, allowOutOfOrderExecution, tokenReceiver, accounts) + + if err != nil { + return *new(ClientSVMExtraArgsV1), err + } + + out0 := *abi.ConvertType(out[0], new(ClientSVMExtraArgsV1)).(*ClientSVMExtraArgsV1) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) DecodeSVMExtraArgsV1(computeUnits uint32, accountIsWritableBitmap uint64, allowOutOfOrderExecution bool, tokenReceiver [32]byte, accounts [][32]byte) (ClientSVMExtraArgsV1, error) { + return _MessageHasher.Contract.DecodeSVMExtraArgsV1(&_MessageHasher.CallOpts, computeUnits, accountIsWritableBitmap, allowOutOfOrderExecution, tokenReceiver, accounts) +} + +func (_MessageHasher *MessageHasherCallerSession) DecodeSVMExtraArgsV1(computeUnits uint32, accountIsWritableBitmap uint64, allowOutOfOrderExecution bool, tokenReceiver [32]byte, accounts [][32]byte) (ClientSVMExtraArgsV1, error) { + return _MessageHasher.Contract.DecodeSVMExtraArgsV1(&_MessageHasher.CallOpts, computeUnits, accountIsWritableBitmap, allowOutOfOrderExecution, tokenReceiver, accounts) +} + +func (_MessageHasher *MessageHasherCaller) EncodeAny2EVMTokenAmountsHashPreimage(opts *bind.CallOpts, tokenAmounts []InternalAny2EVMTokenTransfer) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeAny2EVMTokenAmountsHashPreimage", tokenAmounts) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeAny2EVMTokenAmountsHashPreimage(tokenAmounts []InternalAny2EVMTokenTransfer) ([]byte, error) { + return _MessageHasher.Contract.EncodeAny2EVMTokenAmountsHashPreimage(&_MessageHasher.CallOpts, tokenAmounts) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeAny2EVMTokenAmountsHashPreimage(tokenAmounts []InternalAny2EVMTokenTransfer) ([]byte, error) { + return _MessageHasher.Contract.EncodeAny2EVMTokenAmountsHashPreimage(&_MessageHasher.CallOpts, tokenAmounts) +} + +func (_MessageHasher *MessageHasherCaller) EncodeEVM2AnyTokenAmountsHashPreimage(opts *bind.CallOpts, tokenAmount []InternalEVM2AnyTokenTransfer) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeEVM2AnyTokenAmountsHashPreimage", tokenAmount) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeEVM2AnyTokenAmountsHashPreimage(tokenAmount []InternalEVM2AnyTokenTransfer) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVM2AnyTokenAmountsHashPreimage(&_MessageHasher.CallOpts, tokenAmount) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeEVM2AnyTokenAmountsHashPreimage(tokenAmount []InternalEVM2AnyTokenTransfer) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVM2AnyTokenAmountsHashPreimage(&_MessageHasher.CallOpts, tokenAmount) +} + +func (_MessageHasher *MessageHasherCaller) EncodeEVMExtraArgsV1(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV1) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeEVMExtraArgsV1", extraArgs) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeEVMExtraArgsV1(extraArgs ClientEVMExtraArgsV1) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVMExtraArgsV1(&_MessageHasher.CallOpts, extraArgs) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeEVMExtraArgsV1(extraArgs ClientEVMExtraArgsV1) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVMExtraArgsV1(&_MessageHasher.CallOpts, extraArgs) +} + +func (_MessageHasher *MessageHasherCaller) EncodeEVMExtraArgsV2(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV2) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeEVMExtraArgsV2", extraArgs) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeEVMExtraArgsV2(extraArgs ClientEVMExtraArgsV2) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVMExtraArgsV2(&_MessageHasher.CallOpts, extraArgs) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeEVMExtraArgsV2(extraArgs ClientEVMExtraArgsV2) ([]byte, error) { + return _MessageHasher.Contract.EncodeEVMExtraArgsV2(&_MessageHasher.CallOpts, extraArgs) +} + +func (_MessageHasher *MessageHasherCaller) EncodeFinalHashPreimage(opts *bind.CallOpts, leafDomainSeparator [32]byte, metaDataHash [32]byte, fixedSizeFieldsHash [32]byte, senderHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeFinalHashPreimage", leafDomainSeparator, metaDataHash, fixedSizeFieldsHash, senderHash, dataHash, tokenAmountsHash) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeFinalHashPreimage(leafDomainSeparator [32]byte, metaDataHash [32]byte, fixedSizeFieldsHash [32]byte, senderHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { + return _MessageHasher.Contract.EncodeFinalHashPreimage(&_MessageHasher.CallOpts, leafDomainSeparator, metaDataHash, fixedSizeFieldsHash, senderHash, dataHash, tokenAmountsHash) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeFinalHashPreimage(leafDomainSeparator [32]byte, metaDataHash [32]byte, fixedSizeFieldsHash [32]byte, senderHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) { + return _MessageHasher.Contract.EncodeFinalHashPreimage(&_MessageHasher.CallOpts, leafDomainSeparator, metaDataHash, fixedSizeFieldsHash, senderHash, dataHash, tokenAmountsHash) +} + +func (_MessageHasher *MessageHasherCaller) EncodeFixedSizeFieldsHashPreimage(opts *bind.CallOpts, messageId [32]byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeFixedSizeFieldsHashPreimage", messageId, receiver, sequenceNumber, gasLimit, nonce) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeFixedSizeFieldsHashPreimage(messageId [32]byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { + return _MessageHasher.Contract.EncodeFixedSizeFieldsHashPreimage(&_MessageHasher.CallOpts, messageId, receiver, sequenceNumber, gasLimit, nonce) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeFixedSizeFieldsHashPreimage(messageId [32]byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) { + return _MessageHasher.Contract.EncodeFixedSizeFieldsHashPreimage(&_MessageHasher.CallOpts, messageId, receiver, sequenceNumber, gasLimit, nonce) +} + +func (_MessageHasher *MessageHasherCaller) EncodeMetadataHashPreimage(opts *bind.CallOpts, any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRampHash [32]byte) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeMetadataHashPreimage", any2EVMMessageHash, sourceChainSelector, destChainSelector, onRampHash) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeMetadataHashPreimage(any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRampHash [32]byte) ([]byte, error) { + return _MessageHasher.Contract.EncodeMetadataHashPreimage(&_MessageHasher.CallOpts, any2EVMMessageHash, sourceChainSelector, destChainSelector, onRampHash) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeMetadataHashPreimage(any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRampHash [32]byte) ([]byte, error) { + return _MessageHasher.Contract.EncodeMetadataHashPreimage(&_MessageHasher.CallOpts, any2EVMMessageHash, sourceChainSelector, destChainSelector, onRampHash) +} + +func (_MessageHasher *MessageHasherCaller) EncodeSVMExtraArgsV1(opts *bind.CallOpts, extraArgs ClientSVMExtraArgsV1) ([]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "encodeSVMExtraArgsV1", extraArgs) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) EncodeSVMExtraArgsV1(extraArgs ClientSVMExtraArgsV1) ([]byte, error) { + return _MessageHasher.Contract.EncodeSVMExtraArgsV1(&_MessageHasher.CallOpts, extraArgs) +} + +func (_MessageHasher *MessageHasherCallerSession) EncodeSVMExtraArgsV1(extraArgs ClientSVMExtraArgsV1) ([]byte, error) { + return _MessageHasher.Contract.EncodeSVMExtraArgsV1(&_MessageHasher.CallOpts, extraArgs) +} + +func (_MessageHasher *MessageHasherCaller) Hash(opts *bind.CallOpts, message InternalAny2EVMRampMessage, onRamp []byte) ([32]byte, error) { + var out []interface{} + err := _MessageHasher.contract.Call(opts, &out, "hash", message, onRamp) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_MessageHasher *MessageHasherSession) Hash(message InternalAny2EVMRampMessage, onRamp []byte) ([32]byte, error) { + return _MessageHasher.Contract.Hash(&_MessageHasher.CallOpts, message, onRamp) +} + +func (_MessageHasher *MessageHasherCallerSession) Hash(message InternalAny2EVMRampMessage, onRamp []byte) ([32]byte, error) { + return _MessageHasher.Contract.Hash(&_MessageHasher.CallOpts, message, onRamp) +} + +func (_MessageHasher *MessageHasher) Address() common.Address { + return _MessageHasher.address +} + +type MessageHasherInterface interface { + DecodeEVMExtraArgsV1(opts *bind.CallOpts, gasLimit *big.Int) (ClientEVMExtraArgsV1, error) + + DecodeEVMExtraArgsV2(opts *bind.CallOpts, gasLimit *big.Int, allowOutOfOrderExecution bool) (ClientEVMExtraArgsV2, error) + + DecodeSVMExtraArgsV1(opts *bind.CallOpts, computeUnits uint32, accountIsWritableBitmap uint64, allowOutOfOrderExecution bool, tokenReceiver [32]byte, accounts [][32]byte) (ClientSVMExtraArgsV1, error) + + EncodeAny2EVMTokenAmountsHashPreimage(opts *bind.CallOpts, tokenAmounts []InternalAny2EVMTokenTransfer) ([]byte, error) + + EncodeEVM2AnyTokenAmountsHashPreimage(opts *bind.CallOpts, tokenAmount []InternalEVM2AnyTokenTransfer) ([]byte, error) + + EncodeEVMExtraArgsV1(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV1) ([]byte, error) + + EncodeEVMExtraArgsV2(opts *bind.CallOpts, extraArgs ClientEVMExtraArgsV2) ([]byte, error) + + EncodeFinalHashPreimage(opts *bind.CallOpts, leafDomainSeparator [32]byte, metaDataHash [32]byte, fixedSizeFieldsHash [32]byte, senderHash [32]byte, dataHash [32]byte, tokenAmountsHash [32]byte) ([]byte, error) + + EncodeFixedSizeFieldsHashPreimage(opts *bind.CallOpts, messageId [32]byte, receiver common.Address, sequenceNumber uint64, gasLimit *big.Int, nonce uint64) ([]byte, error) + + EncodeMetadataHashPreimage(opts *bind.CallOpts, any2EVMMessageHash [32]byte, sourceChainSelector uint64, destChainSelector uint64, onRampHash [32]byte) ([]byte, error) + + EncodeSVMExtraArgsV1(opts *bind.CallOpts, extraArgs ClientSVMExtraArgsV1) ([]byte, error) + + Hash(opts *bind.CallOpts, message InternalAny2EVMRampMessage, onRamp []byte) ([32]byte, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go b/core/gethwrappers/ccip/generated/v1_6_0/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go new file mode 100644 index 00000000000..5e09a995863 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go @@ -0,0 +1,1860 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package multi_aggregate_rate_limiter + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type AuthorizedCallersAuthorizedCallerArgs struct { + AddedCallers []common.Address + RemovedCallers []common.Address +} + +type ClientAny2EVMMessage struct { + MessageId [32]byte + SourceChainSelector uint64 + Sender []byte + Data []byte + DestTokenAmounts []ClientEVMTokenAmount +} + +type ClientEVM2AnyMessage struct { + Receiver []byte + Data []byte + TokenAmounts []ClientEVMTokenAmount + FeeToken common.Address + ExtraArgs []byte +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type MultiAggregateRateLimiterLocalRateLimitToken struct { + RemoteChainSelector uint64 + LocalToken common.Address +} + +type MultiAggregateRateLimiterRateLimitTokenArgs struct { + LocalTokenArgs MultiAggregateRateLimiterLocalRateLimitToken + RemoteToken []byte +} + +type MultiAggregateRateLimiterRateLimiterConfigArgs struct { + RemoteChainSelector uint64 + IsOutboundLane bool + RateLimiterConfig RateLimiterConfig +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +var MultiAggregateRateLimiterMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"authorizedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyRateLimiterConfigUpdates\",\"inputs\":[{\"name\":\"rateLimiterUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.RateLimiterConfigArgs[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"currentRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllRateLimitTokens\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"localTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"remoteTokens\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFeeQuoter\",\"inputs\":[],\"outputs\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"onInboundMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onOutboundMessage\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setFeeQuoter\",\"inputs\":[{\"name\":\"newFeeQuoter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateRateLimitTokens\",\"inputs\":[{\"name\":\"removes\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"adds\",\"type\":\"tuple[]\",\"internalType\":\"structMultiAggregateRateLimiter.RateLimitTokenArgs[]\",\"components\":[{\"name\":\"localTokenArgs\",\"type\":\"tuple\",\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeQuoterSet\",\"inputs\":[{\"name\":\"newFeeQuoter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"RateLimiterConfigUpdated\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"isOutboundLane\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenAggregateRateLimitAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenAggregateRateLimitRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"localToken\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PriceNotFoundForToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", + Bin: "0x60806040523461026457612f2d8038038061001981610269565b928339810190604081830312610264576100328161028e565b602082015190916001600160401b03821161026457019180601f84011215610264578251926001600160401b038411610225578360051b90602080610078818501610269565b80978152019282010192831161026457602001905b82821061024c57505050331561023b57600180546001600160a01b0319163317905560206100ba81610269565b60008152600036813760408051949085016001600160401b03811186821017610225576040528452808285015260005b8151811015610151576001906001600160a01b0361010882856102a2565b511684610114826102e4565b610121575b5050016100ea565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a13884610119565b5050915160005b81518110156101c9576001600160a01b0361017382846102a2565b51169081156101b8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef85836101aa6001956103e2565b50604051908152a101610158565b6342bcdf7f60e11b60005260046000fd5b50506001600160a01b03169081156101b857600580546001600160a01b031916831790556040519182527f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac91a1604051612aea90816104438239f35b634e487b7160e01b600052604160045260246000fd5b639b15e16f60e01b60005260046000fd5b602080916102598461028e565b81520191019061008d565b600080fd5b6040519190601f01601f191682016001600160401b0381118382101761022557604052565b51906001600160a01b038216820361026457565b80518210156102b65760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156102b65760005260206000200190600090565b60008181526003602052604090205480156103db5760001981018181116103c5576002546000198101919082116103c557808203610374575b505050600254801561035e57600019016103388160026102cc565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b6103ad6103856103969360026102cc565b90549060031b1c92839260026102cc565b819391549060031b91821b91600019901b19161790565b9055600052600360205260406000205538808061031d565b634e487b7160e01b600052601160045260246000fd5b5050600090565b8060005260036020526040600020541560001461043c57600254680100000000000000008110156102255761042361039682600185940160025560026102cc565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816308d450a114611c7c575080630a35bcc414611b4b578063181f5a7714611ace5780631af18b7b1461156c5780632451a627146114bf578063537e304e146111f557806379ba50971461110c5780638da5cb5b146110ba57806391a2749a14610efc578063e0a0e50614610bbb578063e145291614610b69578063e835232b14610a8d578063f2fde38b1461099d5763fe843cd0146100b957600080fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985736602382011215610998578060040135610113816120b3565b916101216040519384611fd1565b818352602460a06020850193028201019036821161099857602401915b8183106108ea578361014e612416565b6000905b80518210156108e857610165828261231e565b519160408301519267ffffffffffffffff8151169081156108be5760200151151561019081836123e1565b805463ffffffff8160801c16801560001461066757505085516000915015610592576fffffffffffffffffffffffffffffffff6040870151166fffffffffffffffffffffffffffffffff602088015116811090811591610589575b50610526577ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b979161042960019697608093505b6fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff602083015116825115159160405161025d81611f7d565b828152602081019363ffffffff4216855260408201908152606082019384528882019283528a886000146104315760036103ef966103816fffffffffffffffffffffffffffffffff969587958695600052600660205261033a63ffffffff604060002095888060028901965116167fffffffffffffffffffffffffffffffff00000000000000000000000000000000865416178555511683907fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff73ffffffff0000000000000000000000000000000083549260801b169116179055565b5181547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016179055565b01945116167fffffffffffffffffffffffffffffffff0000000000000000000000000000000084541617835551166fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b60405192835260208301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba20190610152565b8d6fffffffffffffffffffffffffffffffff949361038186946104da63ffffffff6105219b8897600052600660205287806040600020975116167fffffffffffffffffffffffffffffffff00000000000000000000000000000000875416178655511684907fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff73ffffffff0000000000000000000000000000000083549260801b169116179055565b5182547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178255565b6103ef565b606486610587604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b905015876101eb565b506fffffffffffffffffffffffffffffffff60408601511615801590610648575b6105e75760807ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b97916104296001969761021e565b606485610587604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff60208601511615156105b3565b6001969761079c6080947ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b9796946106a16104299542612409565b9081610804575b50506fffffffffffffffffffffffffffffffff8a8160208601511692828154168085106000146107fc57508280855b16167fffffffffffffffffffffffffffffffff000000000000000000000000000000008254161781556107508651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1960606040516107f681856fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba16103ef565b8380916106d7565b6fffffffffffffffffffffffffffffffff916108388392838f6108319088015494828616958e1c906126c9565b91166123a5565b808210156108b757505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff00000000000000000000000000000000161781558b806106a8565b9050610842565b7fc65608950000000000000000000000000000000000000000000000000000000060005260046000fd5b005b82360360a081126109985760607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06040519261092584611fb5565b61092e87612029565b845261093c60208801612185565b602085015201126109985760a09160209160405161095981611fb5565b61096560408801612185565b8152610973606088016122d6565b84820152610983608088016122d6565b6040820152604082015281520192019161013e565b600080fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985773ffffffffffffffffffffffffffffffffffffffff6109e96120cb565b6109f1612416565b16338114610a6357807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985773ffffffffffffffffffffffffffffffffffffffff610ad96120cb565b610ae1612416565b168015610b3f576020817f7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac927fffffffffffffffffffffffff00000000000000000000000000000000000000006005541617600555604051908152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857602073ffffffffffffffffffffffffffffffffffffffff60055416604051908152f35b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857610bf2612012565b60243567ffffffffffffffff8111610998578036039060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc83011261099857610c3a612361565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd60448201359201821215610998570160048101359067ffffffffffffffff8211610998576024018160061b3603811361099857610c9991369161210f565b90610ca56001826123e1565b9160ff835460a01c16610cb457005b6000929167ffffffffffffffff16835b8251811015610ee857816000526004602052610d16604060002073ffffffffffffffffffffffffffffffffffffffff610cfd848761231e565b5151169060019160005201602052604060002054151590565b610d23575b600101610cc4565b93610d2e858461231e565b5173ffffffffffffffffffffffffffffffffffffffff60055416604073ffffffffffffffffffffffffffffffffffffffff83511660248251809481937fd02641a000000000000000000000000000000000000000000000000000000000835260048301525afa8015610edc57600090610e3c575b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505116908115610df75791670de0b6b3a7640000610de8610def9360206001960151906126c9565b04906123a5565b949050610d1b565b73ffffffffffffffffffffffffffffffffffffffff9051167f9a655f7b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040823d8211610ed4575b81610e5460409383611fd1565b81010312610ecd5760405191610e6983611f99565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610ed0578352602001519063ffffffff82168203610ecd575060208201527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90610da2565b80fd5b8280fd5b3d9150610e47565b6040513d6000823e3d90fd5b5050509080610ef357005b6108e891612461565b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126109985760405190610f7682611f99565b806004013567ffffffffffffffff811161099857610f9a9060043691840101612271565b825260248101359067ffffffffffffffff8211610998576004610fc09236920101612271565b60208201908152610fcf612416565b519060005b8251811015611047578073ffffffffffffffffffffffffffffffffffffffff610fff6001938661231e565b511661100a8161275e565b611016575b5001610fd4565b60207fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a18461100f565b505160005b81518110156108e85773ffffffffffffffffffffffffffffffffffffffff611074828461231e565b5116908115610b3f577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef6020836110ac600195612a28565b50604051908152a10161104c565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760005473ffffffffffffffffffffffffffffffffffffffff811633036111cb577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985767ffffffffffffffff611235612012565b168060005260046020526040600020549061124f826120b3565b9161125d6040519384611fd1565b8083527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061128a826120b3565b0136602085013761129a816120b3565b916112a86040519384611fd1565b8183527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06112d5836120b3565b0160005b8181106114ae57505060005b828110611384576113058585604051928392604084526040840190612227565b8281036020840152815180825260208201916020808360051b8301019401926000915b8383106113355786860387f35b919395509193602080611372837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086600196030187528951612192565b97019301930190928695949293611328565b8160005260046020526040600020600261139e8383612746565b90549060031b1c918260005201602052604060002090604051916000908054906113c7826126dc565b8086529160018116908115611469575060011461142f575b505082916114076001959473ffffffffffffffffffffffffffffffffffffffff930384611fd1565b16611412838961231e565b5261141d828761231e565b52611428818661231e565b50016112e5565b6000908152602081209092505b8183106114535750508201602001816114076113df565b600181602092548386890101520192019161143c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660208088019190915292151560051b8601909201925083915061140790506113df565b8060606020809388010152016112d9565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760405180602060025491828152019060026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b818110611556576115528561153e81870382611fd1565b604051918291602083526020830190612227565b0390f35b8254845260209093019260019283019201611527565b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985736602382011215610998578060040135906115c7826120b3565b916115d56040519384611fd1565b8083526024602084019160061b8301019136831161099857602401905b828210611ab4576024358467ffffffffffffffff82116109985736602383011215610998578160040135611625816120b3565b926116336040519485611fd1565b8184526024602085019260051b820101903682116109985760248101925b828410611a21578585611662612416565b60005b815181101561176d578073ffffffffffffffffffffffffffffffffffffffff60206116926001948661231e565b5101511667ffffffffffffffff6116a9838661231e565b515116908160005260046020526116e7816040600020816000526002810160205260406000206116d981546126dc565b908161172b575b50506128f4565b6116f4575b505001611665565b7f530cabd30786b7235e124a6c0db77e0b685ef22813b1fe87554247f404eb8ed69160409182519182526020820152a184806116ec565b81601f600093118a146117425750555b89806116e0565b8183526020832061175d91601f0160051c8101908b0161272f565b808252816020812091555561173b565b8260005b81518110156108e857611784818361231e565b51516020611792838561231e565b51015173ffffffffffffffffffffffffffffffffffffffff6020830151169182158015611a18575b80156119ec575b610b3f5767ffffffffffffffff905116806000526004602052604060002083600052600281016020526040600020835167ffffffffffffffff81116119bd5761180a82546126dc565b601f8111611980575b506020601f82116001146118d5579261186d9282889796959360019a99946000916118ca575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff828c1b9260031b1c1916179055612a88565b61187b575b50505001611771565b7fad72a792d2a307f400c278be7deaeec6964276783304580cdc4e905436b8d5c5926118b96040519384938452606060208501526060840190612192565b9060408301520390a1838080611872565b90508701518c611839565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110611968575083899897969361186d969360019c9b968d9410611931575b5050811b019055612a88565b8901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558c80611925565b9192602060018192868c015181550194019201611905565b6119ad90836000526020600020601f840160051c810191602085106119b3575b601f0160051c019061272f565b88611813565b90915081906119a0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b508151602083012060405160208101906000825260208152611a0f604082611fd1565b519020146117c1565b508151156117ba565b833567ffffffffffffffff811161099857820160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc82360301126109985760405191611a6d83611f99565b611a7a36602484016121f1565b835260648201359267ffffffffffffffff841161099857611aa560209493602486953692010161203e565b83820152815201930192611651565b6020604091611ac336856121f1565b8152019101906115f2565b346109985760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610998576115526040805190611b0f8183611fd1565b601f82527f4d756c7469416767726567617465526174654c696d6974657220312e362e3000602083015251918291602083526020830190612192565b346109985760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261099857611b82612012565b6024359081151582036109985760a091611ba491611b9e6122f3565b506123e1565b6fffffffffffffffffffffffffffffffff60405191611bc283611f7d565b8181549181831685526001602086019163ffffffff8560801c16835260ff6040880195891c161515855201549263ffffffff60608701928486168452608088019560801c8652611c106122f3565b508480855116611c3d828b5116611c37611c2d8787511642612409565b858c5116906126c9565b906123a5565b80821015611c7557505b1680985281421681526040519788525116602087015251151560408601525116606084015251166080820152f35b9050611c47565b346109985760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126109985760043567ffffffffffffffff81116109985760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261099857611cf282611f7d565b80600401358252611d0560248201612029565b9060208301918252604481013567ffffffffffffffff811161099857611d31906004369184010161203e565b6040840152606481013567ffffffffffffffff811161099857611d5a906004369184010161203e565b606084015260848101359067ffffffffffffffff821161099857019036602383011215610998576080611da067ffffffffffffffff93369060246004820135910161210f565b9301928352611dad612361565b51169051611dbc6000836123e1565b9060ff825460a01c16611dcb57005b60009260005b8251811015610ee857816000526004602052611e0a604060002073ffffffffffffffffffffffffffffffffffffffff610cfd848761231e565b611e17575b600101611dd1565b93611e22858461231e565b5173ffffffffffffffffffffffffffffffffffffffff60055416604073ffffffffffffffffffffffffffffffffffffffff83511660248251809481937fd02641a000000000000000000000000000000000000000000000000000000000835260048301525afa8015610edc57600090611ee4575b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff91505116908115610df75791670de0b6b3a7640000610de8611edc9360206001960151906126c9565b949050611e0f565b6040823d8211611f75575b81611efc60409383611fd1565b81010312610ecd5760405191611f1183611f99565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103610ed0578352602001519063ffffffff82168203610ecd575060208201527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90611e96565b3d9150611eef565b60a0810190811067ffffffffffffffff8211176119bd57604052565b6040810190811067ffffffffffffffff8211176119bd57604052565b6060810190811067ffffffffffffffff8211176119bd57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176119bd57604052565b6004359067ffffffffffffffff8216820361099857565b359067ffffffffffffffff8216820361099857565b81601f820112156109985780359067ffffffffffffffff82116119bd5760405192612091601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200185611fd1565b8284526020838301011161099857816000926020809301838601378301015290565b67ffffffffffffffff81116119bd5760051b60200190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820361099857565b359073ffffffffffffffffffffffffffffffffffffffff8216820361099857565b92919261211b826120b3565b936121296040519586611fd1565b602085848152019260061b82019181831161099857925b82841061214d5750505050565b604084830312610998576020604091825161216781611f99565b612170876120ee565b81528287013583820152815201930192612140565b3590811515820361099857565b919082519283825260005b8481106121dc5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b8060208092840101518282860101520161219d565b91908260409103126109985760405161220981611f99565b602061222281839561221a81612029565b8552016120ee565b910152565b906020808351928381520192019060005b8181106122455750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612238565b9080601f83011215610998578135612288816120b3565b926122966040519485611fd1565b81845260208085019260051b82010192831161099857602001905b8282106122be5750505090565b602080916122cb846120ee565b8152019101906122b1565b35906fffffffffffffffffffffffffffffffff8216820361099857565b6040519061230082611f7d565b60006080838281528260208201528260408201528260608201520152565b80518210156123325760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3360005260036020526040600020541561237757565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b919082018092116123b257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff1660005260066020526040600020906000146124065760020190565b90565b919082039182116123b257565b73ffffffffffffffffffffffffffffffffffffffff60015416330361243757565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b805460ff8160a01c161580156126c1575b6126bc576fffffffffffffffffffffffffffffffff811690600183019081546124b763ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642612409565b908161261e575b50508481106125ec57508382106125435750916020916fffffffffffffffffffffffffffffffff80612511847f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a97612409565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b5460801c6125518285612409565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82018281116123b257612584916123a5565b9080156125bd5790047f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b84907ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8285929395116126925761263992611c379160801c906126c9565b8083101561268d5750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161784559138806124be565b612644565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b505050565b508215612472565b818102929181159184041417156123b257565b90600182811c92168015612725575b60208310146126f657565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f16916126eb565b81811061273a575050565b6000815560010161272f565b80548210156123325760005260206000200190600090565b60008181526003602052604090205480156128ed577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116123b257600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116123b25780820361287e575b505050600254801561284f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161280c816002612746565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6128d561288f6128a0936002612746565b90549060031b1c9283926002612746565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806127d3565b5050600090565b9060018201918160005282602052604060002054801515600014612a1f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116123b2578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116123b2578082036129e8575b5050508054801561284f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906129a98282612746565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b612a086129f86128a09386612746565b90549060031b1c92839286612746565b905560005283602052604060002055388080612971565b50505050600090565b80600052600360205260406000205415600014612a8257600254680100000000000000008110156119bd57612a696128a08260018594016002556002612746565b9055600254906000526003602052604060002055600190565b50600090565b60008281526001820160205260409020546128ed57805490680100000000000000008210156119bd5782612ac66128a0846001809601855584612746565b90558054926000520160205260406000205560019056fea164736f6c634300081a000a", +} + +var MultiAggregateRateLimiterABI = MultiAggregateRateLimiterMetaData.ABI + +var MultiAggregateRateLimiterBin = MultiAggregateRateLimiterMetaData.Bin + +func DeployMultiAggregateRateLimiter(auth *bind.TransactOpts, backend bind.ContractBackend, feeQuoter common.Address, authorizedCallers []common.Address) (common.Address, *types.Transaction, *MultiAggregateRateLimiter, error) { + parsed, err := MultiAggregateRateLimiterMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MultiAggregateRateLimiterBin), backend, feeQuoter, authorizedCallers) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MultiAggregateRateLimiter{address: address, abi: *parsed, MultiAggregateRateLimiterCaller: MultiAggregateRateLimiterCaller{contract: contract}, MultiAggregateRateLimiterTransactor: MultiAggregateRateLimiterTransactor{contract: contract}, MultiAggregateRateLimiterFilterer: MultiAggregateRateLimiterFilterer{contract: contract}}, nil +} + +type MultiAggregateRateLimiter struct { + address common.Address + abi abi.ABI + MultiAggregateRateLimiterCaller + MultiAggregateRateLimiterTransactor + MultiAggregateRateLimiterFilterer +} + +type MultiAggregateRateLimiterCaller struct { + contract *bind.BoundContract +} + +type MultiAggregateRateLimiterTransactor struct { + contract *bind.BoundContract +} + +type MultiAggregateRateLimiterFilterer struct { + contract *bind.BoundContract +} + +type MultiAggregateRateLimiterSession struct { + Contract *MultiAggregateRateLimiter + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type MultiAggregateRateLimiterCallerSession struct { + Contract *MultiAggregateRateLimiterCaller + CallOpts bind.CallOpts +} + +type MultiAggregateRateLimiterTransactorSession struct { + Contract *MultiAggregateRateLimiterTransactor + TransactOpts bind.TransactOpts +} + +type MultiAggregateRateLimiterRaw struct { + Contract *MultiAggregateRateLimiter +} + +type MultiAggregateRateLimiterCallerRaw struct { + Contract *MultiAggregateRateLimiterCaller +} + +type MultiAggregateRateLimiterTransactorRaw struct { + Contract *MultiAggregateRateLimiterTransactor +} + +func NewMultiAggregateRateLimiter(address common.Address, backend bind.ContractBackend) (*MultiAggregateRateLimiter, error) { + abi, err := abi.JSON(strings.NewReader(MultiAggregateRateLimiterABI)) + if err != nil { + return nil, err + } + contract, err := bindMultiAggregateRateLimiter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiter{address: address, abi: abi, MultiAggregateRateLimiterCaller: MultiAggregateRateLimiterCaller{contract: contract}, MultiAggregateRateLimiterTransactor: MultiAggregateRateLimiterTransactor{contract: contract}, MultiAggregateRateLimiterFilterer: MultiAggregateRateLimiterFilterer{contract: contract}}, nil +} + +func NewMultiAggregateRateLimiterCaller(address common.Address, caller bind.ContractCaller) (*MultiAggregateRateLimiterCaller, error) { + contract, err := bindMultiAggregateRateLimiter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterCaller{contract: contract}, nil +} + +func NewMultiAggregateRateLimiterTransactor(address common.Address, transactor bind.ContractTransactor) (*MultiAggregateRateLimiterTransactor, error) { + contract, err := bindMultiAggregateRateLimiter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterTransactor{contract: contract}, nil +} + +func NewMultiAggregateRateLimiterFilterer(address common.Address, filterer bind.ContractFilterer) (*MultiAggregateRateLimiterFilterer, error) { + contract, err := bindMultiAggregateRateLimiter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterFilterer{contract: contract}, nil +} + +func bindMultiAggregateRateLimiter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MultiAggregateRateLimiterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MultiAggregateRateLimiter.Contract.MultiAggregateRateLimiterCaller.contract.Call(opts, result, method, params...) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.MultiAggregateRateLimiterTransactor.contract.Transfer(opts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.MultiAggregateRateLimiterTransactor.contract.Transact(opts, method, params...) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MultiAggregateRateLimiter.Contract.contract.Call(opts, result, method, params...) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.contract.Transfer(opts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.contract.Transact(opts, method, params...) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCaller) CurrentRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64, isOutboundLane bool) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _MultiAggregateRateLimiter.contract.Call(opts, &out, "currentRateLimiterState", remoteChainSelector, isOutboundLane) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) CurrentRateLimiterState(remoteChainSelector uint64, isOutboundLane bool) (RateLimiterTokenBucket, error) { + return _MultiAggregateRateLimiter.Contract.CurrentRateLimiterState(&_MultiAggregateRateLimiter.CallOpts, remoteChainSelector, isOutboundLane) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerSession) CurrentRateLimiterState(remoteChainSelector uint64, isOutboundLane bool) (RateLimiterTokenBucket, error) { + return _MultiAggregateRateLimiter.Contract.CurrentRateLimiterState(&_MultiAggregateRateLimiter.CallOpts, remoteChainSelector, isOutboundLane) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCaller) GetAllAuthorizedCallers(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _MultiAggregateRateLimiter.contract.Call(opts, &out, "getAllAuthorizedCallers") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) GetAllAuthorizedCallers() ([]common.Address, error) { + return _MultiAggregateRateLimiter.Contract.GetAllAuthorizedCallers(&_MultiAggregateRateLimiter.CallOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerSession) GetAllAuthorizedCallers() ([]common.Address, error) { + return _MultiAggregateRateLimiter.Contract.GetAllAuthorizedCallers(&_MultiAggregateRateLimiter.CallOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCaller) GetAllRateLimitTokens(opts *bind.CallOpts, remoteChainSelector uint64) (GetAllRateLimitTokens, + + error) { + var out []interface{} + err := _MultiAggregateRateLimiter.contract.Call(opts, &out, "getAllRateLimitTokens", remoteChainSelector) + + outstruct := new(GetAllRateLimitTokens) + if err != nil { + return *outstruct, err + } + + outstruct.LocalTokens = *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + outstruct.RemoteTokens = *abi.ConvertType(out[1], new([][]byte)).(*[][]byte) + + return *outstruct, err + +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) GetAllRateLimitTokens(remoteChainSelector uint64) (GetAllRateLimitTokens, + + error) { + return _MultiAggregateRateLimiter.Contract.GetAllRateLimitTokens(&_MultiAggregateRateLimiter.CallOpts, remoteChainSelector) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerSession) GetAllRateLimitTokens(remoteChainSelector uint64) (GetAllRateLimitTokens, + + error) { + return _MultiAggregateRateLimiter.Contract.GetAllRateLimitTokens(&_MultiAggregateRateLimiter.CallOpts, remoteChainSelector) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCaller) GetFeeQuoter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _MultiAggregateRateLimiter.contract.Call(opts, &out, "getFeeQuoter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) GetFeeQuoter() (common.Address, error) { + return _MultiAggregateRateLimiter.Contract.GetFeeQuoter(&_MultiAggregateRateLimiter.CallOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerSession) GetFeeQuoter() (common.Address, error) { + return _MultiAggregateRateLimiter.Contract.GetFeeQuoter(&_MultiAggregateRateLimiter.CallOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _MultiAggregateRateLimiter.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 + +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) Owner() (common.Address, error) { + return _MultiAggregateRateLimiter.Contract.Owner(&_MultiAggregateRateLimiter.CallOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerSession) Owner() (common.Address, error) { + return _MultiAggregateRateLimiter.Contract.Owner(&_MultiAggregateRateLimiter.CallOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _MultiAggregateRateLimiter.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) TypeAndVersion() (string, error) { + return _MultiAggregateRateLimiter.Contract.TypeAndVersion(&_MultiAggregateRateLimiter.CallOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerSession) TypeAndVersion() (string, error) { + return _MultiAggregateRateLimiter.Contract.TypeAndVersion(&_MultiAggregateRateLimiter.CallOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.contract.Transact(opts, "acceptOwnership") +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) AcceptOwnership() (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.AcceptOwnership(&_MultiAggregateRateLimiter.TransactOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.AcceptOwnership(&_MultiAggregateRateLimiter.TransactOpts) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.contract.Transact(opts, "applyAuthorizedCallerUpdates", authorizedCallerArgs) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) ApplyAuthorizedCallerUpdates(authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.ApplyAuthorizedCallerUpdates(&_MultiAggregateRateLimiter.TransactOpts, authorizedCallerArgs) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorSession) ApplyAuthorizedCallerUpdates(authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.ApplyAuthorizedCallerUpdates(&_MultiAggregateRateLimiter.TransactOpts, authorizedCallerArgs) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) ApplyRateLimiterConfigUpdates(opts *bind.TransactOpts, rateLimiterUpdates []MultiAggregateRateLimiterRateLimiterConfigArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.contract.Transact(opts, "applyRateLimiterConfigUpdates", rateLimiterUpdates) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) ApplyRateLimiterConfigUpdates(rateLimiterUpdates []MultiAggregateRateLimiterRateLimiterConfigArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.ApplyRateLimiterConfigUpdates(&_MultiAggregateRateLimiter.TransactOpts, rateLimiterUpdates) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorSession) ApplyRateLimiterConfigUpdates(rateLimiterUpdates []MultiAggregateRateLimiterRateLimiterConfigArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.ApplyRateLimiterConfigUpdates(&_MultiAggregateRateLimiter.TransactOpts, rateLimiterUpdates) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) OnInboundMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.contract.Transact(opts, "onInboundMessage", message) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) OnInboundMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.OnInboundMessage(&_MultiAggregateRateLimiter.TransactOpts, message) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorSession) OnInboundMessage(message ClientAny2EVMMessage) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.OnInboundMessage(&_MultiAggregateRateLimiter.TransactOpts, message) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) OnOutboundMessage(opts *bind.TransactOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.contract.Transact(opts, "onOutboundMessage", destChainSelector, message) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) OnOutboundMessage(destChainSelector uint64, message ClientEVM2AnyMessage) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.OnOutboundMessage(&_MultiAggregateRateLimiter.TransactOpts, destChainSelector, message) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorSession) OnOutboundMessage(destChainSelector uint64, message ClientEVM2AnyMessage) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.OnOutboundMessage(&_MultiAggregateRateLimiter.TransactOpts, destChainSelector, message) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) SetFeeQuoter(opts *bind.TransactOpts, newFeeQuoter common.Address) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.contract.Transact(opts, "setFeeQuoter", newFeeQuoter) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) SetFeeQuoter(newFeeQuoter common.Address) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.SetFeeQuoter(&_MultiAggregateRateLimiter.TransactOpts, newFeeQuoter) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorSession) SetFeeQuoter(newFeeQuoter common.Address) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.SetFeeQuoter(&_MultiAggregateRateLimiter.TransactOpts, newFeeQuoter) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.contract.Transact(opts, "transferOwnership", to) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.TransferOwnership(&_MultiAggregateRateLimiter.TransactOpts, to) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.TransferOwnership(&_MultiAggregateRateLimiter.TransactOpts, to) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) UpdateRateLimitTokens(opts *bind.TransactOpts, removes []MultiAggregateRateLimiterLocalRateLimitToken, adds []MultiAggregateRateLimiterRateLimitTokenArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.contract.Transact(opts, "updateRateLimitTokens", removes, adds) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) UpdateRateLimitTokens(removes []MultiAggregateRateLimiterLocalRateLimitToken, adds []MultiAggregateRateLimiterRateLimitTokenArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.UpdateRateLimitTokens(&_MultiAggregateRateLimiter.TransactOpts, removes, adds) +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactorSession) UpdateRateLimitTokens(removes []MultiAggregateRateLimiterLocalRateLimitToken, adds []MultiAggregateRateLimiterRateLimitTokenArgs) (*types.Transaction, error) { + return _MultiAggregateRateLimiter.Contract.UpdateRateLimitTokens(&_MultiAggregateRateLimiter.TransactOpts, removes, adds) +} + +type MultiAggregateRateLimiterAuthorizedCallerAddedIterator struct { + Event *MultiAggregateRateLimiterAuthorizedCallerAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterAuthorizedCallerAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterAuthorizedCallerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterAuthorizedCallerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterAuthorizedCallerAddedIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterAuthorizedCallerAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterAuthorizedCallerAdded struct { + Caller common.Address + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterAuthorizedCallerAdded(opts *bind.FilterOpts) (*MultiAggregateRateLimiterAuthorizedCallerAddedIterator, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "AuthorizedCallerAdded") + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterAuthorizedCallerAddedIterator{contract: _MultiAggregateRateLimiter.contract, event: "AuthorizedCallerAdded", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchAuthorizedCallerAdded(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterAuthorizedCallerAdded) (event.Subscription, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.WatchLogs(opts, "AuthorizedCallerAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiAggregateRateLimiterAuthorizedCallerAdded) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "AuthorizedCallerAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseAuthorizedCallerAdded(log types.Log) (*MultiAggregateRateLimiterAuthorizedCallerAdded, error) { + event := new(MultiAggregateRateLimiterAuthorizedCallerAdded) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "AuthorizedCallerAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterAuthorizedCallerRemovedIterator struct { + Event *MultiAggregateRateLimiterAuthorizedCallerRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterAuthorizedCallerRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterAuthorizedCallerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterAuthorizedCallerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterAuthorizedCallerRemovedIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterAuthorizedCallerRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterAuthorizedCallerRemoved struct { + Caller common.Address + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterAuthorizedCallerRemoved(opts *bind.FilterOpts) (*MultiAggregateRateLimiterAuthorizedCallerRemovedIterator, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "AuthorizedCallerRemoved") + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterAuthorizedCallerRemovedIterator{contract: _MultiAggregateRateLimiter.contract, event: "AuthorizedCallerRemoved", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchAuthorizedCallerRemoved(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterAuthorizedCallerRemoved) (event.Subscription, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.WatchLogs(opts, "AuthorizedCallerRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiAggregateRateLimiterAuthorizedCallerRemoved) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "AuthorizedCallerRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseAuthorizedCallerRemoved(log types.Log) (*MultiAggregateRateLimiterAuthorizedCallerRemoved, error) { + event := new(MultiAggregateRateLimiterAuthorizedCallerRemoved) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "AuthorizedCallerRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterConfigChangedIterator struct { + Event *MultiAggregateRateLimiterConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterConfigChangedIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*MultiAggregateRateLimiterConfigChangedIterator, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterConfigChangedIterator{contract: _MultiAggregateRateLimiter.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterConfigChanged) (event.Subscription, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiAggregateRateLimiterConfigChanged) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseConfigChanged(log types.Log) (*MultiAggregateRateLimiterConfigChanged, error) { + event := new(MultiAggregateRateLimiterConfigChanged) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterFeeQuoterSetIterator struct { + Event *MultiAggregateRateLimiterFeeQuoterSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterFeeQuoterSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterFeeQuoterSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterFeeQuoterSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterFeeQuoterSetIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterFeeQuoterSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterFeeQuoterSet struct { + NewFeeQuoter common.Address + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterFeeQuoterSet(opts *bind.FilterOpts) (*MultiAggregateRateLimiterFeeQuoterSetIterator, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "FeeQuoterSet") + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterFeeQuoterSetIterator{contract: _MultiAggregateRateLimiter.contract, event: "FeeQuoterSet", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchFeeQuoterSet(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterFeeQuoterSet) (event.Subscription, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.WatchLogs(opts, "FeeQuoterSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiAggregateRateLimiterFeeQuoterSet) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "FeeQuoterSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseFeeQuoterSet(log types.Log) (*MultiAggregateRateLimiterFeeQuoterSet, error) { + event := new(MultiAggregateRateLimiterFeeQuoterSet) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "FeeQuoterSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterOwnershipTransferRequestedIterator struct { + Event *MultiAggregateRateLimiterOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MultiAggregateRateLimiterOwnershipTransferRequestedIterator, 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 := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterOwnershipTransferRequestedIterator{contract: _MultiAggregateRateLimiter.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterOwnershipTransferRequested, 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 := _MultiAggregateRateLimiter.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: + + event := new(MultiAggregateRateLimiterOwnershipTransferRequested) + if err := _MultiAggregateRateLimiter.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 +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseOwnershipTransferRequested(log types.Log) (*MultiAggregateRateLimiterOwnershipTransferRequested, error) { + event := new(MultiAggregateRateLimiterOwnershipTransferRequested) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterOwnershipTransferredIterator struct { + Event *MultiAggregateRateLimiterOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MultiAggregateRateLimiterOwnershipTransferredIterator, 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 := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterOwnershipTransferredIterator{contract: _MultiAggregateRateLimiter.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterOwnershipTransferred, 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 := _MultiAggregateRateLimiter.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: + + event := new(MultiAggregateRateLimiterOwnershipTransferred) + if err := _MultiAggregateRateLimiter.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 +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseOwnershipTransferred(log types.Log) (*MultiAggregateRateLimiterOwnershipTransferred, error) { + event := new(MultiAggregateRateLimiterOwnershipTransferred) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterRateLimiterConfigUpdatedIterator struct { + Event *MultiAggregateRateLimiterRateLimiterConfigUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterRateLimiterConfigUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterRateLimiterConfigUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterRateLimiterConfigUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterRateLimiterConfigUpdatedIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterRateLimiterConfigUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterRateLimiterConfigUpdated struct { + RemoteChainSelector uint64 + IsOutboundLane bool + Config RateLimiterConfig + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterRateLimiterConfigUpdated(opts *bind.FilterOpts, remoteChainSelector []uint64) (*MultiAggregateRateLimiterRateLimiterConfigUpdatedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "RateLimiterConfigUpdated", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterRateLimiterConfigUpdatedIterator{contract: _MultiAggregateRateLimiter.contract, event: "RateLimiterConfigUpdated", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchRateLimiterConfigUpdated(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterRateLimiterConfigUpdated, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _MultiAggregateRateLimiter.contract.WatchLogs(opts, "RateLimiterConfigUpdated", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiAggregateRateLimiterRateLimiterConfigUpdated) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "RateLimiterConfigUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseRateLimiterConfigUpdated(log types.Log) (*MultiAggregateRateLimiterRateLimiterConfigUpdated, error) { + event := new(MultiAggregateRateLimiterRateLimiterConfigUpdated) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "RateLimiterConfigUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterTokenAggregateRateLimitAddedIterator struct { + Event *MultiAggregateRateLimiterTokenAggregateRateLimitAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterTokenAggregateRateLimitAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterTokenAggregateRateLimitAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterTokenAggregateRateLimitAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterTokenAggregateRateLimitAddedIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterTokenAggregateRateLimitAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterTokenAggregateRateLimitAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + LocalToken common.Address + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterTokenAggregateRateLimitAdded(opts *bind.FilterOpts) (*MultiAggregateRateLimiterTokenAggregateRateLimitAddedIterator, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "TokenAggregateRateLimitAdded") + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterTokenAggregateRateLimitAddedIterator{contract: _MultiAggregateRateLimiter.contract, event: "TokenAggregateRateLimitAdded", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchTokenAggregateRateLimitAdded(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterTokenAggregateRateLimitAdded) (event.Subscription, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.WatchLogs(opts, "TokenAggregateRateLimitAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiAggregateRateLimiterTokenAggregateRateLimitAdded) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "TokenAggregateRateLimitAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseTokenAggregateRateLimitAdded(log types.Log) (*MultiAggregateRateLimiterTokenAggregateRateLimitAdded, error) { + event := new(MultiAggregateRateLimiterTokenAggregateRateLimitAdded) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "TokenAggregateRateLimitAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterTokenAggregateRateLimitRemovedIterator struct { + Event *MultiAggregateRateLimiterTokenAggregateRateLimitRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterTokenAggregateRateLimitRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterTokenAggregateRateLimitRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterTokenAggregateRateLimitRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterTokenAggregateRateLimitRemovedIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterTokenAggregateRateLimitRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterTokenAggregateRateLimitRemoved struct { + RemoteChainSelector uint64 + LocalToken common.Address + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterTokenAggregateRateLimitRemoved(opts *bind.FilterOpts) (*MultiAggregateRateLimiterTokenAggregateRateLimitRemovedIterator, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "TokenAggregateRateLimitRemoved") + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterTokenAggregateRateLimitRemovedIterator{contract: _MultiAggregateRateLimiter.contract, event: "TokenAggregateRateLimitRemoved", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchTokenAggregateRateLimitRemoved(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterTokenAggregateRateLimitRemoved) (event.Subscription, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.WatchLogs(opts, "TokenAggregateRateLimitRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiAggregateRateLimiterTokenAggregateRateLimitRemoved) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "TokenAggregateRateLimitRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseTokenAggregateRateLimitRemoved(log types.Log) (*MultiAggregateRateLimiterTokenAggregateRateLimitRemoved, error) { + event := new(MultiAggregateRateLimiterTokenAggregateRateLimitRemoved) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "TokenAggregateRateLimitRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiAggregateRateLimiterTokensConsumedIterator struct { + Event *MultiAggregateRateLimiterTokensConsumed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiAggregateRateLimiterTokensConsumedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiAggregateRateLimiterTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiAggregateRateLimiterTokensConsumedIterator) Error() error { + return it.fail +} + +func (it *MultiAggregateRateLimiterTokensConsumedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiAggregateRateLimiterTokensConsumed struct { + Tokens *big.Int + Raw types.Log +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*MultiAggregateRateLimiterTokensConsumedIterator, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.FilterLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return &MultiAggregateRateLimiterTokensConsumedIterator{contract: _MultiAggregateRateLimiter.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterTokensConsumed) (event.Subscription, error) { + + logs, sub, err := _MultiAggregateRateLimiter.contract.WatchLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiAggregateRateLimiterTokensConsumed) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterFilterer) ParseTokensConsumed(log types.Log) (*MultiAggregateRateLimiterTokensConsumed, error) { + event := new(MultiAggregateRateLimiterTokensConsumed) + if err := _MultiAggregateRateLimiter.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetAllRateLimitTokens struct { + LocalTokens []common.Address + RemoteTokens [][]byte +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiter) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _MultiAggregateRateLimiter.abi.Events["AuthorizedCallerAdded"].ID: + return _MultiAggregateRateLimiter.ParseAuthorizedCallerAdded(log) + case _MultiAggregateRateLimiter.abi.Events["AuthorizedCallerRemoved"].ID: + return _MultiAggregateRateLimiter.ParseAuthorizedCallerRemoved(log) + case _MultiAggregateRateLimiter.abi.Events["ConfigChanged"].ID: + return _MultiAggregateRateLimiter.ParseConfigChanged(log) + case _MultiAggregateRateLimiter.abi.Events["FeeQuoterSet"].ID: + return _MultiAggregateRateLimiter.ParseFeeQuoterSet(log) + case _MultiAggregateRateLimiter.abi.Events["OwnershipTransferRequested"].ID: + return _MultiAggregateRateLimiter.ParseOwnershipTransferRequested(log) + case _MultiAggregateRateLimiter.abi.Events["OwnershipTransferred"].ID: + return _MultiAggregateRateLimiter.ParseOwnershipTransferred(log) + case _MultiAggregateRateLimiter.abi.Events["RateLimiterConfigUpdated"].ID: + return _MultiAggregateRateLimiter.ParseRateLimiterConfigUpdated(log) + case _MultiAggregateRateLimiter.abi.Events["TokenAggregateRateLimitAdded"].ID: + return _MultiAggregateRateLimiter.ParseTokenAggregateRateLimitAdded(log) + case _MultiAggregateRateLimiter.abi.Events["TokenAggregateRateLimitRemoved"].ID: + return _MultiAggregateRateLimiter.ParseTokenAggregateRateLimitRemoved(log) + case _MultiAggregateRateLimiter.abi.Events["TokensConsumed"].ID: + return _MultiAggregateRateLimiter.ParseTokensConsumed(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (MultiAggregateRateLimiterAuthorizedCallerAdded) Topic() common.Hash { + return common.HexToHash("0xeb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef") +} + +func (MultiAggregateRateLimiterAuthorizedCallerRemoved) Topic() common.Hash { + return common.HexToHash("0xc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda77580") +} + +func (MultiAggregateRateLimiterConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (MultiAggregateRateLimiterFeeQuoterSet) Topic() common.Hash { + return common.HexToHash("0x7c737a8eddf62436489aa3600ed26e75e0a58b0f8c0d266bbcee64358c39fdac") +} + +func (MultiAggregateRateLimiterOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (MultiAggregateRateLimiterOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (MultiAggregateRateLimiterRateLimiterConfigUpdated) Topic() common.Hash { + return common.HexToHash("0xf14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b97") +} + +func (MultiAggregateRateLimiterTokenAggregateRateLimitAdded) Topic() common.Hash { + return common.HexToHash("0xad72a792d2a307f400c278be7deaeec6964276783304580cdc4e905436b8d5c5") +} + +func (MultiAggregateRateLimiterTokenAggregateRateLimitRemoved) Topic() common.Hash { + return common.HexToHash("0x530cabd30786b7235e124a6c0db77e0b685ef22813b1fe87554247f404eb8ed6") +} + +func (MultiAggregateRateLimiterTokensConsumed) Topic() common.Hash { + return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a") +} + +func (_MultiAggregateRateLimiter *MultiAggregateRateLimiter) Address() common.Address { + return _MultiAggregateRateLimiter.address +} + +type MultiAggregateRateLimiterInterface interface { + CurrentRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64, isOutboundLane bool) (RateLimiterTokenBucket, error) + + GetAllAuthorizedCallers(opts *bind.CallOpts) ([]common.Address, error) + + GetAllRateLimitTokens(opts *bind.CallOpts, remoteChainSelector uint64) (GetAllRateLimitTokens, + + error) + + GetFeeQuoter(opts *bind.CallOpts) (common.Address, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) + + ApplyRateLimiterConfigUpdates(opts *bind.TransactOpts, rateLimiterUpdates []MultiAggregateRateLimiterRateLimiterConfigArgs) (*types.Transaction, error) + + OnInboundMessage(opts *bind.TransactOpts, message ClientAny2EVMMessage) (*types.Transaction, error) + + OnOutboundMessage(opts *bind.TransactOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*types.Transaction, error) + + SetFeeQuoter(opts *bind.TransactOpts, newFeeQuoter common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdateRateLimitTokens(opts *bind.TransactOpts, removes []MultiAggregateRateLimiterLocalRateLimitToken, adds []MultiAggregateRateLimiterRateLimitTokenArgs) (*types.Transaction, error) + + FilterAuthorizedCallerAdded(opts *bind.FilterOpts) (*MultiAggregateRateLimiterAuthorizedCallerAddedIterator, error) + + WatchAuthorizedCallerAdded(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterAuthorizedCallerAdded) (event.Subscription, error) + + ParseAuthorizedCallerAdded(log types.Log) (*MultiAggregateRateLimiterAuthorizedCallerAdded, error) + + FilterAuthorizedCallerRemoved(opts *bind.FilterOpts) (*MultiAggregateRateLimiterAuthorizedCallerRemovedIterator, error) + + WatchAuthorizedCallerRemoved(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterAuthorizedCallerRemoved) (event.Subscription, error) + + ParseAuthorizedCallerRemoved(log types.Log) (*MultiAggregateRateLimiterAuthorizedCallerRemoved, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*MultiAggregateRateLimiterConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*MultiAggregateRateLimiterConfigChanged, error) + + FilterFeeQuoterSet(opts *bind.FilterOpts) (*MultiAggregateRateLimiterFeeQuoterSetIterator, error) + + WatchFeeQuoterSet(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterFeeQuoterSet) (event.Subscription, error) + + ParseFeeQuoterSet(log types.Log) (*MultiAggregateRateLimiterFeeQuoterSet, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MultiAggregateRateLimiterOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*MultiAggregateRateLimiterOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MultiAggregateRateLimiterOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*MultiAggregateRateLimiterOwnershipTransferred, error) + + FilterRateLimiterConfigUpdated(opts *bind.FilterOpts, remoteChainSelector []uint64) (*MultiAggregateRateLimiterRateLimiterConfigUpdatedIterator, error) + + WatchRateLimiterConfigUpdated(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterRateLimiterConfigUpdated, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRateLimiterConfigUpdated(log types.Log) (*MultiAggregateRateLimiterRateLimiterConfigUpdated, error) + + FilterTokenAggregateRateLimitAdded(opts *bind.FilterOpts) (*MultiAggregateRateLimiterTokenAggregateRateLimitAddedIterator, error) + + WatchTokenAggregateRateLimitAdded(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterTokenAggregateRateLimitAdded) (event.Subscription, error) + + ParseTokenAggregateRateLimitAdded(log types.Log) (*MultiAggregateRateLimiterTokenAggregateRateLimitAdded, error) + + FilterTokenAggregateRateLimitRemoved(opts *bind.FilterOpts) (*MultiAggregateRateLimiterTokenAggregateRateLimitRemovedIterator, error) + + WatchTokenAggregateRateLimitRemoved(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterTokenAggregateRateLimitRemoved) (event.Subscription, error) + + ParseTokenAggregateRateLimitRemoved(log types.Log) (*MultiAggregateRateLimiterTokenAggregateRateLimitRemoved, error) + + FilterTokensConsumed(opts *bind.FilterOpts) (*MultiAggregateRateLimiterTokensConsumedIterator, error) + + WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *MultiAggregateRateLimiterTokensConsumed) (event.Subscription, error) + + ParseTokensConsumed(log types.Log) (*MultiAggregateRateLimiterTokensConsumed, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/multi_ocr3_helper/multi_ocr3_helper.go b/core/gethwrappers/ccip/generated/v1_6_0/multi_ocr3_helper/multi_ocr3_helper.go new file mode 100644 index 00000000000..25f13f42cd7 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/multi_ocr3_helper/multi_ocr3_helper.go @@ -0,0 +1,1096 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package multi_ocr3_helper + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type MultiOCR3BaseConfigInfo struct { + ConfigDigest [32]byte + F uint8 + N uint8 + IsSignatureVerificationEnabled bool +} + +type MultiOCR3BaseOCRConfig struct { + ConfigInfo MultiOCR3BaseConfigInfo + Signers []common.Address + Transmitters []common.Address +} + +type MultiOCR3BaseOCRConfigArgs struct { + ConfigDigest [32]byte + OcrPluginType uint8 + F uint8 + IsSignatureVerificationEnabled bool + Signers []common.Address + Transmitters []common.Address +} + +type MultiOCR3BaseOracle struct { + Index uint8 + Role uint8 +} + +var MultiOCR3HelperMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getOracle\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"oracleAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.Oracle\",\"components\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"role\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.Role\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTransmitOcrPluginType\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transmitWithSignatures\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"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\":\"transmitWithoutSignatures\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"AfterConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"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\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientGasToCompleteTx\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]}]", + Bin: "0x60a080604052346051573315604057600180546001600160a01b0319163317905546608052611f5890816100578239608051818181610f2f01526116b70152f35b639b15e16f60e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806310061068146115fb578063181f5a771461152b57806334a9c92e146114445780633ecdb95b14610e2d57806379ba509714610d445780637ac0aa1a14610cdc5780638da5cb5b14610c8a578063c673e58414610b2e578063f2fde38b14610a3b5763f716f99f1461008a57600080fd5b34610a365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760043567ffffffffffffffff8111610a365736602382011215610a365780600401356100e481611c52565b916100f26040519384611c11565b8183526024602084019260051b82010190368211610a365760248101925b82841061093b5784610120611e90565b6002906000805b82518110156109395761013a8184611e00565b5190604082019060ff8251161561090a5760ff60208401511692836000528660205260406000206001810190815460ff8116156000146108c6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff62ff00006060860151151560101b1691161782555b60a08301928351956101008751116107dc578651156108975760038301996101eb6101de6101e58d60405192838092611db0565b0382611c11565b8a611edb565b6060830151610566575b60005b88518110156103b55773ffffffffffffffffffffffffffffffffffffffff610220828b611e00565b5116908a600052600360205260ff60408060002060009073ffffffffffffffffffffffffffffffffffffffff86168252602052205460081c16600381101561032e5761038757811561035d578b6040519261027a84611bbd565b60ff83168452602084019161032e578f604060ff928f8493865260005260036020528160002073ffffffffffffffffffffffffffffffffffffffff60009216825260205220945116167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008454161783555191600383101561032e576001927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0083549260081b169116179055016101f8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7fd6c62c9b0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f367f56a2000000000000000000000000000000000000000000000000000000006000526004805260246000fd5b509997969091929394959781519167ffffffffffffffff83116105375768010000000000000000831161053757815483835580841061050e575b509060208d989796959493920190600052602060002060005b8381106104e157505050509360019796936104cb7fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946104bd7f897ac1b2c12867721b284f3eb147bd4ab046d4eef1cf31c1d8988bfcfb962b53999560ff60209a51169460ff86167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055519485835551916040519687968a88528b88015260a0604088015260a087019101611db0565b908482036060860152611b73565b9060808301520390a1604051908152a101610127565b825173ffffffffffffffffffffffffffffffffffffffff16818301558e9950602090920191600101610408565b8260005283602060002091820191015b81811061052b57506103ef565b6000815560010161051e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8b840161058360405161057d816101de8186611db0565b8b611edb565b60808401519061010082511161086957815160ff8551166003029060ff821691820361083a57111561080b5781518a51116107dc5781519087547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff008460081b16911617885567ffffffffffffffff8211610537576801000000000000000082116105375780548282558083106107b3575b506020830190600052602060002060005b8381106107895750600193600093508392509050835b61064c575b505050506101f5565b80518310156107845773ffffffffffffffffffffffffffffffffffffffff6106748483611e00565b5116928d600052600360205260ff60408060002060009073ffffffffffffffffffffffffffffffffffffffff88168252602052205460081c16600381101561032e5761038757831561035d5782604051946106ce86611bbd565b60ff83168652602086019161032e578f604060ff9283928a865260005260036020528160002073ffffffffffffffffffffffffffffffffffffffff60009216825260205220965116167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008654161785555190600382101561032e57859485927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff61ff0083549260081b169116179055019261063e565b610643565b600190602073ffffffffffffffffffffffffffffffffffffffff8551169401938184015501610628565b8160005282602060002091820191015b8181106107d05750610617565b600081556001016107c3565b7f367f56a200000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f367f56a200000000000000000000000000000000000000000000000000000000600052600360045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8d7f367f56a20000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f367f56a200000000000000000000000000000000000000000000000000000000600052600560045260246000fd5b60ff606085015115159160101c16151503156101aa57857f87f6037c0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f367f56a200000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b005b833567ffffffffffffffff8111610a3657820160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8236030112610a36576040519160c0830183811067ffffffffffffffff82111761053757604052602482013583526109ab60448301611b34565b60208401526109bc60648301611b34565b604084015260848201358015158103610a3657606084015260a482013567ffffffffffffffff8111610a36576109f89060243691850101611c6a565b608084015260c48201359267ffffffffffffffff8411610a3657610a26602094936024869536920101611c6a565b60a0820152815201930192610110565b600080fd5b34610a365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760043573ffffffffffffffffffffffffffffffffffffffff8116809103610a3657610a93611e90565b338114610b0457807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b34610a365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760ff610b67611b24565b606060408051610b7681611bd9565b8151610b8181611bf5565b60008152600060208201526000838201526000848201528152826020820152015216600052600260205260606040600020610c866003610c5560405193610bc785611bd9565b610bd081611d77565b8552610c0860405191610bf183610bea8160028501611db0565b0384611c11565b60208701928352610bea6040518096819301611db0565b6040850192835260405195869560208752518051602088015260ff602082015116604088015260ff604082015116828801520151151560808601525160c060a086015260e0850190611b73565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160c0850152611b73565b0390f35b34610a365760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a3657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b34610a365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760ff610d15611b24565b167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006004541617600455600080f35b34610a365760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760005473ffffffffffffffffffffffffffffffffffffffff81163303610e03577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b34610a365760c07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365736604411610a365760443567ffffffffffffffff8111610a3657610e84903690600401611af6565b9060643567ffffffffffffffff8111610a3657610ea5903690600401611b42565b919060843567ffffffffffffffff8111610a3657610eca610ee9913690600401611b42565b9190610ee160a4359460ff60045416973691611d2b565b923691611d2b565b90846000526002602052610f006040600020611d77565b9560043594610f0e82611e43565b97606081019889516113f7575b8036036113c65750805187810361139457507f00000000000000000000000000000000000000000000000000000000000000004681036113635750876000526003602052604060002073ffffffffffffffffffffffffffffffffffffffff331660005260205260406000209860405199610f948b611bbd565b5460ff81168b52610faf60ff60208d019260081c1682611d1f565b519960038b101561032e57600260009b1490816112ee575b50156112ab575b51611015575b88887f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef060408a815190815267ffffffffffffffff602435166020820152a280f35b60ff611028816020875194015116611e6c565b160361128357825184510361125b578761104183611ce5565b9161104f6040519384611c11565b8383526020830193368183011161125757806020928637830101525190206040516020810191825260406004818301376060815261108e608082611c11565b51902090869281519488945b8686106110a75750610fd4565b602086101561122a5760208a60806110c0858a1a611e7e565b6110ca8a89611e00565b516110d58b89611e00565b519060ff604051938c855216868401526040830152606082015282805260015afa1561121f578951898b52600360205273ffffffffffffffffffffffffffffffffffffffff60408c2091168b5260205260408a206040519061113682611bbd565b5460ff8116825261115160ff602084019260081c1682611d1f565b5160038110156111f2577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016111ca57600160ff8251161b82166111a25790600160ff819351161b1795019461109a565b60048b7ff67bc7c4000000000000000000000000000000000000000000000000000000008152fd5b60048b7fca31867a000000000000000000000000000000000000000000000000000000008152fd5b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b6040513d8b823e3d90fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b8280fd5b6004887fa75d88af000000000000000000000000000000000000000000000000000000008152fd5b6004887f71253a25000000000000000000000000000000000000000000000000000000008152fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315610fce5760048a7fda0f08e8000000000000000000000000000000000000000000000000000000008152fd5b9050898b52600260205260ff600360408d2001915116908054821015611336579073ffffffffffffffffffffffffffffffffffffffff918c5260208c2001541633148b610fc7565b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b7f0f01ce85000000000000000000000000000000000000000000000000000000006000526004524660245260446000fd5b87907f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f8e1192e1000000000000000000000000000000000000000000000000000000006000526004523660245260446000fd5b84518060051b908082046020149015171561083a5761141590611e51565b908651918260051b928084046020149015171561083a5761143f9261143991611e5f565b90611e5f565b610f1b565b34610a365760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365761147b611b24565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610a365760ff90600060206040516114af81611bbd565b828152015216600052600360205273ffffffffffffffffffffffffffffffffffffffff604060002091166000526020526040600020604051906114f182611bbd565b5460ff8116825261150c60ff602084019260081c1682611d1f565b60ff60405192511682525190600382101561032e576040916020820152f35b34610a365760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365760408051906115698183611c11565b601982527f4d756c74694f4352334261736548656c70657220312e302e30000000000000006020830152805180926020825280519081602084015260005b8281106115e45750506000828201840152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168101030190f35b6020828201810151878301870152869450016115a7565b34610a365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610a365736604411610a365760443567ffffffffffffffff8111610a3657611652903690600401611af6565b604051602092916116638483611c11565b60008252600036813760ff600454169182600052600285526116886040600020611d77565b936004359261169681611e43565b9560608101968751611ab1575b8036036113c657508051858103611a7f57507f000000000000000000000000000000000000000000000000000000000000000046810361136357508560005260038852604060002073ffffffffffffffffffffffffffffffffffffffff331660005288526040600020966040519761171a89611bbd565b5460ff8116895261173460ff8b8b019260081c1682611d1f565b5197600389101561032e576002600099149081611a39575b50156119f6575b5161179a575b86867f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef06040888c825191825267ffffffffffffffff6024351690820152a280f35b60ff6117ac818a875194015116611e6c565b16036119ce576117bb81611ce5565b906117c96040519283611c11565b8082528782019236828201116119ca578188928a92863783010152519020604051868101918252604060048183013760608152611807608082611c11565b519020849082519286925b84841061181f5750611759565b8884101561199d578888608061183682881a611e7e565b6118408887611e00565b5161184b8988611e00565b519060ff604051938a855216868401526040830152606082015282805260015afa1561199257875187895260038a5273ffffffffffffffffffffffffffffffffffffffff60408a2091168952895260408820604051906118aa82611bbd565b5460ff811682526118c460ff8c84019260081c1682611d1f565b516003811015611965577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161193d57600160ff8251161b82166119155790600160ff819351161b17930192611812565b6004897ff67bc7c4000000000000000000000000000000000000000000000000000000008152fd5b6004897fca31867a000000000000000000000000000000000000000000000000000000008152fd5b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526021600452fd5b6040513d89823e3d90fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b8780fd5b6004867f71253a25000000000000000000000000000000000000000000000000000000008152fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315611753576004887fda0f08e8000000000000000000000000000000000000000000000000000000008152fd5b905087895260028a5260ff600360408b200191511690805482101561122a579073ffffffffffffffffffffffffffffffffffffffff918a528a8a2001541633148a61174c565b85907f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b84518060051b908082048b149015171561083a57611ace90611e51565b908551918260051b928084048c149015171561083a57611af19261143991611e5f565b6116a3565b9181601f84011215610a365782359167ffffffffffffffff8311610a365760208381860195010111610a3657565b6004359060ff82168203610a3657565b359060ff82168203610a3657565b9181601f84011215610a365782359167ffffffffffffffff8311610a36576020808501948460051b010111610a3657565b906020808351928381520192019060005b818110611b915750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101611b84565b6040810190811067ffffffffffffffff82111761053757604052565b6060810190811067ffffffffffffffff82111761053757604052565b6080810190811067ffffffffffffffff82111761053757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761053757604052565b67ffffffffffffffff81116105375760051b60200190565b9080601f83011215610a3657813590611c8282611c52565b92611c906040519485611c11565b82845260208085019360051b820101918211610a3657602001915b818310611cb85750505090565b823573ffffffffffffffffffffffffffffffffffffffff81168103610a3657815260209283019201611cab565b67ffffffffffffffff811161053757601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600382101561032e5752565b929190611d3781611c52565b93611d456040519586611c11565b602085838152019160051b8101928311610a3657905b828210611d6757505050565b8135815260209182019101611d5b565b90604051611d8481611bf5565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b818110611dd45750505090565b825473ffffffffffffffffffffffffffffffffffffffff16845260209093019260019283019201611dc7565b8051821015611e145760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b608401908160841161083a57565b60a001908160a01161083a57565b9190820180921161083a57565b60ff60019116019060ff821161083a57565b60ff601b9116019060ff821161083a57565b73ffffffffffffffffffffffffffffffffffffffff600154163303611eb157565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b91909160005b8351811015611f455760019060ff831660005260036020526000604080822073ffffffffffffffffffffffffffffffffffffffff611f1f858a611e00565b511673ffffffffffffffffffffffffffffffffffffffff16835260205281205501611ee1565b5050905056fea164736f6c634300081a000a", +} + +var MultiOCR3HelperABI = MultiOCR3HelperMetaData.ABI + +var MultiOCR3HelperBin = MultiOCR3HelperMetaData.Bin + +func DeployMultiOCR3Helper(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *MultiOCR3Helper, error) { + parsed, err := MultiOCR3HelperMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MultiOCR3HelperBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MultiOCR3Helper{address: address, abi: *parsed, MultiOCR3HelperCaller: MultiOCR3HelperCaller{contract: contract}, MultiOCR3HelperTransactor: MultiOCR3HelperTransactor{contract: contract}, MultiOCR3HelperFilterer: MultiOCR3HelperFilterer{contract: contract}}, nil +} + +type MultiOCR3Helper struct { + address common.Address + abi abi.ABI + MultiOCR3HelperCaller + MultiOCR3HelperTransactor + MultiOCR3HelperFilterer +} + +type MultiOCR3HelperCaller struct { + contract *bind.BoundContract +} + +type MultiOCR3HelperTransactor struct { + contract *bind.BoundContract +} + +type MultiOCR3HelperFilterer struct { + contract *bind.BoundContract +} + +type MultiOCR3HelperSession struct { + Contract *MultiOCR3Helper + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type MultiOCR3HelperCallerSession struct { + Contract *MultiOCR3HelperCaller + CallOpts bind.CallOpts +} + +type MultiOCR3HelperTransactorSession struct { + Contract *MultiOCR3HelperTransactor + TransactOpts bind.TransactOpts +} + +type MultiOCR3HelperRaw struct { + Contract *MultiOCR3Helper +} + +type MultiOCR3HelperCallerRaw struct { + Contract *MultiOCR3HelperCaller +} + +type MultiOCR3HelperTransactorRaw struct { + Contract *MultiOCR3HelperTransactor +} + +func NewMultiOCR3Helper(address common.Address, backend bind.ContractBackend) (*MultiOCR3Helper, error) { + abi, err := abi.JSON(strings.NewReader(MultiOCR3HelperABI)) + if err != nil { + return nil, err + } + contract, err := bindMultiOCR3Helper(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MultiOCR3Helper{address: address, abi: abi, MultiOCR3HelperCaller: MultiOCR3HelperCaller{contract: contract}, MultiOCR3HelperTransactor: MultiOCR3HelperTransactor{contract: contract}, MultiOCR3HelperFilterer: MultiOCR3HelperFilterer{contract: contract}}, nil +} + +func NewMultiOCR3HelperCaller(address common.Address, caller bind.ContractCaller) (*MultiOCR3HelperCaller, error) { + contract, err := bindMultiOCR3Helper(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MultiOCR3HelperCaller{contract: contract}, nil +} + +func NewMultiOCR3HelperTransactor(address common.Address, transactor bind.ContractTransactor) (*MultiOCR3HelperTransactor, error) { + contract, err := bindMultiOCR3Helper(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MultiOCR3HelperTransactor{contract: contract}, nil +} + +func NewMultiOCR3HelperFilterer(address common.Address, filterer bind.ContractFilterer) (*MultiOCR3HelperFilterer, error) { + contract, err := bindMultiOCR3Helper(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MultiOCR3HelperFilterer{contract: contract}, nil +} + +func bindMultiOCR3Helper(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MultiOCR3HelperMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_MultiOCR3Helper *MultiOCR3HelperRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MultiOCR3Helper.Contract.MultiOCR3HelperCaller.contract.Call(opts, result, method, params...) +} + +func (_MultiOCR3Helper *MultiOCR3HelperRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.MultiOCR3HelperTransactor.contract.Transfer(opts) +} + +func (_MultiOCR3Helper *MultiOCR3HelperRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.MultiOCR3HelperTransactor.contract.Transact(opts, method, params...) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MultiOCR3Helper.Contract.contract.Call(opts, result, method, params...) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.contract.Transfer(opts) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.contract.Transact(opts, method, params...) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCaller) GetOracle(opts *bind.CallOpts, ocrPluginType uint8, oracleAddress common.Address) (MultiOCR3BaseOracle, error) { + var out []interface{} + err := _MultiOCR3Helper.contract.Call(opts, &out, "getOracle", ocrPluginType, oracleAddress) + + if err != nil { + return *new(MultiOCR3BaseOracle), err + } + + out0 := *abi.ConvertType(out[0], new(MultiOCR3BaseOracle)).(*MultiOCR3BaseOracle) + + return out0, err + +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) GetOracle(ocrPluginType uint8, oracleAddress common.Address) (MultiOCR3BaseOracle, error) { + return _MultiOCR3Helper.Contract.GetOracle(&_MultiOCR3Helper.CallOpts, ocrPluginType, oracleAddress) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCallerSession) GetOracle(ocrPluginType uint8, oracleAddress common.Address) (MultiOCR3BaseOracle, error) { + return _MultiOCR3Helper.Contract.GetOracle(&_MultiOCR3Helper.CallOpts, ocrPluginType, oracleAddress) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCaller) LatestConfigDetails(opts *bind.CallOpts, ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { + var out []interface{} + err := _MultiOCR3Helper.contract.Call(opts, &out, "latestConfigDetails", ocrPluginType) + + if err != nil { + return *new(MultiOCR3BaseOCRConfig), err + } + + out0 := *abi.ConvertType(out[0], new(MultiOCR3BaseOCRConfig)).(*MultiOCR3BaseOCRConfig) + + return out0, err + +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) LatestConfigDetails(ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { + return _MultiOCR3Helper.Contract.LatestConfigDetails(&_MultiOCR3Helper.CallOpts, ocrPluginType) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCallerSession) LatestConfigDetails(ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { + return _MultiOCR3Helper.Contract.LatestConfigDetails(&_MultiOCR3Helper.CallOpts, ocrPluginType) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _MultiOCR3Helper.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 + +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) Owner() (common.Address, error) { + return _MultiOCR3Helper.Contract.Owner(&_MultiOCR3Helper.CallOpts) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCallerSession) Owner() (common.Address, error) { + return _MultiOCR3Helper.Contract.Owner(&_MultiOCR3Helper.CallOpts) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _MultiOCR3Helper.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) TypeAndVersion() (string, error) { + return _MultiOCR3Helper.Contract.TypeAndVersion(&_MultiOCR3Helper.CallOpts) +} + +func (_MultiOCR3Helper *MultiOCR3HelperCallerSession) TypeAndVersion() (string, error) { + return _MultiOCR3Helper.Contract.TypeAndVersion(&_MultiOCR3Helper.CallOpts) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MultiOCR3Helper.contract.Transact(opts, "acceptOwnership") +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) AcceptOwnership() (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.AcceptOwnership(&_MultiOCR3Helper.TransactOpts) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.AcceptOwnership(&_MultiOCR3Helper.TransactOpts) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactor) SetOCR3Configs(opts *bind.TransactOpts, ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _MultiOCR3Helper.contract.Transact(opts, "setOCR3Configs", ocrConfigArgs) +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) SetOCR3Configs(ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.SetOCR3Configs(&_MultiOCR3Helper.TransactOpts, ocrConfigArgs) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactorSession) SetOCR3Configs(ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.SetOCR3Configs(&_MultiOCR3Helper.TransactOpts, ocrConfigArgs) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactor) SetTransmitOcrPluginType(opts *bind.TransactOpts, ocrPluginType uint8) (*types.Transaction, error) { + return _MultiOCR3Helper.contract.Transact(opts, "setTransmitOcrPluginType", ocrPluginType) +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) SetTransmitOcrPluginType(ocrPluginType uint8) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.SetTransmitOcrPluginType(&_MultiOCR3Helper.TransactOpts, ocrPluginType) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactorSession) SetTransmitOcrPluginType(ocrPluginType uint8) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.SetTransmitOcrPluginType(&_MultiOCR3Helper.TransactOpts, ocrPluginType) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _MultiOCR3Helper.contract.Transact(opts, "transferOwnership", to) +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.TransferOwnership(&_MultiOCR3Helper.TransactOpts, to) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.TransferOwnership(&_MultiOCR3Helper.TransactOpts, to) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactor) TransmitWithSignatures(opts *bind.TransactOpts, reportContext [2][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _MultiOCR3Helper.contract.Transact(opts, "transmitWithSignatures", reportContext, report, rs, ss, rawVs) +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) TransmitWithSignatures(reportContext [2][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.TransmitWithSignatures(&_MultiOCR3Helper.TransactOpts, reportContext, report, rs, ss, rawVs) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactorSession) TransmitWithSignatures(reportContext [2][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.TransmitWithSignatures(&_MultiOCR3Helper.TransactOpts, reportContext, report, rs, ss, rawVs) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactor) TransmitWithoutSignatures(opts *bind.TransactOpts, reportContext [2][32]byte, report []byte) (*types.Transaction, error) { + return _MultiOCR3Helper.contract.Transact(opts, "transmitWithoutSignatures", reportContext, report) +} + +func (_MultiOCR3Helper *MultiOCR3HelperSession) TransmitWithoutSignatures(reportContext [2][32]byte, report []byte) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.TransmitWithoutSignatures(&_MultiOCR3Helper.TransactOpts, reportContext, report) +} + +func (_MultiOCR3Helper *MultiOCR3HelperTransactorSession) TransmitWithoutSignatures(reportContext [2][32]byte, report []byte) (*types.Transaction, error) { + return _MultiOCR3Helper.Contract.TransmitWithoutSignatures(&_MultiOCR3Helper.TransactOpts, reportContext, report) +} + +type MultiOCR3HelperAfterConfigSetIterator struct { + Event *MultiOCR3HelperAfterConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiOCR3HelperAfterConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperAfterConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperAfterConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiOCR3HelperAfterConfigSetIterator) Error() error { + return it.fail +} + +func (it *MultiOCR3HelperAfterConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiOCR3HelperAfterConfigSet struct { + OcrPluginType uint8 + Raw types.Log +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) FilterAfterConfigSet(opts *bind.FilterOpts) (*MultiOCR3HelperAfterConfigSetIterator, error) { + + logs, sub, err := _MultiOCR3Helper.contract.FilterLogs(opts, "AfterConfigSet") + if err != nil { + return nil, err + } + return &MultiOCR3HelperAfterConfigSetIterator{contract: _MultiOCR3Helper.contract, event: "AfterConfigSet", logs: logs, sub: sub}, nil +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) WatchAfterConfigSet(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperAfterConfigSet) (event.Subscription, error) { + + logs, sub, err := _MultiOCR3Helper.contract.WatchLogs(opts, "AfterConfigSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiOCR3HelperAfterConfigSet) + if err := _MultiOCR3Helper.contract.UnpackLog(event, "AfterConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) ParseAfterConfigSet(log types.Log) (*MultiOCR3HelperAfterConfigSet, error) { + event := new(MultiOCR3HelperAfterConfigSet) + if err := _MultiOCR3Helper.contract.UnpackLog(event, "AfterConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiOCR3HelperConfigSetIterator struct { + Event *MultiOCR3HelperConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiOCR3HelperConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiOCR3HelperConfigSetIterator) Error() error { + return it.fail +} + +func (it *MultiOCR3HelperConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiOCR3HelperConfigSet struct { + OcrPluginType uint8 + ConfigDigest [32]byte + Signers []common.Address + Transmitters []common.Address + F uint8 + Raw types.Log +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) FilterConfigSet(opts *bind.FilterOpts) (*MultiOCR3HelperConfigSetIterator, error) { + + logs, sub, err := _MultiOCR3Helper.contract.FilterLogs(opts, "ConfigSet") + if err != nil { + return nil, err + } + return &MultiOCR3HelperConfigSetIterator{contract: _MultiOCR3Helper.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperConfigSet) (event.Subscription, error) { + + logs, sub, err := _MultiOCR3Helper.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: + + event := new(MultiOCR3HelperConfigSet) + if err := _MultiOCR3Helper.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 +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) ParseConfigSet(log types.Log) (*MultiOCR3HelperConfigSet, error) { + event := new(MultiOCR3HelperConfigSet) + if err := _MultiOCR3Helper.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiOCR3HelperOwnershipTransferRequestedIterator struct { + Event *MultiOCR3HelperOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiOCR3HelperOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiOCR3HelperOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *MultiOCR3HelperOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiOCR3HelperOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MultiOCR3HelperOwnershipTransferRequestedIterator, 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 := _MultiOCR3Helper.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &MultiOCR3HelperOwnershipTransferRequestedIterator{contract: _MultiOCR3Helper.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperOwnershipTransferRequested, 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 := _MultiOCR3Helper.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: + + event := new(MultiOCR3HelperOwnershipTransferRequested) + if err := _MultiOCR3Helper.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 +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) ParseOwnershipTransferRequested(log types.Log) (*MultiOCR3HelperOwnershipTransferRequested, error) { + event := new(MultiOCR3HelperOwnershipTransferRequested) + if err := _MultiOCR3Helper.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiOCR3HelperOwnershipTransferredIterator struct { + Event *MultiOCR3HelperOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiOCR3HelperOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiOCR3HelperOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *MultiOCR3HelperOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiOCR3HelperOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MultiOCR3HelperOwnershipTransferredIterator, 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 := _MultiOCR3Helper.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &MultiOCR3HelperOwnershipTransferredIterator{contract: _MultiOCR3Helper.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperOwnershipTransferred, 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 := _MultiOCR3Helper.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: + + event := new(MultiOCR3HelperOwnershipTransferred) + if err := _MultiOCR3Helper.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 +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) ParseOwnershipTransferred(log types.Log) (*MultiOCR3HelperOwnershipTransferred, error) { + event := new(MultiOCR3HelperOwnershipTransferred) + if err := _MultiOCR3Helper.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type MultiOCR3HelperTransmittedIterator struct { + Event *MultiOCR3HelperTransmitted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *MultiOCR3HelperTransmittedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperTransmitted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(MultiOCR3HelperTransmitted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *MultiOCR3HelperTransmittedIterator) Error() error { + return it.fail +} + +func (it *MultiOCR3HelperTransmittedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type MultiOCR3HelperTransmitted struct { + OcrPluginType uint8 + ConfigDigest [32]byte + SequenceNumber uint64 + Raw types.Log +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) FilterTransmitted(opts *bind.FilterOpts, ocrPluginType []uint8) (*MultiOCR3HelperTransmittedIterator, error) { + + var ocrPluginTypeRule []interface{} + for _, ocrPluginTypeItem := range ocrPluginType { + ocrPluginTypeRule = append(ocrPluginTypeRule, ocrPluginTypeItem) + } + + logs, sub, err := _MultiOCR3Helper.contract.FilterLogs(opts, "Transmitted", ocrPluginTypeRule) + if err != nil { + return nil, err + } + return &MultiOCR3HelperTransmittedIterator{contract: _MultiOCR3Helper.contract, event: "Transmitted", logs: logs, sub: sub}, nil +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) WatchTransmitted(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperTransmitted, ocrPluginType []uint8) (event.Subscription, error) { + + var ocrPluginTypeRule []interface{} + for _, ocrPluginTypeItem := range ocrPluginType { + ocrPluginTypeRule = append(ocrPluginTypeRule, ocrPluginTypeItem) + } + + logs, sub, err := _MultiOCR3Helper.contract.WatchLogs(opts, "Transmitted", ocrPluginTypeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(MultiOCR3HelperTransmitted) + if err := _MultiOCR3Helper.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 +} + +func (_MultiOCR3Helper *MultiOCR3HelperFilterer) ParseTransmitted(log types.Log) (*MultiOCR3HelperTransmitted, error) { + event := new(MultiOCR3HelperTransmitted) + if err := _MultiOCR3Helper.contract.UnpackLog(event, "Transmitted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_MultiOCR3Helper *MultiOCR3Helper) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _MultiOCR3Helper.abi.Events["AfterConfigSet"].ID: + return _MultiOCR3Helper.ParseAfterConfigSet(log) + case _MultiOCR3Helper.abi.Events["ConfigSet"].ID: + return _MultiOCR3Helper.ParseConfigSet(log) + case _MultiOCR3Helper.abi.Events["OwnershipTransferRequested"].ID: + return _MultiOCR3Helper.ParseOwnershipTransferRequested(log) + case _MultiOCR3Helper.abi.Events["OwnershipTransferred"].ID: + return _MultiOCR3Helper.ParseOwnershipTransferred(log) + case _MultiOCR3Helper.abi.Events["Transmitted"].ID: + return _MultiOCR3Helper.ParseTransmitted(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (MultiOCR3HelperAfterConfigSet) Topic() common.Hash { + return common.HexToHash("0x897ac1b2c12867721b284f3eb147bd4ab046d4eef1cf31c1d8988bfcfb962b53") +} + +func (MultiOCR3HelperConfigSet) Topic() common.Hash { + return common.HexToHash("0xab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547") +} + +func (MultiOCR3HelperOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (MultiOCR3HelperOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (MultiOCR3HelperTransmitted) Topic() common.Hash { + return common.HexToHash("0x198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0") +} + +func (_MultiOCR3Helper *MultiOCR3Helper) Address() common.Address { + return _MultiOCR3Helper.address +} + +type MultiOCR3HelperInterface interface { + GetOracle(opts *bind.CallOpts, ocrPluginType uint8, oracleAddress common.Address) (MultiOCR3BaseOracle, error) + + LatestConfigDetails(opts *bind.CallOpts, ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + SetOCR3Configs(opts *bind.TransactOpts, ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) + + SetTransmitOcrPluginType(opts *bind.TransactOpts, ocrPluginType uint8) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + TransmitWithSignatures(opts *bind.TransactOpts, reportContext [2][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) + + TransmitWithoutSignatures(opts *bind.TransactOpts, reportContext [2][32]byte, report []byte) (*types.Transaction, error) + + FilterAfterConfigSet(opts *bind.FilterOpts) (*MultiOCR3HelperAfterConfigSetIterator, error) + + WatchAfterConfigSet(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperAfterConfigSet) (event.Subscription, error) + + ParseAfterConfigSet(log types.Log) (*MultiOCR3HelperAfterConfigSet, error) + + FilterConfigSet(opts *bind.FilterOpts) (*MultiOCR3HelperConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperConfigSet) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*MultiOCR3HelperConfigSet, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MultiOCR3HelperOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*MultiOCR3HelperOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*MultiOCR3HelperOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*MultiOCR3HelperOwnershipTransferred, error) + + FilterTransmitted(opts *bind.FilterOpts, ocrPluginType []uint8) (*MultiOCR3HelperTransmittedIterator, error) + + WatchTransmitted(opts *bind.WatchOpts, sink chan<- *MultiOCR3HelperTransmitted, ocrPluginType []uint8) (event.Subscription, error) + + ParseTransmitted(log types.Log) (*MultiOCR3HelperTransmitted, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager/nonce_manager.go b/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager/nonce_manager.go new file mode 100644 index 00000000000..97258d80cdf --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager/nonce_manager.go @@ -0,0 +1,1259 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package nonce_manager + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type AuthorizedCallersAuthorizedCallerArgs struct { + AddedCallers []common.Address + RemovedCallers []common.Address +} + +type NonceManagerPreviousRamps struct { + PrevOnRamp common.Address + PrevOffRamp common.Address +} + +type NonceManagerPreviousRampsArgs struct { + RemoteChainSelector uint64 + OverrideExistingRamps bool + PrevRamps NonceManagerPreviousRamps +} + +var NonceManagerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"authorizedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAuthorizedCallerUpdates\",\"inputs\":[{\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\",\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"components\":[{\"name\":\"addedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedCallers\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyPreviousRampsUpdates\",\"inputs\":[{\"name\":\"previousRampsArgs\",\"type\":\"tuple[]\",\"internalType\":\"structNonceManager.PreviousRampsArgs[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"overrideExistingRamps\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"prevRamps\",\"type\":\"tuple\",\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllAuthorizedCallers\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getIncrementedOutboundNonce\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getOutboundNonce\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPreviousRamps\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"incrementInboundNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"expectedNonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AuthorizedCallerAdded\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AuthorizedCallerRemoved\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"PreviousRampsUpdated\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"prevRamp\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structNonceManager.PreviousRamps\",\"components\":[{\"name\":\"prevOnRamp\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"prevOffRamp\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedIncorrectNonce\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PreviousRampAlreadySet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedCaller\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x60806040523461020f576117738038038061001981610214565b92833981019060208183031261020f578051906001600160401b03821161020f570181601f8201121561020f578051916001600160401b0383116101c8578260051b9160208061006a818601610214565b80968152019382010191821161020f57602001915b8183106101ef578333156101de57600180546001600160a01b031916331790556020906100ab82610214565b60008152600036813760408051929083016001600160401b038111848210176101c8576040528252808383015260005b8151811015610142576001906001600160a01b036100f98285610239565b5116856101058261027b565b610112575b5050016100db565b7fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1858561010a565b50505160005b81518110156101b9576001600160a01b036101638284610239565b51169081156101a8577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef848361019a600195610379565b50604051908152a101610148565b6342bcdf7f60e11b60005260046000fd5b60405161139990816103da8239f35b634e487b7160e01b600052604160045260246000fd5b639b15e16f60e01b60005260046000fd5b82516001600160a01b038116810361020f5781526020928301920161007f565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176101c857604052565b805182101561024d5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561024d5760005260206000200190600090565b600081815260036020526040902054801561037257600019810181811161035c5760025460001981019190821161035c5780820361030b575b50505060025480156102f557600019016102cf816002610263565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61034461031c61032d936002610263565b90549060031b1c9283926002610263565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806102b4565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146103d357600254680100000000000000008110156101c8576103ba61032d8260018594016002556002610263565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c908163181f5a7714610a94575080632451a627146109a6578063294b5630146108ff57806379ba5097146108165780637a75a094146105f95780638da5cb5b146105a757806391a2749a146103bd578063bf18402a14610373578063c9223625146102fe578063e0e03cae14610272578063ea458c0c1461019b5763f2fde38b146100a357600080fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043573ffffffffffffffffffffffffffffffffffffffff8116809103610196576100fb610e81565b33811461016c57807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760206101d4610bef565b6101dc610c06565b6101e461113a565b67ffffffffffffffff6101ff6101fa8385610f2f565b610d1e565b92166000526005835273ffffffffffffffffffffffffffffffffffffffff604060002091166000528252604060002067ffffffffffffffff82167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082541617905567ffffffffffffffff60405191168152f35b346101965760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576102a9610bef565b60243567ffffffffffffffff81168103610196576044359067ffffffffffffffff8211610196576020926102e46102f4933690600401610cba565b9290916102ef61113a565b610d6d565b6040519015158152f35b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657610335610bef565b60243567ffffffffffffffff81116101965760209161035b610361923690600401610cba565b9161104a565b67ffffffffffffffff60405191168152f35b346101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760206103616103af610bef565b6103b7610c06565b90610f2f565b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043567ffffffffffffffff81116101965760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610196576040519061043782610b63565b806004013567ffffffffffffffff81116101965761045b9060043691840101610c4a565b825260248101359067ffffffffffffffff82116101965760046104819236920101610c4a565b60208201908152610490610e81565b519060005b8251811015610508578073ffffffffffffffffffffffffffffffffffffffff6104c060019386610ecc565b51166104cb81611196565b6104d7575b5001610495565b60207fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda7758091604051908152a1846104d0565b505160005b81518110156105a55773ffffffffffffffffffffffffffffffffffffffff6105358284610ecc565b511690811561057b577feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef60208361056d60019561132c565b50604051908152a10161050d565b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b005b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760043567ffffffffffffffff8111610196573660238201121561019657806004013567ffffffffffffffff8111610196573660248260071b8401011161019657610670610e81565b60005b818110156105a55760008160071b84016024810167ffffffffffffffff61069982610ce8565b1683526004602052604083209273ffffffffffffffffffffffffffffffffffffffff845416158015906107f3575b6107b3575b5060408273ffffffffffffffffffffffffffffffffffffffff6107a667ffffffffffffffff6107907fa2e43edcbc4fd175ae4bebbe3fd6139871ed1f1783cd4a1ace59b90d302c3319966084606460019c9b9a01968661072b89610cfd565b167fffffffffffffffffffffffff00000000000000000000000000000000000000008c5416178b550198858c6107608c610cfd565b920191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610ce8565b16958261079e865195610c29565b168452610c29565b166020820152a201610673565b60448301358015908115036107ef57156106cc57807fc6117ae20000000000000000000000000000000000000000000000000000000060049252fd5b5080fd5b5073ffffffffffffffffffffffffffffffffffffffff60018501541615156106c7565b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965760005473ffffffffffffffffffffffffffffffffffffffff811633036108d5577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101965760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101965767ffffffffffffffff61093f610bef565b6000602060405161094f81610b63565b828152015216600052600460205260408060002073ffffffffffffffffffffffffffffffffffffffff825161098381610b63565b602082600181865416958685520154169101908152835192835251166020820152f35b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610196576040518060206002549283815201809260026000527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace9060005b818110610a7e5750505081610a25910382610bae565b6040519182916020830190602084525180915260408301919060005b818110610a4f575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101610a41565b8254845260209093019260019283019201610a0f565b346101965760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261019657610acc81610b63565b601281527f4e6f6e63654d616e6167657220312e362e300000000000000000000000000000602082015260405190602082528181519182602083015260005b838110610b4b5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610b0b565b6040810190811067ffffffffffffffff821117610b7f57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610b7f57604052565b6004359067ffffffffffffffff8216820361019657565b6024359073ffffffffffffffffffffffffffffffffffffffff8216820361019657565b359073ffffffffffffffffffffffffffffffffffffffff8216820361019657565b9080601f830112156101965781359167ffffffffffffffff8311610b7f578260051b9060405193610c7e6020840186610bae565b845260208085019282010192831161019657602001905b828210610ca25750505090565b60208091610caf84610c29565b815201910190610c95565b9181601f840112156101965782359167ffffffffffffffff8311610196576020838186019501011161019657565b3567ffffffffffffffff811681036101965790565b3573ffffffffffffffffffffffffffffffffffffffff811681036101965790565b67ffffffffffffffff60019116019067ffffffffffffffff8211610d3e57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291909267ffffffffffffffff610d886101fa85858561104a565b94168067ffffffffffffffff861603610df8575067ffffffffffffffff9291836020921660005260068252604060002083604051948593843782019081520301902091167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000825416179055600190565b7f606ff8179e5e3c059b82df931acc496b7b6053e8879042f8267f930e0595f69f9450601f8467ffffffffffffffff956080957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09460405198899716875260208701526060604087015281606087015286860137600085828601015201168101030190a1600090565b73ffffffffffffffffffffffffffffffffffffffff600154163303610ea257565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b8051821015610ee05760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90816020910312610196575167ffffffffffffffff811681036101965790565b67ffffffffffffffff1690816000526005602052604060002073ffffffffffffffffffffffffffffffffffffffff821660005260205267ffffffffffffffff60406000205416918215610f8157505090565b600052600460205273ffffffffffffffffffffffffffffffffffffffff604060002054169081610fb057505090565b6020919250602473ffffffffffffffffffffffffffffffffffffffff9160405194859384927f856c82470000000000000000000000000000000000000000000000000000000084521660048301525afa90811561103e57600091611012575090565b611034915060203d602011611037575b61102c8183610bae565b810190610f0f565b90565b503d611022565b6040513d6000823e3d90fd5b67ffffffffffffffff90929192169182600052600660205267ffffffffffffffff60406000206020604051809286868337868201908152030190205416928315611095575b50505090565b600052600460205273ffffffffffffffffffffffffffffffffffffffff6001604060002001541691821561108f57819293509060209181010312610196573573ffffffffffffffffffffffffffffffffffffffff8116809103610196576020906024604051809481937f856c824700000000000000000000000000000000000000000000000000000000835260048301525afa90811561103e57600091611012575090565b3360005260036020526040600020541561115057565b7fd86ad9cf000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b8054821015610ee05760005260206000200190600090565b6000818152600360205260409020548015611325577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111610d3e57600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211610d3e578082036112b6575b5050506002548015611287577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161124481600261117e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61130d6112c76112d893600261117e565b90549060031b1c928392600261117e565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600052600360205260406000205538808061120b565b5050600090565b806000526003602052604060002054156000146113865760025468010000000000000000811015610b7f5761136d6112d8826001859401600255600261117e565b9055600254906000526003602052604060002055600190565b5060009056fea164736f6c634300081a000a", +} + +var NonceManagerABI = NonceManagerMetaData.ABI + +var NonceManagerBin = NonceManagerMetaData.Bin + +func DeployNonceManager(auth *bind.TransactOpts, backend bind.ContractBackend, authorizedCallers []common.Address) (common.Address, *types.Transaction, *NonceManager, error) { + parsed, err := NonceManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(NonceManagerBin), backend, authorizedCallers) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &NonceManager{address: address, abi: *parsed, NonceManagerCaller: NonceManagerCaller{contract: contract}, NonceManagerTransactor: NonceManagerTransactor{contract: contract}, NonceManagerFilterer: NonceManagerFilterer{contract: contract}}, nil +} + +type NonceManager struct { + address common.Address + abi abi.ABI + NonceManagerCaller + NonceManagerTransactor + NonceManagerFilterer +} + +type NonceManagerCaller struct { + contract *bind.BoundContract +} + +type NonceManagerTransactor struct { + contract *bind.BoundContract +} + +type NonceManagerFilterer struct { + contract *bind.BoundContract +} + +type NonceManagerSession struct { + Contract *NonceManager + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type NonceManagerCallerSession struct { + Contract *NonceManagerCaller + CallOpts bind.CallOpts +} + +type NonceManagerTransactorSession struct { + Contract *NonceManagerTransactor + TransactOpts bind.TransactOpts +} + +type NonceManagerRaw struct { + Contract *NonceManager +} + +type NonceManagerCallerRaw struct { + Contract *NonceManagerCaller +} + +type NonceManagerTransactorRaw struct { + Contract *NonceManagerTransactor +} + +func NewNonceManager(address common.Address, backend bind.ContractBackend) (*NonceManager, error) { + abi, err := abi.JSON(strings.NewReader(NonceManagerABI)) + if err != nil { + return nil, err + } + contract, err := bindNonceManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &NonceManager{address: address, abi: abi, NonceManagerCaller: NonceManagerCaller{contract: contract}, NonceManagerTransactor: NonceManagerTransactor{contract: contract}, NonceManagerFilterer: NonceManagerFilterer{contract: contract}}, nil +} + +func NewNonceManagerCaller(address common.Address, caller bind.ContractCaller) (*NonceManagerCaller, error) { + contract, err := bindNonceManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &NonceManagerCaller{contract: contract}, nil +} + +func NewNonceManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*NonceManagerTransactor, error) { + contract, err := bindNonceManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &NonceManagerTransactor{contract: contract}, nil +} + +func NewNonceManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*NonceManagerFilterer, error) { + contract, err := bindNonceManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &NonceManagerFilterer{contract: contract}, nil +} + +func bindNonceManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := NonceManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_NonceManager *NonceManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _NonceManager.Contract.NonceManagerCaller.contract.Call(opts, result, method, params...) +} + +func (_NonceManager *NonceManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NonceManager.Contract.NonceManagerTransactor.contract.Transfer(opts) +} + +func (_NonceManager *NonceManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _NonceManager.Contract.NonceManagerTransactor.contract.Transact(opts, method, params...) +} + +func (_NonceManager *NonceManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _NonceManager.Contract.contract.Call(opts, result, method, params...) +} + +func (_NonceManager *NonceManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NonceManager.Contract.contract.Transfer(opts) +} + +func (_NonceManager *NonceManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _NonceManager.Contract.contract.Transact(opts, method, params...) +} + +func (_NonceManager *NonceManagerCaller) GetAllAuthorizedCallers(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _NonceManager.contract.Call(opts, &out, "getAllAuthorizedCallers") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_NonceManager *NonceManagerSession) GetAllAuthorizedCallers() ([]common.Address, error) { + return _NonceManager.Contract.GetAllAuthorizedCallers(&_NonceManager.CallOpts) +} + +func (_NonceManager *NonceManagerCallerSession) GetAllAuthorizedCallers() ([]common.Address, error) { + return _NonceManager.Contract.GetAllAuthorizedCallers(&_NonceManager.CallOpts) +} + +func (_NonceManager *NonceManagerCaller) GetInboundNonce(opts *bind.CallOpts, sourceChainSelector uint64, sender []byte) (uint64, error) { + var out []interface{} + err := _NonceManager.contract.Call(opts, &out, "getInboundNonce", sourceChainSelector, sender) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_NonceManager *NonceManagerSession) GetInboundNonce(sourceChainSelector uint64, sender []byte) (uint64, error) { + return _NonceManager.Contract.GetInboundNonce(&_NonceManager.CallOpts, sourceChainSelector, sender) +} + +func (_NonceManager *NonceManagerCallerSession) GetInboundNonce(sourceChainSelector uint64, sender []byte) (uint64, error) { + return _NonceManager.Contract.GetInboundNonce(&_NonceManager.CallOpts, sourceChainSelector, sender) +} + +func (_NonceManager *NonceManagerCaller) GetOutboundNonce(opts *bind.CallOpts, destChainSelector uint64, sender common.Address) (uint64, error) { + var out []interface{} + err := _NonceManager.contract.Call(opts, &out, "getOutboundNonce", destChainSelector, sender) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_NonceManager *NonceManagerSession) GetOutboundNonce(destChainSelector uint64, sender common.Address) (uint64, error) { + return _NonceManager.Contract.GetOutboundNonce(&_NonceManager.CallOpts, destChainSelector, sender) +} + +func (_NonceManager *NonceManagerCallerSession) GetOutboundNonce(destChainSelector uint64, sender common.Address) (uint64, error) { + return _NonceManager.Contract.GetOutboundNonce(&_NonceManager.CallOpts, destChainSelector, sender) +} + +func (_NonceManager *NonceManagerCaller) GetPreviousRamps(opts *bind.CallOpts, chainSelector uint64) (NonceManagerPreviousRamps, error) { + var out []interface{} + err := _NonceManager.contract.Call(opts, &out, "getPreviousRamps", chainSelector) + + if err != nil { + return *new(NonceManagerPreviousRamps), err + } + + out0 := *abi.ConvertType(out[0], new(NonceManagerPreviousRamps)).(*NonceManagerPreviousRamps) + + return out0, err + +} + +func (_NonceManager *NonceManagerSession) GetPreviousRamps(chainSelector uint64) (NonceManagerPreviousRamps, error) { + return _NonceManager.Contract.GetPreviousRamps(&_NonceManager.CallOpts, chainSelector) +} + +func (_NonceManager *NonceManagerCallerSession) GetPreviousRamps(chainSelector uint64) (NonceManagerPreviousRamps, error) { + return _NonceManager.Contract.GetPreviousRamps(&_NonceManager.CallOpts, chainSelector) +} + +func (_NonceManager *NonceManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _NonceManager.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 + +} + +func (_NonceManager *NonceManagerSession) Owner() (common.Address, error) { + return _NonceManager.Contract.Owner(&_NonceManager.CallOpts) +} + +func (_NonceManager *NonceManagerCallerSession) Owner() (common.Address, error) { + return _NonceManager.Contract.Owner(&_NonceManager.CallOpts) +} + +func (_NonceManager *NonceManagerCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _NonceManager.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_NonceManager *NonceManagerSession) TypeAndVersion() (string, error) { + return _NonceManager.Contract.TypeAndVersion(&_NonceManager.CallOpts) +} + +func (_NonceManager *NonceManagerCallerSession) TypeAndVersion() (string, error) { + return _NonceManager.Contract.TypeAndVersion(&_NonceManager.CallOpts) +} + +func (_NonceManager *NonceManagerTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NonceManager.contract.Transact(opts, "acceptOwnership") +} + +func (_NonceManager *NonceManagerSession) AcceptOwnership() (*types.Transaction, error) { + return _NonceManager.Contract.AcceptOwnership(&_NonceManager.TransactOpts) +} + +func (_NonceManager *NonceManagerTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _NonceManager.Contract.AcceptOwnership(&_NonceManager.TransactOpts) +} + +func (_NonceManager *NonceManagerTransactor) ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _NonceManager.contract.Transact(opts, "applyAuthorizedCallerUpdates", authorizedCallerArgs) +} + +func (_NonceManager *NonceManagerSession) ApplyAuthorizedCallerUpdates(authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _NonceManager.Contract.ApplyAuthorizedCallerUpdates(&_NonceManager.TransactOpts, authorizedCallerArgs) +} + +func (_NonceManager *NonceManagerTransactorSession) ApplyAuthorizedCallerUpdates(authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { + return _NonceManager.Contract.ApplyAuthorizedCallerUpdates(&_NonceManager.TransactOpts, authorizedCallerArgs) +} + +func (_NonceManager *NonceManagerTransactor) ApplyPreviousRampsUpdates(opts *bind.TransactOpts, previousRampsArgs []NonceManagerPreviousRampsArgs) (*types.Transaction, error) { + return _NonceManager.contract.Transact(opts, "applyPreviousRampsUpdates", previousRampsArgs) +} + +func (_NonceManager *NonceManagerSession) ApplyPreviousRampsUpdates(previousRampsArgs []NonceManagerPreviousRampsArgs) (*types.Transaction, error) { + return _NonceManager.Contract.ApplyPreviousRampsUpdates(&_NonceManager.TransactOpts, previousRampsArgs) +} + +func (_NonceManager *NonceManagerTransactorSession) ApplyPreviousRampsUpdates(previousRampsArgs []NonceManagerPreviousRampsArgs) (*types.Transaction, error) { + return _NonceManager.Contract.ApplyPreviousRampsUpdates(&_NonceManager.TransactOpts, previousRampsArgs) +} + +func (_NonceManager *NonceManagerTransactor) GetIncrementedOutboundNonce(opts *bind.TransactOpts, destChainSelector uint64, sender common.Address) (*types.Transaction, error) { + return _NonceManager.contract.Transact(opts, "getIncrementedOutboundNonce", destChainSelector, sender) +} + +func (_NonceManager *NonceManagerSession) GetIncrementedOutboundNonce(destChainSelector uint64, sender common.Address) (*types.Transaction, error) { + return _NonceManager.Contract.GetIncrementedOutboundNonce(&_NonceManager.TransactOpts, destChainSelector, sender) +} + +func (_NonceManager *NonceManagerTransactorSession) GetIncrementedOutboundNonce(destChainSelector uint64, sender common.Address) (*types.Transaction, error) { + return _NonceManager.Contract.GetIncrementedOutboundNonce(&_NonceManager.TransactOpts, destChainSelector, sender) +} + +func (_NonceManager *NonceManagerTransactor) IncrementInboundNonce(opts *bind.TransactOpts, sourceChainSelector uint64, expectedNonce uint64, sender []byte) (*types.Transaction, error) { + return _NonceManager.contract.Transact(opts, "incrementInboundNonce", sourceChainSelector, expectedNonce, sender) +} + +func (_NonceManager *NonceManagerSession) IncrementInboundNonce(sourceChainSelector uint64, expectedNonce uint64, sender []byte) (*types.Transaction, error) { + return _NonceManager.Contract.IncrementInboundNonce(&_NonceManager.TransactOpts, sourceChainSelector, expectedNonce, sender) +} + +func (_NonceManager *NonceManagerTransactorSession) IncrementInboundNonce(sourceChainSelector uint64, expectedNonce uint64, sender []byte) (*types.Transaction, error) { + return _NonceManager.Contract.IncrementInboundNonce(&_NonceManager.TransactOpts, sourceChainSelector, expectedNonce, sender) +} + +func (_NonceManager *NonceManagerTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _NonceManager.contract.Transact(opts, "transferOwnership", to) +} + +func (_NonceManager *NonceManagerSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _NonceManager.Contract.TransferOwnership(&_NonceManager.TransactOpts, to) +} + +func (_NonceManager *NonceManagerTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _NonceManager.Contract.TransferOwnership(&_NonceManager.TransactOpts, to) +} + +type NonceManagerAuthorizedCallerAddedIterator struct { + Event *NonceManagerAuthorizedCallerAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *NonceManagerAuthorizedCallerAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(NonceManagerAuthorizedCallerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(NonceManagerAuthorizedCallerAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *NonceManagerAuthorizedCallerAddedIterator) Error() error { + return it.fail +} + +func (it *NonceManagerAuthorizedCallerAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type NonceManagerAuthorizedCallerAdded struct { + Caller common.Address + Raw types.Log +} + +func (_NonceManager *NonceManagerFilterer) FilterAuthorizedCallerAdded(opts *bind.FilterOpts) (*NonceManagerAuthorizedCallerAddedIterator, error) { + + logs, sub, err := _NonceManager.contract.FilterLogs(opts, "AuthorizedCallerAdded") + if err != nil { + return nil, err + } + return &NonceManagerAuthorizedCallerAddedIterator{contract: _NonceManager.contract, event: "AuthorizedCallerAdded", logs: logs, sub: sub}, nil +} + +func (_NonceManager *NonceManagerFilterer) WatchAuthorizedCallerAdded(opts *bind.WatchOpts, sink chan<- *NonceManagerAuthorizedCallerAdded) (event.Subscription, error) { + + logs, sub, err := _NonceManager.contract.WatchLogs(opts, "AuthorizedCallerAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(NonceManagerAuthorizedCallerAdded) + if err := _NonceManager.contract.UnpackLog(event, "AuthorizedCallerAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_NonceManager *NonceManagerFilterer) ParseAuthorizedCallerAdded(log types.Log) (*NonceManagerAuthorizedCallerAdded, error) { + event := new(NonceManagerAuthorizedCallerAdded) + if err := _NonceManager.contract.UnpackLog(event, "AuthorizedCallerAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type NonceManagerAuthorizedCallerRemovedIterator struct { + Event *NonceManagerAuthorizedCallerRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *NonceManagerAuthorizedCallerRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(NonceManagerAuthorizedCallerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(NonceManagerAuthorizedCallerRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *NonceManagerAuthorizedCallerRemovedIterator) Error() error { + return it.fail +} + +func (it *NonceManagerAuthorizedCallerRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type NonceManagerAuthorizedCallerRemoved struct { + Caller common.Address + Raw types.Log +} + +func (_NonceManager *NonceManagerFilterer) FilterAuthorizedCallerRemoved(opts *bind.FilterOpts) (*NonceManagerAuthorizedCallerRemovedIterator, error) { + + logs, sub, err := _NonceManager.contract.FilterLogs(opts, "AuthorizedCallerRemoved") + if err != nil { + return nil, err + } + return &NonceManagerAuthorizedCallerRemovedIterator{contract: _NonceManager.contract, event: "AuthorizedCallerRemoved", logs: logs, sub: sub}, nil +} + +func (_NonceManager *NonceManagerFilterer) WatchAuthorizedCallerRemoved(opts *bind.WatchOpts, sink chan<- *NonceManagerAuthorizedCallerRemoved) (event.Subscription, error) { + + logs, sub, err := _NonceManager.contract.WatchLogs(opts, "AuthorizedCallerRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(NonceManagerAuthorizedCallerRemoved) + if err := _NonceManager.contract.UnpackLog(event, "AuthorizedCallerRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_NonceManager *NonceManagerFilterer) ParseAuthorizedCallerRemoved(log types.Log) (*NonceManagerAuthorizedCallerRemoved, error) { + event := new(NonceManagerAuthorizedCallerRemoved) + if err := _NonceManager.contract.UnpackLog(event, "AuthorizedCallerRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type NonceManagerOwnershipTransferRequestedIterator struct { + Event *NonceManagerOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *NonceManagerOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(NonceManagerOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(NonceManagerOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *NonceManagerOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *NonceManagerOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type NonceManagerOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_NonceManager *NonceManagerFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*NonceManagerOwnershipTransferRequestedIterator, 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 := _NonceManager.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &NonceManagerOwnershipTransferRequestedIterator{contract: _NonceManager.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_NonceManager *NonceManagerFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *NonceManagerOwnershipTransferRequested, 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 := _NonceManager.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: + + event := new(NonceManagerOwnershipTransferRequested) + if err := _NonceManager.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 +} + +func (_NonceManager *NonceManagerFilterer) ParseOwnershipTransferRequested(log types.Log) (*NonceManagerOwnershipTransferRequested, error) { + event := new(NonceManagerOwnershipTransferRequested) + if err := _NonceManager.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type NonceManagerOwnershipTransferredIterator struct { + Event *NonceManagerOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *NonceManagerOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(NonceManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(NonceManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *NonceManagerOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *NonceManagerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type NonceManagerOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_NonceManager *NonceManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*NonceManagerOwnershipTransferredIterator, 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 := _NonceManager.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &NonceManagerOwnershipTransferredIterator{contract: _NonceManager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_NonceManager *NonceManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *NonceManagerOwnershipTransferred, 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 := _NonceManager.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: + + event := new(NonceManagerOwnershipTransferred) + if err := _NonceManager.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 +} + +func (_NonceManager *NonceManagerFilterer) ParseOwnershipTransferred(log types.Log) (*NonceManagerOwnershipTransferred, error) { + event := new(NonceManagerOwnershipTransferred) + if err := _NonceManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type NonceManagerPreviousRampsUpdatedIterator struct { + Event *NonceManagerPreviousRampsUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *NonceManagerPreviousRampsUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(NonceManagerPreviousRampsUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(NonceManagerPreviousRampsUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *NonceManagerPreviousRampsUpdatedIterator) Error() error { + return it.fail +} + +func (it *NonceManagerPreviousRampsUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type NonceManagerPreviousRampsUpdated struct { + RemoteChainSelector uint64 + PrevRamp NonceManagerPreviousRamps + Raw types.Log +} + +func (_NonceManager *NonceManagerFilterer) FilterPreviousRampsUpdated(opts *bind.FilterOpts, remoteChainSelector []uint64) (*NonceManagerPreviousRampsUpdatedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _NonceManager.contract.FilterLogs(opts, "PreviousRampsUpdated", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &NonceManagerPreviousRampsUpdatedIterator{contract: _NonceManager.contract, event: "PreviousRampsUpdated", logs: logs, sub: sub}, nil +} + +func (_NonceManager *NonceManagerFilterer) WatchPreviousRampsUpdated(opts *bind.WatchOpts, sink chan<- *NonceManagerPreviousRampsUpdated, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _NonceManager.contract.WatchLogs(opts, "PreviousRampsUpdated", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(NonceManagerPreviousRampsUpdated) + if err := _NonceManager.contract.UnpackLog(event, "PreviousRampsUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_NonceManager *NonceManagerFilterer) ParsePreviousRampsUpdated(log types.Log) (*NonceManagerPreviousRampsUpdated, error) { + event := new(NonceManagerPreviousRampsUpdated) + if err := _NonceManager.contract.UnpackLog(event, "PreviousRampsUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type NonceManagerSkippedIncorrectNonceIterator struct { + Event *NonceManagerSkippedIncorrectNonce + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *NonceManagerSkippedIncorrectNonceIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(NonceManagerSkippedIncorrectNonce) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(NonceManagerSkippedIncorrectNonce) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *NonceManagerSkippedIncorrectNonceIterator) Error() error { + return it.fail +} + +func (it *NonceManagerSkippedIncorrectNonceIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type NonceManagerSkippedIncorrectNonce struct { + SourceChainSelector uint64 + Nonce uint64 + Sender []byte + Raw types.Log +} + +func (_NonceManager *NonceManagerFilterer) FilterSkippedIncorrectNonce(opts *bind.FilterOpts) (*NonceManagerSkippedIncorrectNonceIterator, error) { + + logs, sub, err := _NonceManager.contract.FilterLogs(opts, "SkippedIncorrectNonce") + if err != nil { + return nil, err + } + return &NonceManagerSkippedIncorrectNonceIterator{contract: _NonceManager.contract, event: "SkippedIncorrectNonce", logs: logs, sub: sub}, nil +} + +func (_NonceManager *NonceManagerFilterer) WatchSkippedIncorrectNonce(opts *bind.WatchOpts, sink chan<- *NonceManagerSkippedIncorrectNonce) (event.Subscription, error) { + + logs, sub, err := _NonceManager.contract.WatchLogs(opts, "SkippedIncorrectNonce") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(NonceManagerSkippedIncorrectNonce) + if err := _NonceManager.contract.UnpackLog(event, "SkippedIncorrectNonce", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_NonceManager *NonceManagerFilterer) ParseSkippedIncorrectNonce(log types.Log) (*NonceManagerSkippedIncorrectNonce, error) { + event := new(NonceManagerSkippedIncorrectNonce) + if err := _NonceManager.contract.UnpackLog(event, "SkippedIncorrectNonce", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_NonceManager *NonceManager) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _NonceManager.abi.Events["AuthorizedCallerAdded"].ID: + return _NonceManager.ParseAuthorizedCallerAdded(log) + case _NonceManager.abi.Events["AuthorizedCallerRemoved"].ID: + return _NonceManager.ParseAuthorizedCallerRemoved(log) + case _NonceManager.abi.Events["OwnershipTransferRequested"].ID: + return _NonceManager.ParseOwnershipTransferRequested(log) + case _NonceManager.abi.Events["OwnershipTransferred"].ID: + return _NonceManager.ParseOwnershipTransferred(log) + case _NonceManager.abi.Events["PreviousRampsUpdated"].ID: + return _NonceManager.ParsePreviousRampsUpdated(log) + case _NonceManager.abi.Events["SkippedIncorrectNonce"].ID: + return _NonceManager.ParseSkippedIncorrectNonce(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (NonceManagerAuthorizedCallerAdded) Topic() common.Hash { + return common.HexToHash("0xeb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef") +} + +func (NonceManagerAuthorizedCallerRemoved) Topic() common.Hash { + return common.HexToHash("0xc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda77580") +} + +func (NonceManagerOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (NonceManagerOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (NonceManagerPreviousRampsUpdated) Topic() common.Hash { + return common.HexToHash("0xa2e43edcbc4fd175ae4bebbe3fd6139871ed1f1783cd4a1ace59b90d302c3319") +} + +func (NonceManagerSkippedIncorrectNonce) Topic() common.Hash { + return common.HexToHash("0x606ff8179e5e3c059b82df931acc496b7b6053e8879042f8267f930e0595f69f") +} + +func (_NonceManager *NonceManager) Address() common.Address { + return _NonceManager.address +} + +type NonceManagerInterface interface { + GetAllAuthorizedCallers(opts *bind.CallOpts) ([]common.Address, error) + + GetInboundNonce(opts *bind.CallOpts, sourceChainSelector uint64, sender []byte) (uint64, error) + + GetOutboundNonce(opts *bind.CallOpts, destChainSelector uint64, sender common.Address) (uint64, error) + + GetPreviousRamps(opts *bind.CallOpts, chainSelector uint64) (NonceManagerPreviousRamps, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) + + ApplyPreviousRampsUpdates(opts *bind.TransactOpts, previousRampsArgs []NonceManagerPreviousRampsArgs) (*types.Transaction, error) + + GetIncrementedOutboundNonce(opts *bind.TransactOpts, destChainSelector uint64, sender common.Address) (*types.Transaction, error) + + IncrementInboundNonce(opts *bind.TransactOpts, sourceChainSelector uint64, expectedNonce uint64, sender []byte) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAuthorizedCallerAdded(opts *bind.FilterOpts) (*NonceManagerAuthorizedCallerAddedIterator, error) + + WatchAuthorizedCallerAdded(opts *bind.WatchOpts, sink chan<- *NonceManagerAuthorizedCallerAdded) (event.Subscription, error) + + ParseAuthorizedCallerAdded(log types.Log) (*NonceManagerAuthorizedCallerAdded, error) + + FilterAuthorizedCallerRemoved(opts *bind.FilterOpts) (*NonceManagerAuthorizedCallerRemovedIterator, error) + + WatchAuthorizedCallerRemoved(opts *bind.WatchOpts, sink chan<- *NonceManagerAuthorizedCallerRemoved) (event.Subscription, error) + + ParseAuthorizedCallerRemoved(log types.Log) (*NonceManagerAuthorizedCallerRemoved, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*NonceManagerOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *NonceManagerOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*NonceManagerOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*NonceManagerOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *NonceManagerOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*NonceManagerOwnershipTransferred, error) + + FilterPreviousRampsUpdated(opts *bind.FilterOpts, remoteChainSelector []uint64) (*NonceManagerPreviousRampsUpdatedIterator, error) + + WatchPreviousRampsUpdated(opts *bind.WatchOpts, sink chan<- *NonceManagerPreviousRampsUpdated, remoteChainSelector []uint64) (event.Subscription, error) + + ParsePreviousRampsUpdated(log types.Log) (*NonceManagerPreviousRampsUpdated, error) + + FilterSkippedIncorrectNonce(opts *bind.FilterOpts) (*NonceManagerSkippedIncorrectNonceIterator, error) + + WatchSkippedIncorrectNonce(opts *bind.WatchOpts, sink chan<- *NonceManagerSkippedIncorrectNonce) (event.Subscription, error) + + ParseSkippedIncorrectNonce(log types.Log) (*NonceManagerSkippedIncorrectNonce, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/offramp/offramp.go b/core/gethwrappers/ccip/generated/v1_6_0/offramp/offramp.go new file mode 100644 index 00000000000..fd3e1bba087 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/offramp/offramp.go @@ -0,0 +1,2612 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package offramp + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type ClientAny2EVMMessage struct { + MessageId [32]byte + SourceChainSelector uint64 + Sender []byte + Data []byte + DestTokenAmounts []ClientEVMTokenAmount +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type InternalAny2EVMRampMessage struct { + Header InternalRampMessageHeader + Sender []byte + Data []byte + Receiver common.Address + GasLimit *big.Int + TokenAmounts []InternalAny2EVMTokenTransfer +} + +type InternalAny2EVMTokenTransfer struct { + SourcePoolAddress []byte + DestTokenAddress common.Address + DestGasAmount uint32 + ExtraData []byte + Amount *big.Int +} + +type InternalExecutionReport struct { + SourceChainSelector uint64 + Messages []InternalAny2EVMRampMessage + OffchainTokenData [][][]byte + Proofs [][32]byte + ProofFlagBits *big.Int +} + +type InternalGasPriceUpdate struct { + DestChainSelector uint64 + UsdPerUnitGas *big.Int +} + +type InternalMerkleRoot struct { + SourceChainSelector uint64 + OnRampAddress []byte + MinSeqNr uint64 + MaxSeqNr uint64 + MerkleRoot [32]byte +} + +type InternalPriceUpdates struct { + TokenPriceUpdates []InternalTokenPriceUpdate + GasPriceUpdates []InternalGasPriceUpdate +} + +type InternalRampMessageHeader struct { + MessageId [32]byte + SourceChainSelector uint64 + DestChainSelector uint64 + SequenceNumber uint64 + Nonce uint64 +} + +type InternalTokenPriceUpdate struct { + SourceToken common.Address + UsdPerToken *big.Int +} + +type MultiOCR3BaseConfigInfo struct { + ConfigDigest [32]byte + F uint8 + N uint8 + IsSignatureVerificationEnabled bool +} + +type MultiOCR3BaseOCRConfig struct { + ConfigInfo MultiOCR3BaseConfigInfo + Signers []common.Address + Transmitters []common.Address +} + +type MultiOCR3BaseOCRConfigArgs struct { + ConfigDigest [32]byte + OcrPluginType uint8 + F uint8 + IsSignatureVerificationEnabled bool + Signers []common.Address + Transmitters []common.Address +} + +type OffRampDynamicConfig struct { + FeeQuoter common.Address + PermissionLessExecutionThresholdSeconds uint32 + MessageInterceptor common.Address +} + +type OffRampGasLimitOverride struct { + ReceiverExecutionGasLimit *big.Int + TokenGasOverrides []uint32 +} + +type OffRampSourceChainConfig struct { + Router common.Address + IsEnabled bool + MinSeqNr uint64 + IsRMNVerificationDisabled bool + OnRamp []byte +} + +type OffRampSourceChainConfigArgs struct { + Router common.Address + SourceChainSelector uint64 + IsEnabled bool + IsRMNVerificationDisabled bool + OnRamp []byte +} + +type OffRampStaticConfig struct { + ChainSelector uint64 + GasForCallExactCheck uint16 + RmnRemote common.Address + TokenAdminRegistry common.Address + NonceManager common.Address +} + +var OffRampMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applySourceChainConfigUpdates\",\"inputs\":[{\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfigArgs[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ccipReceive\",\"inputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structClient.Any2EVMMessage\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"commit\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"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\":\"execute\",\"inputs\":[{\"name\":\"reportContext\",\"type\":\"bytes32[2]\",\"internalType\":\"bytes32[2]\"},{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"executeSingleMessage\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInternal.Any2EVMRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllSourceChainConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOffRamp.SourceChainConfig[]\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExecutionState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLatestPriceSequenceNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMerkleRoot\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSourceChainConfig\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestConfigDetails\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"ocrConfig\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"components\":[{\"name\":\"configInfo\",\"type\":\"tuple\",\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"n\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"manuallyExecute\",\"inputs\":[{\"name\":\"reports\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"gasLimitOverrides\",\"type\":\"tuple[][]\",\"internalType\":\"structOffRamp.GasLimitOverride[][]\",\"components\":[{\"name\":\"receiverExecutionGasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverrides\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOCR3Configs\",\"inputs\":[{\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"components\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"F\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"signers\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AlreadyAttempted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CommitReportAccepted\",\"inputs\":[{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"transmitters\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"F\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecutionStateChanged\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"messageHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"state\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\"},{\"name\":\"returnData\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RootRemoved\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedAlreadyExecutedMessage\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SkippedReportExecution\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainConfigSet\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sourceConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.SourceChainConfig\",\"components\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"isRMNVerificationDisabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"onRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SourceChainSelectorAdded\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StaticConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasForCallExactCheck\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transmitted\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"indexed\":true,\"internalType\":\"uint8\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CanOnlySelfCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CommitOnRampMismatch\",\"inputs\":[{\"name\":\"reportOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"configOnRamp\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expected\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"actual\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"EmptyBatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EmptyReport\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ExecutionError\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ForkedChain\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InsufficientGasToCompleteTx\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[{\"name\":\"errorType\",\"type\":\"uint8\",\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\"}]},{\"type\":\"error\",\"name\":\"InvalidDataLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"got\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidInterval\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"min\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"max\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionGasLimit\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"newLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidManualExecutionTokenGasOverride\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"tokenIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"oldLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenGasOverride\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidMessageDestChainSelector\",\"inputs\":[{\"name\":\"messageDestChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNewState\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newState\",\"type\":\"uint8\",\"internalType\":\"enumInternal.MessageExecutionState\"}]},{\"type\":\"error\",\"name\":\"InvalidOnRampUpdate\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRoot\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LeavesCannotBeEmpty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionGasAmountCountMismatch\",\"inputs\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ManualExecutionGasLimitMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ManualExecutionNotYetEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MessageValidationError\",\"inputs\":[{\"name\":\"errorReason\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonUniqueSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotACompatiblePool\",\"inputs\":[{\"name\":\"notPool\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OracleCannotBeZeroAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReceiverError\",\"inputs\":[{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ReleaseOrMintBalanceMismatch\",\"inputs\":[{\"name\":\"amountReleased\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePre\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"balancePost\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"RootAlreadyCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"RootBlessingMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"isBlessed\",\"type\":\"bool\",\"internalType\":\"bool\"}]},{\"type\":\"error\",\"name\":\"RootNotCommitted\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SignatureVerificationNotAllowedInExecutionPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureVerificationRequiredInCommitPlugin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignaturesOutOfRegistration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SourceChainNotEnabled\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"SourceChainSelectorMismatch\",\"inputs\":[{\"name\":\"reportSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messageSourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"StaleCommitReport\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StaticConfigCannotBeChanged\",\"inputs\":[{\"name\":\"ocrPluginType\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"TokenDataMismatch\",\"inputs\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"TokenHandlingError\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"err\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"UnauthorizedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnauthorizedTransmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedTokenData\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WrongMessageLength\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actual\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"WrongNumberOfSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroChainSelectorNotAllowed\",\"inputs\":[]}]", + Bin: "0x610140806040523461084b57616654803803809161001d8285610881565b8339810190808203610120811261084b5760a0811261084b5760405161004281610866565b61004b836108a4565b8152602083015161ffff8116810361084b57602082019081526040840151906001600160a01b038216820361084b576040830191825261008d606086016108b8565b926060810193845260606100a3608088016108b8565b6080830190815295609f19011261084b5760405194606086016001600160401b03811187821017610850576040526100dd60a088016108b8565b865260c08701519463ffffffff8616860361084b576020870195865261010560e089016108b8565b6040880190815261010089015190986001600160401b03821161084b570189601f8201121561084b578051996001600160401b038b11610850578a60051b916040519b6101568d6020860190610881565b8c526020808d01938201019082821161084b5760208101935b82851061073a575050505050331561072957600180546001600160a01b031916331790554660805284516001600160a01b0316158015610717575b8015610705575b6106e35782516001600160401b0316156106f45782516001600160401b0390811660a090815286516001600160a01b0390811660c0528351811660e0528451811661010052865161ffff90811661012052604080519751909416875296519096166020860152955185169084015251831660608301525190911660808201527fb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b79190a181516001600160a01b0316156106e357905160048054835163ffffffff60a01b60a09190911b166001600160a01b039384166001600160c01b03199092168217179091558351600580549184166001600160a01b031990921691909117905560408051918252925163ffffffff166020820152925116908201527fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d90606090a160005b8151811015610656576020600582901b8301810151908101516001600160401b031690600082156106475781516001600160a01b0316156105ae57828152600860205260408120916080810151600184019261035384546108d9565b6105e8578454600160a81b600160e81b031916600160a81b1785556040518681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb990602090a15b815180159081156105bd575b506105ae578151916001600160401b03831161059a576103c785546108d9565b601f8111610555575b50602091601f84116001146104d65760ff948460019a9998956104c2956000805160206166348339815191529995606095926104cb575b5050600019600383901b1c1916908b1b1783555b604081015115158554908760a01b9060a01b16908760a01b1916178555898060a01b038151168a8060a01b0319865416178555015115158354908560e81b9060e81b16908560e81b191617835561047186610996565b506040519384936020855254898060a01b0381166020860152818160a01c1615156040860152898060401b038160a81c16606086015260e81c161515608084015260a08084015260c0830190610913565b0390a2016102f7565b015190503880610407565b9190601f198416868452828420935b81811061053d5750946001856104c2956000805160206166348339815191529995606095849e9d9c9960ff9b10610524575b505050811b01835561041b565b015160001960f88460031b161c19169055388080610517565b929360206001819287860151815501950193016104e5565b85835260208320601f850160051c81019160208610610590575b601f0160051c01905b81811061058557506103d0565b838155600101610578565b909150819061056f565b634e487b7160e01b82526041600452602482fd5b6342bcdf7f60e11b8152600490fd5b905060208301206040516020810190838252602081526105de604082610881565b51902014386103a7565b845460a81c6001600160401b03166001141580610619575b1561039b57632105803760e11b81526004869052602490fd5b506040516106328161062b8188610913565b0382610881565b60208151910120825160208401201415610600565b63c656089560e01b8152600490fd5b604051615c0a9081610a2a82396080518161327e015260a05181818161019f0152614367015260c0518181816101f501528181612ebd0152818161379201528181613a660152614301015260e0518181816102240152614b63015261010051818181610253015261472c0152610120518181816101c6015281816121b101528181614c5601526158bb0152f35b6342bcdf7f60e11b60005260046000fd5b63c656089560e01b60005260046000fd5b5081516001600160a01b0316156101b1565b5080516001600160a01b0316156101aa565b639b15e16f60e01b60005260046000fd5b84516001600160401b03811161084b57820160a0818603601f19011261084b576040519061076782610866565b60208101516001600160a01b038116810361084b57825261078a604082016108a4565b602083015261079b606082016108cc565b60408301526107ac608082016108cc565b606083015260a08101516001600160401b03811161084b57602091010185601f8201121561084b5780516001600160401b03811161085057604051916107fc601f8301601f191660200184610881565b818352876020838301011161084b5760005b828110610836575050918160006020809694958196010152608082015281520194019361016f565b8060208092840101518282870101520161080e565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761085057604052565b601f909101601f19168101906001600160401b0382119082101761085057604052565b51906001600160401b038216820361084b57565b51906001600160a01b038216820361084b57565b5190811515820361084b57565b90600182811c92168015610909575b60208310146108f357565b634e487b7160e01b600052602260045260246000fd5b91607f16916108e8565b60009291815491610923836108d9565b8083529260018116908115610979575060011461093f57505050565b60009081526020812093945091925b83831061095f575060209250010190565b60018160209294939454838587010152019101919061094e565b915050602093945060ff929192191683830152151560051b010190565b80600052600760205260406000205415600014610a235760065468010000000000000000811015610850576001810180600655811015610a0d577ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0181905560065460009182526007602052604090912055600190565b634e487b7160e01b600052603260045260246000fd5b5060009056fe6080604052600436101561001257600080fd5b60003560e01c806306285c6914610157578063181f5a77146101525780633f4b04aa1461014d5780635215505b146101485780635e36480c146101435780635e7bb0081461013e57806360987c20146101395780636f9e320f146101345780637437ff9f1461012f57806379ba50971461012a57806385572ffb146101255780638da5cb5b14610120578063c673e5841461011b578063ccd37ba314610116578063cd19723714610111578063de5e0b9a1461010c578063e9d68a8e14610107578063f2fde38b14610102578063f58e03fc146100fd5763f716f99f146100f857600080fd5b6118ae565b611791565b611706565b611661565b6115c5565b611467565b611408565b611343565b61125b565b611225565b6111a5565b611105565b610f90565b610f15565b610d0e565b610729565b6105ba565b61049e565b61043f565b61016c565b600091031261016757565b600080fd5b34610167576000366003190112610167576101856119e9565b506102cd604051610195816102e7565b6001600160401b037f000000000000000000000000000000000000000000000000000000000000000016815261ffff7f00000000000000000000000000000000000000000000000000000000000000001660208201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660408201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660608201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660808201526040519182918291909160806001600160a01b038160a08401956001600160401b03815116855261ffff6020820151166020860152826040820151166040860152826060820151166060860152015116910152565b0390f35b634e487b7160e01b600052604160045260246000fd5b60a081019081106001600160401b0382111761030257604052565b6102d1565b604081019081106001600160401b0382111761030257604052565b606081019081106001600160401b0382111761030257604052565b608081019081106001600160401b0382111761030257604052565b90601f801991011681019081106001600160401b0382111761030257604052565b6040519061038860c083610358565b565b6040519061038860a083610358565b60405190610388608083610358565b6040519061038861010083610358565b60405190610388604083610358565b6001600160401b03811161030257601f01601f191660200190565b604051906103f1602083610358565b60008252565b60005b83811061040a5750506000910152565b81810151838201526020016103fa565b90602091610433815180928185528580860191016103f7565b601f01601f1916010190565b34610167576000366003190112610167576102cd60408051906104628183610358565b600d82527f4f666652616d7020312e362e300000000000000000000000000000000000000060208301525191829160208352602083019061041a565b346101675760003660031901126101675760206001600160401b03600b5416604051908152f35b9060a06080610516936001600160a01b0381511684526020810151151560208501526001600160401b036040820151166040850152606081015115156060850152015191816080820152019061041a565b90565b6040810160408252825180915260206060830193019060005b81811061059b575050506020818303910152815180825260208201916020808360051b8301019401926000915b83831061056e57505050505090565b909192939460208061058c600193601f1986820301875289516104c5565b9701930193019193929061055f565b82516001600160401b0316855260209485019490920191600101610532565b34610167576000366003190112610167576006546105d781610771565b906105e56040519283610358565b808252601f196105f482610771565b0160005b8181106106b657505061060a81611a42565b9060005b8181106106265750506102cd60405192839283610519565b8061065c6106446106386001946141e8565b6001600160401b031690565b61064e8387611a9c565b906001600160401b03169052565b61069a61069561067c61066f8488611a9c565b516001600160401b031690565b6001600160401b03166000526008602052604060002090565b611b88565b6106a48287611a9c565b526106af8186611a9c565b500161060e565b6020906106c1611a14565b828287010152016105f8565b600435906001600160401b038216820361016757565b35906001600160401b038216820361016757565b634e487b7160e01b600052602160045260246000fd5b6004111561071757565b6106f7565b9060048210156107175752565b34610167576040366003190112610167576107426106cd565b602435906001600160401b03821682036101675760209161076291611c31565b61076f604051809261071c565bf35b6001600160401b0381116103025760051b60200190565b91908260a0910312610167576040516107a0816102e7565b60806107e5818395803585526107b8602082016106e3565b60208601526107c9604082016106e3565b60408601526107da606082016106e3565b6060860152016106e3565b910152565b9291926107f6826103c7565b916108046040519384610358565b829481845281830111610167578281602093846000960137010152565b9080601f8301121561016757816020610516933591016107ea565b6001600160a01b0381160361016757565b35906103888261083c565b63ffffffff81160361016757565b359061038882610858565b81601f820112156101675780359061088882610771565b926108966040519485610358565b82845260208085019360051b830101918183116101675760208101935b8385106108c257505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757604051916108ef836102e7565b60208201356001600160401b0381116101675785602061091192850101610821565b835260408201356109218161083c565b602084015261093260608301610866565b60408401526080820135926001600160401b0384116101675760a08361095f886020809881980101610821565b6060840152013560808201528152019401936108b3565b919091610140818403126101675761098c610379565b926109978183610788565b845260a08201356001600160401b03811161016757816109b8918401610821565b602085015260c08201356001600160401b03811161016757816109dc918401610821565b60408501526109ed60e0830161084d565b606085015261010082013560808501526101208201356001600160401b03811161016757610a1b9201610871565b60a0830152565b9080601f83011215610167578135610a3981610771565b92610a476040519485610358565b81845260208085019260051b820101918383116101675760208201905b838210610a7357505050505090565b81356001600160401b03811161016757602091610a9587848094880101610976565b815201910190610a64565b81601f8201121561016757803590610ab782610771565b92610ac56040519485610358565b82845260208085019360051b830101918183116101675760208101935b838510610af157505050505090565b84356001600160401b03811161016757820183603f82011215610167576020810135610b1c81610771565b91610b2a6040519384610358565b8183526020808085019360051b83010101918683116101675760408201905b838210610b63575050509082525060209485019401610ae2565b81356001600160401b03811161016757602091610b878a8480809589010101610821565b815201910190610b49565b929190610b9e81610771565b93610bac6040519586610358565b602085838152019160051b810192831161016757905b828210610bce57505050565b8135815260209182019101610bc2565b9080601f830112156101675781602061051693359101610b92565b81601f8201121561016757803590610c1082610771565b92610c1e6040519485610358565b82845260208085019360051b830101918183116101675760208101935b838510610c4a57505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757610c7261038a565b91610c7f602083016106e3565b835260408201356001600160401b03811161016757856020610ca392850101610a22565b602084015260608201356001600160401b03811161016757856020610cca92850101610aa0565b60408401526080820135926001600160401b0384116101675760a083610cf7886020809881980101610bde565b606084015201356080820152815201940193610c3b565b34610167576040366003190112610167576004356001600160401b03811161016757610d3e903690600401610bf9565b6024356001600160401b038111610167573660238201121561016757806004013591610d6983610771565b91610d776040519384610358565b8383526024602084019460051b820101903682116101675760248101945b828610610da857610da68585611c79565b005b85356001600160401b03811161016757820136604382011215610167576024810135610dd381610771565b91610de16040519384610358565b818352602060248185019360051b83010101903682116101675760448101925b828410610e1b575050509082525060209586019501610d95565b83356001600160401b038111610167576024908301016040601f1982360301126101675760405190610e4c82610307565b6020810135825260408101356001600160401b03811161016757602091010136601f8201121561016757803590610e8282610771565b91610e906040519384610358565b80835260208084019160051b8301019136831161016757602001905b828210610ecb5750505091816020938480940152815201930192610e01565b602080918335610eda81610858565b815201910190610eac565b9181601f84011215610167578235916001600160401b038311610167576020808501948460051b01011161016757565b34610167576060366003190112610167576004356001600160401b03811161016757610f45903690600401610976565b6024356001600160401b03811161016757610f64903690600401610ee5565b91604435926001600160401b03841161016757610f88610da6943690600401610ee5565b939092612089565b34610167576060366003190112610167576000604051610faf81610322565b600435610fbb8161083c565b8152602435610fc981610858565b6020820190815260443590610fdd8261083c565b60408301918252610fec613534565b6001600160a01b03835116156110f657916110b86001600160a01b036110f0937fa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d95611051838651166001600160a01b03166001600160a01b03196004541617600455565b517fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff77ffffffff00000000000000000000000000000000000000006004549260a01b1691161760045551166001600160a01b03166001600160a01b03196005541617600555565b6040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b0390a180f35b6342bcdf7f60e11b8452600484fd5b346101675760003660031901126101675760006040805161112581610322565b82815282602082015201526102cd60405161113f81610322565b63ffffffff6004546001600160a01b038116835260a01c1660208201526001600160a01b036005541660408201526040519182918291909160406001600160a01b0381606084019582815116855263ffffffff6020820151166020860152015116910152565b34610167576000366003190112610167576000546001600160a01b0381163303611214576001600160a01b0319600154913382841617600155166000556001600160a01b033391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b63015aa1e360e11b60005260046000fd5b34610167576020366003190112610167576004356001600160401b0381116101675760a090600319903603011261016757600080fd5b346101675760003660031901126101675760206001600160a01b0360015416604051908152f35b6004359060ff8216820361016757565b359060ff8216820361016757565b906020808351928381520192019060005b8181106112be5750505090565b82516001600160a01b03168452602093840193909201916001016112b1565b906105169160208152606082518051602084015260ff602082015116604084015260ff60408201511682840152015115156080820152604061132e602084015160c060a085015260e08401906112a0565b9201519060c0601f19828503019101526112a0565b346101675760203660031901126101675760ff61135e611282565b60606040805161136d81610322565b81516113788161033d565b6000815260006020820152600083820152600084820152815282602082015201521660005260026020526102cd604060002060036113f7604051926113bc84610322565b6113c581612366565b84526040516113e2816113db816002860161239f565b0382610358565b60208501526113db604051809481930161239f565b6040820152604051918291826112dd565b34610167576040366003190112610167576114216106cd565b6001600160401b036024359116600052600a6020526040600020906000526020526020604060002054604051908152f35b8015150361016757565b359061038882611452565b34610167576020366003190112610167576004356001600160401b0381116101675736602382011215610167578060040135906114a382610771565b906114b16040519283610358565b8282526024602083019360051b820101903682116101675760248101935b8285106114df57610da6846123f6565b84356001600160401b03811161016757820160a06023198236030112610167576040519161150c836102e7565b602482013561151a8161083c565b8352611528604483016106e3565b6020840152606482013561153b81611452565b6040840152608482013561154e81611452565b606084015260a4820135926001600160401b0384116101675761157b602094936024869536920101610821565b60808201528152019401936114cf565b9060049160441161016757565b9181601f84011215610167578235916001600160401b038311610167576020838186019501011161016757565b346101675760c0366003190112610167576115df3661158b565b6044356001600160401b038111610167576115fe903690600401611598565b6064929192356001600160401b03811161016757611620903690600401610ee5565b60843594916001600160401b03861161016757611644610da6963690600401610ee5565b94909360a43596612cb9565b9060206105169281815201906104c5565b34610167576020366003190112610167576001600160401b036116826106cd565b61168a611a14565b501660005260086020526102cd60406000206116f56001604051926116ae846102e7565b6116ef60ff82546001600160a01b0381168752818160a01c16151560208801526001600160401b038160a81c16604088015260e81c16606086019015159052565b01611b6d565b608082015260405191829182611650565b34610167576020366003190112610167576001600160a01b0360043561172b8161083c565b611733613534565b1633811461178057806001600160a01b031960005416176000556001600160a01b03600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b636d6c4ee560e11b60005260046000fd5b34610167576060366003190112610167576117ab3661158b565b6044356001600160401b038111610167576117ca903690600401611598565b91828201602083820312610167578235906001600160401b038211610167576117f4918401610bf9565b6040519060206118048184610358565b60008352601f19810160005b81811061183857505050610da69491611828916132bf565b611830612f33565b928392613bb0565b60608582018401528201611810565b9080601f8301121561016757813561185e81610771565b9261186c6040519485610358565b81845260208085019260051b82010192831161016757602001905b8282106118945750505090565b6020809183356118a38161083c565b815201910190611887565b34610167576020366003190112610167576004356001600160401b0381116101675736602382011215610167578060040135906118ea82610771565b906118f86040519283610358565b8282526024602083019360051b820101903682116101675760248101935b82851061192657610da684612f4f565b84356001600160401b03811161016757820160c060231982360301126101675761194e610379565b916024820135835261196260448301611292565b602084015261197360648301611292565b60408401526119846084830161145c565b606084015260a48201356001600160401b038111610167576119ac9060243691850101611847565b608084015260c4820135926001600160401b038411610167576119d9602094936024869536920101611847565b60a0820152815201940193611916565b604051906119f6826102e7565b60006080838281528260208201528260408201528260608201520152565b60405190611a21826102e7565b60606080836000815260006020820152600060408201526000838201520152565b90611a4c82610771565b611a596040519182610358565b8281528092611a6a601f1991610771565b0190602036910137565b634e487b7160e01b600052603260045260246000fd5b805115611a975760200190565b611a74565b8051821015611a975760209160051b010190565b90600182811c92168015611ae0575b6020831014611aca57565b634e487b7160e01b600052602260045260246000fd5b91607f1691611abf565b60009291815491611afa83611ab0565b8083529260018116908115611b505750600114611b1657505050565b60009081526020812093945091925b838310611b36575060209250010190565b600181602092949394548385870101520191019190611b25565b915050602093945060ff929192191683830152151560051b010190565b90610388611b819260405193848092611aea565b0383610358565b9060016080604051611b99816102e7565b611bef819560ff81546001600160a01b0381168552818160a01c16151560208601526001600160401b038160a81c16604086015260e81c1615156060840152611be86040518096819301611aea565b0384610358565b0152565b634e487b7160e01b600052601160045260246000fd5b908160051b9180830460201490151715611c1f57565b611bf3565b91908203918211611c1f57565b611c3d82607f92613238565b9116906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611c1f576003911c1660048110156107175790565b611c8161327c565b805182518103611e7c5760005b818110611ca157505090610388916132bf565b611cab8184611a9c565b516020810190815151611cbe8488611a9c565b519283518203611e7c5790916000925b808410611ce2575050505050600101611c8e565b91949398611cf4848b98939598611a9c565b515198611d02888851611a9c565b519980611e33575b5060a08a01988b6020611d208b8d515193611a9c565b5101515103611df25760005b8a5151811015611ddd57611d68611d5f611d558f6020611d4d8f8793611a9c565b510151611a9c565b5163ffffffff1690565b63ffffffff1690565b8b81611d79575b5050600101611d2c565b611d5f6040611d8c85611d989451611a9c565b51015163ffffffff1690565b90818110611da757508b611d6f565b8d51516040516348e617b360e01b81526004810191909152602481019390935260448301919091526064820152608490fd5b0390fd5b50985098509893949095600101929091611cce565b611e2f8b51611e0d606082519201516001600160401b031690565b6370a193fd60e01b6000526004919091526001600160401b0316602452604490565b6000fd5b60808b0151811015611d0a57611e2f908b611e5588516001600160401b031690565b905151633a98d46360e11b6000526001600160401b03909116600452602452604452606490565b6320f8fd5960e21b60005260046000fd5b60405190611e9a82610307565b60006020838281520152565b60405190611eb5602083610358565b600080835282815b828110611ec957505050565b602090611ed4611e8d565b82828501015201611ebd565b805182526001600160401b0360208201511660208301526080611f27611f15604084015160a0604087015260a086019061041a565b6060840151858203606087015261041a565b9101519160808183039101526020808351928381520192019060005b818110611f505750505090565b825180516001600160a01b031685526020908101518186015260409094019390920191600101611f43565b906020610516928181520190611ee0565b6040513d6000823e3d90fd5b3d15611fc3573d90611fa9826103c7565b91611fb76040519384610358565b82523d6000602084013e565b606090565b90602061051692818152019061041a565b9091606082840312610167578151611ff081611452565b9260208301516001600160401b0381116101675783019080601f830112156101675781519161201e836103c7565b9161202c6040519384610358565b838352602084830101116101675760409261204d91602080850191016103f7565b92015190565b9293606092959461ffff6120776001600160a01b0394608088526080880190611ee0565b97166020860152604085015216910152565b929093913033036123555761209c611ea6565b9460a0850151805161230e575b50505050508051916120c7602084519401516001600160401b031690565b9060208301519160408401926120f48451926120e161038a565b9788526001600160401b03166020880152565b6040860152606085015260808401526001600160a01b0361211d6005546001600160a01b031690565b1680612291575b5051511580612285575b801561226f575b8015612246575b612242576121da918161217f61217361216661067c602060009751016001600160401b0390511690565b546001600160a01b031690565b6001600160a01b031690565b908361219a606060808401519301516001600160a01b031690565b604051633cf9798360e01b815296879586948593917f00000000000000000000000000000000000000000000000000000000000000009060048601612053565b03925af190811561223d57600090600092612216575b50156121f95750565b6040516302a35ba360e21b8152908190611dd99060048301611fc8565b905061223591503d806000833e61222d8183610358565b810190611fd9565b5090386121f0565b611f8c565b5050565b5061226a61226661226160608401516001600160a01b031690565b6134e6565b1590565b61213c565b5060608101516001600160a01b03163b15612135565b5060808101511561212e565b803b1561016757600060405180926308d450a160e01b82528183816122b98a60048301611f7b565b03925af190816122f3575b506122ed57611dd96122d4611f98565b6040516309c2532560e01b815291829160048301611fc8565b38612124565b80612302600061230893610358565b8061015c565b386122c4565b859650602061234a96015161232d60608901516001600160a01b031690565b9061234460208a51016001600160401b0390511690565b926133cd565b9038808080806120a9565b6306e34e6560e31b60005260046000fd5b906040516123738161033d565b606060ff600183958054855201548181166020850152818160081c16604085015260101c161515910152565b906020825491828152019160005260206000209060005b8181106123c35750505090565b82546001600160a01b03168452602090930192600192830192016123b6565b90610388611b81926040519384809261239f565b6123fe613534565b60005b8151811015612242576124148183611a9c565b519061242a60208301516001600160401b031690565b6001600160401b0381169081156126c05761245261217361217386516001600160a01b031690565b1561262b57612474816001600160401b03166000526008602052604060002090565b60808501519060018101926124898454611ab0565b612652576124fc7ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb9916124e284750100000000000000000000000000000000000000000067ffffffffffffffff60a81b19825416179055565b6040516001600160401b0390911681529081906020820190565b0390a15b8151801590811561263c575b5061262b5761260c6125d7606060019861254a612622967fbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c986135d6565b6125a061255a6040830151151590565b86547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178655565b6125d06125b482516001600160a01b031690565b86906001600160a01b03166001600160a01b0319825416179055565b0151151590565b82547fffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690151560e81b60ff60e81b16178255565b612615846159ce565b50604051918291826136a7565b0390a201612401565b6342bcdf7f60e11b60005260046000fd5b9050602083012061264b613559565b143861250c565b60016001600160401b0361267184546001600160401b039060a81c1690565b161415806126a1575b6126845750612500565b632105803760e11b6000526001600160401b031660045260246000fd5b506126ab84611b6d565b6020815191012083516020850120141561267a565b63c656089560e01b60005260046000fd5b35906001600160e01b038216820361016757565b81601f82011215610167578035906126fc82610771565b9261270a6040519485610358565b82845260208085019360061b8301019181831161016757602001925b828410612734575050505090565b604084830312610167576020604091825161274e81610307565b612757876106e3565b81526127648388016126d1565b83820152815201930192612726565b9190604083820312610167576040519061278c82610307565b819380356001600160401b03811161016757810182601f820112156101675780356127b681610771565b916127c46040519384610358565b81835260208084019260061b8201019085821161016757602001915b81831061280d5750505083526020810135916001600160401b038311610167576020926107e592016126e5565b604083870312610167576020604091825161282781610307565b85356128328161083c565b815261283f8387016126d1565b838201528152019201916127e0565b81601f820112156101675780359061286582610771565b926128736040519485610358565b82845260208085019360051b830101918183116101675760208101935b83851061289f57505050505090565b84356001600160401b03811161016757820160a0818503601f19011261016757604051916128cc836102e7565b6128d8602083016106e3565b83526040820135926001600160401b0384116101675760a083612902886020809881980101610821565b85840152612912606082016106e3565b6040840152612923608082016106e3565b606084015201356080820152815201940193612890565b81601f820112156101675780359061295182610771565b9261295f6040519485610358565b82845260208085019360061b8301019181831161016757602001925b828410612989575050505090565b60408483031261016757602060409182516129a381610307565b86358152828701358382015281520193019261297b565b602081830312610167578035906001600160401b0382116101675701608081830312610167576129e8610399565b9181356001600160401b0381116101675781612a05918401612773565b835260208201356001600160401b0381116101675781612a2691840161284e565b602084015260408201356001600160401b0381116101675781612a4a91840161284e565b604084015260608201356001600160401b03811161016757612a6c920161293a565b606082015290565b9080602083519182815201916020808360051b8301019401926000915b838310612aa057505050505090565b9091929394602080600192601f198582030186528851906001600160401b038251168152608080612ade8585015160a08786015260a085019061041a565b936001600160401b0360408201511660408501526001600160401b036060820151166060850152015191015297019301930191939290612a91565b916001600160a01b03612b3a92168352606060208401526060830190612a74565b9060408183039101526020808351928381520192019060005b818110612b605750505090565b8251805185526020908101518186015260409094019390920191600101612b53565b6084019081608411611c1f57565b60a001908160a011611c1f57565b91908201809211611c1f57565b906020808351928381520192019060005b818110612bc95750505090565b825180516001600160401b031685526020908101516001600160e01b03168186015260409094019390920191600101612bbc565b9190604081019083519160408252825180915260206060830193019060005b818110612c3d57505050602061051693940151906020818403910152612bab565b825180516001600160a01b031686526020908101516001600160e01b03168187015260409095019490920191600101612c1c565b906020610516928181520190612bfd565b91612cab90612c9d6105169593606086526060860190612a74565b908482036020860152612a74565b916040818403910152612bfd565b9197939796929695909495612cd0818701876129ba565b95602087019788518051612eb3575b5087518051511590811591612ea4575b50612dbf575b60005b89518051821015612d1f5790612d19612d1382600194611a9c565b51613757565b01612cf8565b50509193959799989092949698600099604081019a5b8b518051821015612d5c5790612d56612d5082600194611a9c565b51613a2b565b01612d35565b5050907fb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47612db193926103889c612da7612db998999a9b9c9d9f519151925160405193849384612c82565b0390a13691610b92565b943691610b92565b93613eaa565b612dd4602086015b356001600160401b031690565b600b546001600160401b0382811691161015612e7c57612e0a906001600160401b03166001600160401b0319600b541617600b55565b612e226121736121736004546001600160a01b031690565b885190803b1561016757604051633937306f60e01b8152916000918391829084908290612e529060048301612c71565b03925af1801561223d57612e67575b50612cf5565b806123026000612e7693610358565b38612e61565b50612e8f89515160408a01515190612b9e565b612cf557632261116760e01b60005260046000fd5b60209150015151151538612cef565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169060608a0151823b1561016757604051633854844f60e11b815292600092849283918291612f0f913060048501612b19565b03915afa801561223d5715612cdf57806123026000612f2d93610358565b38612cdf565b60405190612f42602083610358565b6000808352366020840137565b612f57613534565b60005b815181101561224257612f6d8183611a9c565b51906040820160ff612f80825160ff1690565b161561322257602083015160ff1692612fa68460ff166000526002602052604060002090565b9160018301918254612fc1612fbb8260ff1690565b60ff1690565b6131e75750612fee612fd66060830151151590565b845462ff0000191690151560101b62ff000016178455565b60a0810191825161010081511161318f578051156131d1576003860161301c613016826123e2565b8a61501a565b60608401516130ac575b947fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547946002946130886130786130a69a966130718760019f9c61306c61309e9a8f615188565b6140eb565b5160ff1690565b845460ff191660ff821617909455565b5190818555519060405195869501908886614171565b0390a161520a565b01612f5a565b979460028793959701966130c86130c2896123e2565b8861501a565b6080850151946101008651116131bb5785516130f0612fbb6130eb8a5160ff1690565b6140d7565b10156131a557855184511161318f576130886130787fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547986130718760019f61306c6130a69f9a8f61317760029f61317161309e9f8f9061306c8492613156845160ff1690565b908054909161ff001990911660089190911b61ff0016179055565b826150ae565b505050979c9f50975050969a50505094509450613026565b631b3fab5160e11b600052600160045260246000fd5b631b3fab5160e11b600052600360045260246000fd5b631b3fab5160e11b600052600260045260246000fd5b631b3fab5160e11b600052600560045260246000fd5b60101c60ff166132026131fd6060840151151590565b151590565b90151514612fee576321fd80df60e21b60005260ff861660045260246000fd5b631b3fab5160e11b600090815260045260246000fd5b906001600160401b03613278921660005260096020526701ffffffffffffff60406000209160071c166001600160401b0316600052602052604060002090565b5490565b7f00000000000000000000000000000000000000000000000000000000000000004681036132a75750565b630f01ce8560e01b6000526004524660245260446000fd5b9190918051156133615782511592602091604051926132de8185610358565b60008452601f19810160005b81811061333d5750505060005b8151811015613335578061331e61331060019385611a9c565b5188156133245786906142b0565b016132f7565b61332e8387611a9c565b51906142b0565b505050509050565b829060405161334b81610307565b60008152606083820152828289010152016132ea565b63c2e5347d60e01b60005260046000fd5b9190811015611a975760051b0190565b3561051681610858565b9190811015611a975760051b81013590601e19813603018212156101675701908135916001600160401b038311610167576020018236038113610167579190565b909294919397968151966133e088610771565b976133ee604051998a610358565b8089526133fd601f1991610771565b0160005b8181106134cf57505060005b83518110156134c257806134548c8a8a8a61344e613447878d613440828f8f9d8f9e60019f81613470575b505050611a9c565b519761338c565b36916107ea565b93614b14565b61345e828c611a9c565b52613469818b611a9c565b500161340d565b63ffffffff613488613483858585613372565b613382565b1615613438576134b89261349f9261348392613372565b60406134ab8585611a9c565b51019063ffffffff169052565b8f8f908391613438565b5096985050505050505050565b6020906134da611e8d565b82828d01015201613401565b6134f76385572ffb60e01b82614e77565b9081613511575b81613507575090565b6105169150614e49565b905061351c81614dce565b15906134fe565b6134f763aff2afbf60e01b82614e77565b6001600160a01b0360015416330361354857565b6315ae3a6f60e11b60005260046000fd5b60405160208101906000825260208152613574604082610358565b51902090565b818110613585575050565b6000815560010161357a565b9190601f81116135a057505050565b610388926000526020600020906020601f840160051c830193106135cc575b601f0160051c019061357a565b90915081906135bf565b91909182516001600160401b038111610302576135fd816135f78454611ab0565b84613591565b6020601f821160011461363e57819061362f939495600092613633575b50508160011b916000199060031b1c19161790565b9055565b01519050388061361a565b601f1982169061365384600052602060002090565b9160005b81811061368f57509583600195969710613676575b505050811b019055565b015160001960f88460031b161c1916905538808061366c565b9192602060018192868b015181550194019201613657565b90600160c0610516936020815260ff84546001600160a01b0381166020840152818160a01c16151560408401526001600160401b038160a81c16606084015260e81c161515608082015260a080820152019101611aea565b90816020910312610167575161051681611452565b909161372b6105169360408452604084019061041a565b916020818403910152611aea565b6001600160401b036001911601906001600160401b038211611c1f57565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d576000916139fc575b506139de576137d982614ea7565b805460ff60e882901c1615156001146139b3576020830180516020815191012090600184019161380883611b6d565b602081519101200361399657505060408301516001600160401b039081169160a81c16811480159061396e575b61392d5750608082015191821561391c5761387683613867866001600160401b0316600052600a602052604060002090565b90600052602052604060002090565b546138f9576138f6929161389f61389a60606138d89401516001600160401b031690565b613739565b67ffffffffffffffff60a81b197cffffffffffffffff00000000000000000000000000000000000000000083549260a81b169116179055565b61386742936001600160401b0316600052600a602052604060002090565b55565b6332cf0cbf60e01b6000526001600160401b038416600452602483905260446000fd5b63504570e360e01b60005260046000fd5b83611e2f9161394660608601516001600160401b031690565b636af0786b60e11b6000526001600160401b0392831660045290821660245216604452606490565b5061398661063860608501516001600160401b031690565b6001600160401b03821611613835565b51611dd960405192839263b80d8fa960e01b845260048401613714565b60808301516348e2b93360e11b6000526001600160401b038516600452602452600160445260646000fd5b637edeb53960e11b6000526001600160401b03821660045260246000fd5b613a1e915060203d602011613a24575b613a168183610358565b8101906136ff565b386137cb565b503d613a0c565b8051604051632cbc26bb60e01b815267ffffffffffffffff60801b608083901b1660048201526001600160401b0390911691906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d57600091613b06575b506139de57613aad82614ea7565b805460ff60e882901c1615613ad8576020830180516020815191012090600184019161380883611b6d565b60808301516348e2b93360e11b60009081526001600160401b03861660045260249190915260445260646000fd5b613b1f915060203d602011613a2457613a168183610358565b38613a9f565b6003111561071757565b60038210156107175752565b90610388604051613b4b81610307565b602060ff829554818116845260081c169101613b2f565b8054821015611a975760005260206000200190600090565b60ff60019116019060ff8211611c1f57565b60ff601b9116019060ff8211611c1f57565b90606092604091835260208301370190565b6001600052600260205293613be47fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e0612366565b93853594613bf185612b82565b6060820190613c008251151590565b613e7c575b803603613e6457508151878103613e4b5750613c1f61327c565b60016000526003602052613c6e613c697fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c5b336001600160a01b0316600052602052604060002090565b613b3b565b60026020820151613c7e81613b25565b613c8781613b25565b149081613de3575b5015613db7575b51613cee575b50505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613cd2612dc760019460200190565b604080519283526001600160401b0391909116602083015290a2565b613d0f612fbb613d0a602085969799989a955194015160ff1690565b613b7a565b03613da6578151835103613d9557613d8d6000613cd294612dc794613d597f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef09960019b36916107ea565b60208151910120604051613d8481613d7689602083019586613b9e565b03601f198101835282610358565b5190208a614ee4565b948394613c9c565b63a75d88af60e01b60005260046000fd5b6371253a2560e01b60005260046000fd5b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613c9657631b41e11d60e31b60005260046000fd5b60016000526002602052613e43915061217390613e3090613e2a60037fe90b7bceb6e7df5418fb78d8ee546e97c83a08bbccc01a0644d599ccd2a7c2e05b01915160ff1690565b90613b62565b90546001600160a01b039160031b1c1690565b331438613c8f565b6324f7d61360e21b600052600452602487905260446000fd5b638e1192e160e01b6000526004523660245260446000fd5b613ea590613e9f613e95613e908751611c09565b612b90565b613e9f8851611c09565b90612b9e565b613c05565b60008052600260205294909390929091613ee37fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b612366565b94863595613ef083612b82565b6060820190613eff8251151590565b6140b4575b803603613e645750815188810361409b5750613f1e61327c565b600080526003602052613f53613c697f3617319a054d772f909f7c479a2cebe5066e836a939412e32403c99029b92eff613c51565b60026020820151613f6381613b25565b613f6c81613b25565b149081614052575b5015614026575b51613fb8575b5050505050507f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef090613cd2612dc760009460200190565b613fd4612fbb613d0a602087989a999b96975194015160ff1690565b03613da6578351865103613d95576000967f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef096613cd295613d5961401d94612dc79736916107ea565b94839438613f81565b72c11c11c11c11c11c11c11c11c11c11c11c11c1330315613f7b57631b41e11d60e31b60005260046000fd5b600080526002602052614093915061217390613e3090613e2a60037fac33ff75c19e70fe83507db0d683fd3465c996598dc972688b7ace676c89077b613e21565b331438613f74565b6324f7d61360e21b600052600452602488905260446000fd5b6140d290613e9f6140c8613e908951611c09565b613e9f8a51611c09565b613f04565b60ff166003029060ff8216918203611c1f57565b8151916001600160401b03831161030257680100000000000000008311610302576020908254848455808510614154575b500190600052602060002060005b8381106141375750505050565b60019060206001600160a01b03855116940193818401550161412a565b61416b90846000528584600020918201910161357a565b3861411c565b95949392909160ff61419693168752602087015260a0604087015260a086019061239f565b84810360608601526020808351928381520192019060005b8181106141c9575050509060806103889294019060ff169052565b82516001600160a01b03168452602093840193909201916001016141ae565b600654811015611a975760066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015490565b6001600160401b03610516949381606094168352166020820152816040820152019061041a565b60409061051693928152816020820152019061041a565b9291906001600160401b0390816064951660045216602452600481101561071757604452565b94939261429a6060936142ab938852602088019061071c565b60806040870152608086019061041a565b930152565b906142c282516001600160401b031690565b8151604051632cbc26bb60e01b815267ffffffffffffffff60801b608084901b1660048201529015159391906001600160401b038216906020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561223d576000916149fd575b5061499e57602083019182515194851561496e5760408501805151870361495d5761436487611a42565b957f000000000000000000000000000000000000000000000000000000000000000061439460016116ef87614ea7565b602081519101206040516143f481613d766020820194868b876001600160401b036060929594938160808401977f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f85521660208401521660408201520152565b519020906001600160401b031660005b8a81106148c5575050508060806060614424930151910151908886615436565b9788156148a75760005b8881106144415750505050505050505050565b5a614456614450838a51611a9c565b51615468565b80516060015161446f906001600160401b031688611c31565b6144788161070d565b8015908d8283159384614894575b1561485157606088156147d457506144ad60206144a3898d611a9c565b5101519242611c24565b6004546144c29060a01c63ffffffff16611d5f565b1080156147c1575b156147a3576144d9878b611a9c565b515161478d575b8451608001516144f8906001600160401b0316610638565b6146d5575b50614509868951611a9c565b5160a085015151815103614699579361456e9695938c938f9661454e8e958c9261454861454260608951016001600160401b0390511690565b896154b2565b8661576a565b9a90809661456860608851016001600160401b0390511690565b90615537565b614647575b505061457e8261070d565b600282036145ff575b6001966145f57f05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b936001600160401b039351926145e66145dd8b6145d560608801516001600160401b031690565b96519b611a9c565b51985a90611c24565b91604051958695169885614281565b0390a45b0161442e565b9150919394925061460f8261070d565b60038203614623578b929493918a91614587565b51606001516349362d1f60e11b600052611e2f91906001600160401b03168961425b565b6146508461070d565b6003840361457357909294955061466891935061070d565b614678578b92918a913880614573565b5151604051632b11b8d960e01b8152908190611dd990879060048401614244565b611e2f8b6146b360608851016001600160401b0390511690565b631cfe6d8b60e01b6000526001600160401b0391821660045216602452604490565b6146de8361070d565b6146e9575b386144fd565b8351608001516001600160401b0316602080860151918c61471e60405194859384936370701e5760e11b85526004850161421d565b038160006001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561223d5760009161476f575b506146e35750505050506001906145f9565b614787915060203d8111613a2457613a168183610358565b3861475d565b614797878b611a9c565b515160808601526144e0565b6354e7e43160e11b6000526001600160401b038b1660045260246000fd5b506147cb8361070d565b600383146144ca565b9150836147e08461070d565b156144e057506001959450614849925061482791507f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209351016001600160401b0390511690565b604080516001600160401b03808c168252909216602083015290918291820190565b0390a16145f9565b50505050600192915061484961482760607f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c9351016001600160401b0390511690565b5061489e8361070d565b60038314614486565b633ee8bd3f60e11b6000526001600160401b03841660045260246000fd5b6148d0818a51611a9c565b518051604001516001600160401b031683810361494057508051602001516001600160401b031689810361491d57509061490c8460019361532e565b614916828d611a9c565b5201614404565b636c95f1eb60e01b6000526001600160401b03808a166004521660245260446000fd5b631c21951160e11b6000526001600160401b031660045260246000fd5b6357e0e08360e01b60005260046000fd5b611e2f61498286516001600160401b031690565b63676cf24b60e11b6000526001600160401b0316600452602490565b50929150506149e0576040516001600160401b039190911681527faab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d89493390602090a1565b637edeb53960e11b6000526001600160401b031660045260246000fd5b614a16915060203d602011613a2457613a168183610358565b3861433a565b9081602091031261016757516105168161083c565b90610516916020815260e0614acf614aba614a5a8551610100602087015261012086019061041a565b60208601516001600160401b0316604086015260408601516001600160a01b0316606086015260608601516080860152614aa4608087015160a08701906001600160a01b03169052565b60a0860151858203601f190160c087015261041a565b60c0850151848203601f19018486015261041a565b92015190610100601f198285030191015261041a565b6040906001600160a01b036105169493168152816020820152019061041a565b90816020910312610167575190565b91939293614b20611e8d565b5060208301516001600160a01b031660405163bbe4f6db60e01b81526001600160a01b038216600482015290959092602084806024810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa93841561223d57600094614d9d575b506001600160a01b0384169586158015614d8b575b614d6d57614c52614c7b92613d7692614bd6614bcf611d5f60408c015163ffffffff1690565b8c89615883565b9690996080810151614c046060835193015193614bf16103a8565b9687526001600160401b03166020870152565b6001600160a01b038a16604086015260608501526001600160a01b038d16608085015260a084015260c083015260e0820152604051633907753760e01b602082015292839160248301614a31565b82857f000000000000000000000000000000000000000000000000000000000000000092615911565b94909115614d515750805160208103614d38575090614ca4826020808a95518301019101614b05565b956001600160a01b03841603614cdc575b5050505050614cd4614cc56103b8565b6001600160a01b039093168352565b602082015290565b614cef93614ce991611c24565b91615883565b50908082108015614d25575b614d0757808481614cb5565b63a966e21f60e01b6000908152600493909352602452604452606490fd5b5082614d318284611c24565b1415614cfb565b631e3be00960e21b600052602060045260245260446000fd5b611dd9604051928392634ff17cad60e11b845260048401614ae5565b63ae9b4ce960e01b6000526001600160a01b03851660045260246000fd5b50614d9861226686613523565b614ba9565b614dc091945060203d602011614dc7575b614db88183610358565b810190614a1c565b9238614b94565b503d614dae565b60405160208101916301ffc9a760e01b835263ffffffff60e01b602483015260248252614dfc604483610358565b6179185a10614e38576020926000925191617530fa6000513d82614e2c575b5081614e25575090565b9050151590565b60201115915038614e1b565b63753fa58960e11b60005260046000fd5b60405160208101916301ffc9a760e01b83526301ffc9a760e01b602483015260248252614dfc604483610358565b6040519060208201926301ffc9a760e01b845263ffffffff60e01b16602483015260248252614dfc604483610358565b6001600160401b031680600052600860205260406000209060ff825460a01c1615614ed0575090565b63ed053c5960e01b60005260045260246000fd5b919390926000948051946000965b868810614f03575050505050505050565b6020881015611a975760206000614f1b878b1a613b8c565b614f258b87611a9c565b5190614f5c614f348d8a611a9c565b5160405193849389859094939260ff6060936080840197845216602083015260408201520152565b838052039060015afa1561223d57614fa2613c69600051614f8a8960ff166000526003602052604060002090565b906001600160a01b0316600052602052604060002090565b9060016020830151614fb381613b25565b614fbc81613b25565b0361500957614fd9614fcf835160ff1690565b60ff600191161b90565b8116614ff857614fef614fcf6001935160ff1690565b17970196614ef2565b633d9ef1f160e21b60005260046000fd5b636518c33d60e11b60005260046000fd5b91909160005b83518110156150735760019060ff83166000526003602052600061506c604082206001600160a01b03615053858a611a9c565b51166001600160a01b0316600052602052604060002090565b5501615020565b50509050565b8151815460ff191660ff919091161781559060200151600381101561071757815461ff00191660089190911b61ff0016179055565b919060005b8151811015615073576150d66150c98284611a9c565b516001600160a01b031690565b906150ff6150f583614f8a8860ff166000526003602052604060002090565b5460081c60ff1690565b61510881613b25565b615173576001600160a01b038216156151625761515c60019261515761512c6103b8565b60ff85168152916151408660208501613b2f565b614f8a8960ff166000526003602052604060002090565b615079565b016150b3565b63d6c62c9b60e01b60005260046000fd5b631b3fab5160e11b6000526004805260246000fd5b919060005b8151811015615073576151a36150c98284611a9c565b906151c26150f583614f8a8860ff166000526003602052604060002090565b6151cb81613b25565b615173576001600160a01b03821615615162576152046001926151576151ef6103b8565b60ff8516815291615140600260208501613b2f565b0161518d565b60ff1680600052600260205260ff60016040600020015460101c16908015600014615258575015615247576001600160401b0319600b5416600b55565b6317bd8dd160e11b60005260046000fd5b6001146152625750565b61526857565b6307b8c74d60e51b60005260046000fd5b9080602083519182815201916020808360051b8301019401926000915b8383106152a557505050505090565b9091929394602080600192601f198582030186528851906080806153086152d5855160a0865260a086019061041a565b6001600160a01b0387870151168786015263ffffffff60408701511660408601526060860151858203606087015261041a565b93015191015297019301930191939290615296565b906020610516928181520190615279565b61357481518051906153c261534d60608601516001600160a01b031690565b613d7661536460608501516001600160401b031690565b9361537d6080808a01519201516001600160401b031690565b90604051958694602086019889936001600160401b036080946001600160a01b0382959998949960a089019a8952166020880152166040860152606085015216910152565b519020613d766020840151602081519101209360a06040820151602081519101209101516040516153fb81613d7660208201948561531d565b51902090604051958694602086019889919260a093969594919660c08401976000855260208501526040840152606083015260808201520152565b926001600160401b039261544992615a52565b9116600052600a60205260406000209060005260205260406000205490565b60405160c081018181106001600160401b038211176103025760609160a0916040526154926119e9565b815282602082015282604082015260008382015260006080820152015290565b607f8216906801fffffffffffffffe6001600160401b0383169260011b169180830460021490151715611c1f576138f6916001600160401b036154f58584613238565b921660005260096020526701ffffffffffffff60406000209460071c169160036001831b921b19161792906001600160401b0316600052602052604060002090565b9091607f83166801fffffffffffffffe6001600160401b0382169160011b169080820460021490151715611c1f5761556f8484613238565b6004831015610717576001600160401b036138f69416600052600960205260036701ffffffffffffff60406000209660071c1693831b921b19161792906001600160401b0316600052602052604060002090565b9080602083519182815201916020808360051b8301019401926000915b8383106155ef57505050505090565b909192939460208061560d600193601f19868203018752895161041a565b970193019301919392906155e0565b906020808351928381520192019060005b81811061563a5750505090565b825163ffffffff1684526020938401939092019160010161562d565b9161571f906157116105169593606086526001600160401b0360808251805160608a015282602082015116828a01528260408201511660a08a01528260608201511660c08a015201511660e087015260a06156dd6156c660208401516101406101008b01526101a08a019061041a565b6040840151898203605f19016101208b015261041a565b60608301516001600160a01b03166101408901529160808101516101608901520151868203605f1901610180880152615279565b9084820360208601526155c3565b91604081840391015261561c565b80516020909101516001600160e01b031981169291906004821061574f575050565b6001600160e01b031960049290920360031b82901b16169150565b90303b15610167576000916157936040519485938493630304c3e160e51b855260048501615656565b038183305af1908161586e575b50615863576157ad611f98565b9072c11c11c11c11c11c11c11c11c11c11c11c11c133146157cf575b60039190565b6157e86157db8361572d565b6001600160e01b03191690565b6337c3be2960e01b148015615848575b801561582d575b156157c957611e2f6158108361572d565b632882569d60e01b6000526001600160e01b031916600452602490565b5061583a6157db8361572d565b63753fa58960e11b146157ff565b506158556157db8361572d565b632be8ca8b60e21b146157f8565b6002906105166103e2565b80612302600061587d93610358565b386157a0565b6040516370a0823160e01b60208201526001600160a01b0390911660248201529192916158e0906158b78160448101613d76565b84837f000000000000000000000000000000000000000000000000000000000000000092615911565b92909115614d515750805160208103614d3857509061590b8260208061051695518301019101614b05565b93611c24565b93919361591e60846103c7565b9461592c6040519687610358565b6084865261593a60846103c7565b602087019590601f1901368737833b156159bd575a908082106159ac578291038060061c9003111561599b576000918291825a9560208451940192f1905a9003923d9060848211615992575b6000908287523e929190565b60849150615986565b6337c3be2960e01b60005260046000fd5b632be8ca8b60e21b60005260046000fd5b63030ed58f60e21b60005260046000fd5b80600052600760205260406000205415600014615a4c576006546801000000000000000081101561030257600181016006556000600654821015611a9757600690527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01819055600654906000526007602052604060002055600190565b50600090565b8051928251908415615bae5761010185111580615ba2575b15615ad157818501946000198601956101008711615ad1578615615b9257615a9187611a42565b9660009586978795885b848110615af6575050505050600119018095149384615aec575b505082615ae2575b505015615ad157615acd91611a9c565b5190565b6309bde33960e01b60005260046000fd5b1490503880615abd565b1492503880615ab5565b6001811b82811603615b8457868a1015615b6f57615b1860018b019a85611a9c565b51905b8c888c1015615b5b5750615b3360018c019b86611a9c565b515b818d11615ad157615b54828f92615b4e90600196615bbf565b92611a9c565b5201615a9b565b60018d019c615b6991611a9c565b51615b35565b615b7d60018c019b8d611a9c565b5190615b1b565b615b7d600189019884611a9c565b505050509050615acd9150611a8a565b50610101821115615a6a565b630469ac9960e21b60005260046000fd5b81811015615bd1579061051691615bd6565b610516915b9060405190602082019260018452604083015260608201526060815261357460808261035856fea164736f6c634300081a000abd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c", +} + +var OffRampABI = OffRampMetaData.ABI + +var OffRampBin = OffRampMetaData.Bin + +func DeployOffRamp(auth *bind.TransactOpts, backend bind.ContractBackend, staticConfig OffRampStaticConfig, dynamicConfig OffRampDynamicConfig, sourceChainConfigs []OffRampSourceChainConfigArgs) (common.Address, *types.Transaction, *OffRamp, error) { + parsed, err := OffRampMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OffRampBin), backend, staticConfig, dynamicConfig, sourceChainConfigs) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &OffRamp{address: address, abi: *parsed, OffRampCaller: OffRampCaller{contract: contract}, OffRampTransactor: OffRampTransactor{contract: contract}, OffRampFilterer: OffRampFilterer{contract: contract}}, nil +} + +type OffRamp struct { + address common.Address + abi abi.ABI + OffRampCaller + OffRampTransactor + OffRampFilterer +} + +type OffRampCaller struct { + contract *bind.BoundContract +} + +type OffRampTransactor struct { + contract *bind.BoundContract +} + +type OffRampFilterer struct { + contract *bind.BoundContract +} + +type OffRampSession struct { + Contract *OffRamp + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type OffRampCallerSession struct { + Contract *OffRampCaller + CallOpts bind.CallOpts +} + +type OffRampTransactorSession struct { + Contract *OffRampTransactor + TransactOpts bind.TransactOpts +} + +type OffRampRaw struct { + Contract *OffRamp +} + +type OffRampCallerRaw struct { + Contract *OffRampCaller +} + +type OffRampTransactorRaw struct { + Contract *OffRampTransactor +} + +func NewOffRamp(address common.Address, backend bind.ContractBackend) (*OffRamp, error) { + abi, err := abi.JSON(strings.NewReader(OffRampABI)) + if err != nil { + return nil, err + } + contract, err := bindOffRamp(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &OffRamp{address: address, abi: abi, OffRampCaller: OffRampCaller{contract: contract}, OffRampTransactor: OffRampTransactor{contract: contract}, OffRampFilterer: OffRampFilterer{contract: contract}}, nil +} + +func NewOffRampCaller(address common.Address, caller bind.ContractCaller) (*OffRampCaller, error) { + contract, err := bindOffRamp(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &OffRampCaller{contract: contract}, nil +} + +func NewOffRampTransactor(address common.Address, transactor bind.ContractTransactor) (*OffRampTransactor, error) { + contract, err := bindOffRamp(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &OffRampTransactor{contract: contract}, nil +} + +func NewOffRampFilterer(address common.Address, filterer bind.ContractFilterer) (*OffRampFilterer, error) { + contract, err := bindOffRamp(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &OffRampFilterer{contract: contract}, nil +} + +func bindOffRamp(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := OffRampMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_OffRamp *OffRampRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OffRamp.Contract.OffRampCaller.contract.Call(opts, result, method, params...) +} + +func (_OffRamp *OffRampRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OffRamp.Contract.OffRampTransactor.contract.Transfer(opts) +} + +func (_OffRamp *OffRampRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OffRamp.Contract.OffRampTransactor.contract.Transact(opts, method, params...) +} + +func (_OffRamp *OffRampCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OffRamp.Contract.contract.Call(opts, result, method, params...) +} + +func (_OffRamp *OffRampTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OffRamp.Contract.contract.Transfer(opts) +} + +func (_OffRamp *OffRampTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OffRamp.Contract.contract.Transact(opts, method, params...) +} + +func (_OffRamp *OffRampCaller) CcipReceive(opts *bind.CallOpts, arg0 ClientAny2EVMMessage) error { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "ccipReceive", arg0) + + if err != nil { + return err + } + + return err + +} + +func (_OffRamp *OffRampSession) CcipReceive(arg0 ClientAny2EVMMessage) error { + return _OffRamp.Contract.CcipReceive(&_OffRamp.CallOpts, arg0) +} + +func (_OffRamp *OffRampCallerSession) CcipReceive(arg0 ClientAny2EVMMessage) error { + return _OffRamp.Contract.CcipReceive(&_OffRamp.CallOpts, arg0) +} + +func (_OffRamp *OffRampCaller) GetAllSourceChainConfigs(opts *bind.CallOpts) ([]uint64, []OffRampSourceChainConfig, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "getAllSourceChainConfigs") + + if err != nil { + return *new([]uint64), *new([]OffRampSourceChainConfig), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + out1 := *abi.ConvertType(out[1], new([]OffRampSourceChainConfig)).(*[]OffRampSourceChainConfig) + + return out0, out1, err + +} + +func (_OffRamp *OffRampSession) GetAllSourceChainConfigs() ([]uint64, []OffRampSourceChainConfig, error) { + return _OffRamp.Contract.GetAllSourceChainConfigs(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCallerSession) GetAllSourceChainConfigs() ([]uint64, []OffRampSourceChainConfig, error) { + return _OffRamp.Contract.GetAllSourceChainConfigs(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCaller) GetDynamicConfig(opts *bind.CallOpts) (OffRampDynamicConfig, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "getDynamicConfig") + + if err != nil { + return *new(OffRampDynamicConfig), err + } + + out0 := *abi.ConvertType(out[0], new(OffRampDynamicConfig)).(*OffRampDynamicConfig) + + return out0, err + +} + +func (_OffRamp *OffRampSession) GetDynamicConfig() (OffRampDynamicConfig, error) { + return _OffRamp.Contract.GetDynamicConfig(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCallerSession) GetDynamicConfig() (OffRampDynamicConfig, error) { + return _OffRamp.Contract.GetDynamicConfig(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCaller) GetExecutionState(opts *bind.CallOpts, sourceChainSelector uint64, sequenceNumber uint64) (uint8, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "getExecutionState", sourceChainSelector, sequenceNumber) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_OffRamp *OffRampSession) GetExecutionState(sourceChainSelector uint64, sequenceNumber uint64) (uint8, error) { + return _OffRamp.Contract.GetExecutionState(&_OffRamp.CallOpts, sourceChainSelector, sequenceNumber) +} + +func (_OffRamp *OffRampCallerSession) GetExecutionState(sourceChainSelector uint64, sequenceNumber uint64) (uint8, error) { + return _OffRamp.Contract.GetExecutionState(&_OffRamp.CallOpts, sourceChainSelector, sequenceNumber) +} + +func (_OffRamp *OffRampCaller) GetLatestPriceSequenceNumber(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "getLatestPriceSequenceNumber") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_OffRamp *OffRampSession) GetLatestPriceSequenceNumber() (uint64, error) { + return _OffRamp.Contract.GetLatestPriceSequenceNumber(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCallerSession) GetLatestPriceSequenceNumber() (uint64, error) { + return _OffRamp.Contract.GetLatestPriceSequenceNumber(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCaller) GetMerkleRoot(opts *bind.CallOpts, sourceChainSelector uint64, root [32]byte) (*big.Int, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "getMerkleRoot", sourceChainSelector, root) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_OffRamp *OffRampSession) GetMerkleRoot(sourceChainSelector uint64, root [32]byte) (*big.Int, error) { + return _OffRamp.Contract.GetMerkleRoot(&_OffRamp.CallOpts, sourceChainSelector, root) +} + +func (_OffRamp *OffRampCallerSession) GetMerkleRoot(sourceChainSelector uint64, root [32]byte) (*big.Int, error) { + return _OffRamp.Contract.GetMerkleRoot(&_OffRamp.CallOpts, sourceChainSelector, root) +} + +func (_OffRamp *OffRampCaller) GetSourceChainConfig(opts *bind.CallOpts, sourceChainSelector uint64) (OffRampSourceChainConfig, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "getSourceChainConfig", sourceChainSelector) + + if err != nil { + return *new(OffRampSourceChainConfig), err + } + + out0 := *abi.ConvertType(out[0], new(OffRampSourceChainConfig)).(*OffRampSourceChainConfig) + + return out0, err + +} + +func (_OffRamp *OffRampSession) GetSourceChainConfig(sourceChainSelector uint64) (OffRampSourceChainConfig, error) { + return _OffRamp.Contract.GetSourceChainConfig(&_OffRamp.CallOpts, sourceChainSelector) +} + +func (_OffRamp *OffRampCallerSession) GetSourceChainConfig(sourceChainSelector uint64) (OffRampSourceChainConfig, error) { + return _OffRamp.Contract.GetSourceChainConfig(&_OffRamp.CallOpts, sourceChainSelector) +} + +func (_OffRamp *OffRampCaller) GetStaticConfig(opts *bind.CallOpts) (OffRampStaticConfig, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "getStaticConfig") + + if err != nil { + return *new(OffRampStaticConfig), err + } + + out0 := *abi.ConvertType(out[0], new(OffRampStaticConfig)).(*OffRampStaticConfig) + + return out0, err + +} + +func (_OffRamp *OffRampSession) GetStaticConfig() (OffRampStaticConfig, error) { + return _OffRamp.Contract.GetStaticConfig(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCallerSession) GetStaticConfig() (OffRampStaticConfig, error) { + return _OffRamp.Contract.GetStaticConfig(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCaller) LatestConfigDetails(opts *bind.CallOpts, ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "latestConfigDetails", ocrPluginType) + + if err != nil { + return *new(MultiOCR3BaseOCRConfig), err + } + + out0 := *abi.ConvertType(out[0], new(MultiOCR3BaseOCRConfig)).(*MultiOCR3BaseOCRConfig) + + return out0, err + +} + +func (_OffRamp *OffRampSession) LatestConfigDetails(ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { + return _OffRamp.Contract.LatestConfigDetails(&_OffRamp.CallOpts, ocrPluginType) +} + +func (_OffRamp *OffRampCallerSession) LatestConfigDetails(ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) { + return _OffRamp.Contract.LatestConfigDetails(&_OffRamp.CallOpts, ocrPluginType) +} + +func (_OffRamp *OffRampCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _OffRamp.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 + +} + +func (_OffRamp *OffRampSession) Owner() (common.Address, error) { + return _OffRamp.Contract.Owner(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCallerSession) Owner() (common.Address, error) { + return _OffRamp.Contract.Owner(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _OffRamp.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_OffRamp *OffRampSession) TypeAndVersion() (string, error) { + return _OffRamp.Contract.TypeAndVersion(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampCallerSession) TypeAndVersion() (string, error) { + return _OffRamp.Contract.TypeAndVersion(&_OffRamp.CallOpts) +} + +func (_OffRamp *OffRampTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "acceptOwnership") +} + +func (_OffRamp *OffRampSession) AcceptOwnership() (*types.Transaction, error) { + return _OffRamp.Contract.AcceptOwnership(&_OffRamp.TransactOpts) +} + +func (_OffRamp *OffRampTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _OffRamp.Contract.AcceptOwnership(&_OffRamp.TransactOpts) +} + +func (_OffRamp *OffRampTransactor) ApplySourceChainConfigUpdates(opts *bind.TransactOpts, sourceChainConfigUpdates []OffRampSourceChainConfigArgs) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "applySourceChainConfigUpdates", sourceChainConfigUpdates) +} + +func (_OffRamp *OffRampSession) ApplySourceChainConfigUpdates(sourceChainConfigUpdates []OffRampSourceChainConfigArgs) (*types.Transaction, error) { + return _OffRamp.Contract.ApplySourceChainConfigUpdates(&_OffRamp.TransactOpts, sourceChainConfigUpdates) +} + +func (_OffRamp *OffRampTransactorSession) ApplySourceChainConfigUpdates(sourceChainConfigUpdates []OffRampSourceChainConfigArgs) (*types.Transaction, error) { + return _OffRamp.Contract.ApplySourceChainConfigUpdates(&_OffRamp.TransactOpts, sourceChainConfigUpdates) +} + +func (_OffRamp *OffRampTransactor) Commit(opts *bind.TransactOpts, reportContext [2][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "commit", reportContext, report, rs, ss, rawVs) +} + +func (_OffRamp *OffRampSession) Commit(reportContext [2][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _OffRamp.Contract.Commit(&_OffRamp.TransactOpts, reportContext, report, rs, ss, rawVs) +} + +func (_OffRamp *OffRampTransactorSession) Commit(reportContext [2][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) { + return _OffRamp.Contract.Commit(&_OffRamp.TransactOpts, reportContext, report, rs, ss, rawVs) +} + +func (_OffRamp *OffRampTransactor) Execute(opts *bind.TransactOpts, reportContext [2][32]byte, report []byte) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "execute", reportContext, report) +} + +func (_OffRamp *OffRampSession) Execute(reportContext [2][32]byte, report []byte) (*types.Transaction, error) { + return _OffRamp.Contract.Execute(&_OffRamp.TransactOpts, reportContext, report) +} + +func (_OffRamp *OffRampTransactorSession) Execute(reportContext [2][32]byte, report []byte) (*types.Transaction, error) { + return _OffRamp.Contract.Execute(&_OffRamp.TransactOpts, reportContext, report) +} + +func (_OffRamp *OffRampTransactor) ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "executeSingleMessage", message, offchainTokenData, tokenGasOverrides) +} + +func (_OffRamp *OffRampSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData, tokenGasOverrides) +} + +func (_OffRamp *OffRampTransactorSession) ExecuteSingleMessage(message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) { + return _OffRamp.Contract.ExecuteSingleMessage(&_OffRamp.TransactOpts, message, offchainTokenData, tokenGasOverrides) +} + +func (_OffRamp *OffRampTransactor) ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReport, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "manuallyExecute", reports, gasLimitOverrides) +} + +func (_OffRamp *OffRampSession) ManuallyExecute(reports []InternalExecutionReport, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { + return _OffRamp.Contract.ManuallyExecute(&_OffRamp.TransactOpts, reports, gasLimitOverrides) +} + +func (_OffRamp *OffRampTransactorSession) ManuallyExecute(reports []InternalExecutionReport, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) { + return _OffRamp.Contract.ManuallyExecute(&_OffRamp.TransactOpts, reports, gasLimitOverrides) +} + +func (_OffRamp *OffRampTransactor) SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig OffRampDynamicConfig) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "setDynamicConfig", dynamicConfig) +} + +func (_OffRamp *OffRampSession) SetDynamicConfig(dynamicConfig OffRampDynamicConfig) (*types.Transaction, error) { + return _OffRamp.Contract.SetDynamicConfig(&_OffRamp.TransactOpts, dynamicConfig) +} + +func (_OffRamp *OffRampTransactorSession) SetDynamicConfig(dynamicConfig OffRampDynamicConfig) (*types.Transaction, error) { + return _OffRamp.Contract.SetDynamicConfig(&_OffRamp.TransactOpts, dynamicConfig) +} + +func (_OffRamp *OffRampTransactor) SetOCR3Configs(opts *bind.TransactOpts, ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "setOCR3Configs", ocrConfigArgs) +} + +func (_OffRamp *OffRampSession) SetOCR3Configs(ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _OffRamp.Contract.SetOCR3Configs(&_OffRamp.TransactOpts, ocrConfigArgs) +} + +func (_OffRamp *OffRampTransactorSession) SetOCR3Configs(ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) { + return _OffRamp.Contract.SetOCR3Configs(&_OffRamp.TransactOpts, ocrConfigArgs) +} + +func (_OffRamp *OffRampTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _OffRamp.contract.Transact(opts, "transferOwnership", to) +} + +func (_OffRamp *OffRampSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _OffRamp.Contract.TransferOwnership(&_OffRamp.TransactOpts, to) +} + +func (_OffRamp *OffRampTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _OffRamp.Contract.TransferOwnership(&_OffRamp.TransactOpts, to) +} + +type OffRampAlreadyAttemptedIterator struct { + Event *OffRampAlreadyAttempted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampAlreadyAttemptedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampAlreadyAttempted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampAlreadyAttempted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampAlreadyAttemptedIterator) Error() error { + return it.fail +} + +func (it *OffRampAlreadyAttemptedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampAlreadyAttempted struct { + SourceChainSelector uint64 + SequenceNumber uint64 + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterAlreadyAttempted(opts *bind.FilterOpts) (*OffRampAlreadyAttemptedIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "AlreadyAttempted") + if err != nil { + return nil, err + } + return &OffRampAlreadyAttemptedIterator{contract: _OffRamp.contract, event: "AlreadyAttempted", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchAlreadyAttempted(opts *bind.WatchOpts, sink chan<- *OffRampAlreadyAttempted) (event.Subscription, error) { + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "AlreadyAttempted") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampAlreadyAttempted) + if err := _OffRamp.contract.UnpackLog(event, "AlreadyAttempted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseAlreadyAttempted(log types.Log) (*OffRampAlreadyAttempted, error) { + event := new(OffRampAlreadyAttempted) + if err := _OffRamp.contract.UnpackLog(event, "AlreadyAttempted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampCommitReportAcceptedIterator struct { + Event *OffRampCommitReportAccepted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampCommitReportAcceptedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampCommitReportAccepted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampCommitReportAccepted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampCommitReportAcceptedIterator) Error() error { + return it.fail +} + +func (it *OffRampCommitReportAcceptedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampCommitReportAccepted struct { + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + PriceUpdates InternalPriceUpdates + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterCommitReportAccepted(opts *bind.FilterOpts) (*OffRampCommitReportAcceptedIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "CommitReportAccepted") + if err != nil { + return nil, err + } + return &OffRampCommitReportAcceptedIterator{contract: _OffRamp.contract, event: "CommitReportAccepted", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchCommitReportAccepted(opts *bind.WatchOpts, sink chan<- *OffRampCommitReportAccepted) (event.Subscription, error) { + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "CommitReportAccepted") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampCommitReportAccepted) + if err := _OffRamp.contract.UnpackLog(event, "CommitReportAccepted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseCommitReportAccepted(log types.Log) (*OffRampCommitReportAccepted, error) { + event := new(OffRampCommitReportAccepted) + if err := _OffRamp.contract.UnpackLog(event, "CommitReportAccepted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampConfigSetIterator struct { + Event *OffRampConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampConfigSetIterator) Error() error { + return it.fail +} + +func (it *OffRampConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampConfigSet struct { + OcrPluginType uint8 + ConfigDigest [32]byte + Signers []common.Address + Transmitters []common.Address + F uint8 + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterConfigSet(opts *bind.FilterOpts) (*OffRampConfigSetIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "ConfigSet") + if err != nil { + return nil, err + } + return &OffRampConfigSetIterator{contract: _OffRamp.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *OffRampConfigSet) (event.Subscription, error) { + + logs, sub, err := _OffRamp.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: + + event := new(OffRampConfigSet) + if err := _OffRamp.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 +} + +func (_OffRamp *OffRampFilterer) ParseConfigSet(log types.Log) (*OffRampConfigSet, error) { + event := new(OffRampConfigSet) + if err := _OffRamp.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampDynamicConfigSetIterator struct { + Event *OffRampDynamicConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampDynamicConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampDynamicConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampDynamicConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampDynamicConfigSetIterator) Error() error { + return it.fail +} + +func (it *OffRampDynamicConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampDynamicConfigSet struct { + DynamicConfig OffRampDynamicConfig + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterDynamicConfigSet(opts *bind.FilterOpts) (*OffRampDynamicConfigSetIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "DynamicConfigSet") + if err != nil { + return nil, err + } + return &OffRampDynamicConfigSetIterator{contract: _OffRamp.contract, event: "DynamicConfigSet", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchDynamicConfigSet(opts *bind.WatchOpts, sink chan<- *OffRampDynamicConfigSet) (event.Subscription, error) { + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "DynamicConfigSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampDynamicConfigSet) + if err := _OffRamp.contract.UnpackLog(event, "DynamicConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseDynamicConfigSet(log types.Log) (*OffRampDynamicConfigSet, error) { + event := new(OffRampDynamicConfigSet) + if err := _OffRamp.contract.UnpackLog(event, "DynamicConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampExecutionStateChangedIterator struct { + Event *OffRampExecutionStateChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampExecutionStateChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampExecutionStateChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampExecutionStateChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampExecutionStateChangedIterator) Error() error { + return it.fail +} + +func (it *OffRampExecutionStateChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampExecutionStateChanged struct { + SourceChainSelector uint64 + SequenceNumber uint64 + MessageId [32]byte + MessageHash [32]byte + State uint8 + ReturnData []byte + GasUsed *big.Int + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterExecutionStateChanged(opts *bind.FilterOpts, sourceChainSelector []uint64, sequenceNumber []uint64, messageId [][32]byte) (*OffRampExecutionStateChangedIterator, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + var sequenceNumberRule []interface{} + for _, sequenceNumberItem := range sequenceNumber { + sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem) + } + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "ExecutionStateChanged", sourceChainSelectorRule, sequenceNumberRule, messageIdRule) + if err != nil { + return nil, err + } + return &OffRampExecutionStateChangedIterator{contract: _OffRamp.contract, event: "ExecutionStateChanged", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchExecutionStateChanged(opts *bind.WatchOpts, sink chan<- *OffRampExecutionStateChanged, sourceChainSelector []uint64, sequenceNumber []uint64, messageId [][32]byte) (event.Subscription, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + var sequenceNumberRule []interface{} + for _, sequenceNumberItem := range sequenceNumber { + sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem) + } + var messageIdRule []interface{} + for _, messageIdItem := range messageId { + messageIdRule = append(messageIdRule, messageIdItem) + } + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "ExecutionStateChanged", sourceChainSelectorRule, sequenceNumberRule, messageIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampExecutionStateChanged) + if err := _OffRamp.contract.UnpackLog(event, "ExecutionStateChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseExecutionStateChanged(log types.Log) (*OffRampExecutionStateChanged, error) { + event := new(OffRampExecutionStateChanged) + if err := _OffRamp.contract.UnpackLog(event, "ExecutionStateChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampOwnershipTransferRequestedIterator struct { + Event *OffRampOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *OffRampOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OffRampOwnershipTransferRequestedIterator, 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 := _OffRamp.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &OffRampOwnershipTransferRequestedIterator{contract: _OffRamp.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *OffRampOwnershipTransferRequested, 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 := _OffRamp.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: + + event := new(OffRampOwnershipTransferRequested) + if err := _OffRamp.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 +} + +func (_OffRamp *OffRampFilterer) ParseOwnershipTransferRequested(log types.Log) (*OffRampOwnershipTransferRequested, error) { + event := new(OffRampOwnershipTransferRequested) + if err := _OffRamp.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampOwnershipTransferredIterator struct { + Event *OffRampOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *OffRampOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OffRampOwnershipTransferredIterator, 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 := _OffRamp.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &OffRampOwnershipTransferredIterator{contract: _OffRamp.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *OffRampOwnershipTransferred, 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 := _OffRamp.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: + + event := new(OffRampOwnershipTransferred) + if err := _OffRamp.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 +} + +func (_OffRamp *OffRampFilterer) ParseOwnershipTransferred(log types.Log) (*OffRampOwnershipTransferred, error) { + event := new(OffRampOwnershipTransferred) + if err := _OffRamp.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampRootRemovedIterator struct { + Event *OffRampRootRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampRootRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampRootRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampRootRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampRootRemovedIterator) Error() error { + return it.fail +} + +func (it *OffRampRootRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampRootRemoved struct { + Root [32]byte + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterRootRemoved(opts *bind.FilterOpts) (*OffRampRootRemovedIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "RootRemoved") + if err != nil { + return nil, err + } + return &OffRampRootRemovedIterator{contract: _OffRamp.contract, event: "RootRemoved", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchRootRemoved(opts *bind.WatchOpts, sink chan<- *OffRampRootRemoved) (event.Subscription, error) { + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "RootRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampRootRemoved) + if err := _OffRamp.contract.UnpackLog(event, "RootRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseRootRemoved(log types.Log) (*OffRampRootRemoved, error) { + event := new(OffRampRootRemoved) + if err := _OffRamp.contract.UnpackLog(event, "RootRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampSkippedAlreadyExecutedMessageIterator struct { + Event *OffRampSkippedAlreadyExecutedMessage + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampSkippedAlreadyExecutedMessageIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampSkippedAlreadyExecutedMessage) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampSkippedAlreadyExecutedMessage) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampSkippedAlreadyExecutedMessageIterator) Error() error { + return it.fail +} + +func (it *OffRampSkippedAlreadyExecutedMessageIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampSkippedAlreadyExecutedMessage struct { + SourceChainSelector uint64 + SequenceNumber uint64 + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterSkippedAlreadyExecutedMessage(opts *bind.FilterOpts) (*OffRampSkippedAlreadyExecutedMessageIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "SkippedAlreadyExecutedMessage") + if err != nil { + return nil, err + } + return &OffRampSkippedAlreadyExecutedMessageIterator{contract: _OffRamp.contract, event: "SkippedAlreadyExecutedMessage", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchSkippedAlreadyExecutedMessage(opts *bind.WatchOpts, sink chan<- *OffRampSkippedAlreadyExecutedMessage) (event.Subscription, error) { + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "SkippedAlreadyExecutedMessage") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampSkippedAlreadyExecutedMessage) + if err := _OffRamp.contract.UnpackLog(event, "SkippedAlreadyExecutedMessage", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseSkippedAlreadyExecutedMessage(log types.Log) (*OffRampSkippedAlreadyExecutedMessage, error) { + event := new(OffRampSkippedAlreadyExecutedMessage) + if err := _OffRamp.contract.UnpackLog(event, "SkippedAlreadyExecutedMessage", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampSkippedReportExecutionIterator struct { + Event *OffRampSkippedReportExecution + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampSkippedReportExecutionIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampSkippedReportExecution) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampSkippedReportExecution) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampSkippedReportExecutionIterator) Error() error { + return it.fail +} + +func (it *OffRampSkippedReportExecutionIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampSkippedReportExecution struct { + SourceChainSelector uint64 + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterSkippedReportExecution(opts *bind.FilterOpts) (*OffRampSkippedReportExecutionIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "SkippedReportExecution") + if err != nil { + return nil, err + } + return &OffRampSkippedReportExecutionIterator{contract: _OffRamp.contract, event: "SkippedReportExecution", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchSkippedReportExecution(opts *bind.WatchOpts, sink chan<- *OffRampSkippedReportExecution) (event.Subscription, error) { + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "SkippedReportExecution") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampSkippedReportExecution) + if err := _OffRamp.contract.UnpackLog(event, "SkippedReportExecution", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseSkippedReportExecution(log types.Log) (*OffRampSkippedReportExecution, error) { + event := new(OffRampSkippedReportExecution) + if err := _OffRamp.contract.UnpackLog(event, "SkippedReportExecution", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampSourceChainConfigSetIterator struct { + Event *OffRampSourceChainConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampSourceChainConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampSourceChainConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampSourceChainConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampSourceChainConfigSetIterator) Error() error { + return it.fail +} + +func (it *OffRampSourceChainConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampSourceChainConfigSet struct { + SourceChainSelector uint64 + SourceConfig OffRampSourceChainConfig + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterSourceChainConfigSet(opts *bind.FilterOpts, sourceChainSelector []uint64) (*OffRampSourceChainConfigSetIterator, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "SourceChainConfigSet", sourceChainSelectorRule) + if err != nil { + return nil, err + } + return &OffRampSourceChainConfigSetIterator{contract: _OffRamp.contract, event: "SourceChainConfigSet", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchSourceChainConfigSet(opts *bind.WatchOpts, sink chan<- *OffRampSourceChainConfigSet, sourceChainSelector []uint64) (event.Subscription, error) { + + var sourceChainSelectorRule []interface{} + for _, sourceChainSelectorItem := range sourceChainSelector { + sourceChainSelectorRule = append(sourceChainSelectorRule, sourceChainSelectorItem) + } + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "SourceChainConfigSet", sourceChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampSourceChainConfigSet) + if err := _OffRamp.contract.UnpackLog(event, "SourceChainConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseSourceChainConfigSet(log types.Log) (*OffRampSourceChainConfigSet, error) { + event := new(OffRampSourceChainConfigSet) + if err := _OffRamp.contract.UnpackLog(event, "SourceChainConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampSourceChainSelectorAddedIterator struct { + Event *OffRampSourceChainSelectorAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampSourceChainSelectorAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampSourceChainSelectorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampSourceChainSelectorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampSourceChainSelectorAddedIterator) Error() error { + return it.fail +} + +func (it *OffRampSourceChainSelectorAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampSourceChainSelectorAdded struct { + SourceChainSelector uint64 + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterSourceChainSelectorAdded(opts *bind.FilterOpts) (*OffRampSourceChainSelectorAddedIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "SourceChainSelectorAdded") + if err != nil { + return nil, err + } + return &OffRampSourceChainSelectorAddedIterator{contract: _OffRamp.contract, event: "SourceChainSelectorAdded", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchSourceChainSelectorAdded(opts *bind.WatchOpts, sink chan<- *OffRampSourceChainSelectorAdded) (event.Subscription, error) { + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "SourceChainSelectorAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampSourceChainSelectorAdded) + if err := _OffRamp.contract.UnpackLog(event, "SourceChainSelectorAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseSourceChainSelectorAdded(log types.Log) (*OffRampSourceChainSelectorAdded, error) { + event := new(OffRampSourceChainSelectorAdded) + if err := _OffRamp.contract.UnpackLog(event, "SourceChainSelectorAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampStaticConfigSetIterator struct { + Event *OffRampStaticConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampStaticConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampStaticConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampStaticConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampStaticConfigSetIterator) Error() error { + return it.fail +} + +func (it *OffRampStaticConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampStaticConfigSet struct { + StaticConfig OffRampStaticConfig + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterStaticConfigSet(opts *bind.FilterOpts) (*OffRampStaticConfigSetIterator, error) { + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "StaticConfigSet") + if err != nil { + return nil, err + } + return &OffRampStaticConfigSetIterator{contract: _OffRamp.contract, event: "StaticConfigSet", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchStaticConfigSet(opts *bind.WatchOpts, sink chan<- *OffRampStaticConfigSet) (event.Subscription, error) { + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "StaticConfigSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampStaticConfigSet) + if err := _OffRamp.contract.UnpackLog(event, "StaticConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OffRamp *OffRampFilterer) ParseStaticConfigSet(log types.Log) (*OffRampStaticConfigSet, error) { + event := new(OffRampStaticConfigSet) + if err := _OffRamp.contract.UnpackLog(event, "StaticConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OffRampTransmittedIterator struct { + Event *OffRampTransmitted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OffRampTransmittedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OffRampTransmitted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OffRampTransmitted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OffRampTransmittedIterator) Error() error { + return it.fail +} + +func (it *OffRampTransmittedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OffRampTransmitted struct { + OcrPluginType uint8 + ConfigDigest [32]byte + SequenceNumber uint64 + Raw types.Log +} + +func (_OffRamp *OffRampFilterer) FilterTransmitted(opts *bind.FilterOpts, ocrPluginType []uint8) (*OffRampTransmittedIterator, error) { + + var ocrPluginTypeRule []interface{} + for _, ocrPluginTypeItem := range ocrPluginType { + ocrPluginTypeRule = append(ocrPluginTypeRule, ocrPluginTypeItem) + } + + logs, sub, err := _OffRamp.contract.FilterLogs(opts, "Transmitted", ocrPluginTypeRule) + if err != nil { + return nil, err + } + return &OffRampTransmittedIterator{contract: _OffRamp.contract, event: "Transmitted", logs: logs, sub: sub}, nil +} + +func (_OffRamp *OffRampFilterer) WatchTransmitted(opts *bind.WatchOpts, sink chan<- *OffRampTransmitted, ocrPluginType []uint8) (event.Subscription, error) { + + var ocrPluginTypeRule []interface{} + for _, ocrPluginTypeItem := range ocrPluginType { + ocrPluginTypeRule = append(ocrPluginTypeRule, ocrPluginTypeItem) + } + + logs, sub, err := _OffRamp.contract.WatchLogs(opts, "Transmitted", ocrPluginTypeRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OffRampTransmitted) + if err := _OffRamp.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 +} + +func (_OffRamp *OffRampFilterer) ParseTransmitted(log types.Log) (*OffRampTransmitted, error) { + event := new(OffRampTransmitted) + if err := _OffRamp.contract.UnpackLog(event, "Transmitted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_OffRamp *OffRamp) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _OffRamp.abi.Events["AlreadyAttempted"].ID: + return _OffRamp.ParseAlreadyAttempted(log) + case _OffRamp.abi.Events["CommitReportAccepted"].ID: + return _OffRamp.ParseCommitReportAccepted(log) + case _OffRamp.abi.Events["ConfigSet"].ID: + return _OffRamp.ParseConfigSet(log) + case _OffRamp.abi.Events["DynamicConfigSet"].ID: + return _OffRamp.ParseDynamicConfigSet(log) + case _OffRamp.abi.Events["ExecutionStateChanged"].ID: + return _OffRamp.ParseExecutionStateChanged(log) + case _OffRamp.abi.Events["OwnershipTransferRequested"].ID: + return _OffRamp.ParseOwnershipTransferRequested(log) + case _OffRamp.abi.Events["OwnershipTransferred"].ID: + return _OffRamp.ParseOwnershipTransferred(log) + case _OffRamp.abi.Events["RootRemoved"].ID: + return _OffRamp.ParseRootRemoved(log) + case _OffRamp.abi.Events["SkippedAlreadyExecutedMessage"].ID: + return _OffRamp.ParseSkippedAlreadyExecutedMessage(log) + case _OffRamp.abi.Events["SkippedReportExecution"].ID: + return _OffRamp.ParseSkippedReportExecution(log) + case _OffRamp.abi.Events["SourceChainConfigSet"].ID: + return _OffRamp.ParseSourceChainConfigSet(log) + case _OffRamp.abi.Events["SourceChainSelectorAdded"].ID: + return _OffRamp.ParseSourceChainSelectorAdded(log) + case _OffRamp.abi.Events["StaticConfigSet"].ID: + return _OffRamp.ParseStaticConfigSet(log) + case _OffRamp.abi.Events["Transmitted"].ID: + return _OffRamp.ParseTransmitted(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (OffRampAlreadyAttempted) Topic() common.Hash { + return common.HexToHash("0x3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe65120") +} + +func (OffRampCommitReportAccepted) Topic() common.Hash { + return common.HexToHash("0xb967c9b9e1b7af9a61ca71ff00e9f5b89ec6f2e268de8dacf12f0de8e51f3e47") +} + +func (OffRampConfigSet) Topic() common.Hash { + return common.HexToHash("0xab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f547") +} + +func (OffRampDynamicConfigSet) Topic() common.Hash { + return common.HexToHash("0xa1c15688cb2c24508e158f6942b9276c6f3028a85e1af8cf3fff0c3ff3d5fc8d") +} + +func (OffRampExecutionStateChanged) Topic() common.Hash { + return common.HexToHash("0x05665fe9ad095383d018353f4cbcba77e84db27dd215081bbf7cdf9ae6fbe48b") +} + +func (OffRampOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (OffRampOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (OffRampRootRemoved) Topic() common.Hash { + return common.HexToHash("0x202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12") +} + +func (OffRampSkippedAlreadyExecutedMessage) Topic() common.Hash { + return common.HexToHash("0x3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c") +} + +func (OffRampSkippedReportExecution) Topic() common.Hash { + return common.HexToHash("0xaab522ed53d887e56ed53dd37398a01aeef6a58e0fa77c2173beb9512d894933") +} + +func (OffRampSourceChainConfigSet) Topic() common.Hash { + return common.HexToHash("0xbd1ab25a0ff0a36a588597ba1af11e30f3f210de8b9e818cc9bbc457c94c8d8c") +} + +func (OffRampSourceChainSelectorAdded) Topic() common.Hash { + return common.HexToHash("0xf4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb9") +} + +func (OffRampStaticConfigSet) Topic() common.Hash { + return common.HexToHash("0xb0fa1fb01508c5097c502ad056fd77018870c9be9a86d9e56b6b471862d7c5b7") +} + +func (OffRampTransmitted) Topic() common.Hash { + return common.HexToHash("0x198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0") +} + +func (_OffRamp *OffRamp) Address() common.Address { + return _OffRamp.address +} + +type OffRampInterface interface { + CcipReceive(opts *bind.CallOpts, arg0 ClientAny2EVMMessage) error + + GetAllSourceChainConfigs(opts *bind.CallOpts) ([]uint64, []OffRampSourceChainConfig, error) + + GetDynamicConfig(opts *bind.CallOpts) (OffRampDynamicConfig, error) + + GetExecutionState(opts *bind.CallOpts, sourceChainSelector uint64, sequenceNumber uint64) (uint8, error) + + GetLatestPriceSequenceNumber(opts *bind.CallOpts) (uint64, error) + + GetMerkleRoot(opts *bind.CallOpts, sourceChainSelector uint64, root [32]byte) (*big.Int, error) + + GetSourceChainConfig(opts *bind.CallOpts, sourceChainSelector uint64) (OffRampSourceChainConfig, error) + + GetStaticConfig(opts *bind.CallOpts) (OffRampStaticConfig, error) + + LatestConfigDetails(opts *bind.CallOpts, ocrPluginType uint8) (MultiOCR3BaseOCRConfig, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplySourceChainConfigUpdates(opts *bind.TransactOpts, sourceChainConfigUpdates []OffRampSourceChainConfigArgs) (*types.Transaction, error) + + Commit(opts *bind.TransactOpts, reportContext [2][32]byte, report []byte, rs [][32]byte, ss [][32]byte, rawVs [32]byte) (*types.Transaction, error) + + Execute(opts *bind.TransactOpts, reportContext [2][32]byte, report []byte) (*types.Transaction, error) + + ExecuteSingleMessage(opts *bind.TransactOpts, message InternalAny2EVMRampMessage, offchainTokenData [][]byte, tokenGasOverrides []uint32) (*types.Transaction, error) + + ManuallyExecute(opts *bind.TransactOpts, reports []InternalExecutionReport, gasLimitOverrides [][]OffRampGasLimitOverride) (*types.Transaction, error) + + SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig OffRampDynamicConfig) (*types.Transaction, error) + + SetOCR3Configs(opts *bind.TransactOpts, ocrConfigArgs []MultiOCR3BaseOCRConfigArgs) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterAlreadyAttempted(opts *bind.FilterOpts) (*OffRampAlreadyAttemptedIterator, error) + + WatchAlreadyAttempted(opts *bind.WatchOpts, sink chan<- *OffRampAlreadyAttempted) (event.Subscription, error) + + ParseAlreadyAttempted(log types.Log) (*OffRampAlreadyAttempted, error) + + FilterCommitReportAccepted(opts *bind.FilterOpts) (*OffRampCommitReportAcceptedIterator, error) + + WatchCommitReportAccepted(opts *bind.WatchOpts, sink chan<- *OffRampCommitReportAccepted) (event.Subscription, error) + + ParseCommitReportAccepted(log types.Log) (*OffRampCommitReportAccepted, error) + + FilterConfigSet(opts *bind.FilterOpts) (*OffRampConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *OffRampConfigSet) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*OffRampConfigSet, error) + + FilterDynamicConfigSet(opts *bind.FilterOpts) (*OffRampDynamicConfigSetIterator, error) + + WatchDynamicConfigSet(opts *bind.WatchOpts, sink chan<- *OffRampDynamicConfigSet) (event.Subscription, error) + + ParseDynamicConfigSet(log types.Log) (*OffRampDynamicConfigSet, error) + + FilterExecutionStateChanged(opts *bind.FilterOpts, sourceChainSelector []uint64, sequenceNumber []uint64, messageId [][32]byte) (*OffRampExecutionStateChangedIterator, error) + + WatchExecutionStateChanged(opts *bind.WatchOpts, sink chan<- *OffRampExecutionStateChanged, sourceChainSelector []uint64, sequenceNumber []uint64, messageId [][32]byte) (event.Subscription, error) + + ParseExecutionStateChanged(log types.Log) (*OffRampExecutionStateChanged, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OffRampOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *OffRampOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*OffRampOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OffRampOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *OffRampOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*OffRampOwnershipTransferred, error) + + FilterRootRemoved(opts *bind.FilterOpts) (*OffRampRootRemovedIterator, error) + + WatchRootRemoved(opts *bind.WatchOpts, sink chan<- *OffRampRootRemoved) (event.Subscription, error) + + ParseRootRemoved(log types.Log) (*OffRampRootRemoved, error) + + FilterSkippedAlreadyExecutedMessage(opts *bind.FilterOpts) (*OffRampSkippedAlreadyExecutedMessageIterator, error) + + WatchSkippedAlreadyExecutedMessage(opts *bind.WatchOpts, sink chan<- *OffRampSkippedAlreadyExecutedMessage) (event.Subscription, error) + + ParseSkippedAlreadyExecutedMessage(log types.Log) (*OffRampSkippedAlreadyExecutedMessage, error) + + FilterSkippedReportExecution(opts *bind.FilterOpts) (*OffRampSkippedReportExecutionIterator, error) + + WatchSkippedReportExecution(opts *bind.WatchOpts, sink chan<- *OffRampSkippedReportExecution) (event.Subscription, error) + + ParseSkippedReportExecution(log types.Log) (*OffRampSkippedReportExecution, error) + + FilterSourceChainConfigSet(opts *bind.FilterOpts, sourceChainSelector []uint64) (*OffRampSourceChainConfigSetIterator, error) + + WatchSourceChainConfigSet(opts *bind.WatchOpts, sink chan<- *OffRampSourceChainConfigSet, sourceChainSelector []uint64) (event.Subscription, error) + + ParseSourceChainConfigSet(log types.Log) (*OffRampSourceChainConfigSet, error) + + FilterSourceChainSelectorAdded(opts *bind.FilterOpts) (*OffRampSourceChainSelectorAddedIterator, error) + + WatchSourceChainSelectorAdded(opts *bind.WatchOpts, sink chan<- *OffRampSourceChainSelectorAdded) (event.Subscription, error) + + ParseSourceChainSelectorAdded(log types.Log) (*OffRampSourceChainSelectorAdded, error) + + FilterStaticConfigSet(opts *bind.FilterOpts) (*OffRampStaticConfigSetIterator, error) + + WatchStaticConfigSet(opts *bind.WatchOpts, sink chan<- *OffRampStaticConfigSet) (event.Subscription, error) + + ParseStaticConfigSet(log types.Log) (*OffRampStaticConfigSet, error) + + FilterTransmitted(opts *bind.FilterOpts, ocrPluginType []uint8) (*OffRampTransmittedIterator, error) + + WatchTransmitted(opts *bind.WatchOpts, sink chan<- *OffRampTransmitted, ocrPluginType []uint8) (event.Subscription, error) + + ParseTransmitted(log types.Log) (*OffRampTransmitted, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/onramp/onramp.go b/core/gethwrappers/ccip/generated/v1_6_0/onramp/onramp.go new file mode 100644 index 00000000000..27fcbadf3e2 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/onramp/onramp.go @@ -0,0 +1,1913 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package onramp + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type ClientEVM2AnyMessage struct { + Receiver []byte + Data []byte + TokenAmounts []ClientEVMTokenAmount + FeeToken common.Address + ExtraArgs []byte +} + +type ClientEVMTokenAmount struct { + Token common.Address + Amount *big.Int +} + +type InternalEVM2AnyRampMessage struct { + Header InternalRampMessageHeader + Sender common.Address + Data []byte + Receiver []byte + ExtraArgs []byte + FeeToken common.Address + FeeTokenAmount *big.Int + FeeValueJuels *big.Int + TokenAmounts []InternalEVM2AnyTokenTransfer +} + +type InternalEVM2AnyTokenTransfer struct { + SourcePoolAddress common.Address + DestTokenAddress []byte + ExtraData []byte + Amount *big.Int + DestExecData []byte +} + +type InternalRampMessageHeader struct { + MessageId [32]byte + SourceChainSelector uint64 + DestChainSelector uint64 + SequenceNumber uint64 + Nonce uint64 +} + +type OnRampAllowlistConfigArgs struct { + DestChainSelector uint64 + AllowlistEnabled bool + AddedAllowlistedSenders []common.Address + RemovedAllowlistedSenders []common.Address +} + +type OnRampDestChainConfigArgs struct { + DestChainSelector uint64 + Router common.Address + AllowlistEnabled bool +} + +type OnRampDynamicConfig struct { + FeeQuoter common.Address + ReentrancyGuardEntered bool + MessageInterceptor common.Address + FeeAggregator common.Address + AllowlistAdmin common.Address +} + +type OnRampStaticConfig struct { + ChainSelector uint64 + RmnRemote common.Address + NonceManager common.Address + TokenAdminRegistry common.Address +} + +var OnRampMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowlistUpdates\",\"inputs\":[{\"name\":\"allowlistConfigArgsItems\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.AllowlistConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"addedAllowlistedSenders\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"removedAllowlistedSenders\",\"type\":\"address[]\",\"internalType\":\"address[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyDestChainConfigUpdates\",\"inputs\":[{\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\",\"internalType\":\"structOnRamp.DestChainConfigArgs[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forwardFromRouter\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowedSendersList\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"configuredAddresses\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDynamicConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getExpectedNextSequenceNumber\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getFee\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structClient.EVM2AnyMessage\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structClient.EVMTokenAmount[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPoolBySourceToken\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPoolV1\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStaticConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedTokens\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawFeeTokens\",\"inputs\":[{\"name\":\"feeTokens\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdminSet\",\"inputs\":[{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListSendersAdded\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"senders\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListSendersRemoved\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"senders\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CCIPMessageSent\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"message\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraArgs\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"feeToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeTokenAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"feeValueJuels\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.EVM2AnyTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"destExecData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOnRamp.StaticConfig\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rmnRemote\",\"type\":\"address\",\"internalType\":\"contractIRMNRemote\"},{\"name\":\"nonceManager\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOnRamp.DynamicConfig\",\"components\":[{\"name\":\"feeQuoter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"reentrancyGuardEntered\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"messageInterceptor\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"feeAggregator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"allowlistAdmin\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DestChainConfigSet\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"router\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIRouter\"},{\"name\":\"allowlistEnabled\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FeeTokenWithdrawn\",\"inputs\":[{\"name\":\"feeAggregator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"feeToken\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"error\",\"name\":\"CannotSendZeroTokens\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAllowListRequest\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidConfig\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDestChainConfig\",\"inputs\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"MustBeCalledByRouter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwnerOrAllowlistAdmin\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RouterMustSetOriginalSender\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnsupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x6101006040523461055f57613ce88038038061001a81610599565b92833981019080820390610140821261055f576080821261055f5761003d61057a565b90610047816105be565b82526020810151906001600160a01b038216820361055f5760208301918252610072604082016105d2565b926040810193845260a0610088606084016105d2565b6060830190815295607f19011261055f5760405160a081016001600160401b03811182821017610564576040526100c1608084016105d2565b81526100cf60a084016105e6565b602082019081526100e260c085016105d2565b91604081019283526100f660e086016105d2565b936060820194855261010b61010087016105d2565b6080830190815261012087015190966001600160401b03821161055f57018a601f8201121561055f578051906001600160401b0382116105645760209b8c6060610159828660051b01610599565b9e8f8681520194028301019181831161055f57602001925b8284106104f1575050505033156104e057600180546001600160a01b0319163317905580516001600160401b03161580156104ce575b80156104bc575b80156104aa575b61047d57516001600160401b0316608081905295516001600160a01b0390811660a08190529751811660c08190529851811660e08190528251909116158015610498575b801561048e575b61047d57815160028054855160ff60a01b90151560a01b166001600160a01b039384166001600160a81b0319909216919091171790558451600380549183166001600160a01b03199283161790558651600480549184169183169190911790558751600580549190931691161790557fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19861012098606061029f61057a565b8a8152602080820193845260408083019586529290910194855281519a8b5291516001600160a01b03908116928b019290925291518116918901919091529051811660608801529051811660808701529051151560a08601529051811660c08501529051811660e0840152905116610100820152a16000905b805182101561040b5761032b82826105f3565b51916001600160401b0361033f82846105f3565b5151169283156103f65760008481526006602090815260409182902081840151815494840151600160401b600160e81b03198616604883901b600160481b600160e81b031617901515851b68ff000000000000000016179182905583516001600160401b0390951685526001600160a01b031691840191909152811c60ff1615159082015291926001927fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef590606090a20190610318565b8363c35aa79d60e01b60005260045260246000fd5b6040516136ca908161061e82396080518181816103e301528181610bd901528181612163015261290a015260a05181818161219c015281816126bd0152612943015260c051818181610f9c015281816121d8015261297f015260e051818181612214015281816129bb0152612f990152f35b6306b7c75960e31b60005260046000fd5b5082511515610200565b5084516001600160a01b0316156101f9565b5088516001600160a01b0316156101b5565b5087516001600160a01b0316156101ae565b5086516001600160a01b0316156101a7565b639b15e16f60e01b60005260046000fd5b60608483031261055f5760405190606082016001600160401b0381118382101761056457604052610521856105be565b82526020850151906001600160a01b038216820361055f578260209283606095015261054f604088016105e6565b6040820152815201930192610171565b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190608082016001600160401b0381118382101761056457604052565b6040519190601f01601f191682016001600160401b0381118382101761056457604052565b51906001600160401b038216820361055f57565b51906001600160a01b038216820361055f57565b5190811515820361055f57565b80518210156106075760209160051b010190565b634e487b7160e01b600052603260045260246000fdfe608080604052600436101561001357600080fd5b600090813560e01c90816306285c69146128a457508063181f5a771461282557806320487ded146125e15780632716072b1461233157806327e936f114611f2757806348a98aa414611ea45780635cb80c5d14611bbc5780636def4ce714611b2d5780637437ff9f14611a1057806379ba50971461192b5780638da5cb5b146118d95780639041be3d1461182c578063972b46121461175e578063c9b146b314611391578063df0aa9e91461022c578063f2fde38b1461013f5763fbca3b74146100dc57600080fd5b3461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57600490610116612bb0565b507f9e7177c8000000000000000000000000000000000000000000000000000000008152fd5b80fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5773ffffffffffffffffffffffffffffffffffffffff61018c612c06565b610194613367565b1633811461020457807fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12788380a380f35b6004827fdad89dca000000000000000000000000000000000000000000000000000000008152fd5b503461013c5760807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57610264612bb0565b67ffffffffffffffff6024351161138d5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc6024353603011261138d576102ab612c29565b60025460ff8160a01c16611365577fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001760025567ffffffffffffffff8216835260066020526040832073ffffffffffffffffffffffffffffffffffffffff82161561133d57805460ff8160401c166112cf575b60481c73ffffffffffffffffffffffffffffffffffffffff1633036112a75773ffffffffffffffffffffffffffffffffffffffff600354168061123e575b50805467ffffffffffffffff811667ffffffffffffffff8114611211579067ffffffffffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009493011692839116179055604051906103d582612a7a565b84825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602083015267ffffffffffffffff8416604083015260608201528360808201526104366024803501602435600401613147565b61044560046024350180613147565b610453606460243501613053565b93610468604460243501602435600401613198565b9490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06104ae61049887612be1565b966104a66040519889612acf565b808852612be1565b018a5b8181106111fa575050604051966104c788612a96565b875273ffffffffffffffffffffffffffffffffffffffff8816602088015236906104f092613218565b6040860152369061050092613218565b60608401526020916040516105158482612acf565b878152608085015273ffffffffffffffffffffffffffffffffffffffff1660a084015260443560c08401528560e084015261010083015260025473ffffffffffffffffffffffffffffffffffffffff16938560243560640161057690613053565b9561058a6024356084810190600401613147565b90919061059c60046024350180613147565b99906040519a8b95869485947f3a49bb4900000000000000000000000000000000000000000000000000000000865267ffffffffffffffff8b16600487015273ffffffffffffffffffffffffffffffffffffffff16602486015260443560448601526064850160a0905260a485019061061492612d45565b908382037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc01608485015261064892612d45565b03915afa80156110f85786879688908993611179575b50608086015260e085015261067d604460243501602435600401613198565b909661068882612be1565b916106966040519384612acf565b8083528583018099368360061b8201116111755780915b8360061b8201831061113e5750505050885b6106d3604460243501602435600401613198565b9050811015610a3b576106e68184613104565b51906106f06131ec565b508682015115610a135773ffffffffffffffffffffffffffffffffffffffff61071b81845116612f3a565b169182158015610970575b61092e57808c878a8a73ffffffffffffffffffffffffffffffffffffffff8f836107d39801518280895116926040519761075f89612a7a565b885267ffffffffffffffff87890196168652816040890191168152606088019283526080880193845267ffffffffffffffff6040519b8c998a997f9a4575b9000000000000000000000000000000000000000000000000000000008b5260048b01525160a060248b015260c48a0190612b6d565b965116604488015251166064860152516084850152511660a4830152038183885af1918215610923578d809361086b575b50506001938284928b806108649651930151910151916040519361082785612a7a565b84528c840152604083015260608201528d604051906108468c83612acf565b815260808201526101008b01519061085e8383613104565b52613104565b50016106bf565b9250933d8093863e61087d8386612acf565b8985848101031261091f5784519167ffffffffffffffff831161091b576040838701858801031261091b576040516108b481612ab3565b8387015167ffffffffffffffff8111610916576108d89086890190868a010161324f565b81528b84880101519467ffffffffffffffff861161091657876108649688966109079360019b0192010161324f565b8c82015293509150938d610804565b508f80fd5b8e80fd5b8d80fd5b6040513d8f823e3d90fd5b517fbf16aab6000000000000000000000000000000000000000000000000000000008c5273ffffffffffffffffffffffffffffffffffffffff1660045260248bfd5b506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201528881602481875afa908115610923578d916109da575b5015610726565b90508881813d8311610a0c575b6109f18183612acf565b81010312610a0857610a0290612ce8565b386109d3565b8c80fd5b503d6109e7565b60048b7f5cf04449000000000000000000000000000000000000000000000000000000008152fd5b5090889692508690610ab39873ffffffffffffffffffffffffffffffffffffffff600254169061010089015192886040519c8d957f01447eaa00000000000000000000000000000000000000000000000000000000875267ffffffffffffffff8b166004880152606060248801526064870190613291565b917ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8684030160448701525191828152019190855b8a828210611103575050505082809103915afa9687156110f857869761101f575b5015610f2d5750835b67ffffffffffffffff608085510191169052835b61010084015151811015610b5c5780610b4160019288613104565b516080610b5383610100890151613104565b51015201610b26565b5090926060610100604051610b7081612a96565b610b78613074565b8152838782015282604082015282808201528260808201528360a08201528360c08201528360e08201520152604051848101907f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321825267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015267ffffffffffffffff8416606082015230608082015260808152610c2360a082612acf565b51902073ffffffffffffffffffffffffffffffffffffffff602085015116845167ffffffffffffffff6080816060840151169201511673ffffffffffffffffffffffffffffffffffffffff60a08801511660c088015191604051938a850195865260408501526060840152608083015260a082015260a08152610ca760c082612acf565b51902060608501518681519101206040860151878151910120610100870151604051610d0d81610ce18c8201948d86526040830190613291565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282612acf565b51902091608088015189815191012093604051958a870197885260408701526060860152608085015260a084015260c083015260e082015260e08152610d5561010082612acf565b51902082515267ffffffffffffffff60608351015116907f192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f3260405185815267ffffffffffffffff608086518051898501528289820151166040850152826040820151166060850152826060820151168285015201511660a082015273ffffffffffffffffffffffffffffffffffffffff60208601511660c082015280610ef8610e7f610e4a610e1560408a01516101a060e08701526101c0860190612b6d565b60608a01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086830301610100870152612b6d565b60808901517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301610120860152612b6d565b73ffffffffffffffffffffffffffffffffffffffff60a08901511661014084015260c088015161016084015260e088015161018084015267ffffffffffffffff610100890151967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858403016101a08601521695613291565b0390a37fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff600254166002555151604051908152f35b73ffffffffffffffffffffffffffffffffffffffff604051917fea458c0c00000000000000000000000000000000000000000000000000000000835267ffffffffffffffff8416600484015216602482015282816044818873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1908115611014578591610fd2575b50610b12565b90508281813d831161100d575b610fe98183612acf565b81010312611009575167ffffffffffffffff811681036110095786610fcc565b8480fd5b503d610fdf565b6040513d87823e3d90fd5b9096503d908187823e6110328282612acf565b848183810103126110f45780519167ffffffffffffffff83116110f057808201601f8484010112156110f057828201519161106c83612be1565b9361107a6040519586612acf565b83855287850192808301898660051b8486010101116110ec578882840101935b898660051b848601010185106110b7575050505050509587610b09565b845167ffffffffffffffff8111610a08578a80926110df829383878a0191898b01010161324f565b815201950194905061109a565b8a80fd5b8780fd5b8680fd5b6040513d88823e3d90fd5b8351805173ffffffffffffffffffffffffffffffffffffffff168652810151818601528d97508e965060409094019390920191600101610ae8565b604083360312610a085788604091825161115781612ab3565b61116086612c4c565b815282860135838201528152019201916106ad565b8b80fd5b97505050503d8087873e61118d8187612acf565b60808682810103126110f4578551906111a7848801612ce8565b90604088015167ffffffffffffffff81116111f6576111cb90828a01908a0161324f565b97606081015167ffffffffffffffff81116110ec576111ed928201910161324f565b9190963861065e565b8980fd5b6020906112056131ec565b82828a010152016104b1565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b803b15611009578460405180927fe0a0e5060000000000000000000000000000000000000000000000000000000082528183816112846024356004018b60048401612d84565b03925af18015611014571561037357846112a091959295612acf565b9238610373565b6004847f1c0a3529000000000000000000000000000000000000000000000000000000008152fd5b73ffffffffffffffffffffffffffffffffffffffff831660009081526002830160205260409020546103355760248573ffffffffffffffffffffffffffffffffffffffff857fd0d2597600000000000000000000000000000000000000000000000000000000835216600452fd5b6004847fa4ec7479000000000000000000000000000000000000000000000000000000008152fd5b6004847f3ee5aeb5000000000000000000000000000000000000000000000000000000008152fd5b5080fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5760043567ffffffffffffffff811161138d576113e1903690600401612c6d565b73ffffffffffffffffffffffffffffffffffffffff600154163303611716575b919081907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8181360301915b84811015611712578060051b8201358381121561100957820191608083360312611009576040519461145d86612a2f565b61146684612bcc565b865261147460208501612bf9565b9660208701978852604085013567ffffffffffffffff811161170e5761149d903690870161309f565b9460408801958652606081013567ffffffffffffffff811161170a576114c59136910161309f565b60608801908152875167ffffffffffffffff1683526006602052604080842099518a547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff169015159182901b68ff000000000000000016178a559095908151516115e2575b5095976001019550815b85518051821015611573579061156c73ffffffffffffffffffffffffffffffffffffffff61156483600195613104565b51168961345b565b5001611534565b50509590969450600192919351908151611593575b50500193929361142c565b6115d867ffffffffffffffff7fc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d42158692511692604051918291602083526020830190612c9e565b0390a23880611588565b989395929691909497986000146116d357600184019591875b86518051821015611678576116258273ffffffffffffffffffffffffffffffffffffffff92613104565b51168015611641579061163a6001928a6133ca565b50016115fb565b60248a67ffffffffffffffff8e51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b50509692955090929796937f330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc32816116c967ffffffffffffffff8a51169251604051918291602083526020830190612c9e565b0390a2388061152a565b60248767ffffffffffffffff8b51167f463258ff000000000000000000000000000000000000000000000000000000008252600452fd5b8380fd5b8280fd5b8380f35b73ffffffffffffffffffffffffffffffffffffffff60055416330315611401576004837f905d7d9b000000000000000000000000000000000000000000000000000000008152fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5767ffffffffffffffff61179f612bb0565b16808252600660205260ff604083205460401c16908252600660205260016040832001916040518093849160208254918281520191845260208420935b8181106118135750506117f192500383612acf565b61180f60405192839215158352604060208401526040830190612c9e565b0390f35b84548352600194850194879450602090930192016117dc565b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5767ffffffffffffffff61186d612bb0565b1681526006602052600167ffffffffffffffff604083205416019067ffffffffffffffff82116118ac5760208267ffffffffffffffff60405191168152f35b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526011600452fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57805473ffffffffffffffffffffffffffffffffffffffff811633036119e8577fffffffffffffffffffffffff000000000000000000000000000000000000000060015491338284161760015516825573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b6004827f02b543c6000000000000000000000000000000000000000000000000000000008152fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57611a47613074565b5060a0604051611a5681612a7a565b60ff60025473ffffffffffffffffffffffffffffffffffffffff81168352831c161515602082015273ffffffffffffffffffffffffffffffffffffffff60035416604082015273ffffffffffffffffffffffffffffffffffffffff60045416606082015273ffffffffffffffffffffffffffffffffffffffff600554166080820152611b2b604051809273ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565bf35b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57604060609167ffffffffffffffff611b73612bb0565b1681526006602052205473ffffffffffffffffffffffffffffffffffffffff6040519167ffffffffffffffff8116835260ff8160401c161515602084015260481c166040820152f35b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c5760043567ffffffffffffffff811161138d57611c0c903690600401612c6d565b9073ffffffffffffffffffffffffffffffffffffffff6004541690835b83811015611ea05773ffffffffffffffffffffffffffffffffffffffff611c548260051b8401613053565b1690604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481845afa928315611e95578793611e62575b5082611cac575b506001915001611c29565b8460405193611d6760208601957fa9059cbb00000000000000000000000000000000000000000000000000000000875283602482015282604482015260448152611cf7606482612acf565b8a80604098895193611d098b86612acf565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082895af13d15611e5a573d90611d4a82612b10565b91611d578a519384612acf565b82523d8d602084013e5b866135ed565b805180611da3575b505060207f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e9160019651908152a338611ca1565b819294959693509060209181010312611e56576020611dc29101612ce8565b15611dd35792919085903880611d6f565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b8880fd5b606090611d61565b9092506020813d8211611e8d575b81611e7d60209383612acf565b810103126110f457519138611c9a565b3d9150611e70565b6040513d89823e3d90fd5b8480f35b503461013c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57611edc612bb0565b506024359073ffffffffffffffffffffffffffffffffffffffff8216820361013c576020611f0983612f3a565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b503461013c5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57604051611f6381612a7a565b611f6b612c06565b8152602435801515810361170e576020820190815260443573ffffffffffffffffffffffffffffffffffffffff8116810361170a5760408301908152611faf612c29565b90606084019182526084359273ffffffffffffffffffffffffffffffffffffffff8416840361232d5760808501938452611fe7613367565b73ffffffffffffffffffffffffffffffffffffffff85511615801561230e575b8015612304575b6122dc579273ffffffffffffffffffffffffffffffffffffffff859381809461012097827fc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f19a51167fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff00000000000000000000000000000000000000006002549260a01b1691161760025551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600354161760035551167fffffffffffffffffffffffff0000000000000000000000000000000000000000600454161760045551167fffffffffffffffffffffffff000000000000000000000000000000000000000060055416176005556122d86040519161215883612a2f565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016835273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602084015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604084015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060840152612288604051809473ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b608083019073ffffffffffffffffffffffffffffffffffffffff60808092828151168552602081015115156020860152826040820151166040860152826060820151166060860152015116910152565ba180f35b6004867f35be3ac8000000000000000000000000000000000000000000000000000000008152fd5b508051151561200e565b5073ffffffffffffffffffffffffffffffffffffffff83511615612007565b8580fd5b503461013c5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c576004359067ffffffffffffffff821161013c573660238301121561013c57816004013561238d81612be1565b9261239b6040519485612acf565b818452602460606020860193028201019036821161170a57602401915b818310612539575050506123ca613367565b805b8251811015612535576123df8184613104565b5167ffffffffffffffff6123f38386613104565b51511690811561250957907fd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5606060019493838752600660205260ff604088206124ca604060208501519483547fffffff0000000000000000000000000000000000000000ffffffffffffffffff7cffffffffffffffffffffffffffffffffffffffff0000000000000000008860481b1691161784550151151582907fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff68ff0000000000000000835492151560401b169116179055565b5473ffffffffffffffffffffffffffffffffffffffff6040519367ffffffffffffffff8316855216602084015260401c1615156040820152a2016123cc565b602484837fc35aa79d000000000000000000000000000000000000000000000000000000008252600452fd5b5080f35b60608336031261170a576040516060810181811067ffffffffffffffff8211176125b45760405261256984612bcc565b8152602084013573ffffffffffffffffffffffffffffffffffffffff8116810361232d5791816060936020809401526125a460408701612bf9565b60408201528152019201916123b8565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503461013c5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c57612619612bb0565b60243567ffffffffffffffff811161170e5760a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261170e576040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff000000000000000000000000000000008360801b16600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561281a5784916127e0575b506127aa5761274c9160209173ffffffffffffffffffffffffffffffffffffffff60025416906040518095819482937fd8694ccd0000000000000000000000000000000000000000000000000000000084526004019060048401612d84565b03915afa90811561279f578291612769575b602082604051908152f35b90506020813d602011612797575b8161278460209383612acf565b8101031261138d5760209150513861275e565b3d9150612777565b6040513d84823e3d90fd5b60248367ffffffffffffffff847ffdbd6a7200000000000000000000000000000000000000000000000000000000835216600452fd5b90506020813d602011612812575b816127fb60209383612acf565b8101031261170a5761280c90612ce8565b386126ed565b3d91506127ee565b6040513d86823e3d90fd5b503461013c57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013c575061180f604051612866604082612acf565b600c81527f4f6e52616d7020312e362e3000000000000000000000000000000000000000006020820152604051918291602083526020830190612b6d565b90503461138d57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261138d57806128e0606092612a2f565b828152826020820152826040820152015260806040516128ff81612a2f565b67ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016604082015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166060820152611b2b604051809273ffffffffffffffffffffffffffffffffffffffff6060809267ffffffffffffffff8151168552826020820151166020860152826040820151166040860152015116910152565b6080810190811067ffffffffffffffff821117612a4b57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff821117612a4b57604052565b610120810190811067ffffffffffffffff821117612a4b57604052565b6040810190811067ffffffffffffffff821117612a4b57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117612a4b57604052565b67ffffffffffffffff8111612a4b57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b838110612b5d5750506000910152565b8181015183820152602001612b4d565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093612ba981518092818752878088019101612b4a565b0116010190565b6004359067ffffffffffffffff82168203612bc757565b600080fd5b359067ffffffffffffffff82168203612bc757565b67ffffffffffffffff8111612a4b5760051b60200190565b35908115158203612bc757565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b6064359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b359073ffffffffffffffffffffffffffffffffffffffff82168203612bc757565b9181601f84011215612bc75782359167ffffffffffffffff8311612bc7576020808501948460051b010111612bc757565b906020808351928381520192019060005b818110612cbc5750505090565b825173ffffffffffffffffffffffffffffffffffffffff16845260209384019390920191600101612caf565b51908115158203612bc757565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe182360301811215612bc757016020813591019167ffffffffffffffff8211612bc7578136038313612bc757565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9067ffffffffffffffff9093929316815260406020820152612dfa612dbd612dac8580612cf5565b60a0604086015260e0850191612d45565b612dca6020860186612cf5565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0858403016060860152612d45565b9060408401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811215612bc75784016020813591019267ffffffffffffffff8211612bc7578160061b36038413612bc7578281037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0016080840152818152602001929060005b818110612efb57505050612ec88473ffffffffffffffffffffffffffffffffffffffff612eb86060612ef8979801612c4c565b1660a08401526080810190612cf5565b9160c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082860301910152612d45565b90565b90919360408060019273ffffffffffffffffffffffffffffffffffffffff612f2289612c4c565b16815260208881013590820152019501929101612e85565b73ffffffffffffffffffffffffffffffffffffffff604051917fbbe4f6db00000000000000000000000000000000000000000000000000000000835216600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561304757600091612fe4575b5073ffffffffffffffffffffffffffffffffffffffff1690565b6020813d60201161303f575b81612ffd60209383612acf565b8101031261138d57519073ffffffffffffffffffffffffffffffffffffffff8216820361013c575073ffffffffffffffffffffffffffffffffffffffff612fca565b3d9150612ff0565b6040513d6000823e3d90fd5b3573ffffffffffffffffffffffffffffffffffffffff81168103612bc75790565b6040519061308182612a7a565b60006080838281528260208201528260408201528260608201520152565b9080601f83011215612bc75781356130b681612be1565b926130c46040519485612acf565b81845260208085019260051b820101928311612bc757602001905b8282106130ec5750505090565b602080916130f984612c4c565b8152019101906130df565b80518210156131185760209160051b010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612bc7570180359067ffffffffffffffff8211612bc757602001918136038313612bc757565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612bc7570180359067ffffffffffffffff8211612bc757602001918160061b36038313612bc757565b604051906131f982612a7a565b6060608083600081528260208201528260408201526000838201520152565b92919261322482612b10565b916132326040519384612acf565b829481845281830111612bc7578281602093846000960137010152565b81601f82011215612bc757805161326581612b10565b926132736040519485612acf565b81845260208284010111612bc757612ef89160208085019101612b4a565b9080602083519182815201916020808360051b8301019401926000915b8383106132bd57505050505090565b9091929394602080613358837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301875289519073ffffffffffffffffffffffffffffffffffffffff8251168152608061333d61332b8685015160a08886015260a0850190612b6d565b60408501518482036040860152612b6d565b92606081015160608401520151906080818403910152612b6d565b970193019301919392906132ae565b73ffffffffffffffffffffffffffffffffffffffff60015416330361338857565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b80548210156131185760005260206000200190600090565b60008281526001820160205260409020546134545780549068010000000000000000821015612a4b578261343d6134088460018096018555846133b2565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905580549260005201602052604060002055600190565b5050600090565b90600182019181600052826020526040600020548015156000146135e4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181116135b5578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116135b55781810361357e575b5050508054801561354f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019061351082826133b2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61359e61358e61340893866133b2565b90549060031b1c928392866133b2565b9055600052836020526040600020553880806134d8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50505050600090565b919290156136685750815115613601575090565b3b1561360a5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b82519091501561367b5750805190602001fd5b6136b9906040519182917f08c379a0000000000000000000000000000000000000000000000000000000008352602060048401526024830190612b6d565b0390fdfea164736f6c634300081a000a", +} + +var OnRampABI = OnRampMetaData.ABI + +var OnRampBin = OnRampMetaData.Bin + +func DeployOnRamp(auth *bind.TransactOpts, backend bind.ContractBackend, staticConfig OnRampStaticConfig, dynamicConfig OnRampDynamicConfig, destChainConfigArgs []OnRampDestChainConfigArgs) (common.Address, *types.Transaction, *OnRamp, error) { + parsed, err := OnRampMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(OnRampBin), backend, staticConfig, dynamicConfig, destChainConfigArgs) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &OnRamp{address: address, abi: *parsed, OnRampCaller: OnRampCaller{contract: contract}, OnRampTransactor: OnRampTransactor{contract: contract}, OnRampFilterer: OnRampFilterer{contract: contract}}, nil +} + +type OnRamp struct { + address common.Address + abi abi.ABI + OnRampCaller + OnRampTransactor + OnRampFilterer +} + +type OnRampCaller struct { + contract *bind.BoundContract +} + +type OnRampTransactor struct { + contract *bind.BoundContract +} + +type OnRampFilterer struct { + contract *bind.BoundContract +} + +type OnRampSession struct { + Contract *OnRamp + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type OnRampCallerSession struct { + Contract *OnRampCaller + CallOpts bind.CallOpts +} + +type OnRampTransactorSession struct { + Contract *OnRampTransactor + TransactOpts bind.TransactOpts +} + +type OnRampRaw struct { + Contract *OnRamp +} + +type OnRampCallerRaw struct { + Contract *OnRampCaller +} + +type OnRampTransactorRaw struct { + Contract *OnRampTransactor +} + +func NewOnRamp(address common.Address, backend bind.ContractBackend) (*OnRamp, error) { + abi, err := abi.JSON(strings.NewReader(OnRampABI)) + if err != nil { + return nil, err + } + contract, err := bindOnRamp(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &OnRamp{address: address, abi: abi, OnRampCaller: OnRampCaller{contract: contract}, OnRampTransactor: OnRampTransactor{contract: contract}, OnRampFilterer: OnRampFilterer{contract: contract}}, nil +} + +func NewOnRampCaller(address common.Address, caller bind.ContractCaller) (*OnRampCaller, error) { + contract, err := bindOnRamp(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &OnRampCaller{contract: contract}, nil +} + +func NewOnRampTransactor(address common.Address, transactor bind.ContractTransactor) (*OnRampTransactor, error) { + contract, err := bindOnRamp(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &OnRampTransactor{contract: contract}, nil +} + +func NewOnRampFilterer(address common.Address, filterer bind.ContractFilterer) (*OnRampFilterer, error) { + contract, err := bindOnRamp(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &OnRampFilterer{contract: contract}, nil +} + +func bindOnRamp(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := OnRampMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_OnRamp *OnRampRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OnRamp.Contract.OnRampCaller.contract.Call(opts, result, method, params...) +} + +func (_OnRamp *OnRampRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OnRamp.Contract.OnRampTransactor.contract.Transfer(opts) +} + +func (_OnRamp *OnRampRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OnRamp.Contract.OnRampTransactor.contract.Transact(opts, method, params...) +} + +func (_OnRamp *OnRampCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _OnRamp.Contract.contract.Call(opts, result, method, params...) +} + +func (_OnRamp *OnRampTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OnRamp.Contract.contract.Transfer(opts) +} + +func (_OnRamp *OnRampTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _OnRamp.Contract.contract.Transact(opts, method, params...) +} + +func (_OnRamp *OnRampCaller) GetAllowedSendersList(opts *bind.CallOpts, destChainSelector uint64) (GetAllowedSendersList, + + error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "getAllowedSendersList", destChainSelector) + + outstruct := new(GetAllowedSendersList) + if err != nil { + return *outstruct, err + } + + outstruct.IsEnabled = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.ConfiguredAddresses = *abi.ConvertType(out[1], new([]common.Address)).(*[]common.Address) + + return *outstruct, err + +} + +func (_OnRamp *OnRampSession) GetAllowedSendersList(destChainSelector uint64) (GetAllowedSendersList, + + error) { + return _OnRamp.Contract.GetAllowedSendersList(&_OnRamp.CallOpts, destChainSelector) +} + +func (_OnRamp *OnRampCallerSession) GetAllowedSendersList(destChainSelector uint64) (GetAllowedSendersList, + + error) { + return _OnRamp.Contract.GetAllowedSendersList(&_OnRamp.CallOpts, destChainSelector) +} + +func (_OnRamp *OnRampCaller) GetDestChainConfig(opts *bind.CallOpts, destChainSelector uint64) (GetDestChainConfig, + + error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "getDestChainConfig", destChainSelector) + + outstruct := new(GetDestChainConfig) + if err != nil { + return *outstruct, err + } + + outstruct.SequenceNumber = *abi.ConvertType(out[0], new(uint64)).(*uint64) + outstruct.AllowlistEnabled = *abi.ConvertType(out[1], new(bool)).(*bool) + outstruct.Router = *abi.ConvertType(out[2], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +func (_OnRamp *OnRampSession) GetDestChainConfig(destChainSelector uint64) (GetDestChainConfig, + + error) { + return _OnRamp.Contract.GetDestChainConfig(&_OnRamp.CallOpts, destChainSelector) +} + +func (_OnRamp *OnRampCallerSession) GetDestChainConfig(destChainSelector uint64) (GetDestChainConfig, + + error) { + return _OnRamp.Contract.GetDestChainConfig(&_OnRamp.CallOpts, destChainSelector) +} + +func (_OnRamp *OnRampCaller) GetDynamicConfig(opts *bind.CallOpts) (OnRampDynamicConfig, error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "getDynamicConfig") + + if err != nil { + return *new(OnRampDynamicConfig), err + } + + out0 := *abi.ConvertType(out[0], new(OnRampDynamicConfig)).(*OnRampDynamicConfig) + + return out0, err + +} + +func (_OnRamp *OnRampSession) GetDynamicConfig() (OnRampDynamicConfig, error) { + return _OnRamp.Contract.GetDynamicConfig(&_OnRamp.CallOpts) +} + +func (_OnRamp *OnRampCallerSession) GetDynamicConfig() (OnRampDynamicConfig, error) { + return _OnRamp.Contract.GetDynamicConfig(&_OnRamp.CallOpts) +} + +func (_OnRamp *OnRampCaller) GetExpectedNextSequenceNumber(opts *bind.CallOpts, destChainSelector uint64) (uint64, error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "getExpectedNextSequenceNumber", destChainSelector) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_OnRamp *OnRampSession) GetExpectedNextSequenceNumber(destChainSelector uint64) (uint64, error) { + return _OnRamp.Contract.GetExpectedNextSequenceNumber(&_OnRamp.CallOpts, destChainSelector) +} + +func (_OnRamp *OnRampCallerSession) GetExpectedNextSequenceNumber(destChainSelector uint64) (uint64, error) { + return _OnRamp.Contract.GetExpectedNextSequenceNumber(&_OnRamp.CallOpts, destChainSelector) +} + +func (_OnRamp *OnRampCaller) GetFee(opts *bind.CallOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "getFee", destChainSelector, message) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_OnRamp *OnRampSession) GetFee(destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + return _OnRamp.Contract.GetFee(&_OnRamp.CallOpts, destChainSelector, message) +} + +func (_OnRamp *OnRampCallerSession) GetFee(destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) { + return _OnRamp.Contract.GetFee(&_OnRamp.CallOpts, destChainSelector, message) +} + +func (_OnRamp *OnRampCaller) GetPoolBySourceToken(opts *bind.CallOpts, arg0 uint64, sourceToken common.Address) (common.Address, error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "getPoolBySourceToken", arg0, sourceToken) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_OnRamp *OnRampSession) GetPoolBySourceToken(arg0 uint64, sourceToken common.Address) (common.Address, error) { + return _OnRamp.Contract.GetPoolBySourceToken(&_OnRamp.CallOpts, arg0, sourceToken) +} + +func (_OnRamp *OnRampCallerSession) GetPoolBySourceToken(arg0 uint64, sourceToken common.Address) (common.Address, error) { + return _OnRamp.Contract.GetPoolBySourceToken(&_OnRamp.CallOpts, arg0, sourceToken) +} + +func (_OnRamp *OnRampCaller) GetStaticConfig(opts *bind.CallOpts) (OnRampStaticConfig, error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "getStaticConfig") + + if err != nil { + return *new(OnRampStaticConfig), err + } + + out0 := *abi.ConvertType(out[0], new(OnRampStaticConfig)).(*OnRampStaticConfig) + + return out0, err + +} + +func (_OnRamp *OnRampSession) GetStaticConfig() (OnRampStaticConfig, error) { + return _OnRamp.Contract.GetStaticConfig(&_OnRamp.CallOpts) +} + +func (_OnRamp *OnRampCallerSession) GetStaticConfig() (OnRampStaticConfig, error) { + return _OnRamp.Contract.GetStaticConfig(&_OnRamp.CallOpts) +} + +func (_OnRamp *OnRampCaller) GetSupportedTokens(opts *bind.CallOpts, arg0 uint64) ([]common.Address, error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "getSupportedTokens", arg0) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_OnRamp *OnRampSession) GetSupportedTokens(arg0 uint64) ([]common.Address, error) { + return _OnRamp.Contract.GetSupportedTokens(&_OnRamp.CallOpts, arg0) +} + +func (_OnRamp *OnRampCallerSession) GetSupportedTokens(arg0 uint64) ([]common.Address, error) { + return _OnRamp.Contract.GetSupportedTokens(&_OnRamp.CallOpts, arg0) +} + +func (_OnRamp *OnRampCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _OnRamp.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 + +} + +func (_OnRamp *OnRampSession) Owner() (common.Address, error) { + return _OnRamp.Contract.Owner(&_OnRamp.CallOpts) +} + +func (_OnRamp *OnRampCallerSession) Owner() (common.Address, error) { + return _OnRamp.Contract.Owner(&_OnRamp.CallOpts) +} + +func (_OnRamp *OnRampCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _OnRamp.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_OnRamp *OnRampSession) TypeAndVersion() (string, error) { + return _OnRamp.Contract.TypeAndVersion(&_OnRamp.CallOpts) +} + +func (_OnRamp *OnRampCallerSession) TypeAndVersion() (string, error) { + return _OnRamp.Contract.TypeAndVersion(&_OnRamp.CallOpts) +} + +func (_OnRamp *OnRampTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _OnRamp.contract.Transact(opts, "acceptOwnership") +} + +func (_OnRamp *OnRampSession) AcceptOwnership() (*types.Transaction, error) { + return _OnRamp.Contract.AcceptOwnership(&_OnRamp.TransactOpts) +} + +func (_OnRamp *OnRampTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _OnRamp.Contract.AcceptOwnership(&_OnRamp.TransactOpts) +} + +func (_OnRamp *OnRampTransactor) ApplyAllowlistUpdates(opts *bind.TransactOpts, allowlistConfigArgsItems []OnRampAllowlistConfigArgs) (*types.Transaction, error) { + return _OnRamp.contract.Transact(opts, "applyAllowlistUpdates", allowlistConfigArgsItems) +} + +func (_OnRamp *OnRampSession) ApplyAllowlistUpdates(allowlistConfigArgsItems []OnRampAllowlistConfigArgs) (*types.Transaction, error) { + return _OnRamp.Contract.ApplyAllowlistUpdates(&_OnRamp.TransactOpts, allowlistConfigArgsItems) +} + +func (_OnRamp *OnRampTransactorSession) ApplyAllowlistUpdates(allowlistConfigArgsItems []OnRampAllowlistConfigArgs) (*types.Transaction, error) { + return _OnRamp.Contract.ApplyAllowlistUpdates(&_OnRamp.TransactOpts, allowlistConfigArgsItems) +} + +func (_OnRamp *OnRampTransactor) ApplyDestChainConfigUpdates(opts *bind.TransactOpts, destChainConfigArgs []OnRampDestChainConfigArgs) (*types.Transaction, error) { + return _OnRamp.contract.Transact(opts, "applyDestChainConfigUpdates", destChainConfigArgs) +} + +func (_OnRamp *OnRampSession) ApplyDestChainConfigUpdates(destChainConfigArgs []OnRampDestChainConfigArgs) (*types.Transaction, error) { + return _OnRamp.Contract.ApplyDestChainConfigUpdates(&_OnRamp.TransactOpts, destChainConfigArgs) +} + +func (_OnRamp *OnRampTransactorSession) ApplyDestChainConfigUpdates(destChainConfigArgs []OnRampDestChainConfigArgs) (*types.Transaction, error) { + return _OnRamp.Contract.ApplyDestChainConfigUpdates(&_OnRamp.TransactOpts, destChainConfigArgs) +} + +func (_OnRamp *OnRampTransactor) ForwardFromRouter(opts *bind.TransactOpts, destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { + return _OnRamp.contract.Transact(opts, "forwardFromRouter", destChainSelector, message, feeTokenAmount, originalSender) +} + +func (_OnRamp *OnRampSession) ForwardFromRouter(destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { + return _OnRamp.Contract.ForwardFromRouter(&_OnRamp.TransactOpts, destChainSelector, message, feeTokenAmount, originalSender) +} + +func (_OnRamp *OnRampTransactorSession) ForwardFromRouter(destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) { + return _OnRamp.Contract.ForwardFromRouter(&_OnRamp.TransactOpts, destChainSelector, message, feeTokenAmount, originalSender) +} + +func (_OnRamp *OnRampTransactor) SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig OnRampDynamicConfig) (*types.Transaction, error) { + return _OnRamp.contract.Transact(opts, "setDynamicConfig", dynamicConfig) +} + +func (_OnRamp *OnRampSession) SetDynamicConfig(dynamicConfig OnRampDynamicConfig) (*types.Transaction, error) { + return _OnRamp.Contract.SetDynamicConfig(&_OnRamp.TransactOpts, dynamicConfig) +} + +func (_OnRamp *OnRampTransactorSession) SetDynamicConfig(dynamicConfig OnRampDynamicConfig) (*types.Transaction, error) { + return _OnRamp.Contract.SetDynamicConfig(&_OnRamp.TransactOpts, dynamicConfig) +} + +func (_OnRamp *OnRampTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _OnRamp.contract.Transact(opts, "transferOwnership", to) +} + +func (_OnRamp *OnRampSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _OnRamp.Contract.TransferOwnership(&_OnRamp.TransactOpts, to) +} + +func (_OnRamp *OnRampTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _OnRamp.Contract.TransferOwnership(&_OnRamp.TransactOpts, to) +} + +func (_OnRamp *OnRampTransactor) WithdrawFeeTokens(opts *bind.TransactOpts, feeTokens []common.Address) (*types.Transaction, error) { + return _OnRamp.contract.Transact(opts, "withdrawFeeTokens", feeTokens) +} + +func (_OnRamp *OnRampSession) WithdrawFeeTokens(feeTokens []common.Address) (*types.Transaction, error) { + return _OnRamp.Contract.WithdrawFeeTokens(&_OnRamp.TransactOpts, feeTokens) +} + +func (_OnRamp *OnRampTransactorSession) WithdrawFeeTokens(feeTokens []common.Address) (*types.Transaction, error) { + return _OnRamp.Contract.WithdrawFeeTokens(&_OnRamp.TransactOpts, feeTokens) +} + +type OnRampAllowListAdminSetIterator struct { + Event *OnRampAllowListAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampAllowListAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampAllowListAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampAllowListAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampAllowListAdminSetIterator) Error() error { + return it.fail +} + +func (it *OnRampAllowListAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampAllowListAdminSet struct { + AllowlistAdmin common.Address + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterAllowListAdminSet(opts *bind.FilterOpts, allowlistAdmin []common.Address) (*OnRampAllowListAdminSetIterator, error) { + + var allowlistAdminRule []interface{} + for _, allowlistAdminItem := range allowlistAdmin { + allowlistAdminRule = append(allowlistAdminRule, allowlistAdminItem) + } + + logs, sub, err := _OnRamp.contract.FilterLogs(opts, "AllowListAdminSet", allowlistAdminRule) + if err != nil { + return nil, err + } + return &OnRampAllowListAdminSetIterator{contract: _OnRamp.contract, event: "AllowListAdminSet", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchAllowListAdminSet(opts *bind.WatchOpts, sink chan<- *OnRampAllowListAdminSet, allowlistAdmin []common.Address) (event.Subscription, error) { + + var allowlistAdminRule []interface{} + for _, allowlistAdminItem := range allowlistAdmin { + allowlistAdminRule = append(allowlistAdminRule, allowlistAdminItem) + } + + logs, sub, err := _OnRamp.contract.WatchLogs(opts, "AllowListAdminSet", allowlistAdminRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OnRampAllowListAdminSet) + if err := _OnRamp.contract.UnpackLog(event, "AllowListAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OnRamp *OnRampFilterer) ParseAllowListAdminSet(log types.Log) (*OnRampAllowListAdminSet, error) { + event := new(OnRampAllowListAdminSet) + if err := _OnRamp.contract.UnpackLog(event, "AllowListAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OnRampAllowListSendersAddedIterator struct { + Event *OnRampAllowListSendersAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampAllowListSendersAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampAllowListSendersAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampAllowListSendersAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampAllowListSendersAddedIterator) Error() error { + return it.fail +} + +func (it *OnRampAllowListSendersAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampAllowListSendersAdded struct { + DestChainSelector uint64 + Senders []common.Address + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterAllowListSendersAdded(opts *bind.FilterOpts, destChainSelector []uint64) (*OnRampAllowListSendersAddedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _OnRamp.contract.FilterLogs(opts, "AllowListSendersAdded", destChainSelectorRule) + if err != nil { + return nil, err + } + return &OnRampAllowListSendersAddedIterator{contract: _OnRamp.contract, event: "AllowListSendersAdded", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchAllowListSendersAdded(opts *bind.WatchOpts, sink chan<- *OnRampAllowListSendersAdded, destChainSelector []uint64) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _OnRamp.contract.WatchLogs(opts, "AllowListSendersAdded", destChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OnRampAllowListSendersAdded) + if err := _OnRamp.contract.UnpackLog(event, "AllowListSendersAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OnRamp *OnRampFilterer) ParseAllowListSendersAdded(log types.Log) (*OnRampAllowListSendersAdded, error) { + event := new(OnRampAllowListSendersAdded) + if err := _OnRamp.contract.UnpackLog(event, "AllowListSendersAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OnRampAllowListSendersRemovedIterator struct { + Event *OnRampAllowListSendersRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampAllowListSendersRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampAllowListSendersRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampAllowListSendersRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampAllowListSendersRemovedIterator) Error() error { + return it.fail +} + +func (it *OnRampAllowListSendersRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampAllowListSendersRemoved struct { + DestChainSelector uint64 + Senders []common.Address + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterAllowListSendersRemoved(opts *bind.FilterOpts, destChainSelector []uint64) (*OnRampAllowListSendersRemovedIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _OnRamp.contract.FilterLogs(opts, "AllowListSendersRemoved", destChainSelectorRule) + if err != nil { + return nil, err + } + return &OnRampAllowListSendersRemovedIterator{contract: _OnRamp.contract, event: "AllowListSendersRemoved", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchAllowListSendersRemoved(opts *bind.WatchOpts, sink chan<- *OnRampAllowListSendersRemoved, destChainSelector []uint64) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _OnRamp.contract.WatchLogs(opts, "AllowListSendersRemoved", destChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OnRampAllowListSendersRemoved) + if err := _OnRamp.contract.UnpackLog(event, "AllowListSendersRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OnRamp *OnRampFilterer) ParseAllowListSendersRemoved(log types.Log) (*OnRampAllowListSendersRemoved, error) { + event := new(OnRampAllowListSendersRemoved) + if err := _OnRamp.contract.UnpackLog(event, "AllowListSendersRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OnRampCCIPMessageSentIterator struct { + Event *OnRampCCIPMessageSent + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampCCIPMessageSentIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampCCIPMessageSent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampCCIPMessageSent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampCCIPMessageSentIterator) Error() error { + return it.fail +} + +func (it *OnRampCCIPMessageSentIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampCCIPMessageSent struct { + DestChainSelector uint64 + SequenceNumber uint64 + Message InternalEVM2AnyRampMessage + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterCCIPMessageSent(opts *bind.FilterOpts, destChainSelector []uint64, sequenceNumber []uint64) (*OnRampCCIPMessageSentIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var sequenceNumberRule []interface{} + for _, sequenceNumberItem := range sequenceNumber { + sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem) + } + + logs, sub, err := _OnRamp.contract.FilterLogs(opts, "CCIPMessageSent", destChainSelectorRule, sequenceNumberRule) + if err != nil { + return nil, err + } + return &OnRampCCIPMessageSentIterator{contract: _OnRamp.contract, event: "CCIPMessageSent", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchCCIPMessageSent(opts *bind.WatchOpts, sink chan<- *OnRampCCIPMessageSent, destChainSelector []uint64, sequenceNumber []uint64) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + var sequenceNumberRule []interface{} + for _, sequenceNumberItem := range sequenceNumber { + sequenceNumberRule = append(sequenceNumberRule, sequenceNumberItem) + } + + logs, sub, err := _OnRamp.contract.WatchLogs(opts, "CCIPMessageSent", destChainSelectorRule, sequenceNumberRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OnRampCCIPMessageSent) + if err := _OnRamp.contract.UnpackLog(event, "CCIPMessageSent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OnRamp *OnRampFilterer) ParseCCIPMessageSent(log types.Log) (*OnRampCCIPMessageSent, error) { + event := new(OnRampCCIPMessageSent) + if err := _OnRamp.contract.UnpackLog(event, "CCIPMessageSent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OnRampConfigSetIterator struct { + Event *OnRampConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampConfigSetIterator) Error() error { + return it.fail +} + +func (it *OnRampConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampConfigSet struct { + StaticConfig OnRampStaticConfig + DynamicConfig OnRampDynamicConfig + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterConfigSet(opts *bind.FilterOpts) (*OnRampConfigSetIterator, error) { + + logs, sub, err := _OnRamp.contract.FilterLogs(opts, "ConfigSet") + if err != nil { + return nil, err + } + return &OnRampConfigSetIterator{contract: _OnRamp.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *OnRampConfigSet) (event.Subscription, error) { + + logs, sub, err := _OnRamp.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: + + event := new(OnRampConfigSet) + if err := _OnRamp.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 +} + +func (_OnRamp *OnRampFilterer) ParseConfigSet(log types.Log) (*OnRampConfigSet, error) { + event := new(OnRampConfigSet) + if err := _OnRamp.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OnRampDestChainConfigSetIterator struct { + Event *OnRampDestChainConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampDestChainConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampDestChainConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampDestChainConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampDestChainConfigSetIterator) Error() error { + return it.fail +} + +func (it *OnRampDestChainConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampDestChainConfigSet struct { + DestChainSelector uint64 + SequenceNumber uint64 + Router common.Address + AllowlistEnabled bool + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterDestChainConfigSet(opts *bind.FilterOpts, destChainSelector []uint64) (*OnRampDestChainConfigSetIterator, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _OnRamp.contract.FilterLogs(opts, "DestChainConfigSet", destChainSelectorRule) + if err != nil { + return nil, err + } + return &OnRampDestChainConfigSetIterator{contract: _OnRamp.contract, event: "DestChainConfigSet", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchDestChainConfigSet(opts *bind.WatchOpts, sink chan<- *OnRampDestChainConfigSet, destChainSelector []uint64) (event.Subscription, error) { + + var destChainSelectorRule []interface{} + for _, destChainSelectorItem := range destChainSelector { + destChainSelectorRule = append(destChainSelectorRule, destChainSelectorItem) + } + + logs, sub, err := _OnRamp.contract.WatchLogs(opts, "DestChainConfigSet", destChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OnRampDestChainConfigSet) + if err := _OnRamp.contract.UnpackLog(event, "DestChainConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OnRamp *OnRampFilterer) ParseDestChainConfigSet(log types.Log) (*OnRampDestChainConfigSet, error) { + event := new(OnRampDestChainConfigSet) + if err := _OnRamp.contract.UnpackLog(event, "DestChainConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OnRampFeeTokenWithdrawnIterator struct { + Event *OnRampFeeTokenWithdrawn + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampFeeTokenWithdrawnIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampFeeTokenWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampFeeTokenWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampFeeTokenWithdrawnIterator) Error() error { + return it.fail +} + +func (it *OnRampFeeTokenWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampFeeTokenWithdrawn struct { + FeeAggregator common.Address + FeeToken common.Address + Amount *big.Int + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterFeeTokenWithdrawn(opts *bind.FilterOpts, feeAggregator []common.Address, feeToken []common.Address) (*OnRampFeeTokenWithdrawnIterator, error) { + + var feeAggregatorRule []interface{} + for _, feeAggregatorItem := range feeAggregator { + feeAggregatorRule = append(feeAggregatorRule, feeAggregatorItem) + } + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) + } + + logs, sub, err := _OnRamp.contract.FilterLogs(opts, "FeeTokenWithdrawn", feeAggregatorRule, feeTokenRule) + if err != nil { + return nil, err + } + return &OnRampFeeTokenWithdrawnIterator{contract: _OnRamp.contract, event: "FeeTokenWithdrawn", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchFeeTokenWithdrawn(opts *bind.WatchOpts, sink chan<- *OnRampFeeTokenWithdrawn, feeAggregator []common.Address, feeToken []common.Address) (event.Subscription, error) { + + var feeAggregatorRule []interface{} + for _, feeAggregatorItem := range feeAggregator { + feeAggregatorRule = append(feeAggregatorRule, feeAggregatorItem) + } + var feeTokenRule []interface{} + for _, feeTokenItem := range feeToken { + feeTokenRule = append(feeTokenRule, feeTokenItem) + } + + logs, sub, err := _OnRamp.contract.WatchLogs(opts, "FeeTokenWithdrawn", feeAggregatorRule, feeTokenRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(OnRampFeeTokenWithdrawn) + if err := _OnRamp.contract.UnpackLog(event, "FeeTokenWithdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_OnRamp *OnRampFilterer) ParseFeeTokenWithdrawn(log types.Log) (*OnRampFeeTokenWithdrawn, error) { + event := new(OnRampFeeTokenWithdrawn) + if err := _OnRamp.contract.UnpackLog(event, "FeeTokenWithdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OnRampOwnershipTransferRequestedIterator struct { + Event *OnRampOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *OnRampOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OnRampOwnershipTransferRequestedIterator, 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 := _OnRamp.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &OnRampOwnershipTransferRequestedIterator{contract: _OnRamp.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *OnRampOwnershipTransferRequested, 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 := _OnRamp.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: + + event := new(OnRampOwnershipTransferRequested) + if err := _OnRamp.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 +} + +func (_OnRamp *OnRampFilterer) ParseOwnershipTransferRequested(log types.Log) (*OnRampOwnershipTransferRequested, error) { + event := new(OnRampOwnershipTransferRequested) + if err := _OnRamp.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type OnRampOwnershipTransferredIterator struct { + Event *OnRampOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *OnRampOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(OnRampOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(OnRampOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *OnRampOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *OnRampOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type OnRampOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_OnRamp *OnRampFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OnRampOwnershipTransferredIterator, 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 := _OnRamp.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &OnRampOwnershipTransferredIterator{contract: _OnRamp.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_OnRamp *OnRampFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *OnRampOwnershipTransferred, 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 := _OnRamp.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: + + event := new(OnRampOwnershipTransferred) + if err := _OnRamp.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 +} + +func (_OnRamp *OnRampFilterer) ParseOwnershipTransferred(log types.Log) (*OnRampOwnershipTransferred, error) { + event := new(OnRampOwnershipTransferred) + if err := _OnRamp.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetAllowedSendersList struct { + IsEnabled bool + ConfiguredAddresses []common.Address +} +type GetDestChainConfig struct { + SequenceNumber uint64 + AllowlistEnabled bool + Router common.Address +} + +func (_OnRamp *OnRamp) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _OnRamp.abi.Events["AllowListAdminSet"].ID: + return _OnRamp.ParseAllowListAdminSet(log) + case _OnRamp.abi.Events["AllowListSendersAdded"].ID: + return _OnRamp.ParseAllowListSendersAdded(log) + case _OnRamp.abi.Events["AllowListSendersRemoved"].ID: + return _OnRamp.ParseAllowListSendersRemoved(log) + case _OnRamp.abi.Events["CCIPMessageSent"].ID: + return _OnRamp.ParseCCIPMessageSent(log) + case _OnRamp.abi.Events["ConfigSet"].ID: + return _OnRamp.ParseConfigSet(log) + case _OnRamp.abi.Events["DestChainConfigSet"].ID: + return _OnRamp.ParseDestChainConfigSet(log) + case _OnRamp.abi.Events["FeeTokenWithdrawn"].ID: + return _OnRamp.ParseFeeTokenWithdrawn(log) + case _OnRamp.abi.Events["OwnershipTransferRequested"].ID: + return _OnRamp.ParseOwnershipTransferRequested(log) + case _OnRamp.abi.Events["OwnershipTransferred"].ID: + return _OnRamp.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (OnRampAllowListAdminSet) Topic() common.Hash { + return common.HexToHash("0xb8c9b44ae5b5e3afb195f67391d9ff50cb904f9c0fa5fd520e497a97c1aa5a1e") +} + +func (OnRampAllowListSendersAdded) Topic() common.Hash { + return common.HexToHash("0x330939f6eafe8bb516716892fe962ff19770570838686e6579dbc1cc51fc3281") +} + +func (OnRampAllowListSendersRemoved) Topic() common.Hash { + return common.HexToHash("0xc237ec1921f855ccd5e9a5af9733f2d58943a5a8501ec5988e305d7a4d421586") +} + +func (OnRampCCIPMessageSent) Topic() common.Hash { + return common.HexToHash("0x192442a2b2adb6a7948f097023cb6b57d29d3a7a5dd33e6666d33c39cc456f32") +} + +func (OnRampConfigSet) Topic() common.Hash { + return common.HexToHash("0xc7372d2d886367d7bb1b0e0708a5436f2c91d6963de210eb2dc1ec2ecd6d21f1") +} + +func (OnRampDestChainConfigSet) Topic() common.Hash { + return common.HexToHash("0xd5ad72bc37dc7a80a8b9b9df20500046fd7341adb1be2258a540466fdd7dcef5") +} + +func (OnRampFeeTokenWithdrawn) Topic() common.Hash { + return common.HexToHash("0x508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e") +} + +func (OnRampOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (OnRampOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_OnRamp *OnRamp) Address() common.Address { + return _OnRamp.address +} + +type OnRampInterface interface { + GetAllowedSendersList(opts *bind.CallOpts, destChainSelector uint64) (GetAllowedSendersList, + + error) + + GetDestChainConfig(opts *bind.CallOpts, destChainSelector uint64) (GetDestChainConfig, + + error) + + GetDynamicConfig(opts *bind.CallOpts) (OnRampDynamicConfig, error) + + GetExpectedNextSequenceNumber(opts *bind.CallOpts, destChainSelector uint64) (uint64, error) + + GetFee(opts *bind.CallOpts, destChainSelector uint64, message ClientEVM2AnyMessage) (*big.Int, error) + + GetPoolBySourceToken(opts *bind.CallOpts, arg0 uint64, sourceToken common.Address) (common.Address, error) + + GetStaticConfig(opts *bind.CallOpts) (OnRampStaticConfig, error) + + GetSupportedTokens(opts *bind.CallOpts, arg0 uint64) ([]common.Address, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + ApplyAllowlistUpdates(opts *bind.TransactOpts, allowlistConfigArgsItems []OnRampAllowlistConfigArgs) (*types.Transaction, error) + + ApplyDestChainConfigUpdates(opts *bind.TransactOpts, destChainConfigArgs []OnRampDestChainConfigArgs) (*types.Transaction, error) + + ForwardFromRouter(opts *bind.TransactOpts, destChainSelector uint64, message ClientEVM2AnyMessage, feeTokenAmount *big.Int, originalSender common.Address) (*types.Transaction, error) + + SetDynamicConfig(opts *bind.TransactOpts, dynamicConfig OnRampDynamicConfig) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + WithdrawFeeTokens(opts *bind.TransactOpts, feeTokens []common.Address) (*types.Transaction, error) + + FilterAllowListAdminSet(opts *bind.FilterOpts, allowlistAdmin []common.Address) (*OnRampAllowListAdminSetIterator, error) + + WatchAllowListAdminSet(opts *bind.WatchOpts, sink chan<- *OnRampAllowListAdminSet, allowlistAdmin []common.Address) (event.Subscription, error) + + ParseAllowListAdminSet(log types.Log) (*OnRampAllowListAdminSet, error) + + FilterAllowListSendersAdded(opts *bind.FilterOpts, destChainSelector []uint64) (*OnRampAllowListSendersAddedIterator, error) + + WatchAllowListSendersAdded(opts *bind.WatchOpts, sink chan<- *OnRampAllowListSendersAdded, destChainSelector []uint64) (event.Subscription, error) + + ParseAllowListSendersAdded(log types.Log) (*OnRampAllowListSendersAdded, error) + + FilterAllowListSendersRemoved(opts *bind.FilterOpts, destChainSelector []uint64) (*OnRampAllowListSendersRemovedIterator, error) + + WatchAllowListSendersRemoved(opts *bind.WatchOpts, sink chan<- *OnRampAllowListSendersRemoved, destChainSelector []uint64) (event.Subscription, error) + + ParseAllowListSendersRemoved(log types.Log) (*OnRampAllowListSendersRemoved, error) + + FilterCCIPMessageSent(opts *bind.FilterOpts, destChainSelector []uint64, sequenceNumber []uint64) (*OnRampCCIPMessageSentIterator, error) + + WatchCCIPMessageSent(opts *bind.WatchOpts, sink chan<- *OnRampCCIPMessageSent, destChainSelector []uint64, sequenceNumber []uint64) (event.Subscription, error) + + ParseCCIPMessageSent(log types.Log) (*OnRampCCIPMessageSent, error) + + FilterConfigSet(opts *bind.FilterOpts) (*OnRampConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *OnRampConfigSet) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*OnRampConfigSet, error) + + FilterDestChainConfigSet(opts *bind.FilterOpts, destChainSelector []uint64) (*OnRampDestChainConfigSetIterator, error) + + WatchDestChainConfigSet(opts *bind.WatchOpts, sink chan<- *OnRampDestChainConfigSet, destChainSelector []uint64) (event.Subscription, error) + + ParseDestChainConfigSet(log types.Log) (*OnRampDestChainConfigSet, error) + + FilterFeeTokenWithdrawn(opts *bind.FilterOpts, feeAggregator []common.Address, feeToken []common.Address) (*OnRampFeeTokenWithdrawnIterator, error) + + WatchFeeTokenWithdrawn(opts *bind.WatchOpts, sink chan<- *OnRampFeeTokenWithdrawn, feeAggregator []common.Address, feeToken []common.Address) (event.Subscription, error) + + ParseFeeTokenWithdrawn(log types.Log) (*OnRampFeeTokenWithdrawn, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OnRampOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *OnRampOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*OnRampOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*OnRampOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *OnRampOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*OnRampOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/registry_module_owner_custom/registry_module_owner_custom.go b/core/gethwrappers/ccip/generated/v1_6_0/registry_module_owner_custom/registry_module_owner_custom.go new file mode 100644 index 00000000000..a93cb3b7ded --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/registry_module_owner_custom/registry_module_owner_custom.go @@ -0,0 +1,404 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package registry_module_owner_custom + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +var RegistryModuleOwnerCustomMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"tokenAdminRegistry\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAccessControlDefaultAdmin\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAdminViaGetCCIPAdmin\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAdminViaOwner\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AdministratorRegistered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"administrator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CanOnlySelfRegister\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"RequiredRoleNotFound\",\"inputs\":[{\"name\":\"msgSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"role\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x60a034607e57601f6106e938819003918201601f19168301916001600160401b03831184841017608357808492602094604052833981010312607e57516001600160a01b03811690819003607e578015606d5760805260405161064f908161009a82396080518161052b0152f35b639fabe1c160e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe608080604052600436101561001357600080fd5b60003560e01c908163181f5a77146103795750806369c0081e146101e557806396ea2f7a1461012a5763ff12c3541461004b57600080fd5b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043573ffffffffffffffffffffffffffffffffffffffff811690818103610125576020600492604051938480927f8fd6a6ac0000000000000000000000000000000000000000000000000000000082525afa908115610119576100e6926000926100e8575b506104f5565b005b61010b91925060203d602011610112575b6101038183610488565b8101906104c9565b90386100e0565b503d6100f9565b6040513d6000823e3d90fd5b600080fd5b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043573ffffffffffffffffffffffffffffffffffffffff811690818103610125576020600492604051938480927f8da5cb5b0000000000000000000000000000000000000000000000000000000082525afa908115610119576100e6926000926101c457506104f5565b6101de91925060203d602011610112576101038183610488565b90836100e0565b346101255760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101255760043573ffffffffffffffffffffffffffffffffffffffff811690818103610125576040517fa217fddf000000000000000000000000000000000000000000000000000000008152602081600481865afa90811561011957600091610347575b506040517f91d14854000000000000000000000000000000000000000000000000000000008152816004820152336024820152602081604481875afa90811561011957600091610305575b50156102cf576100e633836104f5565b90507f86e0b344000000000000000000000000000000000000000000000000000000006000523360045260245260445260646000fd5b6020813d60201161033f575b8161031e60209383610488565b8101031261033b57519081151582036103385750846102bf565b80fd5b5080fd5b3d9150610311565b90506020813d602011610371575b8161036260209383610488565b81010312610125575183610274565b3d9150610355565b346101255760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610125576040810181811067ffffffffffffffff82111761045957604052601f81527f52656769737472794d6f64756c654f776e6572437573746f6d20312e362e3000602082015260405190602082528181519182602083015260005b8381106104415750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f836000604080968601015201168101030190f35b60208282018101516040878401015285935001610401565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761045957604052565b90816020910312610125575173ffffffffffffffffffffffffffffffffffffffff811681036101255790565b9073ffffffffffffffffffffffffffffffffffffffff16903382036105fb5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690813b156101255773ffffffffffffffffffffffffffffffffffffffff906040519182917fe677ae3700000000000000000000000000000000000000000000000000000000835216928360048301528460248301528160446000948580945af180156105f05790827f09590fb70af4b833346363965e043a9339e8c7d378b8a2b903c75c277faec4f993926105e0575b9050a3565b6105e991610488565b38816105db565b6040513d84823e3d90fd5b73ffffffffffffffffffffffffffffffffffffffff917fc454d182000000000000000000000000000000000000000000000000000000006000526004521660245260446000fdfea164736f6c634300081a000a", +} + +var RegistryModuleOwnerCustomABI = RegistryModuleOwnerCustomMetaData.ABI + +var RegistryModuleOwnerCustomBin = RegistryModuleOwnerCustomMetaData.Bin + +func DeployRegistryModuleOwnerCustom(auth *bind.TransactOpts, backend bind.ContractBackend, tokenAdminRegistry common.Address) (common.Address, *types.Transaction, *RegistryModuleOwnerCustom, error) { + parsed, err := RegistryModuleOwnerCustomMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RegistryModuleOwnerCustomBin), backend, tokenAdminRegistry) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &RegistryModuleOwnerCustom{address: address, abi: *parsed, RegistryModuleOwnerCustomCaller: RegistryModuleOwnerCustomCaller{contract: contract}, RegistryModuleOwnerCustomTransactor: RegistryModuleOwnerCustomTransactor{contract: contract}, RegistryModuleOwnerCustomFilterer: RegistryModuleOwnerCustomFilterer{contract: contract}}, nil +} + +type RegistryModuleOwnerCustom struct { + address common.Address + abi abi.ABI + RegistryModuleOwnerCustomCaller + RegistryModuleOwnerCustomTransactor + RegistryModuleOwnerCustomFilterer +} + +type RegistryModuleOwnerCustomCaller struct { + contract *bind.BoundContract +} + +type RegistryModuleOwnerCustomTransactor struct { + contract *bind.BoundContract +} + +type RegistryModuleOwnerCustomFilterer struct { + contract *bind.BoundContract +} + +type RegistryModuleOwnerCustomSession struct { + Contract *RegistryModuleOwnerCustom + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type RegistryModuleOwnerCustomCallerSession struct { + Contract *RegistryModuleOwnerCustomCaller + CallOpts bind.CallOpts +} + +type RegistryModuleOwnerCustomTransactorSession struct { + Contract *RegistryModuleOwnerCustomTransactor + TransactOpts bind.TransactOpts +} + +type RegistryModuleOwnerCustomRaw struct { + Contract *RegistryModuleOwnerCustom +} + +type RegistryModuleOwnerCustomCallerRaw struct { + Contract *RegistryModuleOwnerCustomCaller +} + +type RegistryModuleOwnerCustomTransactorRaw struct { + Contract *RegistryModuleOwnerCustomTransactor +} + +func NewRegistryModuleOwnerCustom(address common.Address, backend bind.ContractBackend) (*RegistryModuleOwnerCustom, error) { + abi, err := abi.JSON(strings.NewReader(RegistryModuleOwnerCustomABI)) + if err != nil { + return nil, err + } + contract, err := bindRegistryModuleOwnerCustom(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RegistryModuleOwnerCustom{address: address, abi: abi, RegistryModuleOwnerCustomCaller: RegistryModuleOwnerCustomCaller{contract: contract}, RegistryModuleOwnerCustomTransactor: RegistryModuleOwnerCustomTransactor{contract: contract}, RegistryModuleOwnerCustomFilterer: RegistryModuleOwnerCustomFilterer{contract: contract}}, nil +} + +func NewRegistryModuleOwnerCustomCaller(address common.Address, caller bind.ContractCaller) (*RegistryModuleOwnerCustomCaller, error) { + contract, err := bindRegistryModuleOwnerCustom(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RegistryModuleOwnerCustomCaller{contract: contract}, nil +} + +func NewRegistryModuleOwnerCustomTransactor(address common.Address, transactor bind.ContractTransactor) (*RegistryModuleOwnerCustomTransactor, error) { + contract, err := bindRegistryModuleOwnerCustom(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RegistryModuleOwnerCustomTransactor{contract: contract}, nil +} + +func NewRegistryModuleOwnerCustomFilterer(address common.Address, filterer bind.ContractFilterer) (*RegistryModuleOwnerCustomFilterer, error) { + contract, err := bindRegistryModuleOwnerCustom(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RegistryModuleOwnerCustomFilterer{contract: contract}, nil +} + +func bindRegistryModuleOwnerCustom(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RegistryModuleOwnerCustomMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RegistryModuleOwnerCustom.Contract.RegistryModuleOwnerCustomCaller.contract.Call(opts, result, method, params...) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.RegistryModuleOwnerCustomTransactor.contract.Transfer(opts) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.RegistryModuleOwnerCustomTransactor.contract.Transact(opts, method, params...) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RegistryModuleOwnerCustom.Contract.contract.Call(opts, result, method, params...) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.contract.Transfer(opts) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.contract.Transact(opts, method, params...) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RegistryModuleOwnerCustom.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomSession) TypeAndVersion() (string, error) { + return _RegistryModuleOwnerCustom.Contract.TypeAndVersion(&_RegistryModuleOwnerCustom.CallOpts) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomCallerSession) TypeAndVersion() (string, error) { + return _RegistryModuleOwnerCustom.Contract.TypeAndVersion(&_RegistryModuleOwnerCustom.CallOpts) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomTransactor) RegisterAccessControlDefaultAdmin(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.contract.Transact(opts, "registerAccessControlDefaultAdmin", token) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomSession) RegisterAccessControlDefaultAdmin(token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.RegisterAccessControlDefaultAdmin(&_RegistryModuleOwnerCustom.TransactOpts, token) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomTransactorSession) RegisterAccessControlDefaultAdmin(token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.RegisterAccessControlDefaultAdmin(&_RegistryModuleOwnerCustom.TransactOpts, token) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomTransactor) RegisterAdminViaGetCCIPAdmin(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.contract.Transact(opts, "registerAdminViaGetCCIPAdmin", token) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomSession) RegisterAdminViaGetCCIPAdmin(token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.RegisterAdminViaGetCCIPAdmin(&_RegistryModuleOwnerCustom.TransactOpts, token) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomTransactorSession) RegisterAdminViaGetCCIPAdmin(token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.RegisterAdminViaGetCCIPAdmin(&_RegistryModuleOwnerCustom.TransactOpts, token) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomTransactor) RegisterAdminViaOwner(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.contract.Transact(opts, "registerAdminViaOwner", token) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomSession) RegisterAdminViaOwner(token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.RegisterAdminViaOwner(&_RegistryModuleOwnerCustom.TransactOpts, token) +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomTransactorSession) RegisterAdminViaOwner(token common.Address) (*types.Transaction, error) { + return _RegistryModuleOwnerCustom.Contract.RegisterAdminViaOwner(&_RegistryModuleOwnerCustom.TransactOpts, token) +} + +type RegistryModuleOwnerCustomAdministratorRegisteredIterator struct { + Event *RegistryModuleOwnerCustomAdministratorRegistered + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RegistryModuleOwnerCustomAdministratorRegisteredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RegistryModuleOwnerCustomAdministratorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RegistryModuleOwnerCustomAdministratorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RegistryModuleOwnerCustomAdministratorRegisteredIterator) Error() error { + return it.fail +} + +func (it *RegistryModuleOwnerCustomAdministratorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RegistryModuleOwnerCustomAdministratorRegistered struct { + Token common.Address + Administrator common.Address + Raw types.Log +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomFilterer) FilterAdministratorRegistered(opts *bind.FilterOpts, token []common.Address, administrator []common.Address) (*RegistryModuleOwnerCustomAdministratorRegisteredIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var administratorRule []interface{} + for _, administratorItem := range administrator { + administratorRule = append(administratorRule, administratorItem) + } + + logs, sub, err := _RegistryModuleOwnerCustom.contract.FilterLogs(opts, "AdministratorRegistered", tokenRule, administratorRule) + if err != nil { + return nil, err + } + return &RegistryModuleOwnerCustomAdministratorRegisteredIterator{contract: _RegistryModuleOwnerCustom.contract, event: "AdministratorRegistered", logs: logs, sub: sub}, nil +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomFilterer) WatchAdministratorRegistered(opts *bind.WatchOpts, sink chan<- *RegistryModuleOwnerCustomAdministratorRegistered, token []common.Address, administrator []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var administratorRule []interface{} + for _, administratorItem := range administrator { + administratorRule = append(administratorRule, administratorItem) + } + + logs, sub, err := _RegistryModuleOwnerCustom.contract.WatchLogs(opts, "AdministratorRegistered", tokenRule, administratorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RegistryModuleOwnerCustomAdministratorRegistered) + if err := _RegistryModuleOwnerCustom.contract.UnpackLog(event, "AdministratorRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustomFilterer) ParseAdministratorRegistered(log types.Log) (*RegistryModuleOwnerCustomAdministratorRegistered, error) { + event := new(RegistryModuleOwnerCustomAdministratorRegistered) + if err := _RegistryModuleOwnerCustom.contract.UnpackLog(event, "AdministratorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustom) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _RegistryModuleOwnerCustom.abi.Events["AdministratorRegistered"].ID: + return _RegistryModuleOwnerCustom.ParseAdministratorRegistered(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (RegistryModuleOwnerCustomAdministratorRegistered) Topic() common.Hash { + return common.HexToHash("0x09590fb70af4b833346363965e043a9339e8c7d378b8a2b903c75c277faec4f9") +} + +func (_RegistryModuleOwnerCustom *RegistryModuleOwnerCustom) Address() common.Address { + return _RegistryModuleOwnerCustom.address +} + +type RegistryModuleOwnerCustomInterface interface { + TypeAndVersion(opts *bind.CallOpts) (string, error) + + RegisterAccessControlDefaultAdmin(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + RegisterAdminViaGetCCIPAdmin(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + RegisterAdminViaOwner(opts *bind.TransactOpts, token common.Address) (*types.Transaction, error) + + FilterAdministratorRegistered(opts *bind.FilterOpts, token []common.Address, administrator []common.Address) (*RegistryModuleOwnerCustomAdministratorRegisteredIterator, error) + + WatchAdministratorRegistered(opts *bind.WatchOpts, sink chan<- *RegistryModuleOwnerCustomAdministratorRegistered, token []common.Address, administrator []common.Address) (event.Subscription, error) + + ParseAdministratorRegistered(log types.Log) (*RegistryModuleOwnerCustomAdministratorRegistered, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/report_codec/report_codec.go b/core/gethwrappers/ccip/generated/v1_6_0/report_codec/report_codec.go new file mode 100644 index 00000000000..08c3f877570 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/report_codec/report_codec.go @@ -0,0 +1,564 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package report_codec + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type IRMNRemoteSignature struct { + R [32]byte + S [32]byte +} + +type InternalAny2EVMRampMessage struct { + Header InternalRampMessageHeader + Sender []byte + Data []byte + Receiver common.Address + GasLimit *big.Int + TokenAmounts []InternalAny2EVMTokenTransfer +} + +type InternalAny2EVMTokenTransfer struct { + SourcePoolAddress []byte + DestTokenAddress common.Address + DestGasAmount uint32 + ExtraData []byte + Amount *big.Int +} + +type InternalExecutionReport struct { + SourceChainSelector uint64 + Messages []InternalAny2EVMRampMessage + OffchainTokenData [][][]byte + Proofs [][32]byte + ProofFlagBits *big.Int +} + +type InternalGasPriceUpdate struct { + DestChainSelector uint64 + UsdPerUnitGas *big.Int +} + +type InternalMerkleRoot struct { + SourceChainSelector uint64 + OnRampAddress []byte + MinSeqNr uint64 + MaxSeqNr uint64 + MerkleRoot [32]byte +} + +type InternalPriceUpdates struct { + TokenPriceUpdates []InternalTokenPriceUpdate + GasPriceUpdates []InternalGasPriceUpdate +} + +type InternalRampMessageHeader struct { + MessageId [32]byte + SourceChainSelector uint64 + DestChainSelector uint64 + SequenceNumber uint64 + Nonce uint64 +} + +type InternalTokenPriceUpdate struct { + SourceToken common.Address + UsdPerToken *big.Int +} + +type OffRampCommitReport struct { + PriceUpdates InternalPriceUpdates + BlessedMerkleRoots []InternalMerkleRoot + UnblessedMerkleRoots []InternalMerkleRoot + RmnSignatures []IRMNRemoteSignature +} + +var ReportCodecMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"decodeCommitReport\",\"inputs\":[{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"decodeExecuteReport\",\"inputs\":[{\"name\":\"report\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"pure\"},{\"type\":\"event\",\"name\":\"CommitReportDecoded\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOffRamp.CommitReport\",\"components\":[{\"name\":\"priceUpdates\",\"type\":\"tuple\",\"internalType\":\"structInternal.PriceUpdates\",\"components\":[{\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"components\":[{\"name\":\"sourceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"usdPerToken\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]},{\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.GasPriceUpdate[]\",\"components\":[{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"usdPerUnitGas\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}]},{\"name\":\"blessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"unblessedMerkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rmnSignatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExecuteReportDecoded\",\"inputs\":[{\"name\":\"report\",\"type\":\"tuple[]\",\"indexed\":false,\"internalType\":\"structInternal.ExecutionReport[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"messages\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structInternal.RampMessageHeader\",\"components\":[{\"name\":\"messageId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"destChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"sequenceNumber\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"sender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"gasLimit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAmounts\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.Any2EVMTokenTransfer[]\",\"components\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destTokenAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destGasAmount\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"proofs\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proofFlagBits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"anonymous\":false}]", + Bin: "0x6080806040523460155761168f908161001b8239f35b600080fdfe6101c0604052600436101561001357600080fd5b60003560e01c80636fb34956146104fc5763f816ec601461003357600080fd5b346104795761004136611329565b60608061004c61126b565b61005461128b565b82815282602082015281528160208201528160408201520152805181019060208201906020818403126104795760208101519067ffffffffffffffff8211610479570190608082840312610479576100aa61126b565b91602081015167ffffffffffffffff81116104795781016020810190604090860312610479576100d861128b565b90805167ffffffffffffffff811161047957810184601f8201121561047957805161010a610105826114d2565b6112ab565b9160208084848152019260061b8201019087821161047957602001915b8183106104bd57505050825260208101519067ffffffffffffffff8211610479570183601f82011215610479578051610162610105826114d2565b9160208084848152019260061b8201019086821161047957602001915b81831061047e5750505060208201528352604081015167ffffffffffffffff8111610479578260206101b392840101611584565b9360208401948552606082015167ffffffffffffffff8111610479578360206101de92850101611584565b9160408501928352608081015167ffffffffffffffff81116104795760209101019280601f850112156104795783519161021a610105846114d2565b9460208087868152019460061b82010192831161047957602001925b828410610448575050505060608301918252604051926020845251936080602085015260e0840194805195604060a087015286518091526020610100870197019060005b8181106103f25750505060200151947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608582030160c08601526020808751928381520196019060005b8181106103a85750505090610307849561033893517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe087830301604088015261140c565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301606086015261140c565b9051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08382030160808401526020808351928381520192019060005b818110610383575050500390f35b8251805185526020908101518186015286955060409094019390920191600101610375565b8251805167ffffffffffffffff1689526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16818a0152604090980197909201916001016102c3565b8251805173ffffffffffffffffffffffffffffffffffffffff168a526020908101517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16818b01526040909901989092019160010161027a565b60406020858403011261047957602060409161046261128b565b865181528287015183820152815201930192610236565b600080fd5b60406020848b03011261047957602060409161049861128b565b6104a1866114ea565b81526104ae83870161155b565b8382015281520192019161017f565b60406020848c0301126104795760206040916104d761128b565b6104e08661153a565b81526104ed83870161155b565b83820152815201920191610127565b346104795761050a36611329565b61010052610100515161010051016101a0526020610100516101a05103126104795760206101005101516101405267ffffffffffffffff61014051116104795760206101a05101603f610140516101005101011215610479576020610140516101005101015161012052610583610105610120516114d2565b60c05260c051610180526101205160c05152602060c0510160c05260c0516101605260206101a051016020806101205160051b610140516101005101010101116104795760406101405161010051010160e0525b6020806101205160051b61014051610100510101010160e051106109a35760405180602081016020825261018051518091526040820160408260051b8401019161016051916000905b82821061062f57505050500390f35b91939092947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc090820301825284519060a081019167ffffffffffffffff815116825260208101519260a06020840152835180915260c08301602060c08360051b86010195019160005b8181106107f357505050506040810151928281036040840152835180825260208201906020808260051b85010196019260005b8281106107385750505050506060810151928281036060840152602080855192838152019401906000905b80821061072057505050600192602092608080859401519101529601920192018594939192610620565b909194602080600192885181520196019201906106f6565b90919293967fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083829e9d9e0301855287519081519081815260208101906020808460051b8301019401926000915b8183106107aa5750505050506020806001929e9d9e990195019101929190926106cb565b90919293946020806107e6837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0866001960301895289516113c9565b9701950193019190610786565b909192957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff40868203018452865167ffffffffffffffff6080825180518552826020820151166020860152826040820151166040860152826060820151166060860152015116608083015260a061088e61087c6020840151610140848701526101408601906113c9565b604084015185820360c08701526113c9565b9173ffffffffffffffffffffffffffffffffffffffff60608201511660e0850152608081015161010085015201519161012081830391015281519081815260208101906020808460051b8301019401926000915b818310610902575050505050602080600192980194019101919091610698565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08560019503018852885190608080610990610950855160a0865260a08601906113c9565b73ffffffffffffffffffffffffffffffffffffffff87870151168786015263ffffffff6040870151166040860152606086015185820360608701526113c9565b93015191015297019501930191906108e2565b60e0515160a05267ffffffffffffffff60a051116104795760a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081835161014051610100510101016101a0510301011261047957610a0261124b565b610a1c60208060a0516101405161010051010101016114ea565b81526040602060a0516101405161010051010101015160805267ffffffffffffffff608051116104795760206101a05101601f60206080518160a051610140516101005101010101010112156104795760206080518160a0516101405161010051010101010151610a8f610105826114d2565b90602082828152019060206101a0510160208260051b816080518160a05161014051610100510101010101010111610479576020806080518160a0516101405161010051010101010101915b60208260051b816080518160a0516101405161010051010101010101018310610dc65750505060208201526060602060a0516101405161010051010101015167ffffffffffffffff81116104795760206101a05101601f6020838160a05161014051610100510101010101011215610479576020818160a051610140516101005101010101015190610b6f610105836114d2565b91602083828152019160206101a0510160208360051b81848160a051610140516101005101010101010101116104795760a051610140516101005101018101606001925b60208360051b81848160a0516101405161010051010101010101018410610ca55750505050604082015260a0805161014051610100510101015167ffffffffffffffff8111610479576020908160a0516101405161010051010101010160206101a05101601f8201121561047957805190610c30610105836114d2565b9160208084838152019160051b8301019160206101a05101831161047957602001905b828210610c9557505050606082015260a06020815161014051610100510101010151608082015260c05152602060c0510160c052602060e0510160e0526105d7565b8151815260209182019101610c53565b835167ffffffffffffffff81116104795760206101a05101603f826020868160a05161014051610100510101010101010112156104795760a051610140516101005101018301810160600151610cfd610105826114d2565b916020838381520160206101a051016020808560051b85828b8160a0516101405161010051010101010101010101116104795760a0516101405161010051010186018201608001905b60a05161014051610100516080910190910188018401600586901b01018210610d7c575050509082525060209384019301610bb3565b815167ffffffffffffffff8111610479576101a05160a051610140516101005160209586959094610dbb949087019360809301018d01890101016114ff565b815201910190610d46565b825167ffffffffffffffff81116104795760207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082826080518160a05161014051610100510101010101016101a051030101906101408212610479576040519160c083019083821067ffffffffffffffff83111761121c5760a0916040521261047957610e5161124b565b602082816080518160a051610140516101005101010101010101518152610e9160408360206080518160a0516101405161010051010101010101016114ea565b6020820152610eb960608360206080518160a0516101405161010051010101010101016114ea565b6040820152610ee0608083602082518160a0516101405161010051010101010101016114ea565b6060820152610f0760a08360206080518184516101405161010051010101010101016114ea565b6080820152825260c08160206080518160a0516101405161010051010101010101015167ffffffffffffffff811161047957610f64906020806101a051019184826080518160a051610140516101005101010101010101016114ff565b602083015260e08160206080518160a0516101405161010051010101010101015167ffffffffffffffff811161047957610fbf906020806101a051019184826080518160a051610140516101005101010101010101016114ff565b6040830152610fe66101008260206080518160a0516101405186510101010101010161153a565b60608301526101208160206080518160a0516101405161010051010101010101015160808301526101408160206080518160a05185516101005101010101010101519067ffffffffffffffff82116104795760206101a05101601f60208484826080518160a051610140516101005101010101010101010112156104795760208282826080518160a051610140516101005101010101010101015161108d610105826114d2565b92602084838152019260206101a0510160208460051b818585826080518160a05161014051610100510101010101010101010111610479576080805160a05161014051610100510101018201830101935b6080805160a051610140516101005101010183018401600586901b0101851061111957505050505060a0820152815260209283019201610adb565b845167ffffffffffffffff81116104795760208484826080518160a051610140516101005101010101010101010160a060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0836101a051030101126104795761118161124b565b91602082015167ffffffffffffffff8111610479576111ab906020806101a05101918501016114ff565b83526111b96040830161153a565b6020840152606082015163ffffffff8116810361047957604084015260808201519267ffffffffffffffff84116104795760a060209493611205869586806101a05101918401016114ff565b6060840152015160808201528152019401936110de565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519060a0820182811067ffffffffffffffff82111761121c57604052565b604051906080820182811067ffffffffffffffff82111761121c57604052565b604051906040820182811067ffffffffffffffff82111761121c57604052565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f604051930116820182811067ffffffffffffffff82111761121c57604052565b67ffffffffffffffff811161121c57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126104795760043567ffffffffffffffff8111610479578160238201121561047957806004013590611382610105836112ef565b92828452602483830101116104795781600092602460209301838601378301015290565b60005b8381106113b95750506000910152565b81810151838201526020016113a9565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093611405815180928187528780880191016113a6565b0116010190565b9080602083519182815201916020808360051b8301019401926000915b83831061143857505050505090565b9091929394602080827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0856001950301865288519067ffffffffffffffff82511681526080806114958585015160a08786015260a08501906113c9565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff6060820151166060850152015191015297019301930191939290611429565b67ffffffffffffffff811161121c5760051b60200190565b519067ffffffffffffffff8216820361047957565b81601f82011215610479578051611518610105826112ef565b92818452602082840101116104795761153791602080850191016113a6565b90565b519073ffffffffffffffffffffffffffffffffffffffff8216820361047957565b51907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8216820361047957565b81601f820112156104795780519061159e610105836114d2565b9260208085858152019360051b830101918183116104795760208101935b8385106115cb57505050505090565b845167ffffffffffffffff811161047957820160a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082860301126104795761161261124b565b9161161f602083016114ea565b835260408201519267ffffffffffffffff84116104795760a08361164a8860208098819801016114ff565b8584015261165a606082016114ea565b604084015261166b608082016114ea565b6060840152015160808201528152019401936115bc56fea164736f6c634300081a000a", +} + +var ReportCodecABI = ReportCodecMetaData.ABI + +var ReportCodecBin = ReportCodecMetaData.Bin + +func DeployReportCodec(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ReportCodec, error) { + parsed, err := ReportCodecMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ReportCodecBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ReportCodec{address: address, abi: *parsed, ReportCodecCaller: ReportCodecCaller{contract: contract}, ReportCodecTransactor: ReportCodecTransactor{contract: contract}, ReportCodecFilterer: ReportCodecFilterer{contract: contract}}, nil +} + +type ReportCodec struct { + address common.Address + abi abi.ABI + ReportCodecCaller + ReportCodecTransactor + ReportCodecFilterer +} + +type ReportCodecCaller struct { + contract *bind.BoundContract +} + +type ReportCodecTransactor struct { + contract *bind.BoundContract +} + +type ReportCodecFilterer struct { + contract *bind.BoundContract +} + +type ReportCodecSession struct { + Contract *ReportCodec + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type ReportCodecCallerSession struct { + Contract *ReportCodecCaller + CallOpts bind.CallOpts +} + +type ReportCodecTransactorSession struct { + Contract *ReportCodecTransactor + TransactOpts bind.TransactOpts +} + +type ReportCodecRaw struct { + Contract *ReportCodec +} + +type ReportCodecCallerRaw struct { + Contract *ReportCodecCaller +} + +type ReportCodecTransactorRaw struct { + Contract *ReportCodecTransactor +} + +func NewReportCodec(address common.Address, backend bind.ContractBackend) (*ReportCodec, error) { + abi, err := abi.JSON(strings.NewReader(ReportCodecABI)) + if err != nil { + return nil, err + } + contract, err := bindReportCodec(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ReportCodec{address: address, abi: abi, ReportCodecCaller: ReportCodecCaller{contract: contract}, ReportCodecTransactor: ReportCodecTransactor{contract: contract}, ReportCodecFilterer: ReportCodecFilterer{contract: contract}}, nil +} + +func NewReportCodecCaller(address common.Address, caller bind.ContractCaller) (*ReportCodecCaller, error) { + contract, err := bindReportCodec(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ReportCodecCaller{contract: contract}, nil +} + +func NewReportCodecTransactor(address common.Address, transactor bind.ContractTransactor) (*ReportCodecTransactor, error) { + contract, err := bindReportCodec(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ReportCodecTransactor{contract: contract}, nil +} + +func NewReportCodecFilterer(address common.Address, filterer bind.ContractFilterer) (*ReportCodecFilterer, error) { + contract, err := bindReportCodec(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ReportCodecFilterer{contract: contract}, nil +} + +func bindReportCodec(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ReportCodecMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_ReportCodec *ReportCodecRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ReportCodec.Contract.ReportCodecCaller.contract.Call(opts, result, method, params...) +} + +func (_ReportCodec *ReportCodecRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ReportCodec.Contract.ReportCodecTransactor.contract.Transfer(opts) +} + +func (_ReportCodec *ReportCodecRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ReportCodec.Contract.ReportCodecTransactor.contract.Transact(opts, method, params...) +} + +func (_ReportCodec *ReportCodecCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ReportCodec.Contract.contract.Call(opts, result, method, params...) +} + +func (_ReportCodec *ReportCodecTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ReportCodec.Contract.contract.Transfer(opts) +} + +func (_ReportCodec *ReportCodecTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ReportCodec.Contract.contract.Transact(opts, method, params...) +} + +func (_ReportCodec *ReportCodecCaller) DecodeCommitReport(opts *bind.CallOpts, report []byte) (OffRampCommitReport, error) { + var out []interface{} + err := _ReportCodec.contract.Call(opts, &out, "decodeCommitReport", report) + + if err != nil { + return *new(OffRampCommitReport), err + } + + out0 := *abi.ConvertType(out[0], new(OffRampCommitReport)).(*OffRampCommitReport) + + return out0, err + +} + +func (_ReportCodec *ReportCodecSession) DecodeCommitReport(report []byte) (OffRampCommitReport, error) { + return _ReportCodec.Contract.DecodeCommitReport(&_ReportCodec.CallOpts, report) +} + +func (_ReportCodec *ReportCodecCallerSession) DecodeCommitReport(report []byte) (OffRampCommitReport, error) { + return _ReportCodec.Contract.DecodeCommitReport(&_ReportCodec.CallOpts, report) +} + +func (_ReportCodec *ReportCodecCaller) DecodeExecuteReport(opts *bind.CallOpts, report []byte) ([]InternalExecutionReport, error) { + var out []interface{} + err := _ReportCodec.contract.Call(opts, &out, "decodeExecuteReport", report) + + if err != nil { + return *new([]InternalExecutionReport), err + } + + out0 := *abi.ConvertType(out[0], new([]InternalExecutionReport)).(*[]InternalExecutionReport) + + return out0, err + +} + +func (_ReportCodec *ReportCodecSession) DecodeExecuteReport(report []byte) ([]InternalExecutionReport, error) { + return _ReportCodec.Contract.DecodeExecuteReport(&_ReportCodec.CallOpts, report) +} + +func (_ReportCodec *ReportCodecCallerSession) DecodeExecuteReport(report []byte) ([]InternalExecutionReport, error) { + return _ReportCodec.Contract.DecodeExecuteReport(&_ReportCodec.CallOpts, report) +} + +type ReportCodecCommitReportDecodedIterator struct { + Event *ReportCodecCommitReportDecoded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *ReportCodecCommitReportDecodedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(ReportCodecCommitReportDecoded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(ReportCodecCommitReportDecoded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *ReportCodecCommitReportDecodedIterator) Error() error { + return it.fail +} + +func (it *ReportCodecCommitReportDecodedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type ReportCodecCommitReportDecoded struct { + Report OffRampCommitReport + Raw types.Log +} + +func (_ReportCodec *ReportCodecFilterer) FilterCommitReportDecoded(opts *bind.FilterOpts) (*ReportCodecCommitReportDecodedIterator, error) { + + logs, sub, err := _ReportCodec.contract.FilterLogs(opts, "CommitReportDecoded") + if err != nil { + return nil, err + } + return &ReportCodecCommitReportDecodedIterator{contract: _ReportCodec.contract, event: "CommitReportDecoded", logs: logs, sub: sub}, nil +} + +func (_ReportCodec *ReportCodecFilterer) WatchCommitReportDecoded(opts *bind.WatchOpts, sink chan<- *ReportCodecCommitReportDecoded) (event.Subscription, error) { + + logs, sub, err := _ReportCodec.contract.WatchLogs(opts, "CommitReportDecoded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(ReportCodecCommitReportDecoded) + if err := _ReportCodec.contract.UnpackLog(event, "CommitReportDecoded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_ReportCodec *ReportCodecFilterer) ParseCommitReportDecoded(log types.Log) (*ReportCodecCommitReportDecoded, error) { + event := new(ReportCodecCommitReportDecoded) + if err := _ReportCodec.contract.UnpackLog(event, "CommitReportDecoded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type ReportCodecExecuteReportDecodedIterator struct { + Event *ReportCodecExecuteReportDecoded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *ReportCodecExecuteReportDecodedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(ReportCodecExecuteReportDecoded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(ReportCodecExecuteReportDecoded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *ReportCodecExecuteReportDecodedIterator) Error() error { + return it.fail +} + +func (it *ReportCodecExecuteReportDecodedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type ReportCodecExecuteReportDecoded struct { + Report []InternalExecutionReport + Raw types.Log +} + +func (_ReportCodec *ReportCodecFilterer) FilterExecuteReportDecoded(opts *bind.FilterOpts) (*ReportCodecExecuteReportDecodedIterator, error) { + + logs, sub, err := _ReportCodec.contract.FilterLogs(opts, "ExecuteReportDecoded") + if err != nil { + return nil, err + } + return &ReportCodecExecuteReportDecodedIterator{contract: _ReportCodec.contract, event: "ExecuteReportDecoded", logs: logs, sub: sub}, nil +} + +func (_ReportCodec *ReportCodecFilterer) WatchExecuteReportDecoded(opts *bind.WatchOpts, sink chan<- *ReportCodecExecuteReportDecoded) (event.Subscription, error) { + + logs, sub, err := _ReportCodec.contract.WatchLogs(opts, "ExecuteReportDecoded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(ReportCodecExecuteReportDecoded) + if err := _ReportCodec.contract.UnpackLog(event, "ExecuteReportDecoded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_ReportCodec *ReportCodecFilterer) ParseExecuteReportDecoded(log types.Log) (*ReportCodecExecuteReportDecoded, error) { + event := new(ReportCodecExecuteReportDecoded) + if err := _ReportCodec.contract.UnpackLog(event, "ExecuteReportDecoded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_ReportCodec *ReportCodec) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _ReportCodec.abi.Events["CommitReportDecoded"].ID: + return _ReportCodec.ParseCommitReportDecoded(log) + case _ReportCodec.abi.Events["ExecuteReportDecoded"].ID: + return _ReportCodec.ParseExecuteReportDecoded(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (ReportCodecCommitReportDecoded) Topic() common.Hash { + return common.HexToHash("0x58a603662478f1f3f18b8fc8006e127dc1ef28117b04eb2d89cc22849068dcd8") +} + +func (ReportCodecExecuteReportDecoded) Topic() common.Hash { + return common.HexToHash("0x9467c8093a35a72f74398d5b6e351d67dc82eddc378efc6177eafb4fc7a01d39") +} + +func (_ReportCodec *ReportCodec) Address() common.Address { + return _ReportCodec.address +} + +type ReportCodecInterface interface { + DecodeCommitReport(opts *bind.CallOpts, report []byte) (OffRampCommitReport, error) + + DecodeExecuteReport(opts *bind.CallOpts, report []byte) ([]InternalExecutionReport, error) + + FilterCommitReportDecoded(opts *bind.FilterOpts) (*ReportCodecCommitReportDecodedIterator, error) + + WatchCommitReportDecoded(opts *bind.WatchOpts, sink chan<- *ReportCodecCommitReportDecoded) (event.Subscription, error) + + ParseCommitReportDecoded(log types.Log) (*ReportCodecCommitReportDecoded, error) + + FilterExecuteReportDecoded(opts *bind.FilterOpts) (*ReportCodecExecuteReportDecodedIterator, error) + + WatchExecuteReportDecoded(opts *bind.WatchOpts, sink chan<- *ReportCodecExecuteReportDecoded) (event.Subscription, error) + + ParseExecuteReportDecoded(log types.Log) (*ReportCodecExecuteReportDecoded, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/rmn_home/rmn_home.go b/core/gethwrappers/ccip/generated/v1_6_0/rmn_home/rmn_home.go new file mode 100644 index 00000000000..af27055a53f --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/rmn_home/rmn_home.go @@ -0,0 +1,1508 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package rmn_home + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type RMNHomeDynamicConfig struct { + SourceChains []RMNHomeSourceChain + OffchainConfig []byte +} + +type RMNHomeNode struct { + PeerId [32]byte + OffchainPublicKey [32]byte +} + +type RMNHomeSourceChain struct { + ChainSelector uint64 + FObserve uint64 + ObserverNodesBitmap *big.Int +} + +type RMNHomeStaticConfig struct { + Nodes []RMNHomeNode + OffchainConfig []byte +} + +type RMNHomeVersionedConfig struct { + Version uint32 + ConfigDigest [32]byte + StaticConfig RMNHomeStaticConfig + DynamicConfig RMNHomeDynamicConfig +} + +var RMNHomeMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveDigest\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllConfigs\",\"inputs\":[],\"outputs\":[{\"name\":\"activeConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"candidateConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCandidateDigest\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfig\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"versionedConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.VersionedConfig\",\"components\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"ok\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConfigDigests\",\"inputs\":[],\"outputs\":[{\"name\":\"activeConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"candidateConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"promoteCandidateAndRevokeActive\",\"inputs\":[{\"name\":\"digestToPromote\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestToRevoke\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revokeCandidate\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setCandidate\",\"inputs\":[{\"name\":\"staticConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"digestToOverwrite\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"newConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDynamicConfig\",\"inputs\":[{\"name\":\"newDynamicConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"currentDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ActiveConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CandidateConfigRevoked\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigPromoted\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"staticConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.StaticConfig\",\"components\":[{\"name\":\"nodes\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.Node[]\",\"components\":[{\"name\":\"peerId\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"offchainPublicKey\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DynamicConfigSet\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"dynamicConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNHome.DynamicConfig\",\"components\":[{\"name\":\"sourceChains\",\"type\":\"tuple[]\",\"internalType\":\"structRMNHome.SourceChain[]\",\"components\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"fObserve\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"observerNodesBitmap\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"offchainConfig\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"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\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigDigestMismatch\",\"inputs\":[{\"name\":\"expectedConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"gotConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DigestNotFound\",\"inputs\":[{\"name\":\"configDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"DuplicateOffchainPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicatePeerId\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateSourceChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoOpStateTransitionNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotEnoughObservers\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBoundsNodesLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBoundsObserverNodeIndex\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RevokingZeroDigestNotAllowed\",\"inputs\":[]}]", + Bin: "0x60808060405234604d573315603c57600180546001600160a01b03191633179055600e80546001600160401b031916905561262690816100538239f35b639b15e16f60e01b60005260046000fd5b600080fdfe6080604052600436101561001257600080fd5b60003560e01c8063118dbac514610904578063123e65db146108ae578063181f5a77146108315780633567e6b4146107b757806338354c5c1461077657806363507956146106985780636dd5b69d1461063b578063736be802146105b457806379ba5097146104cb5780638c76967f146103255780638da5cb5b146102d3578063f2fde38b146101e05763fb4022d4146100ab57600080fd5b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576004356100e56123b4565b80156101b15763ffffffff610105600163ffffffff600e5460201c161890565b1660028110159081610152576006600391020191825481810361018157507f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b600080a26101525760009055005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f0849d8cc0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043573ffffffffffffffffffffffffffffffffffffffff81168091036101db576102386123b4565b3381146102a957807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576004356024356103626123b4565b8115806104c3575b6104995763ffffffff610388600163ffffffff600e5460201c161890565b1660028110156101525760060260030154828103610467575063ffffffff600e5460201c166002811015610152576006026003018054828103610467575060009055600e547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff67ffffffff00000000600163ffffffff8460201c161860201b16911617600e558061043c575b507ffc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e600080a2005b7f0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8600080a281610414565b90507f93df584c0000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b7f7b4d1e4f0000000000000000000000000000000000000000000000000000000060005260046000fd5b50801561036a565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760005473ffffffffffffffffffffffffffffffffffffffff8116330361058a577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043567ffffffffffffffff81116101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101db576106399061062d6123b4565b60243590600401611f4a565b005b346101db5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5761068c610678600435611eea565b6040519283926040845260408401906116d2565b90151560208301520390f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576106cf611ca0565b6106d7611ca0565b9063ffffffff600e5460201c1660028110156101525760066106fc9102600201611d92565b602081015161076e575b50600e5460201c63ffffffff166001186002811015610152576107549261073560066107629302600201611d92565b6020810151610766575b506040519384936040855260408501906116d2565b9083820360208501526116d2565b0390f35b90508461073f565b905082610706565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760206107af611c65565b604051908152f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5763ffffffff600e5460201c1660028110156101525760060260030154600e5460201c63ffffffff16600118906002821015610152576003600660409302015482519182526020820152f35b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db576107626040805190610872818361162b565b600d82527f524d4e486f6d6520312e362e300000000000000000000000000000000000000060208301525191829160208352602083019061168f565b346101db5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5763ffffffff600e5460201c1660028110156101525760036006602092020154604051908152f35b346101db5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101db5760043567ffffffffffffffff81116101db5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101db5767ffffffffffffffff602435116101db57602435360360407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101db576109b96123b4565b6040516000916109c8826115a8565b67ffffffffffffffff8460040135116115a4578360040135840190366023830112156115a0576109fb600483013561180a565b610a08604051918261162b565b6004830135808252602082019060061b84016024013681116112ad5760248501915b81831061156f575050508352602485013567ffffffffffffffff811161156b57610a5a9060043691880101611822565b6020840152610a6e366024356004016118ac565b94610100845151116115435790919484955b845151871015610b765760018701808811610b49575b85518051821015610b3c5788610aab916123ff565b5151610ab88288516123ff565b515114610b14576020610acc8988516123ff565b5101516020610adc8389516123ff565b51015114610aec57600101610a96565b6004877fae00651d000000000000000000000000000000000000000000000000000000008152fd5b6004877f221a8ae8000000000000000000000000000000000000000000000000000000008152fd5b5050600190960195610a80565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b949390610b8591515190612413565b610b8d611c65565b6044358103611513576114e7575b600e549363ffffffff85169463ffffffff86146114ba5763ffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000095969701169384911617600e557dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff604051610ccc610cfa6020830160208152610c5784610c2b604082018a600401611a26565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810186528561162b565b602060405191818301957f45564d000000000000000000000000000000000000000000000000000000000087524660408501523060608501528a608085015260808452610ca560a08561162b565b604051958694610cbd858701998a925192839161166c565b8501915180938584019061166c565b0101037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261162b565b519020167e0b0000000000000000000000000000000000000000000000000000000000001793610d35600163ffffffff600e5460201c161890565b600281101561148d576006029182600201866003850155857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000825416179055600483017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd85360301856004013512156112a95767ffffffffffffffff6004830135116112a957600482013560061b360360248301136112a9576801000000000000000060048301351161127c578054600483013580835581116113ff575b508752602087208790602483015b600484013583106113db575050505060058201610e246024850185600401611ad9565b9067ffffffffffffffff82116113ae578190610e408454611b2a565b601f811161135e575b508990601f83116001146112bc578a926112b1575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b60068201907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd6024356004013591018112156112ad57602435019060048201359167ffffffffffffffff83116112a95760240160608302360381136112a95768010000000000000000831161127c5781548383558084106111ca575b509087526020872087915b838310611150575050505060070191610f396024803501602435600401611ad9565b67ffffffffffffffff819592951161112357610f558254611b2a565b601f81116110de575b5090859392918760209890601f831160011461101a57907ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf096978361100f575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b611004610ff160405193849384526060898501526060840190600401611a26565b8281036040840152602435600401611b92565b0390a2604051908152f35b013590508980610f9e565b96907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083168489528a8920985b8181106110c45750917ff6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf097989184600195941061108c575b505050811b019055610fd0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c1991013516905589808061107f565b828401358a556001909901988a9850918b01918b01611047565b82885260208820601f830160051c81019160208410611119575b601f0160051c01905b81811061110e5750610f5e565b888155600101611101565b90915081906110f8565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600260608267ffffffffffffffff611169600195611b7d565b168554907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff00000000000000006111ab60208601611b7d565b60401b1692161717855560408101358486015501920192019190610f17565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116810361124f577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416840361124f57828952602089209060011b8101908460011b015b81811061123d5750610f0c565b808a600292558a600182015501611230565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8780fd5b8680fd5b013590508980610e5e565b90917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01691848b5260208b20928b5b818110611346575090846001959493921061130e575b505050811b019055610e90565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055898080611301565b919360206001819287870135815501950192016112eb565b909150838a5260208a20601f840160051c810191602085106113a4575b90601f859493920160051c01905b8181106113965750610e49565b8b8155849350600101611389565b909150819061137b565b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60016002604083600494358655602081013584870155019301930192919050610e01565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116810361124f5760048301357f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116900361124f57818952602089209060011b810190600484013560011b015b81811061147b5750610df3565b6002908a81558a60018201550161146e565b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526032600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6044357f53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b8480a2610b9b565b7f93df584c0000000000000000000000000000000000000000000000000000000084526004526044803560245283fd5b6004857faf26d5e3000000000000000000000000000000000000000000000000000000008152fd5b8480fd5b6040833603126112a95760206040918251611589816115a8565b853581528286013583820152815201920191610a2a565b8380fd5b8280fd5b6040810190811067ffffffffffffffff8211176115c457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176115c457604052565b6080810190811067ffffffffffffffff8211176115c457604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176115c457604052565b60005b83811061167f5750506000910152565b818101518382015260200161166f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6020936116cb8151809281875287808801910161166c565b0116010190565b91909163ffffffff81511683526020810151602084015260408101516080604085015260c0840190805191604060808701528251809152602060e0870193019060005b8181106117e85750505060609160206117599201517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808783030160a088015261168f565b910151926060818303910152604081019083519160408252825180915260206060830193019060005b8181106117a65750505060206117a39394015190602081840391015261168f565b90565b909193602060606001926040885167ffffffffffffffff815116835267ffffffffffffffff858201511685840152015160408201520195019101919091611782565b8251805186526020908101518187015260409095019490920191600101611715565b67ffffffffffffffff81116115c45760051b60200190565b81601f820112156101db5780359067ffffffffffffffff82116115c45760405192611875601f84017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018561162b565b828452602083830101116101db57816000926020809301838601378301015290565b359067ffffffffffffffff821682036101db57565b91906040838203126101db57604051906118c5826115a8565b8193803567ffffffffffffffff81116101db57810182601f820112156101db5780356118f08161180a565b916118fe604051938461162b565b818352602060608185019302820101908582116101db57602001915b81831061194d57505050835260208101359167ffffffffffffffff83116101db576020926119489201611822565b910152565b6060838703126101db576020606091604051611968816115f3565b61197186611897565b815261197e838701611897565b838201526040860135604082015281520192019161191a565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1823603018112156101db57016020813591019167ffffffffffffffff82116101db5781360383136101db57565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b9190604081019083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156101db5784016020813591019267ffffffffffffffff82116101db578160061b360384136101db578190604084525260608201929060005b818110611ab957505050611aab8460206117a395960190611997565b9160208185039101526119e7565b823585526020808401359086015260409485019490920191600101611a8f565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101db570180359067ffffffffffffffff82116101db576020019181360383136101db57565b90600182811c92168015611b73575b6020831014611b4457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691611b39565b3567ffffffffffffffff811681036101db5790565b9190604081019083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156101db5784016020813591019267ffffffffffffffff82116101db5760608202360384136101db578190604084525260608201929060005b818110611c1757505050611aab8460206117a395960190611997565b90919360608060019267ffffffffffffffff611c3289611897565b16815267ffffffffffffffff611c4a60208a01611897565b16602082015260408881013590820152019501929101611bfb565b600e5460201c63ffffffff166001186002811015610152576006026003015490565b60405190611c94826115a8565b60606020838281520152565b60405190611cad8261160f565b816000815260006020820152611cc1611c87565b60408201526060611948611c87565b9060405191826000825492611ce484611b2a565b8084529360018116908115611d525750600114611d0b575b50611d099250038361162b565b565b90506000929192526020600020906000915b818310611d36575050906020611d099282010138611cfc565b6020919350806001915483858901015201910190918492611d1d565b60209350611d099592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b82010138611cfc565b9060405191611da08361160f565b8263ffffffff8254168152600182015460208201526002820160405190611dc6826115a8565b8054611dd18161180a565b91611ddf604051938461162b565b818352602083019060005260206000206000915b838310611ebd57505050508152611e0c60038401611cd0565b60208201526040820152600482019160405192611e28846115a8565b8054611e338161180a565b91611e41604051938461162b565b818352602083019060005260206000206000915b838310611e7b5750505050600560609392611e7292865201611cd0565b60208401520152565b60026020600192604051611e8e816115f3565b67ffffffffffffffff8654818116835260401c1683820152848601546040820152815201920192019190611e55565b60026020600192604051611ed0816115a8565b855481528486015483820152815201920192019190611df3565b611ef2611ca0565b9060005b6002811015611f4257600060068202908360038301541480611f39575b611f21575050600101611ef6565b91509150611f33925050600201611d92565b90600190565b50831515611f13565b505090600090565b9060005b60028110156123865760006006820290836003830154148061237d575b611f79575050600101611f4e565b90915092919250611f976004820154611f9236856118ac565b612413565b6000906006810183357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018112156115a05784019081359167ffffffffffffffff831161156b57602001606083023603811361156b5768010000000000000000831161235057815483835580841061229e575b509084526020842084915b8383106122245750505050600701906120346020840184611ad9565b919067ffffffffffffffff83116121f75761204f8454611b2a565b601f81116121b2575b5081601f84116001146120ec57926120dc949281927f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e62949795926120e1575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b604051918291602083526020830190611b92565b0390a2565b013590503880612096565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0841685845260208420935b81811061219a57509260019285927f1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e629498966120dc989610612162575b505050811b0190556120c8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88560031b161c19910135169055388080612155565b91936020600181928787013581550195019201612119565b84835260208320601f850160051c810191602086106121ed575b601f0160051c01905b8181106121e25750612058565b8381556001016121d5565b90915081906121cc565b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b600260608267ffffffffffffffff61223d600195611b7d565b168554907fffffffffffffffffffffffffffffffff000000000000000000000000000000006fffffffffffffffff000000000000000061227f60208601611b7d565b60401b1692161717855560408101358486015501920192019190612018565b7f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168103612323577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416840361232357828652602086209060011b8101908460011b015b818110612311575061200d565b80876002925587600182015501612304565b6024867f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50831515611f6b565b507fd0b2c0310000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff6001541633036123d557565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b80518210156101525760209160051b010190565b908151519160005b8381106124285750505050565b6124338183516123ff565b5160018201808311612508575b8581106125bf575060408101519084610100036101008111612508577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83911c81160361259557816000925b61253757506020015160011b6801fffffffffffffffe67fffffffffffffffe8216911681036125085760010167ffffffffffffffff81116125085767ffffffffffffffff16116124de5760010161241b565b7fa804bcb30000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908082116125085716917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461250857600101918061248c565b7f2847b6060000000000000000000000000000000000000000000000000000000060005260046000fd5b67ffffffffffffffff82511667ffffffffffffffff6125df8387516123ff565b515116146125ef57600101612440565b7f3857f84d0000000000000000000000000000000000000000000000000000000060005260046000fdfea164736f6c634300081a000a", +} + +var RMNHomeABI = RMNHomeMetaData.ABI + +var RMNHomeBin = RMNHomeMetaData.Bin + +func DeployRMNHome(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *RMNHome, error) { + parsed, err := RMNHomeMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RMNHomeBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &RMNHome{address: address, abi: *parsed, RMNHomeCaller: RMNHomeCaller{contract: contract}, RMNHomeTransactor: RMNHomeTransactor{contract: contract}, RMNHomeFilterer: RMNHomeFilterer{contract: contract}}, nil +} + +type RMNHome struct { + address common.Address + abi abi.ABI + RMNHomeCaller + RMNHomeTransactor + RMNHomeFilterer +} + +type RMNHomeCaller struct { + contract *bind.BoundContract +} + +type RMNHomeTransactor struct { + contract *bind.BoundContract +} + +type RMNHomeFilterer struct { + contract *bind.BoundContract +} + +type RMNHomeSession struct { + Contract *RMNHome + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type RMNHomeCallerSession struct { + Contract *RMNHomeCaller + CallOpts bind.CallOpts +} + +type RMNHomeTransactorSession struct { + Contract *RMNHomeTransactor + TransactOpts bind.TransactOpts +} + +type RMNHomeRaw struct { + Contract *RMNHome +} + +type RMNHomeCallerRaw struct { + Contract *RMNHomeCaller +} + +type RMNHomeTransactorRaw struct { + Contract *RMNHomeTransactor +} + +func NewRMNHome(address common.Address, backend bind.ContractBackend) (*RMNHome, error) { + abi, err := abi.JSON(strings.NewReader(RMNHomeABI)) + if err != nil { + return nil, err + } + contract, err := bindRMNHome(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RMNHome{address: address, abi: abi, RMNHomeCaller: RMNHomeCaller{contract: contract}, RMNHomeTransactor: RMNHomeTransactor{contract: contract}, RMNHomeFilterer: RMNHomeFilterer{contract: contract}}, nil +} + +func NewRMNHomeCaller(address common.Address, caller bind.ContractCaller) (*RMNHomeCaller, error) { + contract, err := bindRMNHome(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RMNHomeCaller{contract: contract}, nil +} + +func NewRMNHomeTransactor(address common.Address, transactor bind.ContractTransactor) (*RMNHomeTransactor, error) { + contract, err := bindRMNHome(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RMNHomeTransactor{contract: contract}, nil +} + +func NewRMNHomeFilterer(address common.Address, filterer bind.ContractFilterer) (*RMNHomeFilterer, error) { + contract, err := bindRMNHome(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RMNHomeFilterer{contract: contract}, nil +} + +func bindRMNHome(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RMNHomeMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_RMNHome *RMNHomeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RMNHome.Contract.RMNHomeCaller.contract.Call(opts, result, method, params...) +} + +func (_RMNHome *RMNHomeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNHome.Contract.RMNHomeTransactor.contract.Transfer(opts) +} + +func (_RMNHome *RMNHomeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RMNHome.Contract.RMNHomeTransactor.contract.Transact(opts, method, params...) +} + +func (_RMNHome *RMNHomeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RMNHome.Contract.contract.Call(opts, result, method, params...) +} + +func (_RMNHome *RMNHomeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNHome.Contract.contract.Transfer(opts) +} + +func (_RMNHome *RMNHomeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RMNHome.Contract.contract.Transact(opts, method, params...) +} + +func (_RMNHome *RMNHomeCaller) GetActiveDigest(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getActiveDigest") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_RMNHome *RMNHomeSession) GetActiveDigest() ([32]byte, error) { + return _RMNHome.Contract.GetActiveDigest(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) GetActiveDigest() ([32]byte, error) { + return _RMNHome.Contract.GetActiveDigest(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) GetAllConfigs(opts *bind.CallOpts) (GetAllConfigs, + + error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getAllConfigs") + + outstruct := new(GetAllConfigs) + if err != nil { + return *outstruct, err + } + + outstruct.ActiveConfig = *abi.ConvertType(out[0], new(RMNHomeVersionedConfig)).(*RMNHomeVersionedConfig) + outstruct.CandidateConfig = *abi.ConvertType(out[1], new(RMNHomeVersionedConfig)).(*RMNHomeVersionedConfig) + + return *outstruct, err + +} + +func (_RMNHome *RMNHomeSession) GetAllConfigs() (GetAllConfigs, + + error) { + return _RMNHome.Contract.GetAllConfigs(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) GetAllConfigs() (GetAllConfigs, + + error) { + return _RMNHome.Contract.GetAllConfigs(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) GetCandidateDigest(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getCandidateDigest") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_RMNHome *RMNHomeSession) GetCandidateDigest() ([32]byte, error) { + return _RMNHome.Contract.GetCandidateDigest(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) GetCandidateDigest() ([32]byte, error) { + return _RMNHome.Contract.GetCandidateDigest(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) GetConfig(opts *bind.CallOpts, configDigest [32]byte) (GetConfig, + + error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getConfig", configDigest) + + outstruct := new(GetConfig) + if err != nil { + return *outstruct, err + } + + outstruct.VersionedConfig = *abi.ConvertType(out[0], new(RMNHomeVersionedConfig)).(*RMNHomeVersionedConfig) + outstruct.Ok = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +func (_RMNHome *RMNHomeSession) GetConfig(configDigest [32]byte) (GetConfig, + + error) { + return _RMNHome.Contract.GetConfig(&_RMNHome.CallOpts, configDigest) +} + +func (_RMNHome *RMNHomeCallerSession) GetConfig(configDigest [32]byte) (GetConfig, + + error) { + return _RMNHome.Contract.GetConfig(&_RMNHome.CallOpts, configDigest) +} + +func (_RMNHome *RMNHomeCaller) GetConfigDigests(opts *bind.CallOpts) (GetConfigDigests, + + error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "getConfigDigests") + + outstruct := new(GetConfigDigests) + if err != nil { + return *outstruct, err + } + + outstruct.ActiveConfigDigest = *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + outstruct.CandidateConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + + return *outstruct, err + +} + +func (_RMNHome *RMNHomeSession) GetConfigDigests() (GetConfigDigests, + + error) { + return _RMNHome.Contract.GetConfigDigests(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) GetConfigDigests() (GetConfigDigests, + + error) { + return _RMNHome.Contract.GetConfigDigests(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _RMNHome.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 + +} + +func (_RMNHome *RMNHomeSession) Owner() (common.Address, error) { + return _RMNHome.Contract.Owner(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) Owner() (common.Address, error) { + return _RMNHome.Contract.Owner(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RMNHome.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_RMNHome *RMNHomeSession) TypeAndVersion() (string, error) { + return _RMNHome.Contract.TypeAndVersion(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeCallerSession) TypeAndVersion() (string, error) { + return _RMNHome.Contract.TypeAndVersion(&_RMNHome.CallOpts) +} + +func (_RMNHome *RMNHomeTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "acceptOwnership") +} + +func (_RMNHome *RMNHomeSession) AcceptOwnership() (*types.Transaction, error) { + return _RMNHome.Contract.AcceptOwnership(&_RMNHome.TransactOpts) +} + +func (_RMNHome *RMNHomeTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _RMNHome.Contract.AcceptOwnership(&_RMNHome.TransactOpts) +} + +func (_RMNHome *RMNHomeTransactor) PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "promoteCandidateAndRevokeActive", digestToPromote, digestToRevoke) +} + +func (_RMNHome *RMNHomeSession) PromoteCandidateAndRevokeActive(digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.PromoteCandidateAndRevokeActive(&_RMNHome.TransactOpts, digestToPromote, digestToRevoke) +} + +func (_RMNHome *RMNHomeTransactorSession) PromoteCandidateAndRevokeActive(digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.PromoteCandidateAndRevokeActive(&_RMNHome.TransactOpts, digestToPromote, digestToRevoke) +} + +func (_RMNHome *RMNHomeTransactor) RevokeCandidate(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "revokeCandidate", configDigest) +} + +func (_RMNHome *RMNHomeSession) RevokeCandidate(configDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.RevokeCandidate(&_RMNHome.TransactOpts, configDigest) +} + +func (_RMNHome *RMNHomeTransactorSession) RevokeCandidate(configDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.RevokeCandidate(&_RMNHome.TransactOpts, configDigest) +} + +func (_RMNHome *RMNHomeTransactor) SetCandidate(opts *bind.TransactOpts, staticConfig RMNHomeStaticConfig, dynamicConfig RMNHomeDynamicConfig, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "setCandidate", staticConfig, dynamicConfig, digestToOverwrite) +} + +func (_RMNHome *RMNHomeSession) SetCandidate(staticConfig RMNHomeStaticConfig, dynamicConfig RMNHomeDynamicConfig, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.SetCandidate(&_RMNHome.TransactOpts, staticConfig, dynamicConfig, digestToOverwrite) +} + +func (_RMNHome *RMNHomeTransactorSession) SetCandidate(staticConfig RMNHomeStaticConfig, dynamicConfig RMNHomeDynamicConfig, digestToOverwrite [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.SetCandidate(&_RMNHome.TransactOpts, staticConfig, dynamicConfig, digestToOverwrite) +} + +func (_RMNHome *RMNHomeTransactor) SetDynamicConfig(opts *bind.TransactOpts, newDynamicConfig RMNHomeDynamicConfig, currentDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "setDynamicConfig", newDynamicConfig, currentDigest) +} + +func (_RMNHome *RMNHomeSession) SetDynamicConfig(newDynamicConfig RMNHomeDynamicConfig, currentDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.SetDynamicConfig(&_RMNHome.TransactOpts, newDynamicConfig, currentDigest) +} + +func (_RMNHome *RMNHomeTransactorSession) SetDynamicConfig(newDynamicConfig RMNHomeDynamicConfig, currentDigest [32]byte) (*types.Transaction, error) { + return _RMNHome.Contract.SetDynamicConfig(&_RMNHome.TransactOpts, newDynamicConfig, currentDigest) +} + +func (_RMNHome *RMNHomeTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _RMNHome.contract.Transact(opts, "transferOwnership", to) +} + +func (_RMNHome *RMNHomeSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _RMNHome.Contract.TransferOwnership(&_RMNHome.TransactOpts, to) +} + +func (_RMNHome *RMNHomeTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _RMNHome.Contract.TransferOwnership(&_RMNHome.TransactOpts, to) +} + +type RMNHomeActiveConfigRevokedIterator struct { + Event *RMNHomeActiveConfigRevoked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeActiveConfigRevokedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeActiveConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeActiveConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeActiveConfigRevokedIterator) Error() error { + return it.fail +} + +func (it *RMNHomeActiveConfigRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeActiveConfigRevoked struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeActiveConfigRevokedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "ActiveConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeActiveConfigRevokedIterator{contract: _RMNHome.contract, event: "ActiveConfigRevoked", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *RMNHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "ActiveConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeActiveConfigRevoked) + if err := _RMNHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseActiveConfigRevoked(log types.Log) (*RMNHomeActiveConfigRevoked, error) { + event := new(RMNHomeActiveConfigRevoked) + if err := _RMNHome.contract.UnpackLog(event, "ActiveConfigRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeCandidateConfigRevokedIterator struct { + Event *RMNHomeCandidateConfigRevoked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeCandidateConfigRevokedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeCandidateConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeCandidateConfigRevoked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeCandidateConfigRevokedIterator) Error() error { + return it.fail +} + +func (it *RMNHomeCandidateConfigRevokedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeCandidateConfigRevoked struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeCandidateConfigRevokedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "CandidateConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeCandidateConfigRevokedIterator{contract: _RMNHome.contract, event: "CandidateConfigRevoked", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *RMNHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "CandidateConfigRevoked", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeCandidateConfigRevoked) + if err := _RMNHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseCandidateConfigRevoked(log types.Log) (*RMNHomeCandidateConfigRevoked, error) { + event := new(RMNHomeCandidateConfigRevoked) + if err := _RMNHome.contract.UnpackLog(event, "CandidateConfigRevoked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeConfigPromotedIterator struct { + Event *RMNHomeConfigPromoted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeConfigPromotedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeConfigPromoted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeConfigPromoted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeConfigPromotedIterator) Error() error { + return it.fail +} + +func (it *RMNHomeConfigPromotedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeConfigPromoted struct { + ConfigDigest [32]byte + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeConfigPromotedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "ConfigPromoted", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeConfigPromotedIterator{contract: _RMNHome.contract, event: "ConfigPromoted", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *RMNHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "ConfigPromoted", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeConfigPromoted) + if err := _RMNHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseConfigPromoted(log types.Log) (*RMNHomeConfigPromoted, error) { + event := new(RMNHomeConfigPromoted) + if err := _RMNHome.contract.UnpackLog(event, "ConfigPromoted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeConfigSetIterator struct { + Event *RMNHomeConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeConfigSetIterator) Error() error { + return it.fail +} + +func (it *RMNHomeConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeConfigSet struct { + ConfigDigest [32]byte + Version uint32 + StaticConfig RMNHomeStaticConfig + DynamicConfig RMNHomeDynamicConfig + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeConfigSetIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "ConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeConfigSetIterator{contract: _RMNHome.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "ConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeConfigSet) + if err := _RMNHome.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 +} + +func (_RMNHome *RMNHomeFilterer) ParseConfigSet(log types.Log) (*RMNHomeConfigSet, error) { + event := new(RMNHomeConfigSet) + if err := _RMNHome.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeDynamicConfigSetIterator struct { + Event *RMNHomeDynamicConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeDynamicConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeDynamicConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeDynamicConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeDynamicConfigSetIterator) Error() error { + return it.fail +} + +func (it *RMNHomeDynamicConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeDynamicConfigSet struct { + ConfigDigest [32]byte + DynamicConfig RMNHomeDynamicConfig + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterDynamicConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeDynamicConfigSetIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.FilterLogs(opts, "DynamicConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return &RMNHomeDynamicConfigSetIterator{contract: _RMNHome.contract, event: "DynamicConfigSet", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchDynamicConfigSet(opts *bind.WatchOpts, sink chan<- *RMNHomeDynamicConfigSet, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _RMNHome.contract.WatchLogs(opts, "DynamicConfigSet", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNHomeDynamicConfigSet) + if err := _RMNHome.contract.UnpackLog(event, "DynamicConfigSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNHome *RMNHomeFilterer) ParseDynamicConfigSet(log types.Log) (*RMNHomeDynamicConfigSet, error) { + event := new(RMNHomeDynamicConfigSet) + if err := _RMNHome.contract.UnpackLog(event, "DynamicConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeOwnershipTransferRequestedIterator struct { + Event *RMNHomeOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *RMNHomeOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNHomeOwnershipTransferRequestedIterator, 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 := _RMNHome.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &RMNHomeOwnershipTransferRequestedIterator{contract: _RMNHome.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNHomeOwnershipTransferRequested, 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 := _RMNHome.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: + + event := new(RMNHomeOwnershipTransferRequested) + if err := _RMNHome.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 +} + +func (_RMNHome *RMNHomeFilterer) ParseOwnershipTransferRequested(log types.Log) (*RMNHomeOwnershipTransferRequested, error) { + event := new(RMNHomeOwnershipTransferRequested) + if err := _RMNHome.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNHomeOwnershipTransferredIterator struct { + Event *RMNHomeOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNHomeOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNHomeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNHomeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNHomeOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *RMNHomeOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNHomeOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_RMNHome *RMNHomeFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNHomeOwnershipTransferredIterator, 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 := _RMNHome.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &RMNHomeOwnershipTransferredIterator{contract: _RMNHome.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_RMNHome *RMNHomeFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNHomeOwnershipTransferred, 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 := _RMNHome.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: + + event := new(RMNHomeOwnershipTransferred) + if err := _RMNHome.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 +} + +func (_RMNHome *RMNHomeFilterer) ParseOwnershipTransferred(log types.Log) (*RMNHomeOwnershipTransferred, error) { + event := new(RMNHomeOwnershipTransferred) + if err := _RMNHome.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetAllConfigs struct { + ActiveConfig RMNHomeVersionedConfig + CandidateConfig RMNHomeVersionedConfig +} +type GetConfig struct { + VersionedConfig RMNHomeVersionedConfig + Ok bool +} +type GetConfigDigests struct { + ActiveConfigDigest [32]byte + CandidateConfigDigest [32]byte +} + +func (_RMNHome *RMNHome) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _RMNHome.abi.Events["ActiveConfigRevoked"].ID: + return _RMNHome.ParseActiveConfigRevoked(log) + case _RMNHome.abi.Events["CandidateConfigRevoked"].ID: + return _RMNHome.ParseCandidateConfigRevoked(log) + case _RMNHome.abi.Events["ConfigPromoted"].ID: + return _RMNHome.ParseConfigPromoted(log) + case _RMNHome.abi.Events["ConfigSet"].ID: + return _RMNHome.ParseConfigSet(log) + case _RMNHome.abi.Events["DynamicConfigSet"].ID: + return _RMNHome.ParseDynamicConfigSet(log) + case _RMNHome.abi.Events["OwnershipTransferRequested"].ID: + return _RMNHome.ParseOwnershipTransferRequested(log) + case _RMNHome.abi.Events["OwnershipTransferred"].ID: + return _RMNHome.ParseOwnershipTransferred(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (RMNHomeActiveConfigRevoked) Topic() common.Hash { + return common.HexToHash("0x0b31c0055e2d464bef7781994b98c4ff9ef4ae0d05f59feb6a68c42de5e201b8") +} + +func (RMNHomeCandidateConfigRevoked) Topic() common.Hash { + return common.HexToHash("0x53f5d9228f0a4173bea6e5931c9b3afe6eeb6692ede1d182952970f152534e3b") +} + +func (RMNHomeConfigPromoted) Topic() common.Hash { + return common.HexToHash("0xfc3e98dbbd47c3fa7c1c05b6ec711caeaf70eca4554192b9ada8fc11a37f298e") +} + +func (RMNHomeConfigSet) Topic() common.Hash { + return common.HexToHash("0xf6c6d1be15ba0acc8ee645c1ec613c360ef786d2d3200eb8e695b6dec757dbf0") +} + +func (RMNHomeDynamicConfigSet) Topic() common.Hash { + return common.HexToHash("0x1f69d1a2edb327babc986b3deb80091f101b9105d42a6c30db4d99c31d7e6294") +} + +func (RMNHomeOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (RMNHomeOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (_RMNHome *RMNHome) Address() common.Address { + return _RMNHome.address +} + +type RMNHomeInterface interface { + GetActiveDigest(opts *bind.CallOpts) ([32]byte, error) + + GetAllConfigs(opts *bind.CallOpts) (GetAllConfigs, + + error) + + GetCandidateDigest(opts *bind.CallOpts) ([32]byte, error) + + GetConfig(opts *bind.CallOpts, configDigest [32]byte) (GetConfig, + + error) + + GetConfigDigests(opts *bind.CallOpts) (GetConfigDigests, + + error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + PromoteCandidateAndRevokeActive(opts *bind.TransactOpts, digestToPromote [32]byte, digestToRevoke [32]byte) (*types.Transaction, error) + + RevokeCandidate(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error) + + SetCandidate(opts *bind.TransactOpts, staticConfig RMNHomeStaticConfig, dynamicConfig RMNHomeDynamicConfig, digestToOverwrite [32]byte) (*types.Transaction, error) + + SetDynamicConfig(opts *bind.TransactOpts, newDynamicConfig RMNHomeDynamicConfig, currentDigest [32]byte) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + FilterActiveConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeActiveConfigRevokedIterator, error) + + WatchActiveConfigRevoked(opts *bind.WatchOpts, sink chan<- *RMNHomeActiveConfigRevoked, configDigest [][32]byte) (event.Subscription, error) + + ParseActiveConfigRevoked(log types.Log) (*RMNHomeActiveConfigRevoked, error) + + FilterCandidateConfigRevoked(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeCandidateConfigRevokedIterator, error) + + WatchCandidateConfigRevoked(opts *bind.WatchOpts, sink chan<- *RMNHomeCandidateConfigRevoked, configDigest [][32]byte) (event.Subscription, error) + + ParseCandidateConfigRevoked(log types.Log) (*RMNHomeCandidateConfigRevoked, error) + + FilterConfigPromoted(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeConfigPromotedIterator, error) + + WatchConfigPromoted(opts *bind.WatchOpts, sink chan<- *RMNHomeConfigPromoted, configDigest [][32]byte) (event.Subscription, error) + + ParseConfigPromoted(log types.Log) (*RMNHomeConfigPromoted, error) + + FilterConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNHomeConfigSet, configDigest [][32]byte) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*RMNHomeConfigSet, error) + + FilterDynamicConfigSet(opts *bind.FilterOpts, configDigest [][32]byte) (*RMNHomeDynamicConfigSetIterator, error) + + WatchDynamicConfigSet(opts *bind.WatchOpts, sink chan<- *RMNHomeDynamicConfigSet, configDigest [][32]byte) (event.Subscription, error) + + ParseDynamicConfigSet(log types.Log) (*RMNHomeDynamicConfigSet, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNHomeOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNHomeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*RMNHomeOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNHomeOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNHomeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*RMNHomeOwnershipTransferred, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote/rmn_remote.go b/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote/rmn_remote.go new file mode 100644 index 00000000000..e48d47ad1c8 --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote/rmn_remote.go @@ -0,0 +1,1264 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package rmn_remote + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type IRMNRemoteSignature struct { + R [32]byte + S [32]byte +} + +type IRMNTaggedRoot struct { + CommitStore common.Address + Root [32]byte +} + +type InternalMerkleRoot struct { + SourceChainSelector uint64 + OnRampAddress []byte + MinSeqNr uint64 + MaxSeqNr uint64 + MerkleRoot [32]byte +} + +type RMNRemoteConfig struct { + RmnHomeContractConfigDigest [32]byte + Signers []RMNRemoteSigner + FSign uint64 +} + +type RMNRemoteSigner struct { + OnchainPublicKey common.Address + NodeIndex uint64 +} + +var RMNRemoteMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"localChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"legacyRMN\",\"type\":\"address\",\"internalType\":\"contractIRMN\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"curse\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"curse\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCursedSubjects\",\"inputs\":[],\"outputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLocalChainSelector\",\"inputs\":[],\"outputs\":[{\"name\":\"localChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getReportDigestHeader\",\"inputs\":[],\"outputs\":[{\"name\":\"digestHeader\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getVersionedConfig\",\"inputs\":[],\"outputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"fSign\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isBlessed\",\"inputs\":[{\"name\":\"taggedRoot\",\"type\":\"tuple\",\"internalType\":\"structIRMN.TaggedRoot\",\"components\":[{\"name\":\"commitStore\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isCursed\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setConfig\",\"inputs\":[{\"name\":\"newConfig\",\"type\":\"tuple\",\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"fSign\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"uncurse\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"uncurse\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"internalType\":\"bytes16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verify\",\"inputs\":[{\"name\":\"offRampAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"merkleRoots\",\"type\":\"tuple[]\",\"internalType\":\"structInternal.MerkleRoot[]\",\"components\":[{\"name\":\"sourceChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"onRampAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"minSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxSeqNr\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"merkleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"signatures\",\"type\":\"tuple[]\",\"internalType\":\"structIRMNRemote.Signature[]\",\"components\":[{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ConfigSet\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRMNRemote.Config\",\"components\":[{\"name\":\"rmnHomeContractConfigDigest\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"signers\",\"type\":\"tuple[]\",\"internalType\":\"structRMNRemote.Signer[]\",\"components\":[{\"name\":\"onchainPublicKey\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nodeIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"name\":\"fSign\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Cursed\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"indexed\":false,\"internalType\":\"bytes16[]\"}],\"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\":\"Uncursed\",\"inputs\":[{\"name\":\"subjects\",\"type\":\"bytes16[]\",\"indexed\":false,\"internalType\":\"bytes16[]\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ConfigNotSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DuplicateOnchainPublicKey\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignerOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"IsBlessedNotAvailable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotCursed\",\"inputs\":[{\"name\":\"subject\",\"type\":\"bytes16\",\"internalType\":\"bytes16\"}]},{\"type\":\"error\",\"name\":\"NotEnoughSigners\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfOrderSignatures\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ThresholdNotMet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedSigner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroValueNotAllowed\",\"inputs\":[]}]", + Bin: "0x60c0346100d357601f6121f938819003918201601f19168301916001600160401b038311848410176100d85780849260409485528339810103126100d35780516001600160401b038116918282036100d35760200151916001600160a01b03831683036100d35733156100c257600180546001600160a01b03191633179055156100b15760805260a05260405161210a90816100ef82396080518181816102fe0152610712015260a05181610f7d0152f35b63273e150360e21b60005260046000fd5b639b15e16f60e01b60005260046000fd5b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b60003560e01c8063181f5a77146119ce578063198f0f77146112df5780631add205f146111145780632cbc26bb146110d3578063397796f7146110905780634d61677114610f3557806362eed41514610e155780636509a95414610dbc5780636d2d399314610c9c57806370a9089e146105f057806379ba5097146105075780638da5cb5b146104b55780639a19b329146103c7578063d881e09214610322578063eaa83ddd146102bf578063f2fde38b146101cf5763f8bb876e146100d757600080fd5b346101ca576100e536611b71565b6100ed611ec2565b60005b81518110156101955761012e7fffffffffffffffffffffffffffffffff000000000000000000000000000000006101278385611eae565b51166120a3565b1561013b576001016100f0565b610166907fffffffffffffffffffffffffffffffff0000000000000000000000000000000092611eae565b51167f19d5c79b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040517f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7490806101c58582611c38565b0390a1005b600080fd5b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5773ffffffffffffffffffffffffffffffffffffffff61021b611b36565b610223611ec2565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760405180602060065491828152019060066000527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f9060005b8181106103b1576103ad856103a181870382611a67565b60405191829182611c38565b0390f35b825484526020909301926001928301920161038a565b346101ca576103d536611b71565b6103dd611ec2565b60005b81518110156104855761041e7fffffffffffffffffffffffffffffffff000000000000000000000000000000006104178385611eae565b5116611f0d565b1561042b576001016103e0565b610456907fffffffffffffffffffffffffffffffff0000000000000000000000000000000092611eae565b51167f73281fa10000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6040517f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba190806101c58582611c38565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760005473ffffffffffffffffffffffffffffffffffffffff811633036105c6577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610627611b36565b67ffffffffffffffff602435116101ca573660236024350112156101ca57602435600401359067ffffffffffffffff82116101ca573660248360051b81350101116101ca576044359067ffffffffffffffff82116101ca57366023830112156101ca5767ffffffffffffffff8260040135116101ca57366024836004013560061b840101116101ca5763ffffffff6005541615610c725767ffffffffffffffff6106d48160045416611d3c565b16826004013510610c485760025460405160c0810181811067ffffffffffffffff821117610c1957604052468152602081019267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168452604082019230845273ffffffffffffffffffffffffffffffffffffffff60608401921682526080830190815261076987611b59565b916107776040519384611a67565b8783526000976024803501602085015b60248360051b813501018210610a61575050509073ffffffffffffffffffffffffffffffffffffffff8095939260a0860193845260405196879567ffffffffffffffff602088019a7f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538c526040808a01526101208901995160608a015251166080880152511660a0860152511660c08401525160e08301525160c0610100830152805180935261014082019260206101408260051b85010192019388905b8282106109c8575050506108809250037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282611a67565b5190208290815b83600401358310610896578480f35b60208560806108ad86886004013560248a01611ce8565b35836108c1888a6004013560248c01611ce8565b013560405191878352601b868401526040830152606082015282805260015afa156109bd5784519073ffffffffffffffffffffffffffffffffffffffff82169081156109955773ffffffffffffffffffffffffffffffffffffffff829116101561096d578552600860205260ff604086205416156109455760019290920191610887565b6004857faaaa9141000000000000000000000000000000000000000000000000000000008152fd5b6004867fbbe15e7f000000000000000000000000000000000000000000000000000000008152fd5b6004877f8baa579f000000000000000000000000000000000000000000000000000000008152fd5b6040513d86823e3d90fd5b91936020847ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec08293600195970301855287519067ffffffffffffffff8251168152608080610a238585015160a08786015260a0850190611aa8565b9367ffffffffffffffff604082015116604085015267ffffffffffffffff606082015116606085015201519101529601920192018593919492610845565b81359067ffffffffffffffff8211610c155760a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc836024350136030112610c15576040519060a0820182811067ffffffffffffffff821117610be457604052610ad060248481350101611d95565b82526044836024350101359167ffffffffffffffff8311610c115736604360243586018501011215610c115767ffffffffffffffff6024848682350101013511610be457908d9160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6024878982350101013501160193610b576040519586611a67565b60248035870182019081013580875236910160440111610be057602495602095869560a49387908a90813586018101808301359060440186850137858235010101358301015285840152610bb060648289350101611d95565b6040840152610bc460848289350101611d95565b6060840152863501013560808201528152019201919050610787565b8380fd5b60248e7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8d80fd5b8b80fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f59fa4a930000000000000000000000000000000000000000000000000000000060005260046000fd5b7face124bc0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610cd3611b07565b604090815190610ce38383611a67565b600182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083013660208401377fffffffffffffffffffffffffffffffff00000000000000000000000000000000610d3a83611ea1565b91169052610d46611ec2565b60005b8151811015610d8d57610d807fffffffffffffffffffffffffffffffff000000000000000000000000000000006104178385611eae565b1561042b57600101610d49565b82517f0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba190806101c58582611c38565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206040517f9651943783dbf81935a60e98f218a9d9b5b28823fb2228bbd91320d632facf538152f35b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57610e4c611b07565b604090815190610e5c8383611a67565b600182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe083013660208401377fffffffffffffffffffffffffffffffff00000000000000000000000000000000610eb383611ea1565b91169052610ebf611ec2565b60005b8151811015610f0657610ef97fffffffffffffffffffffffffffffffff000000000000000000000000000000006101278385611eae565b1561013b57600101610ec2565b82517f1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f7490806101c58582611c38565b346101ca5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca57600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168015611068576020604491604051928380927f4d61677100000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff610fef611b36565b16600483015260243560248301525afa90811561105d57829161101a575b6020826040519015158152f35b90506020813d602011611055575b8161103560209383611a67565b810103126110515751801515810361105157602091508261100d565b5080fd5b3d9150611028565b6040513d84823e3d90fd5b6004827f0a7c4edd000000000000000000000000000000000000000000000000000000008152fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206110c9611e44565b6040519015158152f35b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760206110c961110f611b07565b611daa565b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760006040805161115281611a4b565b82815260606020820152015263ffffffff600554166040519061117482611a4b565b60025482526003549161118683611b59565b926111946040519485611a67565b808452600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9190602086015b82821061128057505050506020810192835267ffffffffffffffff6004541692604082019384526040519283526040602084015260a083019151604084015251906060808401528151809152602060c0840192019060005b81811061123e5750505067ffffffffffffffff8293511660808301520390f35b8251805173ffffffffffffffffffffffffffffffffffffffff16855260209081015167ffffffffffffffff16818601526040909401939092019160010161121e565b6040516040810181811067ffffffffffffffff821117610c1957600192839260209260405267ffffffffffffffff885473ffffffffffffffffffffffffffffffffffffffff8116835260a01c16838201528152019401910190926111c6565b346101ca5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca5760043567ffffffffffffffff81116101ca57806004018136039160607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8401126101ca5761135a611ec2565b81359081156119a457909260248201919060015b6113788486611c94565b90508110156114595761138b8486611c94565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83019183831161142a576113cc926020926113c692611ce8565b01611d27565b67ffffffffffffffff806113ef60206113c6866113e98b8d611c94565b90611ce8565b16911610156114005760010161136e565b7f448515170000000000000000000000000000000000000000000000000000000060005260046000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b508390856114678584611c94565b60448601915061147682611d27565b60011b6801fffffffffffffffe67fffffffffffffffe82169116810361142a576114a867ffffffffffffffff91611d3c565b161161197a57600354805b611877575060005b6114c58786611c94565b905081101561159e5773ffffffffffffffffffffffffffffffffffffffff6114f96114f4836113e98b8a611c94565b611d74565b16600052600860205260ff60406000205416611574578073ffffffffffffffffffffffffffffffffffffffff6115386114f46001946113e98c8b611c94565b1660005260086020526040600020827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055016114bb565b7f28cae27d0000000000000000000000000000000000000000000000000000000060005260046000fd5b50846115b08780959685600255611c94565b90680100000000000000008211610c195760035482600355808310611831575b50600360005260206000206000915b838310611783575050505067ffffffffffffffff6115fc83611d27565b167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000060045416176004556005549463ffffffff86169563ffffffff871461142a5763ffffffff60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000098011696879116176005557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdd6040519560208752608087019560208801523591018112156101ca57016024600482013591019267ffffffffffffffff82116101ca578160061b360384136101ca578190606060408701525260a0840192906000905b80821061173057867f7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c87808867ffffffffffffffff6117258a611d95565b1660608301520390a2005b90919384359073ffffffffffffffffffffffffffffffffffffffff82168092036101ca5760408160019382935267ffffffffffffffff61177260208a01611d95565b1660208201520195019201906116e7565b600160408273ffffffffffffffffffffffffffffffffffffffff6117a78495611d74565b167fffffffffffffffffffffffff00000000000000000000000000000000000000008654161785556117db60208201611d27565b7fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff7bffffffffffffffff000000000000000000000000000000000000000087549260a01b169116178555019201920191906115df565b60036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9081019083015b81811061186b57506115d0565b6000815560010161185e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161142a57600090600354111561194d57600390527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85a81015473ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055801561142a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01806114b3565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526032600452fd5b7f014c50200000000000000000000000000000000000000000000000000000000060005260046000fd5b7f9cf8540c0000000000000000000000000000000000000000000000000000000060005260046000fd5b346101ca5760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101ca576103ad6040805190611a0f8183611a67565b600f82527f524d4e52656d6f746520312e362e300000000000000000000000000000000000602083015251918291602083526020830190611aa8565b6060810190811067ffffffffffffffff821117610c1957604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610c1957604052565b919082519283825260005b848110611af25750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611ab3565b600435907fffffffffffffffffffffffffffffffff00000000000000000000000000000000821682036101ca57565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101ca57565b67ffffffffffffffff8111610c195760051b60200190565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126101ca576004359067ffffffffffffffff82116101ca57806023830112156101ca57816004013590611bc882611b59565b92611bd66040519485611a67565b8284526024602085019360051b8201019182116101ca57602401915b818310611bff5750505090565b82357fffffffffffffffffffffffffffffffff00000000000000000000000000000000811681036101ca57815260209283019201611bf2565b602060408183019282815284518094520192019060005b818110611c5c5750505090565b82517fffffffffffffffffffffffffffffffff0000000000000000000000000000000016845260209384019390920191600101611c4f565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101ca570180359067ffffffffffffffff82116101ca57602001918160061b360383136101ca57565b9190811015611cf85760061b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b3567ffffffffffffffff811681036101ca5790565b67ffffffffffffffff60019116019067ffffffffffffffff821161142a57565b8054821015611cf85760005260206000200190600090565b3573ffffffffffffffffffffffffffffffffffffffff811681036101ca5790565b359067ffffffffffffffff821682036101ca57565b60065415611e3e577fffffffffffffffffffffffffffffffff0000000000000000000000000000000016600052600760205260406000205415801590611ded5790565b507f010000000000000000000000000000010000000000000000000000000000000060005260076020527f70b766b11586b6b505ed3893938b0cc6c6c98bd6f65e969ac311168d34e4f9e254151590565b50600090565b60065415611e9c577f010000000000000000000000000000010000000000000000000000000000000060005260076020527f70b766b11586b6b505ed3893938b0cc6c6c98bd6f65e969ac311168d34e4f9e254151590565b600090565b805115611cf85760200190565b8051821015611cf85760209160051b010190565b73ffffffffffffffffffffffffffffffffffffffff600154163303611ee357565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b600081815260076020526040902054801561209c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161142a57600654907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161142a5781810361202d575b5050506006548015611ffe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01611fbb816006611d5c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600655600052600760205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b61208461203e61204f936006611d5c565b90549060031b1c9283926006611d5c565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b90556000526007602052604060002055388080611f82565b5050600090565b80600052600760205260406000205415600014611e3e5760065468010000000000000000811015610c19576120e461204f8260018594016006556006611d5c565b905560065490600052600760205260406000205560019056fea164736f6c634300081a000a", +} + +var RMNRemoteABI = RMNRemoteMetaData.ABI + +var RMNRemoteBin = RMNRemoteMetaData.Bin + +func DeployRMNRemote(auth *bind.TransactOpts, backend bind.ContractBackend, localChainSelector uint64, legacyRMN common.Address) (common.Address, *types.Transaction, *RMNRemote, error) { + parsed, err := RMNRemoteMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RMNRemoteBin), backend, localChainSelector, legacyRMN) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &RMNRemote{address: address, abi: *parsed, RMNRemoteCaller: RMNRemoteCaller{contract: contract}, RMNRemoteTransactor: RMNRemoteTransactor{contract: contract}, RMNRemoteFilterer: RMNRemoteFilterer{contract: contract}}, nil +} + +type RMNRemote struct { + address common.Address + abi abi.ABI + RMNRemoteCaller + RMNRemoteTransactor + RMNRemoteFilterer +} + +type RMNRemoteCaller struct { + contract *bind.BoundContract +} + +type RMNRemoteTransactor struct { + contract *bind.BoundContract +} + +type RMNRemoteFilterer struct { + contract *bind.BoundContract +} + +type RMNRemoteSession struct { + Contract *RMNRemote + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type RMNRemoteCallerSession struct { + Contract *RMNRemoteCaller + CallOpts bind.CallOpts +} + +type RMNRemoteTransactorSession struct { + Contract *RMNRemoteTransactor + TransactOpts bind.TransactOpts +} + +type RMNRemoteRaw struct { + Contract *RMNRemote +} + +type RMNRemoteCallerRaw struct { + Contract *RMNRemoteCaller +} + +type RMNRemoteTransactorRaw struct { + Contract *RMNRemoteTransactor +} + +func NewRMNRemote(address common.Address, backend bind.ContractBackend) (*RMNRemote, error) { + abi, err := abi.JSON(strings.NewReader(RMNRemoteABI)) + if err != nil { + return nil, err + } + contract, err := bindRMNRemote(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &RMNRemote{address: address, abi: abi, RMNRemoteCaller: RMNRemoteCaller{contract: contract}, RMNRemoteTransactor: RMNRemoteTransactor{contract: contract}, RMNRemoteFilterer: RMNRemoteFilterer{contract: contract}}, nil +} + +func NewRMNRemoteCaller(address common.Address, caller bind.ContractCaller) (*RMNRemoteCaller, error) { + contract, err := bindRMNRemote(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &RMNRemoteCaller{contract: contract}, nil +} + +func NewRMNRemoteTransactor(address common.Address, transactor bind.ContractTransactor) (*RMNRemoteTransactor, error) { + contract, err := bindRMNRemote(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &RMNRemoteTransactor{contract: contract}, nil +} + +func NewRMNRemoteFilterer(address common.Address, filterer bind.ContractFilterer) (*RMNRemoteFilterer, error) { + contract, err := bindRMNRemote(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &RMNRemoteFilterer{contract: contract}, nil +} + +func bindRMNRemote(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := RMNRemoteMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_RMNRemote *RMNRemoteRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RMNRemote.Contract.RMNRemoteCaller.contract.Call(opts, result, method, params...) +} + +func (_RMNRemote *RMNRemoteRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNRemote.Contract.RMNRemoteTransactor.contract.Transfer(opts) +} + +func (_RMNRemote *RMNRemoteRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RMNRemote.Contract.RMNRemoteTransactor.contract.Transact(opts, method, params...) +} + +func (_RMNRemote *RMNRemoteCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _RMNRemote.Contract.contract.Call(opts, result, method, params...) +} + +func (_RMNRemote *RMNRemoteTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNRemote.Contract.contract.Transfer(opts) +} + +func (_RMNRemote *RMNRemoteTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _RMNRemote.Contract.contract.Transact(opts, method, params...) +} + +func (_RMNRemote *RMNRemoteCaller) GetCursedSubjects(opts *bind.CallOpts) ([][16]byte, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "getCursedSubjects") + + if err != nil { + return *new([][16]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][16]byte)).(*[][16]byte) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) GetCursedSubjects() ([][16]byte, error) { + return _RMNRemote.Contract.GetCursedSubjects(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) GetCursedSubjects() ([][16]byte, error) { + return _RMNRemote.Contract.GetCursedSubjects(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) GetLocalChainSelector(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "getLocalChainSelector") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) GetLocalChainSelector() (uint64, error) { + return _RMNRemote.Contract.GetLocalChainSelector(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) GetLocalChainSelector() (uint64, error) { + return _RMNRemote.Contract.GetLocalChainSelector(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) GetReportDigestHeader(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "getReportDigestHeader") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) GetReportDigestHeader() ([32]byte, error) { + return _RMNRemote.Contract.GetReportDigestHeader(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) GetReportDigestHeader() ([32]byte, error) { + return _RMNRemote.Contract.GetReportDigestHeader(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) GetVersionedConfig(opts *bind.CallOpts) (GetVersionedConfig, + + error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "getVersionedConfig") + + outstruct := new(GetVersionedConfig) + if err != nil { + return *outstruct, err + } + + outstruct.Version = *abi.ConvertType(out[0], new(uint32)).(*uint32) + outstruct.Config = *abi.ConvertType(out[1], new(RMNRemoteConfig)).(*RMNRemoteConfig) + + return *outstruct, err + +} + +func (_RMNRemote *RMNRemoteSession) GetVersionedConfig() (GetVersionedConfig, + + error) { + return _RMNRemote.Contract.GetVersionedConfig(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) GetVersionedConfig() (GetVersionedConfig, + + error) { + return _RMNRemote.Contract.GetVersionedConfig(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) IsBlessed(opts *bind.CallOpts, taggedRoot IRMNTaggedRoot) (bool, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "isBlessed", taggedRoot) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) IsBlessed(taggedRoot IRMNTaggedRoot) (bool, error) { + return _RMNRemote.Contract.IsBlessed(&_RMNRemote.CallOpts, taggedRoot) +} + +func (_RMNRemote *RMNRemoteCallerSession) IsBlessed(taggedRoot IRMNTaggedRoot) (bool, error) { + return _RMNRemote.Contract.IsBlessed(&_RMNRemote.CallOpts, taggedRoot) +} + +func (_RMNRemote *RMNRemoteCaller) IsCursed(opts *bind.CallOpts, subject [16]byte) (bool, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "isCursed", subject) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) IsCursed(subject [16]byte) (bool, error) { + return _RMNRemote.Contract.IsCursed(&_RMNRemote.CallOpts, subject) +} + +func (_RMNRemote *RMNRemoteCallerSession) IsCursed(subject [16]byte) (bool, error) { + return _RMNRemote.Contract.IsCursed(&_RMNRemote.CallOpts, subject) +} + +func (_RMNRemote *RMNRemoteCaller) IsCursed0(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "isCursed0") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) IsCursed0() (bool, error) { + return _RMNRemote.Contract.IsCursed0(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) IsCursed0() (bool, error) { + return _RMNRemote.Contract.IsCursed0(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _RMNRemote.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 + +} + +func (_RMNRemote *RMNRemoteSession) Owner() (common.Address, error) { + return _RMNRemote.Contract.Owner(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) Owner() (common.Address, error) { + return _RMNRemote.Contract.Owner(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_RMNRemote *RMNRemoteSession) TypeAndVersion() (string, error) { + return _RMNRemote.Contract.TypeAndVersion(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCallerSession) TypeAndVersion() (string, error) { + return _RMNRemote.Contract.TypeAndVersion(&_RMNRemote.CallOpts) +} + +func (_RMNRemote *RMNRemoteCaller) Verify(opts *bind.CallOpts, offRampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error { + var out []interface{} + err := _RMNRemote.contract.Call(opts, &out, "verify", offRampAddress, merkleRoots, signatures) + + if err != nil { + return err + } + + return err + +} + +func (_RMNRemote *RMNRemoteSession) Verify(offRampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error { + return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offRampAddress, merkleRoots, signatures) +} + +func (_RMNRemote *RMNRemoteCallerSession) Verify(offRampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error { + return _RMNRemote.Contract.Verify(&_RMNRemote.CallOpts, offRampAddress, merkleRoots, signatures) +} + +func (_RMNRemote *RMNRemoteTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "acceptOwnership") +} + +func (_RMNRemote *RMNRemoteSession) AcceptOwnership() (*types.Transaction, error) { + return _RMNRemote.Contract.AcceptOwnership(&_RMNRemote.TransactOpts) +} + +func (_RMNRemote *RMNRemoteTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _RMNRemote.Contract.AcceptOwnership(&_RMNRemote.TransactOpts) +} + +func (_RMNRemote *RMNRemoteTransactor) Curse(opts *bind.TransactOpts, subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "curse", subject) +} + +func (_RMNRemote *RMNRemoteSession) Curse(subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Curse(&_RMNRemote.TransactOpts, subject) +} + +func (_RMNRemote *RMNRemoteTransactorSession) Curse(subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Curse(&_RMNRemote.TransactOpts, subject) +} + +func (_RMNRemote *RMNRemoteTransactor) Curse0(opts *bind.TransactOpts, subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "curse0", subjects) +} + +func (_RMNRemote *RMNRemoteSession) Curse0(subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Curse0(&_RMNRemote.TransactOpts, subjects) +} + +func (_RMNRemote *RMNRemoteTransactorSession) Curse0(subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Curse0(&_RMNRemote.TransactOpts, subjects) +} + +func (_RMNRemote *RMNRemoteTransactor) SetConfig(opts *bind.TransactOpts, newConfig RMNRemoteConfig) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "setConfig", newConfig) +} + +func (_RMNRemote *RMNRemoteSession) SetConfig(newConfig RMNRemoteConfig) (*types.Transaction, error) { + return _RMNRemote.Contract.SetConfig(&_RMNRemote.TransactOpts, newConfig) +} + +func (_RMNRemote *RMNRemoteTransactorSession) SetConfig(newConfig RMNRemoteConfig) (*types.Transaction, error) { + return _RMNRemote.Contract.SetConfig(&_RMNRemote.TransactOpts, newConfig) +} + +func (_RMNRemote *RMNRemoteTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "transferOwnership", to) +} + +func (_RMNRemote *RMNRemoteSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _RMNRemote.Contract.TransferOwnership(&_RMNRemote.TransactOpts, to) +} + +func (_RMNRemote *RMNRemoteTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _RMNRemote.Contract.TransferOwnership(&_RMNRemote.TransactOpts, to) +} + +func (_RMNRemote *RMNRemoteTransactor) Uncurse(opts *bind.TransactOpts, subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "uncurse", subject) +} + +func (_RMNRemote *RMNRemoteSession) Uncurse(subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Uncurse(&_RMNRemote.TransactOpts, subject) +} + +func (_RMNRemote *RMNRemoteTransactorSession) Uncurse(subject [16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Uncurse(&_RMNRemote.TransactOpts, subject) +} + +func (_RMNRemote *RMNRemoteTransactor) Uncurse0(opts *bind.TransactOpts, subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.contract.Transact(opts, "uncurse0", subjects) +} + +func (_RMNRemote *RMNRemoteSession) Uncurse0(subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Uncurse0(&_RMNRemote.TransactOpts, subjects) +} + +func (_RMNRemote *RMNRemoteTransactorSession) Uncurse0(subjects [][16]byte) (*types.Transaction, error) { + return _RMNRemote.Contract.Uncurse0(&_RMNRemote.TransactOpts, subjects) +} + +type RMNRemoteConfigSetIterator struct { + Event *RMNRemoteConfigSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNRemoteConfigSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNRemoteConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNRemoteConfigSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNRemoteConfigSetIterator) Error() error { + return it.fail +} + +func (it *RMNRemoteConfigSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNRemoteConfigSet struct { + Version uint32 + Config RMNRemoteConfig + Raw types.Log +} + +func (_RMNRemote *RMNRemoteFilterer) FilterConfigSet(opts *bind.FilterOpts, version []uint32) (*RMNRemoteConfigSetIterator, error) { + + var versionRule []interface{} + for _, versionItem := range version { + versionRule = append(versionRule, versionItem) + } + + logs, sub, err := _RMNRemote.contract.FilterLogs(opts, "ConfigSet", versionRule) + if err != nil { + return nil, err + } + return &RMNRemoteConfigSetIterator{contract: _RMNRemote.contract, event: "ConfigSet", logs: logs, sub: sub}, nil +} + +func (_RMNRemote *RMNRemoteFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNRemoteConfigSet, version []uint32) (event.Subscription, error) { + + var versionRule []interface{} + for _, versionItem := range version { + versionRule = append(versionRule, versionItem) + } + + logs, sub, err := _RMNRemote.contract.WatchLogs(opts, "ConfigSet", versionRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNRemoteConfigSet) + if err := _RMNRemote.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 +} + +func (_RMNRemote *RMNRemoteFilterer) ParseConfigSet(log types.Log) (*RMNRemoteConfigSet, error) { + event := new(RMNRemoteConfigSet) + if err := _RMNRemote.contract.UnpackLog(event, "ConfigSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNRemoteCursedIterator struct { + Event *RMNRemoteCursed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNRemoteCursedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNRemoteCursed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNRemoteCursed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNRemoteCursedIterator) Error() error { + return it.fail +} + +func (it *RMNRemoteCursedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNRemoteCursed struct { + Subjects [][16]byte + Raw types.Log +} + +func (_RMNRemote *RMNRemoteFilterer) FilterCursed(opts *bind.FilterOpts) (*RMNRemoteCursedIterator, error) { + + logs, sub, err := _RMNRemote.contract.FilterLogs(opts, "Cursed") + if err != nil { + return nil, err + } + return &RMNRemoteCursedIterator{contract: _RMNRemote.contract, event: "Cursed", logs: logs, sub: sub}, nil +} + +func (_RMNRemote *RMNRemoteFilterer) WatchCursed(opts *bind.WatchOpts, sink chan<- *RMNRemoteCursed) (event.Subscription, error) { + + logs, sub, err := _RMNRemote.contract.WatchLogs(opts, "Cursed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNRemoteCursed) + if err := _RMNRemote.contract.UnpackLog(event, "Cursed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNRemote *RMNRemoteFilterer) ParseCursed(log types.Log) (*RMNRemoteCursed, error) { + event := new(RMNRemoteCursed) + if err := _RMNRemote.contract.UnpackLog(event, "Cursed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNRemoteOwnershipTransferRequestedIterator struct { + Event *RMNRemoteOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNRemoteOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNRemoteOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNRemoteOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNRemoteOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *RMNRemoteOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNRemoteOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_RMNRemote *RMNRemoteFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNRemoteOwnershipTransferRequestedIterator, 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 := _RMNRemote.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &RMNRemoteOwnershipTransferRequestedIterator{contract: _RMNRemote.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_RMNRemote *RMNRemoteFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNRemoteOwnershipTransferRequested, 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 := _RMNRemote.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: + + event := new(RMNRemoteOwnershipTransferRequested) + if err := _RMNRemote.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 +} + +func (_RMNRemote *RMNRemoteFilterer) ParseOwnershipTransferRequested(log types.Log) (*RMNRemoteOwnershipTransferRequested, error) { + event := new(RMNRemoteOwnershipTransferRequested) + if err := _RMNRemote.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNRemoteOwnershipTransferredIterator struct { + Event *RMNRemoteOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNRemoteOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNRemoteOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNRemoteOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNRemoteOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *RMNRemoteOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNRemoteOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_RMNRemote *RMNRemoteFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNRemoteOwnershipTransferredIterator, 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 := _RMNRemote.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &RMNRemoteOwnershipTransferredIterator{contract: _RMNRemote.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_RMNRemote *RMNRemoteFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNRemoteOwnershipTransferred, 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 := _RMNRemote.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: + + event := new(RMNRemoteOwnershipTransferred) + if err := _RMNRemote.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 +} + +func (_RMNRemote *RMNRemoteFilterer) ParseOwnershipTransferred(log types.Log) (*RMNRemoteOwnershipTransferred, error) { + event := new(RMNRemoteOwnershipTransferred) + if err := _RMNRemote.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type RMNRemoteUncursedIterator struct { + Event *RMNRemoteUncursed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *RMNRemoteUncursedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(RMNRemoteUncursed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(RMNRemoteUncursed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *RMNRemoteUncursedIterator) Error() error { + return it.fail +} + +func (it *RMNRemoteUncursedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type RMNRemoteUncursed struct { + Subjects [][16]byte + Raw types.Log +} + +func (_RMNRemote *RMNRemoteFilterer) FilterUncursed(opts *bind.FilterOpts) (*RMNRemoteUncursedIterator, error) { + + logs, sub, err := _RMNRemote.contract.FilterLogs(opts, "Uncursed") + if err != nil { + return nil, err + } + return &RMNRemoteUncursedIterator{contract: _RMNRemote.contract, event: "Uncursed", logs: logs, sub: sub}, nil +} + +func (_RMNRemote *RMNRemoteFilterer) WatchUncursed(opts *bind.WatchOpts, sink chan<- *RMNRemoteUncursed) (event.Subscription, error) { + + logs, sub, err := _RMNRemote.contract.WatchLogs(opts, "Uncursed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(RMNRemoteUncursed) + if err := _RMNRemote.contract.UnpackLog(event, "Uncursed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_RMNRemote *RMNRemoteFilterer) ParseUncursed(log types.Log) (*RMNRemoteUncursed, error) { + event := new(RMNRemoteUncursed) + if err := _RMNRemote.contract.UnpackLog(event, "Uncursed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type GetVersionedConfig struct { + Version uint32 + Config RMNRemoteConfig +} + +func (_RMNRemote *RMNRemote) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _RMNRemote.abi.Events["ConfigSet"].ID: + return _RMNRemote.ParseConfigSet(log) + case _RMNRemote.abi.Events["Cursed"].ID: + return _RMNRemote.ParseCursed(log) + case _RMNRemote.abi.Events["OwnershipTransferRequested"].ID: + return _RMNRemote.ParseOwnershipTransferRequested(log) + case _RMNRemote.abi.Events["OwnershipTransferred"].ID: + return _RMNRemote.ParseOwnershipTransferred(log) + case _RMNRemote.abi.Events["Uncursed"].ID: + return _RMNRemote.ParseUncursed(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (RMNRemoteConfigSet) Topic() common.Hash { + return common.HexToHash("0x7f22bf988149dbe8de8fb879c6b97a4e56e68b2bd57421ce1a4e79d4ef6b496c") +} + +func (RMNRemoteCursed) Topic() common.Hash { + return common.HexToHash("0x1716e663a90a76d3b6c7e5f680673d1b051454c19c627e184c8daf28f3104f74") +} + +func (RMNRemoteOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (RMNRemoteOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (RMNRemoteUncursed) Topic() common.Hash { + return common.HexToHash("0x0676e709c9cc74fa0519fd78f7c33be0f1b2b0bae0507c724aef7229379c6ba1") +} + +func (_RMNRemote *RMNRemote) Address() common.Address { + return _RMNRemote.address +} + +type RMNRemoteInterface interface { + GetCursedSubjects(opts *bind.CallOpts) ([][16]byte, error) + + GetLocalChainSelector(opts *bind.CallOpts) (uint64, error) + + GetReportDigestHeader(opts *bind.CallOpts) ([32]byte, error) + + GetVersionedConfig(opts *bind.CallOpts) (GetVersionedConfig, + + error) + + IsBlessed(opts *bind.CallOpts, taggedRoot IRMNTaggedRoot) (bool, error) + + IsCursed(opts *bind.CallOpts, subject [16]byte) (bool, error) + + IsCursed0(opts *bind.CallOpts) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + Verify(opts *bind.CallOpts, offRampAddress common.Address, merkleRoots []InternalMerkleRoot, signatures []IRMNRemoteSignature) error + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + Curse(opts *bind.TransactOpts, subject [16]byte) (*types.Transaction, error) + + Curse0(opts *bind.TransactOpts, subjects [][16]byte) (*types.Transaction, error) + + SetConfig(opts *bind.TransactOpts, newConfig RMNRemoteConfig) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + Uncurse(opts *bind.TransactOpts, subject [16]byte) (*types.Transaction, error) + + Uncurse0(opts *bind.TransactOpts, subjects [][16]byte) (*types.Transaction, error) + + FilterConfigSet(opts *bind.FilterOpts, version []uint32) (*RMNRemoteConfigSetIterator, error) + + WatchConfigSet(opts *bind.WatchOpts, sink chan<- *RMNRemoteConfigSet, version []uint32) (event.Subscription, error) + + ParseConfigSet(log types.Log) (*RMNRemoteConfigSet, error) + + FilterCursed(opts *bind.FilterOpts) (*RMNRemoteCursedIterator, error) + + WatchCursed(opts *bind.WatchOpts, sink chan<- *RMNRemoteCursed) (event.Subscription, error) + + ParseCursed(log types.Log) (*RMNRemoteCursed, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNRemoteOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *RMNRemoteOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*RMNRemoteOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*RMNRemoteOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *RMNRemoteOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*RMNRemoteOwnershipTransferred, error) + + FilterUncursed(opts *bind.FilterOpts) (*RMNRemoteUncursedIterator, error) + + WatchUncursed(opts *bind.WatchOpts, sink chan<- *RMNRemoteUncursed) (event.Subscription, error) + + ParseUncursed(log types.Log) (*RMNRemoteUncursed, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/generated/v1_6_0/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go b/core/gethwrappers/ccip/generated/v1_6_0/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go new file mode 100644 index 00000000000..6a208909f1f --- /dev/null +++ b/core/gethwrappers/ccip/generated/v1_6_0/siloed_lock_release_token_pool/siloed_lock_release_token_pool.go @@ -0,0 +1,4197 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package siloed_lock_release_token_pool + +import ( + "errors" + "fmt" + "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" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type PoolLockOrBurnInV1 struct { + Receiver []byte + RemoteChainSelector uint64 + OriginalSender common.Address + Amount *big.Int + LocalToken common.Address +} + +type PoolLockOrBurnOutV1 struct { + DestTokenAddress []byte + DestPoolData []byte +} + +type PoolReleaseOrMintInV1 struct { + OriginalSender []byte + RemoteChainSelector uint64 + Receiver common.Address + Amount *big.Int + LocalToken common.Address + SourcePoolAddress []byte + SourcePoolData []byte + OffchainTokenData []byte +} + +type PoolReleaseOrMintOutV1 struct { + DestinationAmount *big.Int +} + +type RateLimiterConfig struct { + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type RateLimiterTokenBucket struct { + Tokens *big.Int + LastUpdated uint32 + IsEnabled bool + Capacity *big.Int + Rate *big.Int +} + +type SiloedLockReleaseTokenPoolSiloConfigUpdate struct { + RemoteChainSelector uint64 + Rebalancer common.Address +} + +type TokenPoolChainUpdate struct { + RemoteChainSelector uint64 + RemotePoolAddresses [][]byte + RemoteTokenAddress []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig +} + +var SiloedLockReleaseTokenPoolMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"localTokenDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"allowlist\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyAllowListUpdates\",\"inputs\":[{\"name\":\"removes\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"adds\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"applyChainUpdates\",\"inputs\":[{\"name\":\"remoteChainSelectorsToRemove\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"chainsToAdd\",\"type\":\"tuple[]\",\"internalType\":\"structTokenPool.ChainUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddresses\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"remoteTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAllowList\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllowListEnabled\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAvailableTokens\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"lockedTokens\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getChainRebalancer\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentInboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentOutboundRateLimiterState\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.TokenBucket\",\"components\":[{\"name\":\"tokens\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"lastUpdated\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRateLimitAdmin\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRebalancer\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemotePools\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRemoteToken\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRmnProxy\",\"inputs\":[],\"outputs\":[{\"name\":\"rmnProxy\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"router\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSupportedChains\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getToken\",\"inputs\":[],\"outputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getTokenDecimals\",\"inputs\":[],\"outputs\":[{\"name\":\"decimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUnsiloedLiquidity\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isSupportedToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lockOrBurn\",\"inputs\":[{\"name\":\"lockOrBurnIn\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnInV1\",\"components\":[{\"name\":\"receiver\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"originalSender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.LockOrBurnOutV1\",\"components\":[{\"name\":\"destTokenAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"destPoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provideLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"provideSiloedLiquidity\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"releaseOrMint\",\"inputs\":[{\"name\":\"releaseOrMintIn\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintInV1\",\"components\":[{\"name\":\"originalSender\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"receiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"localToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"offchainTokenData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"components\":[{\"name\":\"destinationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeRemotePool\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfig\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"outboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setChainRateLimiterConfigs\",\"inputs\":[{\"name\":\"remoteChainSelectors\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"outboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundConfigs\",\"type\":\"tuple[]\",\"internalType\":\"structRateLimiter.Config[]\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRateLimitAdmin\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRebalancer\",\"inputs\":[{\"name\":\"newRebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRouter\",\"inputs\":[{\"name\":\"newRouter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSiloRebalancer\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"typeAndVersion\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"updateSiloDesignations\",\"inputs\":[{\"name\":\"removes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"},{\"name\":\"adds\",\"type\":\"tuple[]\",\"internalType\":\"structSiloedLockReleaseTokenPool.SiloConfigUpdate[]\",\"components\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rebalancer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawLiquidity\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSiloedLiquidity\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AllowListAdd\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllowListRemove\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burned\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remoteToken\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainConfigured\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]},{\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"rebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChainUnsiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"amountUnsiloed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConfigChanged\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"provider\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LiquidityRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"remover\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Locked\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Minted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"RateLimitAdminSet\",\"inputs\":[{\"name\":\"rateLimitAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Released\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RemotePoolRemoved\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RouterUpdated\",\"inputs\":[{\"name\":\"oldRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRouter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SiloRebalancerSet\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"oldRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokensConsumed\",\"inputs\":[{\"name\":\"tokens\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnsiloedRebalancerSet\",\"inputs\":[{\"name\":\"oldRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newRebalancer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AggregateValueMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AggregateValueRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"AllowListNotEnabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BucketOverfilled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CallerIsNotARampOnRouter\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CannotTransferToSelf\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ChainAlreadyExists\",\"inputs\":[{\"name\":\"chainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotAllowed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"ChainNotSiloed\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"CursedByRMN\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"DisabledNonZeroRateLimit\",\"inputs\":[{\"name\":\"config\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InsufficientLiquidity\",\"inputs\":[{\"name\":\"availableLiquidity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requestedAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidChainSelector\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidDecimalArgs\",\"inputs\":[{\"name\":\"expected\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"actual\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"type\":\"error\",\"name\":\"InvalidRateLimitRate\",\"inputs\":[{\"name\":\"rateLimiterConfig\",\"type\":\"tuple\",\"internalType\":\"structRateLimiter.Config\",\"components\":[{\"name\":\"isEnabled\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"capacity\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"rate\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}]},{\"type\":\"error\",\"name\":\"InvalidRemoteChainDecimals\",\"inputs\":[{\"name\":\"sourcePoolData\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidRemotePoolForChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidSourcePoolAddress\",\"inputs\":[{\"name\":\"sourcePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"InvalidToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"LiquidityAmountCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MismatchedArrayLengths\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MustBeProposedOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonExistentChain\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"OnlyCallableByOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OverflowDetected\",\"inputs\":[{\"name\":\"remoteDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"localDecimals\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"remoteAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OwnerCannotBeZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PoolAlreadyAdded\",\"inputs\":[{\"name\":\"remoteChainSelector\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"remotePoolAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"RateLimitMustBeDisabled\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SenderNotAllowed\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenMaxCapacityExceeded\",\"inputs\":[{\"name\":\"capacity\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"requested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"TokenRateLimitReached\",\"inputs\":[{\"name\":\"minWaitInSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"available\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"tokenAddress\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"Unauthorized\",\"inputs\":[{\"name\":\"caller\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]}]", + Bin: "0x6101008060405234610377576155d7803803809161001d82856103f6565b833981019060a0818303126103775780516001600160a01b038116918282036103775761004c60208201610419565b60408201519092906001600160401b0381116103775782019480601f87011215610377578551956001600160401b0387116103e0578660051b906020820197610098604051998a6103f6565b885260208089019282010192831161037757602001905b8282106103c8575050506100d160806100ca60608501610427565b9301610427565b9333156103b757600180546001600160a01b03191633179055801580156103a6575b8015610395575b6103845760049260209260805260c0526040519283809263313ce56760e01b82525afa60009181610343575b50610318575b5060a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e08190526101fa575b604051614ffb90816105dc82396080518181816103e4015281816110780152818161188c01528181611a8601528181612a0b01528181612be901528181612fc20152818161301c015261315d015260a051818181611b4601528181612f6b01528181613bd60152613c59015260c051818181610df9015281816119270152612aa7015260e051818181610da70152818161196b015261280c0152f35b604051602061020981836103f6565b60008252600036813760e051156103075760005b8251811015610284576001906001600160a01b0361023b828661043b565b5116836102478261047d565b610254575b50500161021d565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a1388361024c565b50905060005b82518110156102fe576001906001600160a01b036102a8828661043b565b511680156102f857836102ba8261057b565b6102c8575b50505b0161028a565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a138836102bf565b506102c2565b5050503861015e565b6335f4a7b360e01b60005260046000fd5b60ff1660ff821681810361032c575061012c565b6332ad3e0760e11b60005260045260245260446000fd5b9091506020813d60201161037c575b8161035f602093836103f6565b810103126103775761037090610419565b9038610126565b600080fd5b3d9150610352565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b038316156100fa565b506001600160a01b038516156100f3565b639b15e16f60e01b60005260046000fd5b602080916103d584610427565b8152019101906100af565b634e487b7160e01b600052604160045260246000fd5b601f909101601f19168101906001600160401b038211908210176103e057604052565b519060ff8216820361037757565b51906001600160a01b038216820361037757565b805182101561044f5760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b805482101561044f5760005260206000200190600090565b600081815260036020526040902054801561057457600019810181811161055e5760025460001981019190821161055e5781810361050d575b50505060025480156104f757600019016104d1816002610465565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b61054661051e61052f936002610465565b90549060031b1c9283926002610465565b819391549060031b91821b91600019901b19161790565b905560005260036020526040600020553880806104b6565b634e487b7160e01b600052601160045260246000fd5b5050600090565b806000526003602052604060002054156000146105d557600254680100000000000000008110156103e0576105bc61052f8260018594016002556002610465565b9055600254906000526003602052604060002055600190565b5060009056fe608080604052600436101561001357600080fd5b60003560e01c90816301ffc9a7146131d3575080630a861f2a1461309f578063181f5a771461304057806321df0da714612fef578063240028e814612f8f57806324f65ee714612f515780632d4a148f14612e1e57806331238ffc14612dd857806339077537146129a1578063432a6ba31461296d5780634c5ef0ed1461295457806354c8a4f3146127da57806362ddd3c4146127575780636600f92c146126395780636cfd15531461257c5780636d3d1a58146125485780636d9d216c1461212557806379ba50971461205a5780637d54534e14611fcd5780638632d5cc14611f8c5780638926f54f14611f475780638da5cb5b14611f13578063962d402014611dbd5780639a4575b914611821578063a42a7b8b146116b3578063a7cd63b7146115ff578063acfecf91146114df578063af0e58b9146114c1578063af58d59f14611477578063b0f479a114611443578063b79465801461140b578063c0d7865514611323578063c4bffe2b146111f3578063c75eea9c1461114a578063ce3c752814610f94578063cf7401f314610e1d578063dc0bd97114610dcc578063e0351e1314610d8f578063e8a1da17146104aa578063eb521a4c146102ef578063f1e73399146102c45763f2fde38b146101ed57600080fd5b346102bf5760206003193601126102bf5773ffffffffffffffffffffffffffffffffffffffff61021b61341b565b610223613dc5565b1633811461029557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b600080fd5b346102bf5760206003193601126102bf5760206102e76102e261343e565b613ac4565b604051908152f35b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff61032860006137f8565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff161561043d576103928282546137db565b90555b6104086040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e2608482613341565b7f0000000000000000000000000000000000000000000000000000000000000000614360565b604051906000825260208201527f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf60403392a2005b5061044a81600a546137db565b600a55610395565b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b7fa90c0d190000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576104b8366134eb565b9190926104c3613dc5565b6000905b828210610be65750505060009063ffffffff4216907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee184360301925b81811015610be4576000918160051b86013585811215610be05786019061012082360312610be0576040519561053887613325565b823567ffffffffffffffff81168103610bdc578752602083013567ffffffffffffffff8111610bdc5783019536601f88011215610bdc5786359661057b8861371c565b97610589604051998a613341565b8089526020808a019160051b83010190368211610bd85760208301905b828210610ba5575050505060208801968752604084013567ffffffffffffffff8111610ba1576105d99036908601613aa9565b92604089019384526106036105f1366060880161358b565b9560608b0196875260c036910161358b565b9660808a019788526106158651614205565b61061f8851614205565b84515115610b795761063b67ffffffffffffffff8b5116614b8b565b15610b425767ffffffffffffffff8a5116815260076020526040812061077b87516fffffffffffffffffffffffffffffffff604082015116906107366fffffffffffffffffffffffffffffffff602083015116915115158360806040516106a181613325565b858152602081018c905260408101849052606081018690520152855474ff000000000000000000000000000000000000000091151560a01b919091167fffffffffffffffffffffff0000000000000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff84161773ffffffff0000000000000000000000000000000060808b901b1617178555565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176001830155565b6108a189516fffffffffffffffffffffffffffffffff6040820151169061085c6fffffffffffffffffffffffffffffffff602083015116915115158360806040516107c581613325565b858152602081018c9052604081018490526060810186905201526002860180547fffffffffffffffffffffff000000000000000000000000000000000000000000166fffffffffffffffffffffffffffffffff85161773ffffffff0000000000000000000000000000000060808c901b161791151560a01b74ff000000000000000000000000000000000000000016919091179055565b60809190911b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff91909116176003830155565b6004865191019080519067ffffffffffffffff8211610b15576108c48354613878565b601f8111610ada575b50602090601f8311600114610a3b5761091b9291859183610a30575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90555b88518051821015610953579061094d6001926109468367ffffffffffffffff8f511692613864565b5190613e10565b0161091e565b5050977f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2939199975095610a2167ffffffffffffffff60019796949851169251935191516109ed6109b8604051968796875261010060208801526101008701906133bc565b9360408601906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60a08401906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b0390a101939193929092610503565b015190508f806108e9565b83855281852091907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08416865b818110610ac25750908460019594939210610a8b575b505050811b01905561091e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690558e8080610a7e565b92936020600181928786015181550195019301610a68565b610b059084865260208620601f850160051c81019160208610610b0b575b601f0160051c0190613a7f565b8e6108cd565b9091508190610af8565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b60249067ffffffffffffffff8b51167f1d5ad3c5000000000000000000000000000000000000000000000000000000008252600452fd5b807f8579befe0000000000000000000000000000000000000000000000000000000060049252fd5b8680fd5b813567ffffffffffffffff8111610bd457602091610bc98392833691890101613aa9565b8152019101906105a6565b8a80fd5b8880fd5b8580fd5b8380fd5b005b909267ffffffffffffffff610c07610c0286868699979961379c565b61365f565b1692610c12846148cc565b15610d6157836000526007602052610c3060056040600020016146d3565b9260005b8451811015610c6c57600190866000526007602052610c656005604060002001610c5e8389613864565b51906149f7565b5001610c34565b5093909491959250806000526007602052600560406000206000815560006001820155600060028201556000600382015560048101610cab8154613878565b9081610d1e575b5050018054906000815581610cfd575b5050907f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166020600193604051908152a10190919392936104c7565b6000526020600020908101905b81811015610cc25760008155600101610d0a565b81601f60009311600114610d365750555b8880610cb2565b81835260208320610d5191601f01861c810190600101613a7f565b8082528160208120915555610d2f565b837f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760e06003193601126102bf57610e3661343e565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc3601126102bf57604051610e6c816132ed565b60243580151581036102bf5781526044356fffffffffffffffffffffffffffffffff811681036102bf5760208201526064356fffffffffffffffffffffffffffffffff811681036102bf57604082015260607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c3601126102bf5760405190610ef3826132ed565b60843580151581036102bf57825260a4356fffffffffffffffffffffffffffffffff811681036102bf57602083015260c4356fffffffffffffffffffffffffffffffff811681036102bf57604083015273ffffffffffffffffffffffffffffffffffffffff6009541633141580610f72575b61045257610be492614050565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415610f65565b346102bf5760406003193601126102bf57610fad61343e565b60243567ffffffffffffffff821680600052600c60205260ff60016040600020015460a01c16158015611142575b6111155781156104805773ffffffffffffffffffffffffffffffffffffffff611003846137f8565b16330361045257600052600c602052604060002060ff600182015460a01c168060001461110d5781545b8084116110db5750916110c1917f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e936000146110c65761106e828254613674565b90555b61109c81337f0000000000000000000000000000000000000000000000000000000000000000613d63565b6040519182913395836020909392919367ffffffffffffffff60408201951681520152565b0390a2005b506110d381600a54613674565b600a55611071565b83907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a5461102d565b7f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b508015610fdb565b346102bf5760206003193601126102bf5767ffffffffffffffff61116c61343e565b6111746139cc565b501660005260076020526111ef61119661119160406000206139f7565b614180565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b0390f35b346102bf5760006003193601126102bf576040516005548082528160208101600560005260206000209260005b81811061130a57505061123592500382613341565b80519061125a6112448361371c565b926112526040519485613341565b80845261371c565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe060208401920136833760005b81518110156112ba578067ffffffffffffffff6112a760019385613864565b51166112b38287613864565b5201611288565b5050906040519182916020830190602084525180915260408301919060005b8181106112e7575050500390f35b825167ffffffffffffffff168452859450602093840193909201916001016112d9565b8454835260019485019486945060209093019201611220565b346102bf5760206003193601126102bf5761133c61341b565b611344613dc5565b73ffffffffffffffffffffffffffffffffffffffff81169081156113e157600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168491819081015b0390a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760206003193601126102bf576111ef61142f61142a61343e565b613a5d565b6040519182916020835260208301906133bc565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b346102bf5760206003193601126102bf5767ffffffffffffffff61149961343e565b6114a16139cc565b501660005260076020526111ef61119661119160026040600020016139f7565b346102bf5760006003193601126102bf576020600a54604051908152f35b346102bf5767ffffffffffffffff6114f636613455565b929091611501613dc5565b169061151a826000526006602052604060002054151590565b156115d15781600052600760205261154b600560406000200161153e368685613628565b60208151910120906149f7565b1561158a577f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d7691926110c160405192839260208452602084019161398d565b6115cd906040519384937f74f23c7c000000000000000000000000000000000000000000000000000000008552600485015260406024850152604484019161398d565b0390fd5b507f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5760006003193601126102bf5760405160025490818152602081018092600260005260206000209060005b81811061169d5750505081611644910382613341565b6040519182916020830190602084525180915260408301919060005b81811061166e575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611660565b825484526020909301926001928301920161162e565b346102bf5760206003193601126102bf5767ffffffffffffffff6116d561343e565b1660005260076020526116ee60056040600020016146d3565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061173461171e8461371c565b9361172c6040519586613341565b80855261371c565b0160005b81811061181057505060005b815181101561178c578061175a60019284613864565b51600052600860205261177060406000206138cb565b61177a8286613864565b526117858185613864565b5001611744565b826040518091602082016020835281518091526040830190602060408260051b8601019301916000905b8282106117c557505050500390f35b91936020611800827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0600195979984950301865288516133bc565b96019201920185949391926117b6565b806060602080938701015201611738565b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf5760a060031982360301126102bf576060602060405161186281613309565b828152015260848101611874816136b0565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d7157506024810177ffffffffffffffff000000000000000000000000000000006118da8261365f565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c8957600091611d42575b50611d1857611969604483016136b0565b7f0000000000000000000000000000000000000000000000000000000000000000611cc2575b5067ffffffffffffffff6119a28261365f565b166119ba816000526006602052604060002054151590565b15611c9557602073ffffffffffffffffffffffffffffffffffffffff60045416916024604051809481937fa8d87a3b00000000000000000000000000000000000000000000000000000000835260048301525afa908115611c8957600091611c1f575b5073ffffffffffffffffffffffffffffffffffffffff163303611bf15761142a81611bac9367ffffffffffffffff6064611a59611b3c9661365f565b92013591166000526007602052611aac60406000208273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001691614c3a565b67ffffffffffffffff611abe8361365f565b16600052600c60205260ff60016040600020015460a01c16600014611bdd5767ffffffffffffffff611aef8361365f565b16600052600c6020526040600020611b088282546137db565b90555b6040519081527f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860203392a261365f565b6111ef60405160ff7f000000000000000000000000000000000000000000000000000000000000000016602082015260208152611b7a604082613341565b60405192611b8784613309565b83526020830190815260405193849360208552516040602086015260608501906133bc565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526133bc565b611be981600a546137db565b600a55611b0b565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6020813d602011611c81575b81611c3860209383613341565b81010312611c7d57519073ffffffffffffffffffffffffffffffffffffffff82168203611c7a575073ffffffffffffffffffffffffffffffffffffffff611a1d565b80fd5b5080fd5b3d9150611c2b565b6040513d6000823e3d90fd5b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff1680600052600360205260406000205461198f577fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b611d64915060203d602011611d6a575b611d5c8183613341565b810190613b4b565b83611958565b503d611d52565b611d8f73ffffffffffffffffffffffffffffffffffffffff916136b0565b7f961c9a4f000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760606003193601126102bf5760043567ffffffffffffffff81116102bf57611dee9036906004016134ba565b9060243567ffffffffffffffff81116102bf57611e0f90369060040161353d565b9060443567ffffffffffffffff81116102bf57611e3090369060040161353d565b73ffffffffffffffffffffffffffffffffffffffff6009541633141580611ef1575b61045257838614801590611ee7575b611ebd5760005b868110611e7157005b80611eb7611e85610c026001948b8b61379c565b611e90838989613854565b611eb1611ea9611ea186898b613854565b92369061358b565b91369061358b565b91614050565b01611e68565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b5080861415611e61565b5073ffffffffffffffffffffffffffffffffffffffff60015416331415611e52565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346102bf5760206003193601126102bf576020611f8267ffffffffffffffff611f6e61343e565b166000526006602052604060002054151590565b6040519015158152f35b346102bf5760206003193601126102bf576020611faf611faa61343e565b6137f8565b73ffffffffffffffffffffffffffffffffffffffff60405191168152f35b346102bf5760206003193601126102bf577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff61201e61341b565b612026613dc5565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346102bf5760006003193601126102bf5760005473ffffffffffffffffffffffffffffffffffffffff811633036120fb577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf5760406003193601126102bf5760043567ffffffffffffffff81116102bf576121569036906004016134ba565b6024359167ffffffffffffffff83116102bf57366023840112156102bf5782600401359167ffffffffffffffff83116102bf576024840193602436918560061b0101116102bf576121a5613dc5565b60005b81811061241a5750505060005b8181106121be57005b67ffffffffffffffff6121d5610c028385876137e8565b161580156123e5575b80156123c4575b61237f5773ffffffffffffffffffffffffffffffffffffffff612214602061220e8486886137e8565b016136b0565b16156113e15780612307612230602061220e60019587896137e8565b8573ffffffffffffffffffffffffffffffffffffffff8086604051612254816132ed565b6000815282602082019616865267ffffffffffffffff61227f610c028a8d6040860199878b526137e8565b16600052600c60205260406000209051815501935116167fffffffffffffffffffffffff00000000000000000000000000000000000000008354161782555115157fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b7f180c6940bd64ba8f75679203ca32f8be2f629477a3307b190656e4b14dd5ddeb612336610c028386886137e8565b612346602061220e85888a6137e8565b6040805167ffffffffffffffff93909316835273ffffffffffffffffffffffffffffffffffffffff91909116602083015290a1016121b5565b610c02906123969267ffffffffffffffff946137e8565b7fd9a9cd68000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b506123df67ffffffffffffffff611f6e610c028486886137e8565b156121e5565b5067ffffffffffffffff6123fd610c028385876137e8565b16600052600c60205260ff60016040600020015460a01c166121de565b67ffffffffffffffff612431610c0283858761379c565b16600052600c60205260ff60016040600020015460a01c1615612503578067ffffffffffffffff612468610c02600194868861379c565b16600052600c6020527f7b5efb3f8090c5cfd24e170b667d0e2b6fdc3db6540d75b86d5b6655ba00eb936040600020546124a481600a546137db565b600a5567ffffffffffffffff6124be610c0285888a61379c565b16600052600c6020526000846040822082815501556124e1610c0284878961379c565b6040805167ffffffffffffffff9290921682526020820192909252a1016121a8565b610c029061251a9267ffffffffffffffff9461379c565b7f46f5f12b000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b346102bf5760206003193601126102bf5761259561341b565b61259d613dc5565b73ffffffffffffffffffffffffffffffffffffffff81169081156113e157600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000811690931790556040805173ffffffffffffffffffffffffffffffffffffffff93841681529190921660208201527f66b1c1bdec8b60a3442bb25b5b6cd6fff3d0eceb6f5390be8e2f82a8ad39b23491819081016113dc565b346102bf5760406003193601126102bf5761265261343e565b60243573ffffffffffffffffffffffffffffffffffffffff8116918282036102bf5767ffffffffffffffff90612686613dc5565b169182600052600c60205260016040600020019081549060ff8260a01c16156127295780156113e15782547fffffffffffffffffffffffff000000000000000000000000000000000000000016179091556040805173ffffffffffffffffffffffffffffffffffffffff92831681529190921660208201527f01efd4cd7dd64263689551000d4359d6559c839f39b773b1df3fd19ff060cf5f91819081016110c1565b847f46f5f12b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5761276536613455565b612770929192613dc5565b67ffffffffffffffff8216612792816000526006602052604060002054151590565b156127ad5750610be4926127a7913691613628565b90613e10565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346102bf5761280261280a6127ee366134eb565b94916127fb939193613dc5565b3691613734565b923691613734565b7f00000000000000000000000000000000000000000000000000000000000000001561292a5760005b82518110156128a6578073ffffffffffffffffffffffffffffffffffffffff61285e60019386613864565b511661286981614736565b612875575b5001612833565b60207f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a18461286e565b5060005b8151811015610be4578073ffffffffffffffffffffffffffffffffffffffff6128d560019385613864565b51168015612924576128e681614b2b565b6128f3575b505b016128aa565b60207f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1836128eb565b506128ed565b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346102bf576020611f8261296736613455565b916136d1565b346102bf5760006003193601126102bf57602073ffffffffffffffffffffffffffffffffffffffff600b5416604051908152f35b346102bf5760206003193601126102bf5760043567ffffffffffffffff81116102bf578060040161010060031983360301126102bf5760006040516129e5816132a2565b52608482016129f3816136b0565b73ffffffffffffffffffffffffffffffffffffffff807f000000000000000000000000000000000000000000000000000000000000000016911603611d715750602482019177ffffffffffffffff00000000000000000000000000000000612a5a8461365f565b60801b16604051907f2cbc26bb000000000000000000000000000000000000000000000000000000008252600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa908115611c8957600091612db9575b50611d1857612ae68361365f565b67ffffffffffffffff8116612b08816000526006602052604060002054151590565b15611c955750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff93909316918301919091523360248301526020908290604490829073ffffffffffffffffffffffffffffffffffffffff165afa908115611c8957600091612d9a575b5015611bf157612b928361365f565b612ba460a483019161296783866135d7565b15612d53575067ffffffffffffffff612c49612c43612bc28661365f565b83606486013591166000526007602052612c3d612c38612c31600260406000200198612c277f00000000000000000000000000000000000000000000000000000000000000009a8673ffffffffffffffffffffffffffffffffffffffff8d1691614c3a565b60c48901906135d7565b3691613628565b613b63565b90613c56565b9461365f565b16600052600c602052604060002060ff600182015460a01c1680600014612d4b5781545b808611612d195760208673ffffffffffffffffffffffffffffffffffffffff612cc288612cbd8460448b8b8b15612d0457612ca9848254613674565b90555b0192612cb7846136b0565b90613d63565b6136b0565b166040518281527f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52843392a380604051612cfb816132a2565b52604051908152f35b50612d1183600a54613674565b600a55612cac565b85907fa17e11d50000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b600a54612c6d565b612d5d90836135d7565b6115cd6040519283927f24eb47e500000000000000000000000000000000000000000000000000000000845260206004850152602484019161398d565b612db3915060203d602011611d6a57611d5c8183613341565b84612b83565b612dd2915060203d602011611d6a57611d5c8183613341565b84612ad8565b346102bf5760206003193601126102bf5767ffffffffffffffff612dfa61343e565b16600052600c602052602060ff60016040600020015460a01c166040519015158152f35b346102bf5760406003193601126102bf57612e3761343e565b60243567ffffffffffffffff821680600052600c60205260ff60016040600020015460a01c16158015612f49575b6111155781156104805773ffffffffffffffffffffffffffffffffffffffff612e8d846137f8565b163303610452577f569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf916110c191600052600c602052604060002060ff600182015460a01c16600014612f3457612ee48282546137db565b90555b61109c6040517f23b872dd000000000000000000000000000000000000000000000000000000006020820152336024820152306044820152826064820152606481526103e2608482613341565b50612f4181600a546137db565b600a55612ee7565b508015612e65565b346102bf5760006003193601126102bf57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760206003193601126102bf576020612faa61341b565b73ffffffffffffffffffffffffffffffffffffffff807f0000000000000000000000000000000000000000000000000000000000000000169116146040519015158152f35b346102bf5760006003193601126102bf57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346102bf5760006003193601126102bf576111ef60408051906130638183613341565b602082527f53696c6f65644c6f636b52656c65617365546f6b656e506f6f6c20312e362e306020830152519182916020835260208301906133bc565b346102bf5760206003193601126102bf5760043580156104805773ffffffffffffffffffffffffffffffffffffffff6130d860006137f8565b1633036104525760008052600c6020527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e9547f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e89060a01c60ff1680156131cb5781545b8084116110db5750156131b657613153828254613674565b90555b61318181337f0000000000000000000000000000000000000000000000000000000000000000613d63565b604051906000825260208201527f58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e60403392a2005b506131c381600a54613674565b600a55613156565b600a5461313b565b346102bf5760206003193601126102bf57600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036102bf57817faff2afbf0000000000000000000000000000000000000000000000000000000060209314908115613278575b811561324e575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483613247565b7f0e64dd290000000000000000000000000000000000000000000000000000000081149150613240565b6020810190811067ffffffffffffffff8211176132be57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176132be57604052565b6040810190811067ffffffffffffffff8211176132be57604052565b60a0810190811067ffffffffffffffff8211176132be57604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176132be57604052565b67ffffffffffffffff81116132be57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b919082519283825260005b8481106134065750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016133c7565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036102bf57565b6004359067ffffffffffffffff821682036102bf57565b60406003198201126102bf5760043567ffffffffffffffff811681036102bf579160243567ffffffffffffffff81116102bf57826023820112156102bf5780600401359267ffffffffffffffff84116102bf57602484830101116102bf576024019190565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf576020808501948460051b0101116102bf57565b60406003198201126102bf5760043567ffffffffffffffff81116102bf5781613516916004016134ba565b929092916024359067ffffffffffffffff82116102bf57613539916004016134ba565b9091565b9181601f840112156102bf5782359167ffffffffffffffff83116102bf57602080850194606085020101116102bf57565b35906fffffffffffffffffffffffffffffffff821682036102bf57565b91908260609103126102bf576040516135a3816132ed565b809280359081151582036102bf5760406135d291819385526135c76020820161356e565b60208601520161356e565b910152565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156102bf570180359067ffffffffffffffff82116102bf576020019181360383136102bf57565b92919261363482613382565b916136426040519384613341565b8294818452818301116102bf578281602093846000960137010152565b3567ffffffffffffffff811681036102bf5790565b9190820391821161368157565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b3573ffffffffffffffffffffffffffffffffffffffff811681036102bf5790565b613719929167ffffffffffffffff6136fc921660005260076020526005604060002001923691613628565b602081519101209060019160005201602052604060002054151590565b90565b67ffffffffffffffff81116132be5760051b60200190565b929161373f8261371c565b9361374d6040519586613341565b602085848152019260051b81019182116102bf57915b81831061376f57505050565b823573ffffffffffffffffffffffffffffffffffffffff811681036102bf57815260209283019201613763565b91908110156137ac5760051b0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190820180921161368157565b91908110156137ac5760061b0190565b67ffffffffffffffff16600052600c60205260016040600020015460ff8160a01c1661383b575073ffffffffffffffffffffffffffffffffffffffff600b541690565b73ffffffffffffffffffffffffffffffffffffffff1690565b91908110156137ac576060020190565b80518210156137ac5760209160051b010190565b90600182811c921680156138c1575b602083101461389257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613887565b90604051918260008254926138df84613878565b808452936001811690811561394d5750600114613906575b5061390492500383613341565b565b90506000929192526020600020906000915b81831061393157505090602061390492820101386138f7565b6020919350806001915483858901015201910190918492613918565b602093506139049592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386138f7565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b604051906139d982613325565b60006080838281528260208201528260408201528260608201520152565b90604051613a0481613325565b60806001829460ff81546fffffffffffffffffffffffffffffffff8116865263ffffffff81861c16602087015260a01c161515604085015201546fffffffffffffffffffffffffffffffff81166060840152811c910152565b67ffffffffffffffff16600052600760205261371960046040600020016138cb565b818110613a8a575050565b60008155600101613a7f565b8181029291811591840414171561368157565b9080601f830112156102bf5781602061371993359101613628565b67ffffffffffffffff16613ae5816000526006602052604060002054151590565b15613b1e5780600052600c60205260ff60016040600020015460a01c16613b0d5750600a5490565b600052600c60205260406000205490565b7fd9a9cd680000000000000000000000000000000000000000000000000000000060005260045260246000fd5b908160209103126102bf575180151581036102bf5790565b80518015613bd257602003613b94576020818051810103126102bf5760208101519060ff8211613b94575060ff1690565b6115cd906040519182917f953576f70000000000000000000000000000000000000000000000000000000083526020600484015260248301906133bc565b50507f000000000000000000000000000000000000000000000000000000000000000090565b9060ff8091169116039060ff821161368157565b60ff16604d811161368157600a0a90565b8115613c27570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b907f00000000000000000000000000000000000000000000000000000000000000009060ff82169060ff811692828414613d5c57828411613d325790613c9b91613bf8565b91604d60ff8416118015613cf9575b613cc357505090613cbd61371992613c0c565b90613a96565b9091507fa9cb113d0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b50613d0383613c0c565b8015613c27577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048411613caa565b613d3b91613bf8565b91604d60ff841611613cc357505090613d5661371992613c0c565b90613c1d565b5050505090565b6139049273ffffffffffffffffffffffffffffffffffffffff604051937fa9059cbb000000000000000000000000000000000000000000000000000000006020860152166024840152604483015260448252613dc0606483613341565b614360565b73ffffffffffffffffffffffffffffffffffffffff600154163303613de657565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b908051156113e15767ffffffffffffffff81516020830120921691826000526007602052613e45816005604060002001614be5565b1561400c5760005260086020526040600020815167ffffffffffffffff81116132be57613e728254613878565b601f8111613fda575b506020601f8211600114613f145791613eee827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea9593613f0495600091613f09575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b90556040519182916020835260208301906133bc565b0390a2565b905084015138613ebd565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169083600052806000209160005b818110613fc2575092613f049492600192827f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea989610613f8b575b5050811b01905561142f565b8501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690553880613f7f565b9192602060018192868a015181550194019201613f44565b61400690836000526020600020601f840160051c81019160208510610b0b57601f0160051c0190613a7f565b38613e7b565b50906115cd6040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401526040602484015260448301906133bc565b67ffffffffffffffff166000818152600660205260409020549092919015614152579161414f60e09261411b856140a77f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b97614205565b8460005260076020526140be8160406000206144a0565b6140c783614205565b8460005260076020526140e18360026040600020016144a0565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6141886139cc565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff80835116916141e560208501936141df6141d263ffffffff87511642613674565b8560808901511690613a96565b906137db565b808210156141fe57505b16825263ffffffff4216905290565b90506141ef565b8051156142b9576fffffffffffffffffffffffffffffffff6040820151166fffffffffffffffffffffffffffffffff6020830151168110908115916142b0575b5061424d5750565b6064906142ae604051917f8020d12400000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565bfd5b90501538614245565b6fffffffffffffffffffffffffffffffff60408201511615801590614341575b6142e05750565b6064906142ae604051917fd68af9cc00000000000000000000000000000000000000000000000000000000835260048301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b506fffffffffffffffffffffffffffffffff60208201511615156142d9565b73ffffffffffffffffffffffffffffffffffffffff6143ef91169160409260008085519361438e8786613341565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602086015260208151910182855af13d15614498573d916143d383613382565b926143e087519485613341565b83523d6000602085013e614f22565b805190816143fc57505050565b60208061440d938301019101613b4b565b156144155750565b608490517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152fd5b606091614f22565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19916145d960609280546144dd63ffffffff8260801c1642613674565b9081614618575b50506fffffffffffffffffffffffffffffffff600181602086015116928281541680851060001461461057508280855b16167fffffffffffffffffffffffffffffffff0000000000000000000000000000000082541617815561458d8651151582907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff74ff0000000000000000000000000000000000000000835492151560a01b169116179055565b60408601517fffffffffffffffffffffffffffffffff0000000000000000000000000000000060809190911b16939092166fffffffffffffffffffffffffffffffff1692909217910155565b61414f60405180926fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b838091614514565b6fffffffffffffffffffffffffffffffff9161464d8392836146466001880154948286169560801c90613a96565b91166137db565b808210156146cc57505b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9290911692909216167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116174260801b73ffffffff000000000000000000000000000000001617815538806144e4565b9050614657565b906040519182815491828252602082019060005260206000209260005b81811061470557505061390492500383613341565b84548352600194850194879450602090930192016146f0565b80548210156137ac5760005260206000200190600090565b60008181526003602052604090205480156148c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161368157600254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161368157818103614856575b5050506002548015614827577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016147e481600261471e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600255600052600360205260006040812055600190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6148ad61486761487893600261471e565b90549060031b1c928392600261471e565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b905560005260036020526040600020553880806147ab565b5050600090565b60008181526006602052604090205480156148c5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811161368157600554907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211613681578181036149bd575b5050506005548015614827577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161497a81600561471e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b19169055600555600052600660205260006040812055600190565b6149df6149ce61487893600561471e565b90549060031b1c928392600561471e565b90556000526006602052604060002055388080614941565b9060018201918160005282602052604060002054801515600014614b22577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111613681578254907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161368157818103614aeb575b50505080548015614827577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614aac828261471e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b191690555560005260205260006040812055600190565b614b0b614afb614878938661471e565b90549060031b1c9283928661471e565b905560005283602052604060002055388080614a74565b50505050600090565b80600052600360205260406000205415600014614b8557600254680100000000000000008110156132be57614b6c614878826001859401600255600261471e565b9055600254906000526003602052604060002055600190565b50600090565b80600052600660205260406000205415600014614b8557600554680100000000000000008110156132be57614bcc614878826001859401600555600561471e565b9055600554906000526006602052604060002055600190565b60008281526001820160205260409020546148c557805490680100000000000000008210156132be5782614c2361487884600180960185558461471e565b905580549260005201602052604060002055600190565b929192805460ff8160a01c16158015614f1a575b614f13576fffffffffffffffffffffffffffffffff81169060018301908154614c9363ffffffff6fffffffffffffffffffffffffffffffff83169360801c1642613674565b9081614e75575b5050848110614df35750838210614d2257507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a939450906fffffffffffffffffffffffffffffffff80614cf08560209695613674565b16167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055604051908152a1565b819450614d3492505460801c92613674565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81019080821161368157614d82614d879273ffffffffffffffffffffffffffffffffffffffff946137db565b613c1d565b9216918215614dc3577fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7f15279c080000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b8473ffffffffffffffffffffffffffffffffffffffff8816918215614e45577f1a76572a0000000000000000000000000000000000000000000000000000000060005260045260245260445260646000fd5b7ff94ebcd10000000000000000000000000000000000000000000000000000000060005260045260245260446000fd5b828592939511614ee957614e90926141df9160801c90613a96565b80831015614ee45750815b83547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff0000000000000000000000000000000016178455913880614c9a565b614e9b565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b508215614c4e565b91929015614f9d5750815115614f36575090565b3b15614f3f5790565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152fd5b825190915015614fb05750805190602001fd5b6115cd906040519182917f08c379a00000000000000000000000000000000000000000000000000000000083526020600484015260248301906133bc56fea164736f6c634300081a000a", +} + +var SiloedLockReleaseTokenPoolABI = SiloedLockReleaseTokenPoolMetaData.ABI + +var SiloedLockReleaseTokenPoolBin = SiloedLockReleaseTokenPoolMetaData.Bin + +func DeploySiloedLockReleaseTokenPool(auth *bind.TransactOpts, backend bind.ContractBackend, token common.Address, localTokenDecimals uint8, allowlist []common.Address, rmnProxy common.Address, router common.Address) (common.Address, *types.Transaction, *SiloedLockReleaseTokenPool, error) { + parsed, err := SiloedLockReleaseTokenPoolMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(SiloedLockReleaseTokenPoolBin), backend, token, localTokenDecimals, allowlist, rmnProxy, router) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &SiloedLockReleaseTokenPool{address: address, abi: *parsed, SiloedLockReleaseTokenPoolCaller: SiloedLockReleaseTokenPoolCaller{contract: contract}, SiloedLockReleaseTokenPoolTransactor: SiloedLockReleaseTokenPoolTransactor{contract: contract}, SiloedLockReleaseTokenPoolFilterer: SiloedLockReleaseTokenPoolFilterer{contract: contract}}, nil +} + +type SiloedLockReleaseTokenPool struct { + address common.Address + abi abi.ABI + SiloedLockReleaseTokenPoolCaller + SiloedLockReleaseTokenPoolTransactor + SiloedLockReleaseTokenPoolFilterer +} + +type SiloedLockReleaseTokenPoolCaller struct { + contract *bind.BoundContract +} + +type SiloedLockReleaseTokenPoolTransactor struct { + contract *bind.BoundContract +} + +type SiloedLockReleaseTokenPoolFilterer struct { + contract *bind.BoundContract +} + +type SiloedLockReleaseTokenPoolSession struct { + Contract *SiloedLockReleaseTokenPool + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type SiloedLockReleaseTokenPoolCallerSession struct { + Contract *SiloedLockReleaseTokenPoolCaller + CallOpts bind.CallOpts +} + +type SiloedLockReleaseTokenPoolTransactorSession struct { + Contract *SiloedLockReleaseTokenPoolTransactor + TransactOpts bind.TransactOpts +} + +type SiloedLockReleaseTokenPoolRaw struct { + Contract *SiloedLockReleaseTokenPool +} + +type SiloedLockReleaseTokenPoolCallerRaw struct { + Contract *SiloedLockReleaseTokenPoolCaller +} + +type SiloedLockReleaseTokenPoolTransactorRaw struct { + Contract *SiloedLockReleaseTokenPoolTransactor +} + +func NewSiloedLockReleaseTokenPool(address common.Address, backend bind.ContractBackend) (*SiloedLockReleaseTokenPool, error) { + abi, err := abi.JSON(strings.NewReader(SiloedLockReleaseTokenPoolABI)) + if err != nil { + return nil, err + } + contract, err := bindSiloedLockReleaseTokenPool(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPool{address: address, abi: abi, SiloedLockReleaseTokenPoolCaller: SiloedLockReleaseTokenPoolCaller{contract: contract}, SiloedLockReleaseTokenPoolTransactor: SiloedLockReleaseTokenPoolTransactor{contract: contract}, SiloedLockReleaseTokenPoolFilterer: SiloedLockReleaseTokenPoolFilterer{contract: contract}}, nil +} + +func NewSiloedLockReleaseTokenPoolCaller(address common.Address, caller bind.ContractCaller) (*SiloedLockReleaseTokenPoolCaller, error) { + contract, err := bindSiloedLockReleaseTokenPool(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolCaller{contract: contract}, nil +} + +func NewSiloedLockReleaseTokenPoolTransactor(address common.Address, transactor bind.ContractTransactor) (*SiloedLockReleaseTokenPoolTransactor, error) { + contract, err := bindSiloedLockReleaseTokenPool(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolTransactor{contract: contract}, nil +} + +func NewSiloedLockReleaseTokenPoolFilterer(address common.Address, filterer bind.ContractFilterer) (*SiloedLockReleaseTokenPoolFilterer, error) { + contract, err := bindSiloedLockReleaseTokenPool(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolFilterer{contract: contract}, nil +} + +func bindSiloedLockReleaseTokenPool(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := SiloedLockReleaseTokenPoolMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _SiloedLockReleaseTokenPool.Contract.SiloedLockReleaseTokenPoolCaller.contract.Call(opts, result, method, params...) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SiloedLockReleaseTokenPoolTransactor.contract.Transfer(opts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SiloedLockReleaseTokenPoolTransactor.contract.Transact(opts, method, params...) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _SiloedLockReleaseTokenPool.Contract.contract.Call(opts, result, method, params...) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.contract.Transfer(opts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.contract.Transact(opts, method, params...) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetAllowList(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getAllowList") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetAllowList() ([]common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetAllowList(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetAllowList() ([]common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetAllowList(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetAllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getAllowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetAllowListEnabled() (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.GetAllowListEnabled(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetAllowListEnabled() (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.GetAllowListEnabled(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetAvailableTokens(opts *bind.CallOpts, remoteChainSelector uint64) (*big.Int, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getAvailableTokens", remoteChainSelector) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetAvailableTokens(remoteChainSelector uint64) (*big.Int, error) { + return _SiloedLockReleaseTokenPool.Contract.GetAvailableTokens(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetAvailableTokens(remoteChainSelector uint64) (*big.Int, error) { + return _SiloedLockReleaseTokenPool.Contract.GetAvailableTokens(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetChainRebalancer(opts *bind.CallOpts, remoteChainSelector uint64) (common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getChainRebalancer", remoteChainSelector) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetChainRebalancer(remoteChainSelector uint64) (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetChainRebalancer(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetChainRebalancer(remoteChainSelector uint64) (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetChainRebalancer(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getCurrentInboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _SiloedLockReleaseTokenPool.Contract.GetCurrentInboundRateLimiterState(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetCurrentInboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _SiloedLockReleaseTokenPool.Contract.GetCurrentInboundRateLimiterState(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getCurrentOutboundRateLimiterState", remoteChainSelector) + + if err != nil { + return *new(RateLimiterTokenBucket), err + } + + out0 := *abi.ConvertType(out[0], new(RateLimiterTokenBucket)).(*RateLimiterTokenBucket) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _SiloedLockReleaseTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetCurrentOutboundRateLimiterState(remoteChainSelector uint64) (RateLimiterTokenBucket, error) { + return _SiloedLockReleaseTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getRateLimitAdmin") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetRateLimitAdmin() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRateLimitAdmin(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRateLimitAdmin(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetRebalancer(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getRebalancer") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetRebalancer() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRebalancer(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetRebalancer() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRebalancer(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getRemotePools", remoteChainSelector) + + if err != nil { + return *new([][]byte), err + } + + out0 := *abi.ConvertType(out[0], new([][]byte)).(*[][]byte) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRemotePools(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetRemotePools(remoteChainSelector uint64) ([][]byte, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRemotePools(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getRemoteToken", remoteChainSelector) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRemoteToken(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetRemoteToken(remoteChainSelector uint64) ([]byte, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRemoteToken(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetRmnProxy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getRmnProxy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetRmnProxy() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRmnProxy(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetRmnProxy() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRmnProxy(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetRouter(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getRouter") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetRouter() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRouter(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetRouter() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetRouter(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getSupportedChains") + + if err != nil { + return *new([]uint64), err + } + + out0 := *abi.ConvertType(out[0], new([]uint64)).(*[]uint64) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetSupportedChains() ([]uint64, error) { + return _SiloedLockReleaseTokenPool.Contract.GetSupportedChains(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetSupportedChains() ([]uint64, error) { + return _SiloedLockReleaseTokenPool.Contract.GetSupportedChains(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetToken(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getToken") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetToken() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetToken(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetToken() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.GetToken(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetTokenDecimals(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getTokenDecimals") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetTokenDecimals() (uint8, error) { + return _SiloedLockReleaseTokenPool.Contract.GetTokenDecimals(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetTokenDecimals() (uint8, error) { + return _SiloedLockReleaseTokenPool.Contract.GetTokenDecimals(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) GetUnsiloedLiquidity(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "getUnsiloedLiquidity") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) GetUnsiloedLiquidity() (*big.Int, error) { + return _SiloedLockReleaseTokenPool.Contract.GetUnsiloedLiquidity(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) GetUnsiloedLiquidity() (*big.Int, error) { + return _SiloedLockReleaseTokenPool.Contract.GetUnsiloedLiquidity(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "isRemotePool", remoteChainSelector, remotePoolAddress) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.IsRemotePool(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) IsRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.IsRemotePool(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector, remotePoolAddress) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) IsSiloed(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "isSiloed", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) IsSiloed(remoteChainSelector uint64) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.IsSiloed(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) IsSiloed(remoteChainSelector uint64) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.IsSiloed(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "isSupportedChain", remoteChainSelector) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.IsSupportedChain(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) IsSupportedChain(remoteChainSelector uint64) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.IsSupportedChain(&_SiloedLockReleaseTokenPool.CallOpts, remoteChainSelector) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "isSupportedToken", token) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) IsSupportedToken(token common.Address) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.IsSupportedToken(&_SiloedLockReleaseTokenPool.CallOpts, token) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) IsSupportedToken(token common.Address) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.IsSupportedToken(&_SiloedLockReleaseTokenPool.CallOpts, token) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.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 + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) Owner() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.Owner(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) Owner() (common.Address, error) { + return _SiloedLockReleaseTokenPool.Contract.Owner(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.SupportsInterface(&_SiloedLockReleaseTokenPool.CallOpts, interfaceId) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _SiloedLockReleaseTokenPool.Contract.SupportsInterface(&_SiloedLockReleaseTokenPool.CallOpts, interfaceId) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _SiloedLockReleaseTokenPool.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) TypeAndVersion() (string, error) { + return _SiloedLockReleaseTokenPool.Contract.TypeAndVersion(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolCallerSession) TypeAndVersion() (string, error) { + return _SiloedLockReleaseTokenPool.Contract.TypeAndVersion(&_SiloedLockReleaseTokenPool.CallOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "acceptOwnership") +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) AcceptOwnership() (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.AcceptOwnership(&_SiloedLockReleaseTokenPool.TransactOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.AcceptOwnership(&_SiloedLockReleaseTokenPool.TransactOpts) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "addRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.AddRemotePool(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) AddRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.AddRemotePool(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "applyAllowListUpdates", removes, adds) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ApplyAllowListUpdates(&_SiloedLockReleaseTokenPool.TransactOpts, removes, adds) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) ApplyAllowListUpdates(removes []common.Address, adds []common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ApplyAllowListUpdates(&_SiloedLockReleaseTokenPool.TransactOpts, removes, adds) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "applyChainUpdates", remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ApplyChainUpdates(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) ApplyChainUpdates(remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ApplyChainUpdates(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelectorsToRemove, chainsToAdd) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "lockOrBurn", lockOrBurnIn) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.LockOrBurn(&_SiloedLockReleaseTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) LockOrBurn(lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.LockOrBurn(&_SiloedLockReleaseTokenPool.TransactOpts, lockOrBurnIn) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) ProvideLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "provideLiquidity", amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) ProvideLiquidity(amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ProvideLiquidity(&_SiloedLockReleaseTokenPool.TransactOpts, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) ProvideLiquidity(amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ProvideLiquidity(&_SiloedLockReleaseTokenPool.TransactOpts, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) ProvideSiloedLiquidity(opts *bind.TransactOpts, remoteChainSelector uint64, amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "provideSiloedLiquidity", remoteChainSelector, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) ProvideSiloedLiquidity(remoteChainSelector uint64, amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ProvideSiloedLiquidity(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) ProvideSiloedLiquidity(remoteChainSelector uint64, amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ProvideSiloedLiquidity(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "releaseOrMint", releaseOrMintIn) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ReleaseOrMint(&_SiloedLockReleaseTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) ReleaseOrMint(releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.ReleaseOrMint(&_SiloedLockReleaseTokenPool.TransactOpts, releaseOrMintIn) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "removeRemotePool", remoteChainSelector, remotePoolAddress) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.RemoveRemotePool(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) RemoveRemotePool(remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.RemoveRemotePool(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, remotePoolAddress) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "setChainRateLimiterConfig", remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetChainRateLimiterConfig(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) SetChainRateLimiterConfig(remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetChainRateLimiterConfig(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "setChainRateLimiterConfigs", remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetChainRateLimiterConfigs(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) SetChainRateLimiterConfigs(remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetChainRateLimiterConfigs(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelectors, outboundConfigs, inboundConfigs) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetRateLimitAdmin(&_SiloedLockReleaseTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetRateLimitAdmin(&_SiloedLockReleaseTokenPool.TransactOpts, rateLimitAdmin) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) SetRebalancer(opts *bind.TransactOpts, newRebalancer common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "setRebalancer", newRebalancer) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) SetRebalancer(newRebalancer common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetRebalancer(&_SiloedLockReleaseTokenPool.TransactOpts, newRebalancer) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) SetRebalancer(newRebalancer common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetRebalancer(&_SiloedLockReleaseTokenPool.TransactOpts, newRebalancer) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "setRouter", newRouter) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetRouter(&_SiloedLockReleaseTokenPool.TransactOpts, newRouter) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) SetRouter(newRouter common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetRouter(&_SiloedLockReleaseTokenPool.TransactOpts, newRouter) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) SetSiloRebalancer(opts *bind.TransactOpts, remoteChainSelector uint64, newRebalancer common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "setSiloRebalancer", remoteChainSelector, newRebalancer) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) SetSiloRebalancer(remoteChainSelector uint64, newRebalancer common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetSiloRebalancer(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, newRebalancer) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) SetSiloRebalancer(remoteChainSelector uint64, newRebalancer common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.SetSiloRebalancer(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, newRebalancer) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "transferOwnership", to) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.TransferOwnership(&_SiloedLockReleaseTokenPool.TransactOpts, to) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.TransferOwnership(&_SiloedLockReleaseTokenPool.TransactOpts, to) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) UpdateSiloDesignations(opts *bind.TransactOpts, removes []uint64, adds []SiloedLockReleaseTokenPoolSiloConfigUpdate) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "updateSiloDesignations", removes, adds) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) UpdateSiloDesignations(removes []uint64, adds []SiloedLockReleaseTokenPoolSiloConfigUpdate) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.UpdateSiloDesignations(&_SiloedLockReleaseTokenPool.TransactOpts, removes, adds) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) UpdateSiloDesignations(removes []uint64, adds []SiloedLockReleaseTokenPoolSiloConfigUpdate) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.UpdateSiloDesignations(&_SiloedLockReleaseTokenPool.TransactOpts, removes, adds) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) WithdrawLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "withdrawLiquidity", amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) WithdrawLiquidity(amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.WithdrawLiquidity(&_SiloedLockReleaseTokenPool.TransactOpts, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) WithdrawLiquidity(amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.WithdrawLiquidity(&_SiloedLockReleaseTokenPool.TransactOpts, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactor) WithdrawSiloedLiquidity(opts *bind.TransactOpts, remoteChainSelector uint64, amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.contract.Transact(opts, "withdrawSiloedLiquidity", remoteChainSelector, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolSession) WithdrawSiloedLiquidity(remoteChainSelector uint64, amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.WithdrawSiloedLiquidity(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, amount) +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolTransactorSession) WithdrawSiloedLiquidity(remoteChainSelector uint64, amount *big.Int) (*types.Transaction, error) { + return _SiloedLockReleaseTokenPool.Contract.WithdrawSiloedLiquidity(&_SiloedLockReleaseTokenPool.TransactOpts, remoteChainSelector, amount) +} + +type SiloedLockReleaseTokenPoolAllowListAddIterator struct { + Event *SiloedLockReleaseTokenPoolAllowListAdd + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolAllowListAddIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolAllowListAdd) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolAllowListAddIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolAllowListAddIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolAllowListAdd struct { + Sender common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterAllowListAdd(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolAllowListAddIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolAllowListAddIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "AllowListAdd", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolAllowListAdd) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "AllowListAdd") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolAllowListAdd) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseAllowListAdd(log types.Log) (*SiloedLockReleaseTokenPoolAllowListAdd, error) { + event := new(SiloedLockReleaseTokenPoolAllowListAdd) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "AllowListAdd", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolAllowListRemoveIterator struct { + Event *SiloedLockReleaseTokenPoolAllowListRemove + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolAllowListRemoveIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolAllowListRemove) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolAllowListRemoveIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolAllowListRemoveIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolAllowListRemove struct { + Sender common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterAllowListRemove(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolAllowListRemoveIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolAllowListRemoveIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "AllowListRemove", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolAllowListRemove) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "AllowListRemove") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolAllowListRemove) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseAllowListRemove(log types.Log) (*SiloedLockReleaseTokenPoolAllowListRemove, error) { + event := new(SiloedLockReleaseTokenPoolAllowListRemove) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "AllowListRemove", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolBurnedIterator struct { + Event *SiloedLockReleaseTokenPoolBurned + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolBurnedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolBurned) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolBurnedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolBurnedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolBurned struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*SiloedLockReleaseTokenPoolBurnedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolBurnedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "Burned", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchBurned(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolBurned, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "Burned", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolBurned) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseBurned(log types.Log) (*SiloedLockReleaseTokenPoolBurned, error) { + event := new(SiloedLockReleaseTokenPoolBurned) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "Burned", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolChainAddedIterator struct { + Event *SiloedLockReleaseTokenPoolChainAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolChainAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolChainAddedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolChainAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolChainAdded struct { + RemoteChainSelector uint64 + RemoteToken []byte + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterChainAdded(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainAddedIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolChainAddedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "ChainAdded", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchChainAdded(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainAdded) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "ChainAdded") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolChainAdded) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseChainAdded(log types.Log) (*SiloedLockReleaseTokenPoolChainAdded, error) { + event := new(SiloedLockReleaseTokenPoolChainAdded) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolChainConfiguredIterator struct { + Event *SiloedLockReleaseTokenPoolChainConfigured + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolChainConfiguredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainConfigured) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolChainConfiguredIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolChainConfiguredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolChainConfigured struct { + RemoteChainSelector uint64 + OutboundRateLimiterConfig RateLimiterConfig + InboundRateLimiterConfig RateLimiterConfig + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterChainConfigured(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainConfiguredIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolChainConfiguredIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "ChainConfigured", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainConfigured) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "ChainConfigured") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolChainConfigured) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseChainConfigured(log types.Log) (*SiloedLockReleaseTokenPoolChainConfigured, error) { + event := new(SiloedLockReleaseTokenPoolChainConfigured) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainConfigured", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolChainRemovedIterator struct { + Event *SiloedLockReleaseTokenPoolChainRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolChainRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolChainRemovedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolChainRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolChainRemoved struct { + RemoteChainSelector uint64 + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterChainRemoved(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainRemovedIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolChainRemovedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "ChainRemoved", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainRemoved) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "ChainRemoved") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolChainRemoved) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseChainRemoved(log types.Log) (*SiloedLockReleaseTokenPoolChainRemoved, error) { + event := new(SiloedLockReleaseTokenPoolChainRemoved) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolChainSiloedIterator struct { + Event *SiloedLockReleaseTokenPoolChainSiloed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolChainSiloedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainSiloed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainSiloed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolChainSiloedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolChainSiloedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolChainSiloed struct { + RemoteChainSelector uint64 + Rebalancer common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterChainSiloed(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainSiloedIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "ChainSiloed") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolChainSiloedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "ChainSiloed", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchChainSiloed(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainSiloed) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "ChainSiloed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolChainSiloed) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainSiloed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseChainSiloed(log types.Log) (*SiloedLockReleaseTokenPoolChainSiloed, error) { + event := new(SiloedLockReleaseTokenPoolChainSiloed) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainSiloed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolChainUnsiloedIterator struct { + Event *SiloedLockReleaseTokenPoolChainUnsiloed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolChainUnsiloedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainUnsiloed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolChainUnsiloed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolChainUnsiloedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolChainUnsiloedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolChainUnsiloed struct { + RemoteChainSelector uint64 + AmountUnsiloed *big.Int + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterChainUnsiloed(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainUnsiloedIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "ChainUnsiloed") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolChainUnsiloedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "ChainUnsiloed", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchChainUnsiloed(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainUnsiloed) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "ChainUnsiloed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolChainUnsiloed) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainUnsiloed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseChainUnsiloed(log types.Log) (*SiloedLockReleaseTokenPoolChainUnsiloed, error) { + event := new(SiloedLockReleaseTokenPoolChainUnsiloed) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ChainUnsiloed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolConfigChangedIterator struct { + Event *SiloedLockReleaseTokenPoolConfigChanged + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolConfigChangedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolConfigChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolConfigChangedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolConfigChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolConfigChanged struct { + Config RateLimiterConfig + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterConfigChanged(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolConfigChangedIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolConfigChangedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "ConfigChanged", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolConfigChanged) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "ConfigChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolConfigChanged) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseConfigChanged(log types.Log) (*SiloedLockReleaseTokenPoolConfigChanged, error) { + event := new(SiloedLockReleaseTokenPoolConfigChanged) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "ConfigChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolLiquidityAddedIterator struct { + Event *SiloedLockReleaseTokenPoolLiquidityAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolLiquidityAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolLiquidityAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolLiquidityAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolLiquidityAddedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolLiquidityAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolLiquidityAdded struct { + RemoteChainSelector uint64 + Provider common.Address + Amount *big.Int + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterLiquidityAdded(opts *bind.FilterOpts, provider []common.Address) (*SiloedLockReleaseTokenPoolLiquidityAddedIterator, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "LiquidityAdded", providerRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolLiquidityAddedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "LiquidityAdded", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchLiquidityAdded(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolLiquidityAdded, provider []common.Address) (event.Subscription, error) { + + var providerRule []interface{} + for _, providerItem := range provider { + providerRule = append(providerRule, providerItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "LiquidityAdded", providerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolLiquidityAdded) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "LiquidityAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseLiquidityAdded(log types.Log) (*SiloedLockReleaseTokenPoolLiquidityAdded, error) { + event := new(SiloedLockReleaseTokenPoolLiquidityAdded) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "LiquidityAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolLiquidityRemovedIterator struct { + Event *SiloedLockReleaseTokenPoolLiquidityRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolLiquidityRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolLiquidityRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolLiquidityRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolLiquidityRemovedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolLiquidityRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolLiquidityRemoved struct { + RemoteChainSelector uint64 + Remover common.Address + Amount *big.Int + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterLiquidityRemoved(opts *bind.FilterOpts, remover []common.Address) (*SiloedLockReleaseTokenPoolLiquidityRemovedIterator, error) { + + var removerRule []interface{} + for _, removerItem := range remover { + removerRule = append(removerRule, removerItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "LiquidityRemoved", removerRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolLiquidityRemovedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "LiquidityRemoved", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchLiquidityRemoved(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolLiquidityRemoved, remover []common.Address) (event.Subscription, error) { + + var removerRule []interface{} + for _, removerItem := range remover { + removerRule = append(removerRule, removerItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "LiquidityRemoved", removerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolLiquidityRemoved) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "LiquidityRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseLiquidityRemoved(log types.Log) (*SiloedLockReleaseTokenPoolLiquidityRemoved, error) { + event := new(SiloedLockReleaseTokenPoolLiquidityRemoved) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "LiquidityRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolLockedIterator struct { + Event *SiloedLockReleaseTokenPoolLocked + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolLockedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolLocked) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolLockedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolLockedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolLocked struct { + Sender common.Address + Amount *big.Int + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*SiloedLockReleaseTokenPoolLockedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolLockedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "Locked", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchLocked(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolLocked, sender []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "Locked", senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolLocked) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseLocked(log types.Log) (*SiloedLockReleaseTokenPoolLocked, error) { + event := new(SiloedLockReleaseTokenPoolLocked) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "Locked", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolMintedIterator struct { + Event *SiloedLockReleaseTokenPoolMinted + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolMintedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolMintedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*SiloedLockReleaseTokenPoolMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolMintedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "Minted", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchMinted(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "Minted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolMinted) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseMinted(log types.Log) (*SiloedLockReleaseTokenPoolMinted, error) { + event := new(SiloedLockReleaseTokenPoolMinted) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "Minted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolOwnershipTransferRequestedIterator struct { + Event *SiloedLockReleaseTokenPoolOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SiloedLockReleaseTokenPoolOwnershipTransferRequestedIterator, 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 := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolOwnershipTransferRequestedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolOwnershipTransferRequested, 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 := _SiloedLockReleaseTokenPool.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: + + event := new(SiloedLockReleaseTokenPoolOwnershipTransferRequested) + if err := _SiloedLockReleaseTokenPool.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 +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseOwnershipTransferRequested(log types.Log) (*SiloedLockReleaseTokenPoolOwnershipTransferRequested, error) { + event := new(SiloedLockReleaseTokenPoolOwnershipTransferRequested) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolOwnershipTransferredIterator struct { + Event *SiloedLockReleaseTokenPoolOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SiloedLockReleaseTokenPoolOwnershipTransferredIterator, 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 := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolOwnershipTransferredIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolOwnershipTransferred, 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 := _SiloedLockReleaseTokenPool.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: + + event := new(SiloedLockReleaseTokenPoolOwnershipTransferred) + if err := _SiloedLockReleaseTokenPool.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 +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseOwnershipTransferred(log types.Log) (*SiloedLockReleaseTokenPoolOwnershipTransferred, error) { + event := new(SiloedLockReleaseTokenPoolOwnershipTransferred) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolRateLimitAdminSetIterator struct { + Event *SiloedLockReleaseTokenPoolRateLimitAdminSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolRateLimitAdminSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolRateLimitAdminSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolRateLimitAdminSetIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolRateLimitAdminSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolRateLimitAdminSet struct { + RateLimitAdmin common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterRateLimitAdminSet(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolRateLimitAdminSetIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolRateLimitAdminSetIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "RateLimitAdminSet", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolRateLimitAdminSet) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "RateLimitAdminSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolRateLimitAdminSet) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseRateLimitAdminSet(log types.Log) (*SiloedLockReleaseTokenPoolRateLimitAdminSet, error) { + event := new(SiloedLockReleaseTokenPoolRateLimitAdminSet) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "RateLimitAdminSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolReleasedIterator struct { + Event *SiloedLockReleaseTokenPoolReleased + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolReleasedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolReleased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolReleasedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolReleasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolReleased struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*SiloedLockReleaseTokenPoolReleasedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolReleasedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "Released", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchReleased(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "Released", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolReleased) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseReleased(log types.Log) (*SiloedLockReleaseTokenPoolReleased, error) { + event := new(SiloedLockReleaseTokenPoolReleased) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "Released", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolRemotePoolAddedIterator struct { + Event *SiloedLockReleaseTokenPoolRemotePoolAdded + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolRemotePoolAddedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolRemotePoolAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolRemotePoolAddedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolRemotePoolAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolRemotePoolAdded struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*SiloedLockReleaseTokenPoolRemotePoolAddedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolRemotePoolAddedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "RemotePoolAdded", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "RemotePoolAdded", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolRemotePoolAdded) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseRemotePoolAdded(log types.Log) (*SiloedLockReleaseTokenPoolRemotePoolAdded, error) { + event := new(SiloedLockReleaseTokenPoolRemotePoolAdded) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "RemotePoolAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolRemotePoolRemovedIterator struct { + Event *SiloedLockReleaseTokenPoolRemotePoolRemoved + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolRemotePoolRemovedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolRemotePoolRemoved) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolRemotePoolRemovedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolRemotePoolRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolRemotePoolRemoved struct { + RemoteChainSelector uint64 + RemotePoolAddress []byte + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*SiloedLockReleaseTokenPoolRemotePoolRemovedIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolRemotePoolRemovedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "RemotePoolRemoved", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "RemotePoolRemoved", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolRemotePoolRemoved) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseRemotePoolRemoved(log types.Log) (*SiloedLockReleaseTokenPoolRemotePoolRemoved, error) { + event := new(SiloedLockReleaseTokenPoolRemotePoolRemoved) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "RemotePoolRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolRouterUpdatedIterator struct { + Event *SiloedLockReleaseTokenPoolRouterUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolRouterUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolRouterUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolRouterUpdatedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolRouterUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolRouterUpdated struct { + OldRouter common.Address + NewRouter common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterRouterUpdated(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolRouterUpdatedIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolRouterUpdatedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "RouterUpdated", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolRouterUpdated) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "RouterUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolRouterUpdated) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseRouterUpdated(log types.Log) (*SiloedLockReleaseTokenPoolRouterUpdated, error) { + event := new(SiloedLockReleaseTokenPoolRouterUpdated) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "RouterUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolSiloRebalancerSetIterator struct { + Event *SiloedLockReleaseTokenPoolSiloRebalancerSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolSiloRebalancerSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolSiloRebalancerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolSiloRebalancerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolSiloRebalancerSetIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolSiloRebalancerSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolSiloRebalancerSet struct { + RemoteChainSelector uint64 + OldRebalancer common.Address + NewRebalancer common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterSiloRebalancerSet(opts *bind.FilterOpts, remoteChainSelector []uint64) (*SiloedLockReleaseTokenPoolSiloRebalancerSetIterator, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "SiloRebalancerSet", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolSiloRebalancerSetIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "SiloRebalancerSet", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchSiloRebalancerSet(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolSiloRebalancerSet, remoteChainSelector []uint64) (event.Subscription, error) { + + var remoteChainSelectorRule []interface{} + for _, remoteChainSelectorItem := range remoteChainSelector { + remoteChainSelectorRule = append(remoteChainSelectorRule, remoteChainSelectorItem) + } + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "SiloRebalancerSet", remoteChainSelectorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolSiloRebalancerSet) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "SiloRebalancerSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseSiloRebalancerSet(log types.Log) (*SiloedLockReleaseTokenPoolSiloRebalancerSet, error) { + event := new(SiloedLockReleaseTokenPoolSiloRebalancerSet) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "SiloRebalancerSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolTokensConsumedIterator struct { + Event *SiloedLockReleaseTokenPoolTokensConsumed + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolTokensConsumedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolTokensConsumed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolTokensConsumedIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolTokensConsumedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolTokensConsumed struct { + Tokens *big.Int + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterTokensConsumed(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolTokensConsumedIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolTokensConsumedIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "TokensConsumed", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolTokensConsumed) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "TokensConsumed") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolTokensConsumed) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseTokensConsumed(log types.Log) (*SiloedLockReleaseTokenPoolTokensConsumed, error) { + event := new(SiloedLockReleaseTokenPoolTokensConsumed) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "TokensConsumed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type SiloedLockReleaseTokenPoolUnsiloedRebalancerSetIterator struct { + Event *SiloedLockReleaseTokenPoolUnsiloedRebalancerSet + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *SiloedLockReleaseTokenPoolUnsiloedRebalancerSetIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolUnsiloedRebalancerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(SiloedLockReleaseTokenPoolUnsiloedRebalancerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *SiloedLockReleaseTokenPoolUnsiloedRebalancerSetIterator) Error() error { + return it.fail +} + +func (it *SiloedLockReleaseTokenPoolUnsiloedRebalancerSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type SiloedLockReleaseTokenPoolUnsiloedRebalancerSet struct { + OldRebalancer common.Address + NewRebalancer common.Address + Raw types.Log +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) FilterUnsiloedRebalancerSet(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolUnsiloedRebalancerSetIterator, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.FilterLogs(opts, "UnsiloedRebalancerSet") + if err != nil { + return nil, err + } + return &SiloedLockReleaseTokenPoolUnsiloedRebalancerSetIterator{contract: _SiloedLockReleaseTokenPool.contract, event: "UnsiloedRebalancerSet", logs: logs, sub: sub}, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) WatchUnsiloedRebalancerSet(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolUnsiloedRebalancerSet) (event.Subscription, error) { + + logs, sub, err := _SiloedLockReleaseTokenPool.contract.WatchLogs(opts, "UnsiloedRebalancerSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(SiloedLockReleaseTokenPoolUnsiloedRebalancerSet) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "UnsiloedRebalancerSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPoolFilterer) ParseUnsiloedRebalancerSet(log types.Log) (*SiloedLockReleaseTokenPoolUnsiloedRebalancerSet, error) { + event := new(SiloedLockReleaseTokenPoolUnsiloedRebalancerSet) + if err := _SiloedLockReleaseTokenPool.contract.UnpackLog(event, "UnsiloedRebalancerSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPool) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _SiloedLockReleaseTokenPool.abi.Events["AllowListAdd"].ID: + return _SiloedLockReleaseTokenPool.ParseAllowListAdd(log) + case _SiloedLockReleaseTokenPool.abi.Events["AllowListRemove"].ID: + return _SiloedLockReleaseTokenPool.ParseAllowListRemove(log) + case _SiloedLockReleaseTokenPool.abi.Events["Burned"].ID: + return _SiloedLockReleaseTokenPool.ParseBurned(log) + case _SiloedLockReleaseTokenPool.abi.Events["ChainAdded"].ID: + return _SiloedLockReleaseTokenPool.ParseChainAdded(log) + case _SiloedLockReleaseTokenPool.abi.Events["ChainConfigured"].ID: + return _SiloedLockReleaseTokenPool.ParseChainConfigured(log) + case _SiloedLockReleaseTokenPool.abi.Events["ChainRemoved"].ID: + return _SiloedLockReleaseTokenPool.ParseChainRemoved(log) + case _SiloedLockReleaseTokenPool.abi.Events["ChainSiloed"].ID: + return _SiloedLockReleaseTokenPool.ParseChainSiloed(log) + case _SiloedLockReleaseTokenPool.abi.Events["ChainUnsiloed"].ID: + return _SiloedLockReleaseTokenPool.ParseChainUnsiloed(log) + case _SiloedLockReleaseTokenPool.abi.Events["ConfigChanged"].ID: + return _SiloedLockReleaseTokenPool.ParseConfigChanged(log) + case _SiloedLockReleaseTokenPool.abi.Events["LiquidityAdded"].ID: + return _SiloedLockReleaseTokenPool.ParseLiquidityAdded(log) + case _SiloedLockReleaseTokenPool.abi.Events["LiquidityRemoved"].ID: + return _SiloedLockReleaseTokenPool.ParseLiquidityRemoved(log) + case _SiloedLockReleaseTokenPool.abi.Events["Locked"].ID: + return _SiloedLockReleaseTokenPool.ParseLocked(log) + case _SiloedLockReleaseTokenPool.abi.Events["Minted"].ID: + return _SiloedLockReleaseTokenPool.ParseMinted(log) + case _SiloedLockReleaseTokenPool.abi.Events["OwnershipTransferRequested"].ID: + return _SiloedLockReleaseTokenPool.ParseOwnershipTransferRequested(log) + case _SiloedLockReleaseTokenPool.abi.Events["OwnershipTransferred"].ID: + return _SiloedLockReleaseTokenPool.ParseOwnershipTransferred(log) + case _SiloedLockReleaseTokenPool.abi.Events["RateLimitAdminSet"].ID: + return _SiloedLockReleaseTokenPool.ParseRateLimitAdminSet(log) + case _SiloedLockReleaseTokenPool.abi.Events["Released"].ID: + return _SiloedLockReleaseTokenPool.ParseReleased(log) + case _SiloedLockReleaseTokenPool.abi.Events["RemotePoolAdded"].ID: + return _SiloedLockReleaseTokenPool.ParseRemotePoolAdded(log) + case _SiloedLockReleaseTokenPool.abi.Events["RemotePoolRemoved"].ID: + return _SiloedLockReleaseTokenPool.ParseRemotePoolRemoved(log) + case _SiloedLockReleaseTokenPool.abi.Events["RouterUpdated"].ID: + return _SiloedLockReleaseTokenPool.ParseRouterUpdated(log) + case _SiloedLockReleaseTokenPool.abi.Events["SiloRebalancerSet"].ID: + return _SiloedLockReleaseTokenPool.ParseSiloRebalancerSet(log) + case _SiloedLockReleaseTokenPool.abi.Events["TokensConsumed"].ID: + return _SiloedLockReleaseTokenPool.ParseTokensConsumed(log) + case _SiloedLockReleaseTokenPool.abi.Events["UnsiloedRebalancerSet"].ID: + return _SiloedLockReleaseTokenPool.ParseUnsiloedRebalancerSet(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (SiloedLockReleaseTokenPoolAllowListAdd) Topic() common.Hash { + return common.HexToHash("0x2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d8") +} + +func (SiloedLockReleaseTokenPoolAllowListRemove) Topic() common.Hash { + return common.HexToHash("0x800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf7566") +} + +func (SiloedLockReleaseTokenPoolBurned) Topic() common.Hash { + return common.HexToHash("0x696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df7") +} + +func (SiloedLockReleaseTokenPoolChainAdded) Topic() common.Hash { + return common.HexToHash("0x8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2") +} + +func (SiloedLockReleaseTokenPoolChainConfigured) Topic() common.Hash { + return common.HexToHash("0x0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b") +} + +func (SiloedLockReleaseTokenPoolChainRemoved) Topic() common.Hash { + return common.HexToHash("0x5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d859916") +} + +func (SiloedLockReleaseTokenPoolChainSiloed) Topic() common.Hash { + return common.HexToHash("0x180c6940bd64ba8f75679203ca32f8be2f629477a3307b190656e4b14dd5ddeb") +} + +func (SiloedLockReleaseTokenPoolChainUnsiloed) Topic() common.Hash { + return common.HexToHash("0x7b5efb3f8090c5cfd24e170b667d0e2b6fdc3db6540d75b86d5b6655ba00eb93") +} + +func (SiloedLockReleaseTokenPoolConfigChanged) Topic() common.Hash { + return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19") +} + +func (SiloedLockReleaseTokenPoolLiquidityAdded) Topic() common.Hash { + return common.HexToHash("0x569a440e6842b5e5a7ac02286311855f5a0b81b9390909e552e82aaf02c9e9bf") +} + +func (SiloedLockReleaseTokenPoolLiquidityRemoved) Topic() common.Hash { + return common.HexToHash("0x58fca2457646a9f47422ab9eb9bff90cef88cd8b8725ab52b1d17baa392d784e") +} + +func (SiloedLockReleaseTokenPoolLocked) Topic() common.Hash { + return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008") +} + +func (SiloedLockReleaseTokenPoolMinted) Topic() common.Hash { + return common.HexToHash("0x9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0") +} + +func (SiloedLockReleaseTokenPoolOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (SiloedLockReleaseTokenPoolOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (SiloedLockReleaseTokenPoolRateLimitAdminSet) Topic() common.Hash { + return common.HexToHash("0x44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174") +} + +func (SiloedLockReleaseTokenPoolReleased) Topic() common.Hash { + return common.HexToHash("0x2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52") +} + +func (SiloedLockReleaseTokenPoolRemotePoolAdded) Topic() common.Hash { + return common.HexToHash("0x7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea") +} + +func (SiloedLockReleaseTokenPoolRemotePoolRemoved) Topic() common.Hash { + return common.HexToHash("0x52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d76") +} + +func (SiloedLockReleaseTokenPoolRouterUpdated) Topic() common.Hash { + return common.HexToHash("0x02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684") +} + +func (SiloedLockReleaseTokenPoolSiloRebalancerSet) Topic() common.Hash { + return common.HexToHash("0x01efd4cd7dd64263689551000d4359d6559c839f39b773b1df3fd19ff060cf5f") +} + +func (SiloedLockReleaseTokenPoolTokensConsumed) Topic() common.Hash { + return common.HexToHash("0x1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a") +} + +func (SiloedLockReleaseTokenPoolUnsiloedRebalancerSet) Topic() common.Hash { + return common.HexToHash("0x66b1c1bdec8b60a3442bb25b5b6cd6fff3d0eceb6f5390be8e2f82a8ad39b234") +} + +func (_SiloedLockReleaseTokenPool *SiloedLockReleaseTokenPool) Address() common.Address { + return _SiloedLockReleaseTokenPool.address +} + +type SiloedLockReleaseTokenPoolInterface interface { + GetAllowList(opts *bind.CallOpts) ([]common.Address, error) + + GetAllowListEnabled(opts *bind.CallOpts) (bool, error) + + GetAvailableTokens(opts *bind.CallOpts, remoteChainSelector uint64) (*big.Int, error) + + GetChainRebalancer(opts *bind.CallOpts, remoteChainSelector uint64) (common.Address, error) + + GetCurrentInboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error) + + GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) + + GetRebalancer(opts *bind.CallOpts) (common.Address, error) + + GetRemotePools(opts *bind.CallOpts, remoteChainSelector uint64) ([][]byte, error) + + GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) + + GetRmnProxy(opts *bind.CallOpts) (common.Address, error) + + GetRouter(opts *bind.CallOpts) (common.Address, error) + + GetSupportedChains(opts *bind.CallOpts) ([]uint64, error) + + GetToken(opts *bind.CallOpts) (common.Address, error) + + GetTokenDecimals(opts *bind.CallOpts) (uint8, error) + + GetUnsiloedLiquidity(opts *bind.CallOpts) (*big.Int, error) + + IsRemotePool(opts *bind.CallOpts, remoteChainSelector uint64, remotePoolAddress []byte) (bool, error) + + IsSiloed(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedChain(opts *bind.CallOpts, remoteChainSelector uint64) (bool, error) + + IsSupportedToken(opts *bind.CallOpts, token common.Address) (bool, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + AddRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + ApplyAllowListUpdates(opts *bind.TransactOpts, removes []common.Address, adds []common.Address) (*types.Transaction, error) + + ApplyChainUpdates(opts *bind.TransactOpts, remoteChainSelectorsToRemove []uint64, chainsToAdd []TokenPoolChainUpdate) (*types.Transaction, error) + + LockOrBurn(opts *bind.TransactOpts, lockOrBurnIn PoolLockOrBurnInV1) (*types.Transaction, error) + + ProvideLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) + + ProvideSiloedLiquidity(opts *bind.TransactOpts, remoteChainSelector uint64, amount *big.Int) (*types.Transaction, error) + + ReleaseOrMint(opts *bind.TransactOpts, releaseOrMintIn PoolReleaseOrMintInV1) (*types.Transaction, error) + + RemoveRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) + + SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error) + + SetChainRateLimiterConfigs(opts *bind.TransactOpts, remoteChainSelectors []uint64, outboundConfigs []RateLimiterConfig, inboundConfigs []RateLimiterConfig) (*types.Transaction, error) + + SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) + + SetRebalancer(opts *bind.TransactOpts, newRebalancer common.Address) (*types.Transaction, error) + + SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error) + + SetSiloRebalancer(opts *bind.TransactOpts, remoteChainSelector uint64, newRebalancer common.Address) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdateSiloDesignations(opts *bind.TransactOpts, removes []uint64, adds []SiloedLockReleaseTokenPoolSiloConfigUpdate) (*types.Transaction, error) + + WithdrawLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) + + WithdrawSiloedLiquidity(opts *bind.TransactOpts, remoteChainSelector uint64, amount *big.Int) (*types.Transaction, error) + + FilterAllowListAdd(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolAllowListAddIterator, error) + + WatchAllowListAdd(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolAllowListAdd) (event.Subscription, error) + + ParseAllowListAdd(log types.Log) (*SiloedLockReleaseTokenPoolAllowListAdd, error) + + FilterAllowListRemove(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolAllowListRemoveIterator, error) + + WatchAllowListRemove(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolAllowListRemove) (event.Subscription, error) + + ParseAllowListRemove(log types.Log) (*SiloedLockReleaseTokenPoolAllowListRemove, error) + + FilterBurned(opts *bind.FilterOpts, sender []common.Address) (*SiloedLockReleaseTokenPoolBurnedIterator, error) + + WatchBurned(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolBurned, sender []common.Address) (event.Subscription, error) + + ParseBurned(log types.Log) (*SiloedLockReleaseTokenPoolBurned, error) + + FilterChainAdded(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainAddedIterator, error) + + WatchChainAdded(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainAdded) (event.Subscription, error) + + ParseChainAdded(log types.Log) (*SiloedLockReleaseTokenPoolChainAdded, error) + + FilterChainConfigured(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainConfiguredIterator, error) + + WatchChainConfigured(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainConfigured) (event.Subscription, error) + + ParseChainConfigured(log types.Log) (*SiloedLockReleaseTokenPoolChainConfigured, error) + + FilterChainRemoved(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainRemovedIterator, error) + + WatchChainRemoved(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainRemoved) (event.Subscription, error) + + ParseChainRemoved(log types.Log) (*SiloedLockReleaseTokenPoolChainRemoved, error) + + FilterChainSiloed(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainSiloedIterator, error) + + WatchChainSiloed(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainSiloed) (event.Subscription, error) + + ParseChainSiloed(log types.Log) (*SiloedLockReleaseTokenPoolChainSiloed, error) + + FilterChainUnsiloed(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolChainUnsiloedIterator, error) + + WatchChainUnsiloed(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolChainUnsiloed) (event.Subscription, error) + + ParseChainUnsiloed(log types.Log) (*SiloedLockReleaseTokenPoolChainUnsiloed, error) + + FilterConfigChanged(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolConfigChangedIterator, error) + + WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolConfigChanged) (event.Subscription, error) + + ParseConfigChanged(log types.Log) (*SiloedLockReleaseTokenPoolConfigChanged, error) + + FilterLiquidityAdded(opts *bind.FilterOpts, provider []common.Address) (*SiloedLockReleaseTokenPoolLiquidityAddedIterator, error) + + WatchLiquidityAdded(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolLiquidityAdded, provider []common.Address) (event.Subscription, error) + + ParseLiquidityAdded(log types.Log) (*SiloedLockReleaseTokenPoolLiquidityAdded, error) + + FilterLiquidityRemoved(opts *bind.FilterOpts, remover []common.Address) (*SiloedLockReleaseTokenPoolLiquidityRemovedIterator, error) + + WatchLiquidityRemoved(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolLiquidityRemoved, remover []common.Address) (event.Subscription, error) + + ParseLiquidityRemoved(log types.Log) (*SiloedLockReleaseTokenPoolLiquidityRemoved, error) + + FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*SiloedLockReleaseTokenPoolLockedIterator, error) + + WatchLocked(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolLocked, sender []common.Address) (event.Subscription, error) + + ParseLocked(log types.Log) (*SiloedLockReleaseTokenPoolLocked, error) + + FilterMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*SiloedLockReleaseTokenPoolMintedIterator, error) + + WatchMinted(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseMinted(log types.Log) (*SiloedLockReleaseTokenPoolMinted, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SiloedLockReleaseTokenPoolOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*SiloedLockReleaseTokenPoolOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*SiloedLockReleaseTokenPoolOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*SiloedLockReleaseTokenPoolOwnershipTransferred, error) + + FilterRateLimitAdminSet(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolRateLimitAdminSetIterator, error) + + WatchRateLimitAdminSet(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolRateLimitAdminSet) (event.Subscription, error) + + ParseRateLimitAdminSet(log types.Log) (*SiloedLockReleaseTokenPoolRateLimitAdminSet, error) + + FilterReleased(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*SiloedLockReleaseTokenPoolReleasedIterator, error) + + WatchReleased(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolReleased, sender []common.Address, recipient []common.Address) (event.Subscription, error) + + ParseReleased(log types.Log) (*SiloedLockReleaseTokenPoolReleased, error) + + FilterRemotePoolAdded(opts *bind.FilterOpts, remoteChainSelector []uint64) (*SiloedLockReleaseTokenPoolRemotePoolAddedIterator, error) + + WatchRemotePoolAdded(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolRemotePoolAdded, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolAdded(log types.Log) (*SiloedLockReleaseTokenPoolRemotePoolAdded, error) + + FilterRemotePoolRemoved(opts *bind.FilterOpts, remoteChainSelector []uint64) (*SiloedLockReleaseTokenPoolRemotePoolRemovedIterator, error) + + WatchRemotePoolRemoved(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolRemotePoolRemoved, remoteChainSelector []uint64) (event.Subscription, error) + + ParseRemotePoolRemoved(log types.Log) (*SiloedLockReleaseTokenPoolRemotePoolRemoved, error) + + FilterRouterUpdated(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolRouterUpdatedIterator, error) + + WatchRouterUpdated(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolRouterUpdated) (event.Subscription, error) + + ParseRouterUpdated(log types.Log) (*SiloedLockReleaseTokenPoolRouterUpdated, error) + + FilterSiloRebalancerSet(opts *bind.FilterOpts, remoteChainSelector []uint64) (*SiloedLockReleaseTokenPoolSiloRebalancerSetIterator, error) + + WatchSiloRebalancerSet(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolSiloRebalancerSet, remoteChainSelector []uint64) (event.Subscription, error) + + ParseSiloRebalancerSet(log types.Log) (*SiloedLockReleaseTokenPoolSiloRebalancerSet, error) + + FilterTokensConsumed(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolTokensConsumedIterator, error) + + WatchTokensConsumed(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolTokensConsumed) (event.Subscription, error) + + ParseTokensConsumed(log types.Log) (*SiloedLockReleaseTokenPoolTokensConsumed, error) + + FilterUnsiloedRebalancerSet(opts *bind.FilterOpts) (*SiloedLockReleaseTokenPoolUnsiloedRebalancerSetIterator, error) + + WatchUnsiloedRebalancerSet(opts *bind.WatchOpts, sink chan<- *SiloedLockReleaseTokenPoolUnsiloedRebalancerSet) (event.Subscription, error) + + ParseUnsiloedRebalancerSet(log types.Log) (*SiloedLockReleaseTokenPoolUnsiloedRebalancerSet, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/ccip/go_generate.go b/core/gethwrappers/ccip/go_generate.go index 734789f338f..95370c646be 100644 --- a/core/gethwrappers/ccip/go_generate.go +++ b/core/gethwrappers/ccip/go_generate.go @@ -1,42 +1,42 @@ package ccip -//go:generate go run ../generation/wrap.go ccip Router router -//go:generate go run ../generation/wrap.go ccip CCIPHome ccip_home -//go:generate go run ../generation/wrap.go ccip OnRamp onramp -//go:generate go run ../generation/wrap.go ccip OffRamp offramp -//go:generate go run ../generation/wrap.go ccip OnRampWithMessageTransformer onramp_with_message_transformer -//go:generate go run ../generation/wrap.go ccip OffRampWithMessageTransformer offramp_with_message_transformer -//go:generate go run ../generation/wrap.go ccip FeeQuoter fee_quoter -//go:generate go run ../generation/wrap.go ccip NonceManager nonce_manager -//go:generate go run ../generation/wrap.go ccip MultiAggregateRateLimiter multi_aggregate_rate_limiter -//go:generate go run ../generation/wrap.go ccip TokenAdminRegistry token_admin_registry -//go:generate go run ../generation/wrap.go ccip RegistryModuleOwnerCustom registry_module_owner_custom -//go:generate go run ../generation/wrap.go ccip RMNProxy rmn_proxy_contract -//go:generate go run ../generation/wrap.go ccip RMNRemote rmn_remote -//go:generate go run ../generation/wrap.go ccip RMNHome rmn_home +//go:generate go run ../generation/wrap.go ccip Router router latest +//go:generate go run ../generation/wrap.go ccip CCIPHome ccip_home latest +//go:generate go run ../generation/wrap.go ccip OnRamp onramp latest +//go:generate go run ../generation/wrap.go ccip OffRamp offramp latest +//go:generate go run ../generation/wrap.go ccip OnRampWithMessageTransformer onramp_with_message_transformer latest +//go:generate go run ../generation/wrap.go ccip OffRampWithMessageTransformer offramp_with_message_transformer latest +//go:generate go run ../generation/wrap.go ccip FeeQuoter fee_quoter latest +//go:generate go run ../generation/wrap.go ccip NonceManager nonce_manager latest +//go:generate go run ../generation/wrap.go ccip MultiAggregateRateLimiter multi_aggregate_rate_limiter latest +//go:generate go run ../generation/wrap.go ccip TokenAdminRegistry token_admin_registry latest +//go:generate go run ../generation/wrap.go ccip RegistryModuleOwnerCustom registry_module_owner_custom latest +//go:generate go run ../generation/wrap.go ccip RMNProxy rmn_proxy_contract latest +//go:generate go run ../generation/wrap.go ccip RMNRemote rmn_remote latest +//go:generate go run ../generation/wrap.go ccip RMNHome rmn_home latest // Pools -//go:generate go run ../generation/wrap.go ccip BurnMintTokenPool burn_mint_token_pool -//go:generate go run ../generation/wrap.go ccip BurnFromMintTokenPool burn_from_mint_token_pool -//go:generate go run ../generation/wrap.go ccip BurnWithFromMintTokenPool burn_with_from_mint_token_pool -//go:generate go run ../generation/wrap.go ccip LockReleaseTokenPool lock_release_token_pool -//go:generate go run ../generation/wrap.go ccip TokenPool token_pool -//go:generate go run ../generation/wrap.go ccip USDCTokenPool usdc_token_pool -//go:generate go run ../generation/wrap.go ccip SiloedLockReleaseTokenPool siloed_lock_release_token_pool -//go:generate go run ../generation/wrap.go ccip BurnToAddressMintTokenPool burn_to_address_mint_token_pool +//go:generate go run ../generation/wrap.go ccip BurnMintTokenPool burn_mint_token_pool latest +//go:generate go run ../generation/wrap.go ccip BurnFromMintTokenPool burn_from_mint_token_pool latest +//go:generate go run ../generation/wrap.go ccip BurnWithFromMintTokenPool burn_with_from_mint_token_pool latest +//go:generate go run ../generation/wrap.go ccip LockReleaseTokenPool lock_release_token_pool latest +//go:generate go run ../generation/wrap.go ccip TokenPool token_pool latest +//go:generate go run ../generation/wrap.go ccip USDCTokenPool usdc_token_pool latest +//go:generate go run ../generation/wrap.go ccip SiloedLockReleaseTokenPool siloed_lock_release_token_pool latest +//go:generate go run ../generation/wrap.go ccip BurnToAddressMintTokenPool burn_to_address_mint_token_pool latest // Helpers -//go:generate go run ../generation/wrap.go ccip MaybeRevertMessageReceiver maybe_revert_message_receiver -//go:generate go run ../generation/wrap.go ccip LogMessageDataReceiver log_message_data_receiver -//go:generate go run ../generation/wrap.go ccip PingPongDemo ping_pong_demo -//go:generate go run ../generation/wrap.go ccip MessageHasher message_hasher -//go:generate go run ../generation/wrap.go ccip MultiOCR3Helper multi_ocr3_helper -//go:generate go run ../generation/wrap.go ccip USDCReaderTester usdc_reader_tester -//go:generate go run ../generation/wrap.go ccip ReportCodec report_codec -//go:generate go run ../generation/wrap.go ccip EtherSenderReceiver ether_sender_receiver -//go:generate go run ../generation/wrap.go ccip MockE2EUSDCTokenMessenger mock_usdc_token_messenger -//go:generate go run ../generation/wrap.go ccip MockE2EUSDCTransmitter mock_usdc_token_transmitter -//go:generate go run ../generation/wrap.go ccip CCIPReaderTester ccip_reader_tester +//go:generate go run ../generation/wrap.go ccip MaybeRevertMessageReceiver maybe_revert_message_receiver latest +//go:generate go run ../generation/wrap.go ccip LogMessageDataReceiver log_message_data_receiver latest +//go:generate go run ../generation/wrap.go ccip PingPongDemo ping_pong_demo latest +//go:generate go run ../generation/wrap.go ccip MessageHasher message_hasher latest +//go:generate go run ../generation/wrap.go ccip MultiOCR3Helper multi_ocr3_helper latest +//go:generate go run ../generation/wrap.go ccip USDCReaderTester usdc_reader_tester latest +//go:generate go run ../generation/wrap.go ccip ReportCodec report_codec latest +//go:generate go run ../generation/wrap.go ccip EtherSenderReceiver ether_sender_receiver latest +//go:generate go run ../generation/wrap.go ccip MockE2EUSDCTokenMessenger mock_usdc_token_messenger latest +//go:generate go run ../generation/wrap.go ccip MockE2EUSDCTransmitter mock_usdc_token_transmitter latest +//go:generate go run ../generation/wrap.go ccip CCIPReaderTester ccip_reader_tester latest // EncodingUtils -//go:generate go run ../generation/wrap.go ccip EncodingUtils ccip_encoding_utils +//go:generate go run ../generation/wrap.go ccip EncodingUtils ccip_encoding_utils latest diff --git a/core/gethwrappers/ccip/mocks/commit_store_interface.go b/core/gethwrappers/ccip/mocks/commit_store_interface.go index f1ff6c610a1..08f3dd8a904 100644 --- a/core/gethwrappers/ccip/mocks/commit_store_interface.go +++ b/core/gethwrappers/ccip/mocks/commit_store_interface.go @@ -7,7 +7,7 @@ import ( bind "github.com/ethereum/go-ethereum/accounts/abi/bind" common "github.com/ethereum/go-ethereum/common" - commit_store "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" + commit_store "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" event "github.com/ethereum/go-ethereum/event" diff --git a/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go b/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go index 73ee46418c9..d0e0e52b527 100644 --- a/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go +++ b/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go @@ -8,7 +8,7 @@ import ( event "github.com/ethereum/go-ethereum/event" - evm_2_evm_offramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" + evm_2_evm_offramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" generated "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" diff --git a/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go b/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go index 428c71ba393..f625480d071 100644 --- a/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go +++ b/core/gethwrappers/ccip/mocks/evm2_evm_on_ramp_interface.go @@ -10,7 +10,7 @@ import ( event "github.com/ethereum/go-ethereum/event" - evm_2_evm_onramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" + evm_2_evm_onramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" generated "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" diff --git a/core/gethwrappers/ccip/mocks/fee_quoter_interface.go b/core/gethwrappers/ccip/mocks/fee_quoter_interface.go deleted file mode 100644 index de7437f6e38..00000000000 --- a/core/gethwrappers/ccip/mocks/fee_quoter_interface.go +++ /dev/null @@ -1,4683 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mock_contracts - -import ( - big "math/big" - - bind "github.com/ethereum/go-ethereum/accounts/abi/bind" - common "github.com/ethereum/go-ethereum/common" - - event "github.com/ethereum/go-ethereum/event" - - fee_quoter "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - - generated "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" - - mock "github.com/stretchr/testify/mock" - - types "github.com/ethereum/go-ethereum/core/types" -) - -// FeeQuoterInterface is an autogenerated mock type for the FeeQuoterInterface type -type FeeQuoterInterface struct { - mock.Mock -} - -type FeeQuoterInterface_Expecter struct { - mock *mock.Mock -} - -func (_m *FeeQuoterInterface) EXPECT() *FeeQuoterInterface_Expecter { - return &FeeQuoterInterface_Expecter{mock: &_m.Mock} -} - -// AcceptOwnership provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for AcceptOwnership") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_AcceptOwnership_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AcceptOwnership' -type FeeQuoterInterface_AcceptOwnership_Call struct { - *mock.Call -} - -// AcceptOwnership is a helper method to define mock.On call -// - opts *bind.TransactOpts -func (_e *FeeQuoterInterface_Expecter) AcceptOwnership(opts interface{}) *FeeQuoterInterface_AcceptOwnership_Call { - return &FeeQuoterInterface_AcceptOwnership_Call{Call: _e.mock.On("AcceptOwnership", opts)} -} - -func (_c *FeeQuoterInterface_AcceptOwnership_Call) Run(run func(opts *bind.TransactOpts)) *FeeQuoterInterface_AcceptOwnership_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_AcceptOwnership_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_AcceptOwnership_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_AcceptOwnership_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *FeeQuoterInterface_AcceptOwnership_Call { - _c.Call.Return(run) - return _c -} - -// Address provides a mock function with no fields -func (_m *FeeQuoterInterface) Address() common.Address { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Address") - } - - var r0 common.Address - if rf, ok := ret.Get(0).(func() common.Address); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Address) - } - } - - return r0 -} - -// FeeQuoterInterface_Address_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Address' -type FeeQuoterInterface_Address_Call struct { - *mock.Call -} - -// Address is a helper method to define mock.On call -func (_e *FeeQuoterInterface_Expecter) Address() *FeeQuoterInterface_Address_Call { - return &FeeQuoterInterface_Address_Call{Call: _e.mock.On("Address")} -} - -func (_c *FeeQuoterInterface_Address_Call) Run(run func()) *FeeQuoterInterface_Address_Call { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *FeeQuoterInterface_Address_Call) Return(_a0 common.Address) *FeeQuoterInterface_Address_Call { - _c.Call.Return(_a0) - return _c -} - -func (_c *FeeQuoterInterface_Address_Call) RunAndReturn(run func() common.Address) *FeeQuoterInterface_Address_Call { - _c.Call.Return(run) - return _c -} - -// ApplyAuthorizedCallerUpdates provides a mock function with given fields: opts, authorizedCallerArgs -func (_m *FeeQuoterInterface) ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs fee_quoter.AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error) { - ret := _m.Called(opts, authorizedCallerArgs) - - if len(ret) == 0 { - panic("no return value specified for ApplyAuthorizedCallerUpdates") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, fee_quoter.AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error)); ok { - return rf(opts, authorizedCallerArgs) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, fee_quoter.AuthorizedCallersAuthorizedCallerArgs) *types.Transaction); ok { - r0 = rf(opts, authorizedCallerArgs) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, fee_quoter.AuthorizedCallersAuthorizedCallerArgs) error); ok { - r1 = rf(opts, authorizedCallerArgs) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplyAuthorizedCallerUpdates' -type FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call struct { - *mock.Call -} - -// ApplyAuthorizedCallerUpdates is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - authorizedCallerArgs fee_quoter.AuthorizedCallersAuthorizedCallerArgs -func (_e *FeeQuoterInterface_Expecter) ApplyAuthorizedCallerUpdates(opts interface{}, authorizedCallerArgs interface{}) *FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call { - return &FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call{Call: _e.mock.On("ApplyAuthorizedCallerUpdates", opts, authorizedCallerArgs)} -} - -func (_c *FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call) Run(run func(opts *bind.TransactOpts, authorizedCallerArgs fee_quoter.AuthorizedCallersAuthorizedCallerArgs)) *FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].(fee_quoter.AuthorizedCallersAuthorizedCallerArgs)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call) RunAndReturn(run func(*bind.TransactOpts, fee_quoter.AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error)) *FeeQuoterInterface_ApplyAuthorizedCallerUpdates_Call { - _c.Call.Return(run) - return _c -} - -// ApplyDestChainConfigUpdates provides a mock function with given fields: opts, destChainConfigArgs -func (_m *FeeQuoterInterface) ApplyDestChainConfigUpdates(opts *bind.TransactOpts, destChainConfigArgs []fee_quoter.FeeQuoterDestChainConfigArgs) (*types.Transaction, error) { - ret := _m.Called(opts, destChainConfigArgs) - - if len(ret) == 0 { - panic("no return value specified for ApplyDestChainConfigUpdates") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterDestChainConfigArgs) (*types.Transaction, error)); ok { - return rf(opts, destChainConfigArgs) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterDestChainConfigArgs) *types.Transaction); ok { - r0 = rf(opts, destChainConfigArgs) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterDestChainConfigArgs) error); ok { - r1 = rf(opts, destChainConfigArgs) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ApplyDestChainConfigUpdates_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplyDestChainConfigUpdates' -type FeeQuoterInterface_ApplyDestChainConfigUpdates_Call struct { - *mock.Call -} - -// ApplyDestChainConfigUpdates is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - destChainConfigArgs []fee_quoter.FeeQuoterDestChainConfigArgs -func (_e *FeeQuoterInterface_Expecter) ApplyDestChainConfigUpdates(opts interface{}, destChainConfigArgs interface{}) *FeeQuoterInterface_ApplyDestChainConfigUpdates_Call { - return &FeeQuoterInterface_ApplyDestChainConfigUpdates_Call{Call: _e.mock.On("ApplyDestChainConfigUpdates", opts, destChainConfigArgs)} -} - -func (_c *FeeQuoterInterface_ApplyDestChainConfigUpdates_Call) Run(run func(opts *bind.TransactOpts, destChainConfigArgs []fee_quoter.FeeQuoterDestChainConfigArgs)) *FeeQuoterInterface_ApplyDestChainConfigUpdates_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].([]fee_quoter.FeeQuoterDestChainConfigArgs)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ApplyDestChainConfigUpdates_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_ApplyDestChainConfigUpdates_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ApplyDestChainConfigUpdates_Call) RunAndReturn(run func(*bind.TransactOpts, []fee_quoter.FeeQuoterDestChainConfigArgs) (*types.Transaction, error)) *FeeQuoterInterface_ApplyDestChainConfigUpdates_Call { - _c.Call.Return(run) - return _c -} - -// ApplyFeeTokensUpdates provides a mock function with given fields: opts, feeTokensToRemove, feeTokensToAdd -func (_m *FeeQuoterInterface) ApplyFeeTokensUpdates(opts *bind.TransactOpts, feeTokensToRemove []common.Address, feeTokensToAdd []common.Address) (*types.Transaction, error) { - ret := _m.Called(opts, feeTokensToRemove, feeTokensToAdd) - - if len(ret) == 0 { - panic("no return value specified for ApplyFeeTokensUpdates") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address, []common.Address) (*types.Transaction, error)); ok { - return rf(opts, feeTokensToRemove, feeTokensToAdd) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address, []common.Address) *types.Transaction); ok { - r0 = rf(opts, feeTokensToRemove, feeTokensToAdd) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []common.Address, []common.Address) error); ok { - r1 = rf(opts, feeTokensToRemove, feeTokensToAdd) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ApplyFeeTokensUpdates_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplyFeeTokensUpdates' -type FeeQuoterInterface_ApplyFeeTokensUpdates_Call struct { - *mock.Call -} - -// ApplyFeeTokensUpdates is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - feeTokensToRemove []common.Address -// - feeTokensToAdd []common.Address -func (_e *FeeQuoterInterface_Expecter) ApplyFeeTokensUpdates(opts interface{}, feeTokensToRemove interface{}, feeTokensToAdd interface{}) *FeeQuoterInterface_ApplyFeeTokensUpdates_Call { - return &FeeQuoterInterface_ApplyFeeTokensUpdates_Call{Call: _e.mock.On("ApplyFeeTokensUpdates", opts, feeTokensToRemove, feeTokensToAdd)} -} - -func (_c *FeeQuoterInterface_ApplyFeeTokensUpdates_Call) Run(run func(opts *bind.TransactOpts, feeTokensToRemove []common.Address, feeTokensToAdd []common.Address)) *FeeQuoterInterface_ApplyFeeTokensUpdates_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].([]common.Address), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ApplyFeeTokensUpdates_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_ApplyFeeTokensUpdates_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ApplyFeeTokensUpdates_Call) RunAndReturn(run func(*bind.TransactOpts, []common.Address, []common.Address) (*types.Transaction, error)) *FeeQuoterInterface_ApplyFeeTokensUpdates_Call { - _c.Call.Return(run) - return _c -} - -// ApplyPremiumMultiplierWeiPerEthUpdates provides a mock function with given fields: opts, premiumMultiplierWeiPerEthArgs -func (_m *FeeQuoterInterface) ApplyPremiumMultiplierWeiPerEthUpdates(opts *bind.TransactOpts, premiumMultiplierWeiPerEthArgs []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs) (*types.Transaction, error) { - ret := _m.Called(opts, premiumMultiplierWeiPerEthArgs) - - if len(ret) == 0 { - panic("no return value specified for ApplyPremiumMultiplierWeiPerEthUpdates") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs) (*types.Transaction, error)); ok { - return rf(opts, premiumMultiplierWeiPerEthArgs) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs) *types.Transaction); ok { - r0 = rf(opts, premiumMultiplierWeiPerEthArgs) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs) error); ok { - r1 = rf(opts, premiumMultiplierWeiPerEthArgs) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplyPremiumMultiplierWeiPerEthUpdates' -type FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call struct { - *mock.Call -} - -// ApplyPremiumMultiplierWeiPerEthUpdates is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - premiumMultiplierWeiPerEthArgs []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs -func (_e *FeeQuoterInterface_Expecter) ApplyPremiumMultiplierWeiPerEthUpdates(opts interface{}, premiumMultiplierWeiPerEthArgs interface{}) *FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call { - return &FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call{Call: _e.mock.On("ApplyPremiumMultiplierWeiPerEthUpdates", opts, premiumMultiplierWeiPerEthArgs)} -} - -func (_c *FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call) Run(run func(opts *bind.TransactOpts, premiumMultiplierWeiPerEthArgs []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs)) *FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].([]fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call) RunAndReturn(run func(*bind.TransactOpts, []fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthArgs) (*types.Transaction, error)) *FeeQuoterInterface_ApplyPremiumMultiplierWeiPerEthUpdates_Call { - _c.Call.Return(run) - return _c -} - -// ApplyTokenTransferFeeConfigUpdates provides a mock function with given fields: opts, tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs -func (_m *FeeQuoterInterface) ApplyTokenTransferFeeConfigUpdates(opts *bind.TransactOpts, tokenTransferFeeConfigArgs []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs) (*types.Transaction, error) { - ret := _m.Called(opts, tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs) - - if len(ret) == 0 { - panic("no return value specified for ApplyTokenTransferFeeConfigUpdates") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs, []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs) (*types.Transaction, error)); ok { - return rf(opts, tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs, []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs) *types.Transaction); ok { - r0 = rf(opts, tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs, []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs) error); ok { - r1 = rf(opts, tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ApplyTokenTransferFeeConfigUpdates' -type FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call struct { - *mock.Call -} - -// ApplyTokenTransferFeeConfigUpdates is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - tokenTransferFeeConfigArgs []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs -// - tokensToUseDefaultFeeConfigs []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs -func (_e *FeeQuoterInterface_Expecter) ApplyTokenTransferFeeConfigUpdates(opts interface{}, tokenTransferFeeConfigArgs interface{}, tokensToUseDefaultFeeConfigs interface{}) *FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call { - return &FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call{Call: _e.mock.On("ApplyTokenTransferFeeConfigUpdates", opts, tokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs)} -} - -func (_c *FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call) Run(run func(opts *bind.TransactOpts, tokenTransferFeeConfigArgs []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs, tokensToUseDefaultFeeConfigs []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs)) *FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].([]fee_quoter.FeeQuoterTokenTransferFeeConfigArgs), args[2].([]fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call) RunAndReturn(run func(*bind.TransactOpts, []fee_quoter.FeeQuoterTokenTransferFeeConfigArgs, []fee_quoter.FeeQuoterTokenTransferFeeConfigRemoveArgs) (*types.Transaction, error)) *FeeQuoterInterface_ApplyTokenTransferFeeConfigUpdates_Call { - _c.Call.Return(run) - return _c -} - -// ConvertTokenAmount provides a mock function with given fields: opts, fromToken, fromTokenAmount, toToken -func (_m *FeeQuoterInterface) ConvertTokenAmount(opts *bind.CallOpts, fromToken common.Address, fromTokenAmount *big.Int, toToken common.Address) (*big.Int, error) { - ret := _m.Called(opts, fromToken, fromTokenAmount, toToken) - - if len(ret) == 0 { - panic("no return value specified for ConvertTokenAmount") - } - - var r0 *big.Int - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, *big.Int, common.Address) (*big.Int, error)); ok { - return rf(opts, fromToken, fromTokenAmount, toToken) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, *big.Int, common.Address) *big.Int); ok { - r0 = rf(opts, fromToken, fromTokenAmount, toToken) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address, *big.Int, common.Address) error); ok { - r1 = rf(opts, fromToken, fromTokenAmount, toToken) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ConvertTokenAmount_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ConvertTokenAmount' -type FeeQuoterInterface_ConvertTokenAmount_Call struct { - *mock.Call -} - -// ConvertTokenAmount is a helper method to define mock.On call -// - opts *bind.CallOpts -// - fromToken common.Address -// - fromTokenAmount *big.Int -// - toToken common.Address -func (_e *FeeQuoterInterface_Expecter) ConvertTokenAmount(opts interface{}, fromToken interface{}, fromTokenAmount interface{}, toToken interface{}) *FeeQuoterInterface_ConvertTokenAmount_Call { - return &FeeQuoterInterface_ConvertTokenAmount_Call{Call: _e.mock.On("ConvertTokenAmount", opts, fromToken, fromTokenAmount, toToken)} -} - -func (_c *FeeQuoterInterface_ConvertTokenAmount_Call) Run(run func(opts *bind.CallOpts, fromToken common.Address, fromTokenAmount *big.Int, toToken common.Address)) *FeeQuoterInterface_ConvertTokenAmount_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(common.Address), args[2].(*big.Int), args[3].(common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ConvertTokenAmount_Call) Return(_a0 *big.Int, _a1 error) *FeeQuoterInterface_ConvertTokenAmount_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ConvertTokenAmount_Call) RunAndReturn(run func(*bind.CallOpts, common.Address, *big.Int, common.Address) (*big.Int, error)) *FeeQuoterInterface_ConvertTokenAmount_Call { - _c.Call.Return(run) - return _c -} - -// FEEBASEDECIMALS provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) FEEBASEDECIMALS(opts *bind.CallOpts) (*big.Int, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for FEEBASEDECIMALS") - } - - var r0 *big.Int - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FEEBASEDECIMALS_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FEEBASEDECIMALS' -type FeeQuoterInterface_FEEBASEDECIMALS_Call struct { - *mock.Call -} - -// FEEBASEDECIMALS is a helper method to define mock.On call -// - opts *bind.CallOpts -func (_e *FeeQuoterInterface_Expecter) FEEBASEDECIMALS(opts interface{}) *FeeQuoterInterface_FEEBASEDECIMALS_Call { - return &FeeQuoterInterface_FEEBASEDECIMALS_Call{Call: _e.mock.On("FEEBASEDECIMALS", opts)} -} - -func (_c *FeeQuoterInterface_FEEBASEDECIMALS_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_FEEBASEDECIMALS_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FEEBASEDECIMALS_Call) Return(_a0 *big.Int, _a1 error) *FeeQuoterInterface_FEEBASEDECIMALS_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FEEBASEDECIMALS_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *FeeQuoterInterface_FEEBASEDECIMALS_Call { - _c.Call.Return(run) - return _c -} - -// FilterAuthorizedCallerAdded provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) FilterAuthorizedCallerAdded(opts *bind.FilterOpts) (*fee_quoter.FeeQuoterAuthorizedCallerAddedIterator, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for FilterAuthorizedCallerAdded") - } - - var r0 *fee_quoter.FeeQuoterAuthorizedCallerAddedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*fee_quoter.FeeQuoterAuthorizedCallerAddedIterator, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *fee_quoter.FeeQuoterAuthorizedCallerAddedIterator); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterAuthorizedCallerAddedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterAuthorizedCallerAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterAuthorizedCallerAdded' -type FeeQuoterInterface_FilterAuthorizedCallerAdded_Call struct { - *mock.Call -} - -// FilterAuthorizedCallerAdded is a helper method to define mock.On call -// - opts *bind.FilterOpts -func (_e *FeeQuoterInterface_Expecter) FilterAuthorizedCallerAdded(opts interface{}) *FeeQuoterInterface_FilterAuthorizedCallerAdded_Call { - return &FeeQuoterInterface_FilterAuthorizedCallerAdded_Call{Call: _e.mock.On("FilterAuthorizedCallerAdded", opts)} -} - -func (_c *FeeQuoterInterface_FilterAuthorizedCallerAdded_Call) Run(run func(opts *bind.FilterOpts)) *FeeQuoterInterface_FilterAuthorizedCallerAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterAuthorizedCallerAdded_Call) Return(_a0 *fee_quoter.FeeQuoterAuthorizedCallerAddedIterator, _a1 error) *FeeQuoterInterface_FilterAuthorizedCallerAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterAuthorizedCallerAdded_Call) RunAndReturn(run func(*bind.FilterOpts) (*fee_quoter.FeeQuoterAuthorizedCallerAddedIterator, error)) *FeeQuoterInterface_FilterAuthorizedCallerAdded_Call { - _c.Call.Return(run) - return _c -} - -// FilterAuthorizedCallerRemoved provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) FilterAuthorizedCallerRemoved(opts *bind.FilterOpts) (*fee_quoter.FeeQuoterAuthorizedCallerRemovedIterator, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for FilterAuthorizedCallerRemoved") - } - - var r0 *fee_quoter.FeeQuoterAuthorizedCallerRemovedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*fee_quoter.FeeQuoterAuthorizedCallerRemovedIterator, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *fee_quoter.FeeQuoterAuthorizedCallerRemovedIterator); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterAuthorizedCallerRemovedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterAuthorizedCallerRemoved' -type FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call struct { - *mock.Call -} - -// FilterAuthorizedCallerRemoved is a helper method to define mock.On call -// - opts *bind.FilterOpts -func (_e *FeeQuoterInterface_Expecter) FilterAuthorizedCallerRemoved(opts interface{}) *FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call { - return &FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call{Call: _e.mock.On("FilterAuthorizedCallerRemoved", opts)} -} - -func (_c *FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call) Run(run func(opts *bind.FilterOpts)) *FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call) Return(_a0 *fee_quoter.FeeQuoterAuthorizedCallerRemovedIterator, _a1 error) *FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call) RunAndReturn(run func(*bind.FilterOpts) (*fee_quoter.FeeQuoterAuthorizedCallerRemovedIterator, error)) *FeeQuoterInterface_FilterAuthorizedCallerRemoved_Call { - _c.Call.Return(run) - return _c -} - -// FilterDestChainAdded provides a mock function with given fields: opts, destChainSelector -func (_m *FeeQuoterInterface) FilterDestChainAdded(opts *bind.FilterOpts, destChainSelector []uint64) (*fee_quoter.FeeQuoterDestChainAddedIterator, error) { - ret := _m.Called(opts, destChainSelector) - - if len(ret) == 0 { - panic("no return value specified for FilterDestChainAdded") - } - - var r0 *fee_quoter.FeeQuoterDestChainAddedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64) (*fee_quoter.FeeQuoterDestChainAddedIterator, error)); ok { - return rf(opts, destChainSelector) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64) *fee_quoter.FeeQuoterDestChainAddedIterator); ok { - r0 = rf(opts, destChainSelector) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterDestChainAddedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []uint64) error); ok { - r1 = rf(opts, destChainSelector) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterDestChainAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterDestChainAdded' -type FeeQuoterInterface_FilterDestChainAdded_Call struct { - *mock.Call -} - -// FilterDestChainAdded is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - destChainSelector []uint64 -func (_e *FeeQuoterInterface_Expecter) FilterDestChainAdded(opts interface{}, destChainSelector interface{}) *FeeQuoterInterface_FilterDestChainAdded_Call { - return &FeeQuoterInterface_FilterDestChainAdded_Call{Call: _e.mock.On("FilterDestChainAdded", opts, destChainSelector)} -} - -func (_c *FeeQuoterInterface_FilterDestChainAdded_Call) Run(run func(opts *bind.FilterOpts, destChainSelector []uint64)) *FeeQuoterInterface_FilterDestChainAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterDestChainAdded_Call) Return(_a0 *fee_quoter.FeeQuoterDestChainAddedIterator, _a1 error) *FeeQuoterInterface_FilterDestChainAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterDestChainAdded_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64) (*fee_quoter.FeeQuoterDestChainAddedIterator, error)) *FeeQuoterInterface_FilterDestChainAdded_Call { - _c.Call.Return(run) - return _c -} - -// FilterDestChainConfigUpdated provides a mock function with given fields: opts, destChainSelector -func (_m *FeeQuoterInterface) FilterDestChainConfigUpdated(opts *bind.FilterOpts, destChainSelector []uint64) (*fee_quoter.FeeQuoterDestChainConfigUpdatedIterator, error) { - ret := _m.Called(opts, destChainSelector) - - if len(ret) == 0 { - panic("no return value specified for FilterDestChainConfigUpdated") - } - - var r0 *fee_quoter.FeeQuoterDestChainConfigUpdatedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64) (*fee_quoter.FeeQuoterDestChainConfigUpdatedIterator, error)); ok { - return rf(opts, destChainSelector) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64) *fee_quoter.FeeQuoterDestChainConfigUpdatedIterator); ok { - r0 = rf(opts, destChainSelector) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterDestChainConfigUpdatedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []uint64) error); ok { - r1 = rf(opts, destChainSelector) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterDestChainConfigUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterDestChainConfigUpdated' -type FeeQuoterInterface_FilterDestChainConfigUpdated_Call struct { - *mock.Call -} - -// FilterDestChainConfigUpdated is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - destChainSelector []uint64 -func (_e *FeeQuoterInterface_Expecter) FilterDestChainConfigUpdated(opts interface{}, destChainSelector interface{}) *FeeQuoterInterface_FilterDestChainConfigUpdated_Call { - return &FeeQuoterInterface_FilterDestChainConfigUpdated_Call{Call: _e.mock.On("FilterDestChainConfigUpdated", opts, destChainSelector)} -} - -func (_c *FeeQuoterInterface_FilterDestChainConfigUpdated_Call) Run(run func(opts *bind.FilterOpts, destChainSelector []uint64)) *FeeQuoterInterface_FilterDestChainConfigUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterDestChainConfigUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterDestChainConfigUpdatedIterator, _a1 error) *FeeQuoterInterface_FilterDestChainConfigUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterDestChainConfigUpdated_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64) (*fee_quoter.FeeQuoterDestChainConfigUpdatedIterator, error)) *FeeQuoterInterface_FilterDestChainConfigUpdated_Call { - _c.Call.Return(run) - return _c -} - -// FilterFeeTokenAdded provides a mock function with given fields: opts, feeToken -func (_m *FeeQuoterInterface) FilterFeeTokenAdded(opts *bind.FilterOpts, feeToken []common.Address) (*fee_quoter.FeeQuoterFeeTokenAddedIterator, error) { - ret := _m.Called(opts, feeToken) - - if len(ret) == 0 { - panic("no return value specified for FilterFeeTokenAdded") - } - - var r0 *fee_quoter.FeeQuoterFeeTokenAddedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterFeeTokenAddedIterator, error)); ok { - return rf(opts, feeToken) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) *fee_quoter.FeeQuoterFeeTokenAddedIterator); ok { - r0 = rf(opts, feeToken) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterFeeTokenAddedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address) error); ok { - r1 = rf(opts, feeToken) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterFeeTokenAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterFeeTokenAdded' -type FeeQuoterInterface_FilterFeeTokenAdded_Call struct { - *mock.Call -} - -// FilterFeeTokenAdded is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - feeToken []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterFeeTokenAdded(opts interface{}, feeToken interface{}) *FeeQuoterInterface_FilterFeeTokenAdded_Call { - return &FeeQuoterInterface_FilterFeeTokenAdded_Call{Call: _e.mock.On("FilterFeeTokenAdded", opts, feeToken)} -} - -func (_c *FeeQuoterInterface_FilterFeeTokenAdded_Call) Run(run func(opts *bind.FilterOpts, feeToken []common.Address)) *FeeQuoterInterface_FilterFeeTokenAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterFeeTokenAdded_Call) Return(_a0 *fee_quoter.FeeQuoterFeeTokenAddedIterator, _a1 error) *FeeQuoterInterface_FilterFeeTokenAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterFeeTokenAdded_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterFeeTokenAddedIterator, error)) *FeeQuoterInterface_FilterFeeTokenAdded_Call { - _c.Call.Return(run) - return _c -} - -// FilterFeeTokenRemoved provides a mock function with given fields: opts, feeToken -func (_m *FeeQuoterInterface) FilterFeeTokenRemoved(opts *bind.FilterOpts, feeToken []common.Address) (*fee_quoter.FeeQuoterFeeTokenRemovedIterator, error) { - ret := _m.Called(opts, feeToken) - - if len(ret) == 0 { - panic("no return value specified for FilterFeeTokenRemoved") - } - - var r0 *fee_quoter.FeeQuoterFeeTokenRemovedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterFeeTokenRemovedIterator, error)); ok { - return rf(opts, feeToken) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) *fee_quoter.FeeQuoterFeeTokenRemovedIterator); ok { - r0 = rf(opts, feeToken) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterFeeTokenRemovedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address) error); ok { - r1 = rf(opts, feeToken) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterFeeTokenRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterFeeTokenRemoved' -type FeeQuoterInterface_FilterFeeTokenRemoved_Call struct { - *mock.Call -} - -// FilterFeeTokenRemoved is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - feeToken []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterFeeTokenRemoved(opts interface{}, feeToken interface{}) *FeeQuoterInterface_FilterFeeTokenRemoved_Call { - return &FeeQuoterInterface_FilterFeeTokenRemoved_Call{Call: _e.mock.On("FilterFeeTokenRemoved", opts, feeToken)} -} - -func (_c *FeeQuoterInterface_FilterFeeTokenRemoved_Call) Run(run func(opts *bind.FilterOpts, feeToken []common.Address)) *FeeQuoterInterface_FilterFeeTokenRemoved_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterFeeTokenRemoved_Call) Return(_a0 *fee_quoter.FeeQuoterFeeTokenRemovedIterator, _a1 error) *FeeQuoterInterface_FilterFeeTokenRemoved_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterFeeTokenRemoved_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterFeeTokenRemovedIterator, error)) *FeeQuoterInterface_FilterFeeTokenRemoved_Call { - _c.Call.Return(run) - return _c -} - -// FilterOwnershipTransferRequested provides a mock function with given fields: opts, from, to -func (_m *FeeQuoterInterface) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*fee_quoter.FeeQuoterOwnershipTransferRequestedIterator, error) { - ret := _m.Called(opts, from, to) - - if len(ret) == 0 { - panic("no return value specified for FilterOwnershipTransferRequested") - } - - var r0 *fee_quoter.FeeQuoterOwnershipTransferRequestedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) (*fee_quoter.FeeQuoterOwnershipTransferRequestedIterator, error)); ok { - return rf(opts, from, to) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) *fee_quoter.FeeQuoterOwnershipTransferRequestedIterator); ok { - r0 = rf(opts, from, to) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterOwnershipTransferRequestedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address, []common.Address) error); ok { - r1 = rf(opts, from, to) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterOwnershipTransferRequested_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterOwnershipTransferRequested' -type FeeQuoterInterface_FilterOwnershipTransferRequested_Call struct { - *mock.Call -} - -// FilterOwnershipTransferRequested is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - from []common.Address -// - to []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterOwnershipTransferRequested(opts interface{}, from interface{}, to interface{}) *FeeQuoterInterface_FilterOwnershipTransferRequested_Call { - return &FeeQuoterInterface_FilterOwnershipTransferRequested_Call{Call: _e.mock.On("FilterOwnershipTransferRequested", opts, from, to)} -} - -func (_c *FeeQuoterInterface_FilterOwnershipTransferRequested_Call) Run(run func(opts *bind.FilterOpts, from []common.Address, to []common.Address)) *FeeQuoterInterface_FilterOwnershipTransferRequested_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]common.Address), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterOwnershipTransferRequested_Call) Return(_a0 *fee_quoter.FeeQuoterOwnershipTransferRequestedIterator, _a1 error) *FeeQuoterInterface_FilterOwnershipTransferRequested_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterOwnershipTransferRequested_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address, []common.Address) (*fee_quoter.FeeQuoterOwnershipTransferRequestedIterator, error)) *FeeQuoterInterface_FilterOwnershipTransferRequested_Call { - _c.Call.Return(run) - return _c -} - -// FilterOwnershipTransferred provides a mock function with given fields: opts, from, to -func (_m *FeeQuoterInterface) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*fee_quoter.FeeQuoterOwnershipTransferredIterator, error) { - ret := _m.Called(opts, from, to) - - if len(ret) == 0 { - panic("no return value specified for FilterOwnershipTransferred") - } - - var r0 *fee_quoter.FeeQuoterOwnershipTransferredIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) (*fee_quoter.FeeQuoterOwnershipTransferredIterator, error)); ok { - return rf(opts, from, to) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) *fee_quoter.FeeQuoterOwnershipTransferredIterator); ok { - r0 = rf(opts, from, to) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterOwnershipTransferredIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address, []common.Address) error); ok { - r1 = rf(opts, from, to) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterOwnershipTransferred_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterOwnershipTransferred' -type FeeQuoterInterface_FilterOwnershipTransferred_Call struct { - *mock.Call -} - -// FilterOwnershipTransferred is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - from []common.Address -// - to []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterOwnershipTransferred(opts interface{}, from interface{}, to interface{}) *FeeQuoterInterface_FilterOwnershipTransferred_Call { - return &FeeQuoterInterface_FilterOwnershipTransferred_Call{Call: _e.mock.On("FilterOwnershipTransferred", opts, from, to)} -} - -func (_c *FeeQuoterInterface_FilterOwnershipTransferred_Call) Run(run func(opts *bind.FilterOpts, from []common.Address, to []common.Address)) *FeeQuoterInterface_FilterOwnershipTransferred_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]common.Address), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterOwnershipTransferred_Call) Return(_a0 *fee_quoter.FeeQuoterOwnershipTransferredIterator, _a1 error) *FeeQuoterInterface_FilterOwnershipTransferred_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterOwnershipTransferred_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address, []common.Address) (*fee_quoter.FeeQuoterOwnershipTransferredIterator, error)) *FeeQuoterInterface_FilterOwnershipTransferred_Call { - _c.Call.Return(run) - return _c -} - -// FilterPremiumMultiplierWeiPerEthUpdated provides a mock function with given fields: opts, token -func (_m *FeeQuoterInterface) FilterPremiumMultiplierWeiPerEthUpdated(opts *bind.FilterOpts, token []common.Address) (*fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator, error) { - ret := _m.Called(opts, token) - - if len(ret) == 0 { - panic("no return value specified for FilterPremiumMultiplierWeiPerEthUpdated") - } - - var r0 *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator, error)); ok { - return rf(opts, token) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator); ok { - r0 = rf(opts, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address) error); ok { - r1 = rf(opts, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterPremiumMultiplierWeiPerEthUpdated' -type FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call struct { - *mock.Call -} - -// FilterPremiumMultiplierWeiPerEthUpdated is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterPremiumMultiplierWeiPerEthUpdated(opts interface{}, token interface{}) *FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call { - return &FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call{Call: _e.mock.On("FilterPremiumMultiplierWeiPerEthUpdated", opts, token)} -} - -func (_c *FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call) Run(run func(opts *bind.FilterOpts, token []common.Address)) *FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator, _a1 error) *FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdatedIterator, error)) *FeeQuoterInterface_FilterPremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Return(run) - return _c -} - -// FilterPriceFeedPerTokenUpdated provides a mock function with given fields: opts, token -func (_m *FeeQuoterInterface) FilterPriceFeedPerTokenUpdated(opts *bind.FilterOpts, token []common.Address) (*fee_quoter.FeeQuoterPriceFeedPerTokenUpdatedIterator, error) { - ret := _m.Called(opts, token) - - if len(ret) == 0 { - panic("no return value specified for FilterPriceFeedPerTokenUpdated") - } - - var r0 *fee_quoter.FeeQuoterPriceFeedPerTokenUpdatedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterPriceFeedPerTokenUpdatedIterator, error)); ok { - return rf(opts, token) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) *fee_quoter.FeeQuoterPriceFeedPerTokenUpdatedIterator); ok { - r0 = rf(opts, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterPriceFeedPerTokenUpdatedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address) error); ok { - r1 = rf(opts, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterPriceFeedPerTokenUpdated' -type FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call struct { - *mock.Call -} - -// FilterPriceFeedPerTokenUpdated is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterPriceFeedPerTokenUpdated(opts interface{}, token interface{}) *FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call { - return &FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call{Call: _e.mock.On("FilterPriceFeedPerTokenUpdated", opts, token)} -} - -func (_c *FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call) Run(run func(opts *bind.FilterOpts, token []common.Address)) *FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterPriceFeedPerTokenUpdatedIterator, _a1 error) *FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterPriceFeedPerTokenUpdatedIterator, error)) *FeeQuoterInterface_FilterPriceFeedPerTokenUpdated_Call { - _c.Call.Return(run) - return _c -} - -// FilterReportPermissionSet provides a mock function with given fields: opts, reportId -func (_m *FeeQuoterInterface) FilterReportPermissionSet(opts *bind.FilterOpts, reportId [][32]byte) (*fee_quoter.FeeQuoterReportPermissionSetIterator, error) { - ret := _m.Called(opts, reportId) - - if len(ret) == 0 { - panic("no return value specified for FilterReportPermissionSet") - } - - var r0 *fee_quoter.FeeQuoterReportPermissionSetIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte) (*fee_quoter.FeeQuoterReportPermissionSetIterator, error)); ok { - return rf(opts, reportId) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte) *fee_quoter.FeeQuoterReportPermissionSetIterator); ok { - r0 = rf(opts, reportId) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterReportPermissionSetIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, [][32]byte) error); ok { - r1 = rf(opts, reportId) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterReportPermissionSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterReportPermissionSet' -type FeeQuoterInterface_FilterReportPermissionSet_Call struct { - *mock.Call -} - -// FilterReportPermissionSet is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - reportId [][32]byte -func (_e *FeeQuoterInterface_Expecter) FilterReportPermissionSet(opts interface{}, reportId interface{}) *FeeQuoterInterface_FilterReportPermissionSet_Call { - return &FeeQuoterInterface_FilterReportPermissionSet_Call{Call: _e.mock.On("FilterReportPermissionSet", opts, reportId)} -} - -func (_c *FeeQuoterInterface_FilterReportPermissionSet_Call) Run(run func(opts *bind.FilterOpts, reportId [][32]byte)) *FeeQuoterInterface_FilterReportPermissionSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([][32]byte)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterReportPermissionSet_Call) Return(_a0 *fee_quoter.FeeQuoterReportPermissionSetIterator, _a1 error) *FeeQuoterInterface_FilterReportPermissionSet_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterReportPermissionSet_Call) RunAndReturn(run func(*bind.FilterOpts, [][32]byte) (*fee_quoter.FeeQuoterReportPermissionSetIterator, error)) *FeeQuoterInterface_FilterReportPermissionSet_Call { - _c.Call.Return(run) - return _c -} - -// FilterTokenTransferFeeConfigDeleted provides a mock function with given fields: opts, destChainSelector, token -func (_m *FeeQuoterInterface) FilterTokenTransferFeeConfigDeleted(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address) (*fee_quoter.FeeQuoterTokenTransferFeeConfigDeletedIterator, error) { - ret := _m.Called(opts, destChainSelector, token) - - if len(ret) == 0 { - panic("no return value specified for FilterTokenTransferFeeConfigDeleted") - } - - var r0 *fee_quoter.FeeQuoterTokenTransferFeeConfigDeletedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) (*fee_quoter.FeeQuoterTokenTransferFeeConfigDeletedIterator, error)); ok { - return rf(opts, destChainSelector, token) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) *fee_quoter.FeeQuoterTokenTransferFeeConfigDeletedIterator); ok { - r0 = rf(opts, destChainSelector, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterTokenTransferFeeConfigDeletedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []uint64, []common.Address) error); ok { - r1 = rf(opts, destChainSelector, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterTokenTransferFeeConfigDeleted' -type FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call struct { - *mock.Call -} - -// FilterTokenTransferFeeConfigDeleted is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - destChainSelector []uint64 -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterTokenTransferFeeConfigDeleted(opts interface{}, destChainSelector interface{}, token interface{}) *FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call { - return &FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call{Call: _e.mock.On("FilterTokenTransferFeeConfigDeleted", opts, destChainSelector, token)} -} - -func (_c *FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call) Run(run func(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address)) *FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]uint64), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call) Return(_a0 *fee_quoter.FeeQuoterTokenTransferFeeConfigDeletedIterator, _a1 error) *FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64, []common.Address) (*fee_quoter.FeeQuoterTokenTransferFeeConfigDeletedIterator, error)) *FeeQuoterInterface_FilterTokenTransferFeeConfigDeleted_Call { - _c.Call.Return(run) - return _c -} - -// FilterTokenTransferFeeConfigUpdated provides a mock function with given fields: opts, destChainSelector, token -func (_m *FeeQuoterInterface) FilterTokenTransferFeeConfigUpdated(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address) (*fee_quoter.FeeQuoterTokenTransferFeeConfigUpdatedIterator, error) { - ret := _m.Called(opts, destChainSelector, token) - - if len(ret) == 0 { - panic("no return value specified for FilterTokenTransferFeeConfigUpdated") - } - - var r0 *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdatedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) (*fee_quoter.FeeQuoterTokenTransferFeeConfigUpdatedIterator, error)); ok { - return rf(opts, destChainSelector, token) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdatedIterator); ok { - r0 = rf(opts, destChainSelector, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterTokenTransferFeeConfigUpdatedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []uint64, []common.Address) error); ok { - r1 = rf(opts, destChainSelector, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterTokenTransferFeeConfigUpdated' -type FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call struct { - *mock.Call -} - -// FilterTokenTransferFeeConfigUpdated is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - destChainSelector []uint64 -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterTokenTransferFeeConfigUpdated(opts interface{}, destChainSelector interface{}, token interface{}) *FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call { - return &FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call{Call: _e.mock.On("FilterTokenTransferFeeConfigUpdated", opts, destChainSelector, token)} -} - -func (_c *FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call) Run(run func(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address)) *FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]uint64), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdatedIterator, _a1 error) *FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64, []common.Address) (*fee_quoter.FeeQuoterTokenTransferFeeConfigUpdatedIterator, error)) *FeeQuoterInterface_FilterTokenTransferFeeConfigUpdated_Call { - _c.Call.Return(run) - return _c -} - -// FilterUsdPerTokenUpdated provides a mock function with given fields: opts, token -func (_m *FeeQuoterInterface) FilterUsdPerTokenUpdated(opts *bind.FilterOpts, token []common.Address) (*fee_quoter.FeeQuoterUsdPerTokenUpdatedIterator, error) { - ret := _m.Called(opts, token) - - if len(ret) == 0 { - panic("no return value specified for FilterUsdPerTokenUpdated") - } - - var r0 *fee_quoter.FeeQuoterUsdPerTokenUpdatedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterUsdPerTokenUpdatedIterator, error)); ok { - return rf(opts, token) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) *fee_quoter.FeeQuoterUsdPerTokenUpdatedIterator); ok { - r0 = rf(opts, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterUsdPerTokenUpdatedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address) error); ok { - r1 = rf(opts, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterUsdPerTokenUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterUsdPerTokenUpdated' -type FeeQuoterInterface_FilterUsdPerTokenUpdated_Call struct { - *mock.Call -} - -// FilterUsdPerTokenUpdated is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) FilterUsdPerTokenUpdated(opts interface{}, token interface{}) *FeeQuoterInterface_FilterUsdPerTokenUpdated_Call { - return &FeeQuoterInterface_FilterUsdPerTokenUpdated_Call{Call: _e.mock.On("FilterUsdPerTokenUpdated", opts, token)} -} - -func (_c *FeeQuoterInterface_FilterUsdPerTokenUpdated_Call) Run(run func(opts *bind.FilterOpts, token []common.Address)) *FeeQuoterInterface_FilterUsdPerTokenUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterUsdPerTokenUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterUsdPerTokenUpdatedIterator, _a1 error) *FeeQuoterInterface_FilterUsdPerTokenUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterUsdPerTokenUpdated_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address) (*fee_quoter.FeeQuoterUsdPerTokenUpdatedIterator, error)) *FeeQuoterInterface_FilterUsdPerTokenUpdated_Call { - _c.Call.Return(run) - return _c -} - -// FilterUsdPerUnitGasUpdated provides a mock function with given fields: opts, destChain -func (_m *FeeQuoterInterface) FilterUsdPerUnitGasUpdated(opts *bind.FilterOpts, destChain []uint64) (*fee_quoter.FeeQuoterUsdPerUnitGasUpdatedIterator, error) { - ret := _m.Called(opts, destChain) - - if len(ret) == 0 { - panic("no return value specified for FilterUsdPerUnitGasUpdated") - } - - var r0 *fee_quoter.FeeQuoterUsdPerUnitGasUpdatedIterator - var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64) (*fee_quoter.FeeQuoterUsdPerUnitGasUpdatedIterator, error)); ok { - return rf(opts, destChain) - } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64) *fee_quoter.FeeQuoterUsdPerUnitGasUpdatedIterator); ok { - r0 = rf(opts, destChain) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterUsdPerUnitGasUpdatedIterator) - } - } - - if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []uint64) error); ok { - r1 = rf(opts, destChain) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterUsdPerUnitGasUpdated' -type FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call struct { - *mock.Call -} - -// FilterUsdPerUnitGasUpdated is a helper method to define mock.On call -// - opts *bind.FilterOpts -// - destChain []uint64 -func (_e *FeeQuoterInterface_Expecter) FilterUsdPerUnitGasUpdated(opts interface{}, destChain interface{}) *FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call { - return &FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call{Call: _e.mock.On("FilterUsdPerUnitGasUpdated", opts, destChain)} -} - -func (_c *FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call) Run(run func(opts *bind.FilterOpts, destChain []uint64)) *FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.FilterOpts), args[1].([]uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterUsdPerUnitGasUpdatedIterator, _a1 error) *FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64) (*fee_quoter.FeeQuoterUsdPerUnitGasUpdatedIterator, error)) *FeeQuoterInterface_FilterUsdPerUnitGasUpdated_Call { - _c.Call.Return(run) - return _c -} - -// GetAllAuthorizedCallers provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) GetAllAuthorizedCallers(opts *bind.CallOpts) ([]common.Address, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for GetAllAuthorizedCallers") - } - - var r0 []common.Address - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([]common.Address, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) []common.Address); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]common.Address) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetAllAuthorizedCallers_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAllAuthorizedCallers' -type FeeQuoterInterface_GetAllAuthorizedCallers_Call struct { - *mock.Call -} - -// GetAllAuthorizedCallers is a helper method to define mock.On call -// - opts *bind.CallOpts -func (_e *FeeQuoterInterface_Expecter) GetAllAuthorizedCallers(opts interface{}) *FeeQuoterInterface_GetAllAuthorizedCallers_Call { - return &FeeQuoterInterface_GetAllAuthorizedCallers_Call{Call: _e.mock.On("GetAllAuthorizedCallers", opts)} -} - -func (_c *FeeQuoterInterface_GetAllAuthorizedCallers_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_GetAllAuthorizedCallers_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetAllAuthorizedCallers_Call) Return(_a0 []common.Address, _a1 error) *FeeQuoterInterface_GetAllAuthorizedCallers_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetAllAuthorizedCallers_Call) RunAndReturn(run func(*bind.CallOpts) ([]common.Address, error)) *FeeQuoterInterface_GetAllAuthorizedCallers_Call { - _c.Call.Return(run) - return _c -} - -// GetDestChainConfig provides a mock function with given fields: opts, destChainSelector -func (_m *FeeQuoterInterface) GetDestChainConfig(opts *bind.CallOpts, destChainSelector uint64) (fee_quoter.FeeQuoterDestChainConfig, error) { - ret := _m.Called(opts, destChainSelector) - - if len(ret) == 0 { - panic("no return value specified for GetDestChainConfig") - } - - var r0 fee_quoter.FeeQuoterDestChainConfig - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64) (fee_quoter.FeeQuoterDestChainConfig, error)); ok { - return rf(opts, destChainSelector) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64) fee_quoter.FeeQuoterDestChainConfig); ok { - r0 = rf(opts, destChainSelector) - } else { - r0 = ret.Get(0).(fee_quoter.FeeQuoterDestChainConfig) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64) error); ok { - r1 = rf(opts, destChainSelector) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetDestChainConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDestChainConfig' -type FeeQuoterInterface_GetDestChainConfig_Call struct { - *mock.Call -} - -// GetDestChainConfig is a helper method to define mock.On call -// - opts *bind.CallOpts -// - destChainSelector uint64 -func (_e *FeeQuoterInterface_Expecter) GetDestChainConfig(opts interface{}, destChainSelector interface{}) *FeeQuoterInterface_GetDestChainConfig_Call { - return &FeeQuoterInterface_GetDestChainConfig_Call{Call: _e.mock.On("GetDestChainConfig", opts, destChainSelector)} -} - -func (_c *FeeQuoterInterface_GetDestChainConfig_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64)) *FeeQuoterInterface_GetDestChainConfig_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetDestChainConfig_Call) Return(_a0 fee_quoter.FeeQuoterDestChainConfig, _a1 error) *FeeQuoterInterface_GetDestChainConfig_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetDestChainConfig_Call) RunAndReturn(run func(*bind.CallOpts, uint64) (fee_quoter.FeeQuoterDestChainConfig, error)) *FeeQuoterInterface_GetDestChainConfig_Call { - _c.Call.Return(run) - return _c -} - -// GetDestinationChainGasPrice provides a mock function with given fields: opts, destChainSelector -func (_m *FeeQuoterInterface) GetDestinationChainGasPrice(opts *bind.CallOpts, destChainSelector uint64) (fee_quoter.InternalTimestampedPackedUint224, error) { - ret := _m.Called(opts, destChainSelector) - - if len(ret) == 0 { - panic("no return value specified for GetDestinationChainGasPrice") - } - - var r0 fee_quoter.InternalTimestampedPackedUint224 - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64) (fee_quoter.InternalTimestampedPackedUint224, error)); ok { - return rf(opts, destChainSelector) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64) fee_quoter.InternalTimestampedPackedUint224); ok { - r0 = rf(opts, destChainSelector) - } else { - r0 = ret.Get(0).(fee_quoter.InternalTimestampedPackedUint224) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64) error); ok { - r1 = rf(opts, destChainSelector) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetDestinationChainGasPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetDestinationChainGasPrice' -type FeeQuoterInterface_GetDestinationChainGasPrice_Call struct { - *mock.Call -} - -// GetDestinationChainGasPrice is a helper method to define mock.On call -// - opts *bind.CallOpts -// - destChainSelector uint64 -func (_e *FeeQuoterInterface_Expecter) GetDestinationChainGasPrice(opts interface{}, destChainSelector interface{}) *FeeQuoterInterface_GetDestinationChainGasPrice_Call { - return &FeeQuoterInterface_GetDestinationChainGasPrice_Call{Call: _e.mock.On("GetDestinationChainGasPrice", opts, destChainSelector)} -} - -func (_c *FeeQuoterInterface_GetDestinationChainGasPrice_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64)) *FeeQuoterInterface_GetDestinationChainGasPrice_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetDestinationChainGasPrice_Call) Return(_a0 fee_quoter.InternalTimestampedPackedUint224, _a1 error) *FeeQuoterInterface_GetDestinationChainGasPrice_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetDestinationChainGasPrice_Call) RunAndReturn(run func(*bind.CallOpts, uint64) (fee_quoter.InternalTimestampedPackedUint224, error)) *FeeQuoterInterface_GetDestinationChainGasPrice_Call { - _c.Call.Return(run) - return _c -} - -// GetFeeTokens provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) GetFeeTokens(opts *bind.CallOpts) ([]common.Address, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for GetFeeTokens") - } - - var r0 []common.Address - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([]common.Address, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) []common.Address); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]common.Address) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetFeeTokens_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFeeTokens' -type FeeQuoterInterface_GetFeeTokens_Call struct { - *mock.Call -} - -// GetFeeTokens is a helper method to define mock.On call -// - opts *bind.CallOpts -func (_e *FeeQuoterInterface_Expecter) GetFeeTokens(opts interface{}) *FeeQuoterInterface_GetFeeTokens_Call { - return &FeeQuoterInterface_GetFeeTokens_Call{Call: _e.mock.On("GetFeeTokens", opts)} -} - -func (_c *FeeQuoterInterface_GetFeeTokens_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_GetFeeTokens_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetFeeTokens_Call) Return(_a0 []common.Address, _a1 error) *FeeQuoterInterface_GetFeeTokens_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetFeeTokens_Call) RunAndReturn(run func(*bind.CallOpts) ([]common.Address, error)) *FeeQuoterInterface_GetFeeTokens_Call { - _c.Call.Return(run) - return _c -} - -// GetPremiumMultiplierWeiPerEth provides a mock function with given fields: opts, token -func (_m *FeeQuoterInterface) GetPremiumMultiplierWeiPerEth(opts *bind.CallOpts, token common.Address) (uint64, error) { - ret := _m.Called(opts, token) - - if len(ret) == 0 { - panic("no return value specified for GetPremiumMultiplierWeiPerEth") - } - - var r0 uint64 - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (uint64, error)); ok { - return rf(opts, token) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) uint64); ok { - r0 = rf(opts, token) - } else { - r0 = ret.Get(0).(uint64) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { - r1 = rf(opts, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetPremiumMultiplierWeiPerEth' -type FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call struct { - *mock.Call -} - -// GetPremiumMultiplierWeiPerEth is a helper method to define mock.On call -// - opts *bind.CallOpts -// - token common.Address -func (_e *FeeQuoterInterface_Expecter) GetPremiumMultiplierWeiPerEth(opts interface{}, token interface{}) *FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call { - return &FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call{Call: _e.mock.On("GetPremiumMultiplierWeiPerEth", opts, token)} -} - -func (_c *FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call) Run(run func(opts *bind.CallOpts, token common.Address)) *FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call) Return(_a0 uint64, _a1 error) *FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (uint64, error)) *FeeQuoterInterface_GetPremiumMultiplierWeiPerEth_Call { - _c.Call.Return(run) - return _c -} - -// GetStaticConfig provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) GetStaticConfig(opts *bind.CallOpts) (fee_quoter.FeeQuoterStaticConfig, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for GetStaticConfig") - } - - var r0 fee_quoter.FeeQuoterStaticConfig - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (fee_quoter.FeeQuoterStaticConfig, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) fee_quoter.FeeQuoterStaticConfig); ok { - r0 = rf(opts) - } else { - r0 = ret.Get(0).(fee_quoter.FeeQuoterStaticConfig) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetStaticConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetStaticConfig' -type FeeQuoterInterface_GetStaticConfig_Call struct { - *mock.Call -} - -// GetStaticConfig is a helper method to define mock.On call -// - opts *bind.CallOpts -func (_e *FeeQuoterInterface_Expecter) GetStaticConfig(opts interface{}) *FeeQuoterInterface_GetStaticConfig_Call { - return &FeeQuoterInterface_GetStaticConfig_Call{Call: _e.mock.On("GetStaticConfig", opts)} -} - -func (_c *FeeQuoterInterface_GetStaticConfig_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_GetStaticConfig_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetStaticConfig_Call) Return(_a0 fee_quoter.FeeQuoterStaticConfig, _a1 error) *FeeQuoterInterface_GetStaticConfig_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetStaticConfig_Call) RunAndReturn(run func(*bind.CallOpts) (fee_quoter.FeeQuoterStaticConfig, error)) *FeeQuoterInterface_GetStaticConfig_Call { - _c.Call.Return(run) - return _c -} - -// GetTokenAndGasPrices provides a mock function with given fields: opts, token, destChainSelector -func (_m *FeeQuoterInterface) GetTokenAndGasPrices(opts *bind.CallOpts, token common.Address, destChainSelector uint64) (fee_quoter.GetTokenAndGasPrices, error) { - ret := _m.Called(opts, token, destChainSelector) - - if len(ret) == 0 { - panic("no return value specified for GetTokenAndGasPrices") - } - - var r0 fee_quoter.GetTokenAndGasPrices - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, uint64) (fee_quoter.GetTokenAndGasPrices, error)); ok { - return rf(opts, token, destChainSelector) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, uint64) fee_quoter.GetTokenAndGasPrices); ok { - r0 = rf(opts, token, destChainSelector) - } else { - r0 = ret.Get(0).(fee_quoter.GetTokenAndGasPrices) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address, uint64) error); ok { - r1 = rf(opts, token, destChainSelector) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetTokenAndGasPrices_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTokenAndGasPrices' -type FeeQuoterInterface_GetTokenAndGasPrices_Call struct { - *mock.Call -} - -// GetTokenAndGasPrices is a helper method to define mock.On call -// - opts *bind.CallOpts -// - token common.Address -// - destChainSelector uint64 -func (_e *FeeQuoterInterface_Expecter) GetTokenAndGasPrices(opts interface{}, token interface{}, destChainSelector interface{}) *FeeQuoterInterface_GetTokenAndGasPrices_Call { - return &FeeQuoterInterface_GetTokenAndGasPrices_Call{Call: _e.mock.On("GetTokenAndGasPrices", opts, token, destChainSelector)} -} - -func (_c *FeeQuoterInterface_GetTokenAndGasPrices_Call) Run(run func(opts *bind.CallOpts, token common.Address, destChainSelector uint64)) *FeeQuoterInterface_GetTokenAndGasPrices_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(common.Address), args[2].(uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenAndGasPrices_Call) Return(_a0 fee_quoter.GetTokenAndGasPrices, _a1 error) *FeeQuoterInterface_GetTokenAndGasPrices_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenAndGasPrices_Call) RunAndReturn(run func(*bind.CallOpts, common.Address, uint64) (fee_quoter.GetTokenAndGasPrices, error)) *FeeQuoterInterface_GetTokenAndGasPrices_Call { - _c.Call.Return(run) - return _c -} - -// GetTokenPrice provides a mock function with given fields: opts, token -func (_m *FeeQuoterInterface) GetTokenPrice(opts *bind.CallOpts, token common.Address) (fee_quoter.InternalTimestampedPackedUint224, error) { - ret := _m.Called(opts, token) - - if len(ret) == 0 { - panic("no return value specified for GetTokenPrice") - } - - var r0 fee_quoter.InternalTimestampedPackedUint224 - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (fee_quoter.InternalTimestampedPackedUint224, error)); ok { - return rf(opts, token) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) fee_quoter.InternalTimestampedPackedUint224); ok { - r0 = rf(opts, token) - } else { - r0 = ret.Get(0).(fee_quoter.InternalTimestampedPackedUint224) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { - r1 = rf(opts, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetTokenPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTokenPrice' -type FeeQuoterInterface_GetTokenPrice_Call struct { - *mock.Call -} - -// GetTokenPrice is a helper method to define mock.On call -// - opts *bind.CallOpts -// - token common.Address -func (_e *FeeQuoterInterface_Expecter) GetTokenPrice(opts interface{}, token interface{}) *FeeQuoterInterface_GetTokenPrice_Call { - return &FeeQuoterInterface_GetTokenPrice_Call{Call: _e.mock.On("GetTokenPrice", opts, token)} -} - -func (_c *FeeQuoterInterface_GetTokenPrice_Call) Run(run func(opts *bind.CallOpts, token common.Address)) *FeeQuoterInterface_GetTokenPrice_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenPrice_Call) Return(_a0 fee_quoter.InternalTimestampedPackedUint224, _a1 error) *FeeQuoterInterface_GetTokenPrice_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenPrice_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (fee_quoter.InternalTimestampedPackedUint224, error)) *FeeQuoterInterface_GetTokenPrice_Call { - _c.Call.Return(run) - return _c -} - -// GetTokenPriceFeedConfig provides a mock function with given fields: opts, token -func (_m *FeeQuoterInterface) GetTokenPriceFeedConfig(opts *bind.CallOpts, token common.Address) (fee_quoter.FeeQuoterTokenPriceFeedConfig, error) { - ret := _m.Called(opts, token) - - if len(ret) == 0 { - panic("no return value specified for GetTokenPriceFeedConfig") - } - - var r0 fee_quoter.FeeQuoterTokenPriceFeedConfig - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (fee_quoter.FeeQuoterTokenPriceFeedConfig, error)); ok { - return rf(opts, token) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) fee_quoter.FeeQuoterTokenPriceFeedConfig); ok { - r0 = rf(opts, token) - } else { - r0 = ret.Get(0).(fee_quoter.FeeQuoterTokenPriceFeedConfig) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { - r1 = rf(opts, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetTokenPriceFeedConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTokenPriceFeedConfig' -type FeeQuoterInterface_GetTokenPriceFeedConfig_Call struct { - *mock.Call -} - -// GetTokenPriceFeedConfig is a helper method to define mock.On call -// - opts *bind.CallOpts -// - token common.Address -func (_e *FeeQuoterInterface_Expecter) GetTokenPriceFeedConfig(opts interface{}, token interface{}) *FeeQuoterInterface_GetTokenPriceFeedConfig_Call { - return &FeeQuoterInterface_GetTokenPriceFeedConfig_Call{Call: _e.mock.On("GetTokenPriceFeedConfig", opts, token)} -} - -func (_c *FeeQuoterInterface_GetTokenPriceFeedConfig_Call) Run(run func(opts *bind.CallOpts, token common.Address)) *FeeQuoterInterface_GetTokenPriceFeedConfig_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenPriceFeedConfig_Call) Return(_a0 fee_quoter.FeeQuoterTokenPriceFeedConfig, _a1 error) *FeeQuoterInterface_GetTokenPriceFeedConfig_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenPriceFeedConfig_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (fee_quoter.FeeQuoterTokenPriceFeedConfig, error)) *FeeQuoterInterface_GetTokenPriceFeedConfig_Call { - _c.Call.Return(run) - return _c -} - -// GetTokenPrices provides a mock function with given fields: opts, tokens -func (_m *FeeQuoterInterface) GetTokenPrices(opts *bind.CallOpts, tokens []common.Address) ([]fee_quoter.InternalTimestampedPackedUint224, error) { - ret := _m.Called(opts, tokens) - - if len(ret) == 0 { - panic("no return value specified for GetTokenPrices") - } - - var r0 []fee_quoter.InternalTimestampedPackedUint224 - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, []common.Address) ([]fee_quoter.InternalTimestampedPackedUint224, error)); ok { - return rf(opts, tokens) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, []common.Address) []fee_quoter.InternalTimestampedPackedUint224); ok { - r0 = rf(opts, tokens) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]fee_quoter.InternalTimestampedPackedUint224) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, []common.Address) error); ok { - r1 = rf(opts, tokens) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetTokenPrices_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTokenPrices' -type FeeQuoterInterface_GetTokenPrices_Call struct { - *mock.Call -} - -// GetTokenPrices is a helper method to define mock.On call -// - opts *bind.CallOpts -// - tokens []common.Address -func (_e *FeeQuoterInterface_Expecter) GetTokenPrices(opts interface{}, tokens interface{}) *FeeQuoterInterface_GetTokenPrices_Call { - return &FeeQuoterInterface_GetTokenPrices_Call{Call: _e.mock.On("GetTokenPrices", opts, tokens)} -} - -func (_c *FeeQuoterInterface_GetTokenPrices_Call) Run(run func(opts *bind.CallOpts, tokens []common.Address)) *FeeQuoterInterface_GetTokenPrices_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenPrices_Call) Return(_a0 []fee_quoter.InternalTimestampedPackedUint224, _a1 error) *FeeQuoterInterface_GetTokenPrices_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenPrices_Call) RunAndReturn(run func(*bind.CallOpts, []common.Address) ([]fee_quoter.InternalTimestampedPackedUint224, error)) *FeeQuoterInterface_GetTokenPrices_Call { - _c.Call.Return(run) - return _c -} - -// GetTokenTransferFeeConfig provides a mock function with given fields: opts, destChainSelector, token -func (_m *FeeQuoterInterface) GetTokenTransferFeeConfig(opts *bind.CallOpts, destChainSelector uint64, token common.Address) (fee_quoter.FeeQuoterTokenTransferFeeConfig, error) { - ret := _m.Called(opts, destChainSelector, token) - - if len(ret) == 0 { - panic("no return value specified for GetTokenTransferFeeConfig") - } - - var r0 fee_quoter.FeeQuoterTokenTransferFeeConfig - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address) (fee_quoter.FeeQuoterTokenTransferFeeConfig, error)); ok { - return rf(opts, destChainSelector, token) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address) fee_quoter.FeeQuoterTokenTransferFeeConfig); ok { - r0 = rf(opts, destChainSelector, token) - } else { - r0 = ret.Get(0).(fee_quoter.FeeQuoterTokenTransferFeeConfig) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, common.Address) error); ok { - r1 = rf(opts, destChainSelector, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetTokenTransferFeeConfig_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetTokenTransferFeeConfig' -type FeeQuoterInterface_GetTokenTransferFeeConfig_Call struct { - *mock.Call -} - -// GetTokenTransferFeeConfig is a helper method to define mock.On call -// - opts *bind.CallOpts -// - destChainSelector uint64 -// - token common.Address -func (_e *FeeQuoterInterface_Expecter) GetTokenTransferFeeConfig(opts interface{}, destChainSelector interface{}, token interface{}) *FeeQuoterInterface_GetTokenTransferFeeConfig_Call { - return &FeeQuoterInterface_GetTokenTransferFeeConfig_Call{Call: _e.mock.On("GetTokenTransferFeeConfig", opts, destChainSelector, token)} -} - -func (_c *FeeQuoterInterface_GetTokenTransferFeeConfig_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64, token common.Address)) *FeeQuoterInterface_GetTokenTransferFeeConfig_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(uint64), args[2].(common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenTransferFeeConfig_Call) Return(_a0 fee_quoter.FeeQuoterTokenTransferFeeConfig, _a1 error) *FeeQuoterInterface_GetTokenTransferFeeConfig_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetTokenTransferFeeConfig_Call) RunAndReturn(run func(*bind.CallOpts, uint64, common.Address) (fee_quoter.FeeQuoterTokenTransferFeeConfig, error)) *FeeQuoterInterface_GetTokenTransferFeeConfig_Call { - _c.Call.Return(run) - return _c -} - -// GetValidatedFee provides a mock function with given fields: opts, destChainSelector, message -func (_m *FeeQuoterInterface) GetValidatedFee(opts *bind.CallOpts, destChainSelector uint64, message fee_quoter.ClientEVM2AnyMessage) (*big.Int, error) { - ret := _m.Called(opts, destChainSelector, message) - - if len(ret) == 0 { - panic("no return value specified for GetValidatedFee") - } - - var r0 *big.Int - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, fee_quoter.ClientEVM2AnyMessage) (*big.Int, error)); ok { - return rf(opts, destChainSelector, message) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, fee_quoter.ClientEVM2AnyMessage) *big.Int); ok { - r0 = rf(opts, destChainSelector, message) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, fee_quoter.ClientEVM2AnyMessage) error); ok { - r1 = rf(opts, destChainSelector, message) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetValidatedFee_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetValidatedFee' -type FeeQuoterInterface_GetValidatedFee_Call struct { - *mock.Call -} - -// GetValidatedFee is a helper method to define mock.On call -// - opts *bind.CallOpts -// - destChainSelector uint64 -// - message fee_quoter.ClientEVM2AnyMessage -func (_e *FeeQuoterInterface_Expecter) GetValidatedFee(opts interface{}, destChainSelector interface{}, message interface{}) *FeeQuoterInterface_GetValidatedFee_Call { - return &FeeQuoterInterface_GetValidatedFee_Call{Call: _e.mock.On("GetValidatedFee", opts, destChainSelector, message)} -} - -func (_c *FeeQuoterInterface_GetValidatedFee_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64, message fee_quoter.ClientEVM2AnyMessage)) *FeeQuoterInterface_GetValidatedFee_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(uint64), args[2].(fee_quoter.ClientEVM2AnyMessage)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetValidatedFee_Call) Return(_a0 *big.Int, _a1 error) *FeeQuoterInterface_GetValidatedFee_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetValidatedFee_Call) RunAndReturn(run func(*bind.CallOpts, uint64, fee_quoter.ClientEVM2AnyMessage) (*big.Int, error)) *FeeQuoterInterface_GetValidatedFee_Call { - _c.Call.Return(run) - return _c -} - -// GetValidatedTokenPrice provides a mock function with given fields: opts, token -func (_m *FeeQuoterInterface) GetValidatedTokenPrice(opts *bind.CallOpts, token common.Address) (*big.Int, error) { - ret := _m.Called(opts, token) - - if len(ret) == 0 { - panic("no return value specified for GetValidatedTokenPrice") - } - - var r0 *big.Int - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) (*big.Int, error)); ok { - return rf(opts, token) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address) *big.Int); ok { - r0 = rf(opts, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address) error); ok { - r1 = rf(opts, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_GetValidatedTokenPrice_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetValidatedTokenPrice' -type FeeQuoterInterface_GetValidatedTokenPrice_Call struct { - *mock.Call -} - -// GetValidatedTokenPrice is a helper method to define mock.On call -// - opts *bind.CallOpts -// - token common.Address -func (_e *FeeQuoterInterface_Expecter) GetValidatedTokenPrice(opts interface{}, token interface{}) *FeeQuoterInterface_GetValidatedTokenPrice_Call { - return &FeeQuoterInterface_GetValidatedTokenPrice_Call{Call: _e.mock.On("GetValidatedTokenPrice", opts, token)} -} - -func (_c *FeeQuoterInterface_GetValidatedTokenPrice_Call) Run(run func(opts *bind.CallOpts, token common.Address)) *FeeQuoterInterface_GetValidatedTokenPrice_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_GetValidatedTokenPrice_Call) Return(_a0 *big.Int, _a1 error) *FeeQuoterInterface_GetValidatedTokenPrice_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_GetValidatedTokenPrice_Call) RunAndReturn(run func(*bind.CallOpts, common.Address) (*big.Int, error)) *FeeQuoterInterface_GetValidatedTokenPrice_Call { - _c.Call.Return(run) - return _c -} - -// KEYSTONEPRICEDECIMALS provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) KEYSTONEPRICEDECIMALS(opts *bind.CallOpts) (*big.Int, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for KEYSTONEPRICEDECIMALS") - } - - var r0 *big.Int - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (*big.Int, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) *big.Int); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*big.Int) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'KEYSTONEPRICEDECIMALS' -type FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call struct { - *mock.Call -} - -// KEYSTONEPRICEDECIMALS is a helper method to define mock.On call -// - opts *bind.CallOpts -func (_e *FeeQuoterInterface_Expecter) KEYSTONEPRICEDECIMALS(opts interface{}) *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call { - return &FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call{Call: _e.mock.On("KEYSTONEPRICEDECIMALS", opts)} -} - -func (_c *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call) Return(_a0 *big.Int, _a1 error) *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call) RunAndReturn(run func(*bind.CallOpts) (*big.Int, error)) *FeeQuoterInterface_KEYSTONEPRICEDECIMALS_Call { - _c.Call.Return(run) - return _c -} - -// OnReport provides a mock function with given fields: opts, metadata, report -func (_m *FeeQuoterInterface) OnReport(opts *bind.TransactOpts, metadata []byte, report []byte) (*types.Transaction, error) { - ret := _m.Called(opts, metadata, report) - - if len(ret) == 0 { - panic("no return value specified for OnReport") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []byte, []byte) (*types.Transaction, error)); ok { - return rf(opts, metadata, report) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []byte, []byte) *types.Transaction); ok { - r0 = rf(opts, metadata, report) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []byte, []byte) error); ok { - r1 = rf(opts, metadata, report) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_OnReport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'OnReport' -type FeeQuoterInterface_OnReport_Call struct { - *mock.Call -} - -// OnReport is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - metadata []byte -// - report []byte -func (_e *FeeQuoterInterface_Expecter) OnReport(opts interface{}, metadata interface{}, report interface{}) *FeeQuoterInterface_OnReport_Call { - return &FeeQuoterInterface_OnReport_Call{Call: _e.mock.On("OnReport", opts, metadata, report)} -} - -func (_c *FeeQuoterInterface_OnReport_Call) Run(run func(opts *bind.TransactOpts, metadata []byte, report []byte)) *FeeQuoterInterface_OnReport_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].([]byte), args[2].([]byte)) - }) - return _c -} - -func (_c *FeeQuoterInterface_OnReport_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_OnReport_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_OnReport_Call) RunAndReturn(run func(*bind.TransactOpts, []byte, []byte) (*types.Transaction, error)) *FeeQuoterInterface_OnReport_Call { - _c.Call.Return(run) - return _c -} - -// Owner provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) Owner(opts *bind.CallOpts) (common.Address, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for Owner") - } - - var r0 common.Address - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (common.Address, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) common.Address); ok { - r0 = rf(opts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(common.Address) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_Owner_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Owner' -type FeeQuoterInterface_Owner_Call struct { - *mock.Call -} - -// Owner is a helper method to define mock.On call -// - opts *bind.CallOpts -func (_e *FeeQuoterInterface_Expecter) Owner(opts interface{}) *FeeQuoterInterface_Owner_Call { - return &FeeQuoterInterface_Owner_Call{Call: _e.mock.On("Owner", opts)} -} - -func (_c *FeeQuoterInterface_Owner_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_Owner_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_Owner_Call) Return(_a0 common.Address, _a1 error) *FeeQuoterInterface_Owner_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_Owner_Call) RunAndReturn(run func(*bind.CallOpts) (common.Address, error)) *FeeQuoterInterface_Owner_Call { - _c.Call.Return(run) - return _c -} - -// ParseAuthorizedCallerAdded provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseAuthorizedCallerAdded(log types.Log) (*fee_quoter.FeeQuoterAuthorizedCallerAdded, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseAuthorizedCallerAdded") - } - - var r0 *fee_quoter.FeeQuoterAuthorizedCallerAdded - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterAuthorizedCallerAdded, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterAuthorizedCallerAdded); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterAuthorizedCallerAdded) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseAuthorizedCallerAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseAuthorizedCallerAdded' -type FeeQuoterInterface_ParseAuthorizedCallerAdded_Call struct { - *mock.Call -} - -// ParseAuthorizedCallerAdded is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseAuthorizedCallerAdded(log interface{}) *FeeQuoterInterface_ParseAuthorizedCallerAdded_Call { - return &FeeQuoterInterface_ParseAuthorizedCallerAdded_Call{Call: _e.mock.On("ParseAuthorizedCallerAdded", log)} -} - -func (_c *FeeQuoterInterface_ParseAuthorizedCallerAdded_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseAuthorizedCallerAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseAuthorizedCallerAdded_Call) Return(_a0 *fee_quoter.FeeQuoterAuthorizedCallerAdded, _a1 error) *FeeQuoterInterface_ParseAuthorizedCallerAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseAuthorizedCallerAdded_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterAuthorizedCallerAdded, error)) *FeeQuoterInterface_ParseAuthorizedCallerAdded_Call { - _c.Call.Return(run) - return _c -} - -// ParseAuthorizedCallerRemoved provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseAuthorizedCallerRemoved(log types.Log) (*fee_quoter.FeeQuoterAuthorizedCallerRemoved, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseAuthorizedCallerRemoved") - } - - var r0 *fee_quoter.FeeQuoterAuthorizedCallerRemoved - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterAuthorizedCallerRemoved, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterAuthorizedCallerRemoved); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterAuthorizedCallerRemoved) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseAuthorizedCallerRemoved' -type FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call struct { - *mock.Call -} - -// ParseAuthorizedCallerRemoved is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseAuthorizedCallerRemoved(log interface{}) *FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call { - return &FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call{Call: _e.mock.On("ParseAuthorizedCallerRemoved", log)} -} - -func (_c *FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call) Return(_a0 *fee_quoter.FeeQuoterAuthorizedCallerRemoved, _a1 error) *FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterAuthorizedCallerRemoved, error)) *FeeQuoterInterface_ParseAuthorizedCallerRemoved_Call { - _c.Call.Return(run) - return _c -} - -// ParseDestChainAdded provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseDestChainAdded(log types.Log) (*fee_quoter.FeeQuoterDestChainAdded, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseDestChainAdded") - } - - var r0 *fee_quoter.FeeQuoterDestChainAdded - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterDestChainAdded, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterDestChainAdded); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterDestChainAdded) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseDestChainAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseDestChainAdded' -type FeeQuoterInterface_ParseDestChainAdded_Call struct { - *mock.Call -} - -// ParseDestChainAdded is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseDestChainAdded(log interface{}) *FeeQuoterInterface_ParseDestChainAdded_Call { - return &FeeQuoterInterface_ParseDestChainAdded_Call{Call: _e.mock.On("ParseDestChainAdded", log)} -} - -func (_c *FeeQuoterInterface_ParseDestChainAdded_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseDestChainAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseDestChainAdded_Call) Return(_a0 *fee_quoter.FeeQuoterDestChainAdded, _a1 error) *FeeQuoterInterface_ParseDestChainAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseDestChainAdded_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterDestChainAdded, error)) *FeeQuoterInterface_ParseDestChainAdded_Call { - _c.Call.Return(run) - return _c -} - -// ParseDestChainConfigUpdated provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseDestChainConfigUpdated(log types.Log) (*fee_quoter.FeeQuoterDestChainConfigUpdated, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseDestChainConfigUpdated") - } - - var r0 *fee_quoter.FeeQuoterDestChainConfigUpdated - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterDestChainConfigUpdated, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterDestChainConfigUpdated); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterDestChainConfigUpdated) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseDestChainConfigUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseDestChainConfigUpdated' -type FeeQuoterInterface_ParseDestChainConfigUpdated_Call struct { - *mock.Call -} - -// ParseDestChainConfigUpdated is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseDestChainConfigUpdated(log interface{}) *FeeQuoterInterface_ParseDestChainConfigUpdated_Call { - return &FeeQuoterInterface_ParseDestChainConfigUpdated_Call{Call: _e.mock.On("ParseDestChainConfigUpdated", log)} -} - -func (_c *FeeQuoterInterface_ParseDestChainConfigUpdated_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseDestChainConfigUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseDestChainConfigUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterDestChainConfigUpdated, _a1 error) *FeeQuoterInterface_ParseDestChainConfigUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseDestChainConfigUpdated_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterDestChainConfigUpdated, error)) *FeeQuoterInterface_ParseDestChainConfigUpdated_Call { - _c.Call.Return(run) - return _c -} - -// ParseFeeTokenAdded provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseFeeTokenAdded(log types.Log) (*fee_quoter.FeeQuoterFeeTokenAdded, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseFeeTokenAdded") - } - - var r0 *fee_quoter.FeeQuoterFeeTokenAdded - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterFeeTokenAdded, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterFeeTokenAdded); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterFeeTokenAdded) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseFeeTokenAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseFeeTokenAdded' -type FeeQuoterInterface_ParseFeeTokenAdded_Call struct { - *mock.Call -} - -// ParseFeeTokenAdded is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseFeeTokenAdded(log interface{}) *FeeQuoterInterface_ParseFeeTokenAdded_Call { - return &FeeQuoterInterface_ParseFeeTokenAdded_Call{Call: _e.mock.On("ParseFeeTokenAdded", log)} -} - -func (_c *FeeQuoterInterface_ParseFeeTokenAdded_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseFeeTokenAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseFeeTokenAdded_Call) Return(_a0 *fee_quoter.FeeQuoterFeeTokenAdded, _a1 error) *FeeQuoterInterface_ParseFeeTokenAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseFeeTokenAdded_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterFeeTokenAdded, error)) *FeeQuoterInterface_ParseFeeTokenAdded_Call { - _c.Call.Return(run) - return _c -} - -// ParseFeeTokenRemoved provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseFeeTokenRemoved(log types.Log) (*fee_quoter.FeeQuoterFeeTokenRemoved, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseFeeTokenRemoved") - } - - var r0 *fee_quoter.FeeQuoterFeeTokenRemoved - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterFeeTokenRemoved, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterFeeTokenRemoved); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterFeeTokenRemoved) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseFeeTokenRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseFeeTokenRemoved' -type FeeQuoterInterface_ParseFeeTokenRemoved_Call struct { - *mock.Call -} - -// ParseFeeTokenRemoved is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseFeeTokenRemoved(log interface{}) *FeeQuoterInterface_ParseFeeTokenRemoved_Call { - return &FeeQuoterInterface_ParseFeeTokenRemoved_Call{Call: _e.mock.On("ParseFeeTokenRemoved", log)} -} - -func (_c *FeeQuoterInterface_ParseFeeTokenRemoved_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseFeeTokenRemoved_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseFeeTokenRemoved_Call) Return(_a0 *fee_quoter.FeeQuoterFeeTokenRemoved, _a1 error) *FeeQuoterInterface_ParseFeeTokenRemoved_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseFeeTokenRemoved_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterFeeTokenRemoved, error)) *FeeQuoterInterface_ParseFeeTokenRemoved_Call { - _c.Call.Return(run) - return _c -} - -// ParseLog provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseLog(log types.Log) (generated.AbigenLog, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseLog") - } - - var r0 generated.AbigenLog - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (generated.AbigenLog, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) generated.AbigenLog); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(generated.AbigenLog) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseLog' -type FeeQuoterInterface_ParseLog_Call struct { - *mock.Call -} - -// ParseLog is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseLog(log interface{}) *FeeQuoterInterface_ParseLog_Call { - return &FeeQuoterInterface_ParseLog_Call{Call: _e.mock.On("ParseLog", log)} -} - -func (_c *FeeQuoterInterface_ParseLog_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseLog_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseLog_Call) Return(_a0 generated.AbigenLog, _a1 error) *FeeQuoterInterface_ParseLog_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseLog_Call) RunAndReturn(run func(types.Log) (generated.AbigenLog, error)) *FeeQuoterInterface_ParseLog_Call { - _c.Call.Return(run) - return _c -} - -// ParseOwnershipTransferRequested provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseOwnershipTransferRequested(log types.Log) (*fee_quoter.FeeQuoterOwnershipTransferRequested, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseOwnershipTransferRequested") - } - - var r0 *fee_quoter.FeeQuoterOwnershipTransferRequested - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterOwnershipTransferRequested, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterOwnershipTransferRequested); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterOwnershipTransferRequested) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseOwnershipTransferRequested_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseOwnershipTransferRequested' -type FeeQuoterInterface_ParseOwnershipTransferRequested_Call struct { - *mock.Call -} - -// ParseOwnershipTransferRequested is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseOwnershipTransferRequested(log interface{}) *FeeQuoterInterface_ParseOwnershipTransferRequested_Call { - return &FeeQuoterInterface_ParseOwnershipTransferRequested_Call{Call: _e.mock.On("ParseOwnershipTransferRequested", log)} -} - -func (_c *FeeQuoterInterface_ParseOwnershipTransferRequested_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseOwnershipTransferRequested_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseOwnershipTransferRequested_Call) Return(_a0 *fee_quoter.FeeQuoterOwnershipTransferRequested, _a1 error) *FeeQuoterInterface_ParseOwnershipTransferRequested_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseOwnershipTransferRequested_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterOwnershipTransferRequested, error)) *FeeQuoterInterface_ParseOwnershipTransferRequested_Call { - _c.Call.Return(run) - return _c -} - -// ParseOwnershipTransferred provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseOwnershipTransferred(log types.Log) (*fee_quoter.FeeQuoterOwnershipTransferred, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseOwnershipTransferred") - } - - var r0 *fee_quoter.FeeQuoterOwnershipTransferred - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterOwnershipTransferred, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterOwnershipTransferred); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterOwnershipTransferred) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseOwnershipTransferred_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseOwnershipTransferred' -type FeeQuoterInterface_ParseOwnershipTransferred_Call struct { - *mock.Call -} - -// ParseOwnershipTransferred is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseOwnershipTransferred(log interface{}) *FeeQuoterInterface_ParseOwnershipTransferred_Call { - return &FeeQuoterInterface_ParseOwnershipTransferred_Call{Call: _e.mock.On("ParseOwnershipTransferred", log)} -} - -func (_c *FeeQuoterInterface_ParseOwnershipTransferred_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseOwnershipTransferred_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseOwnershipTransferred_Call) Return(_a0 *fee_quoter.FeeQuoterOwnershipTransferred, _a1 error) *FeeQuoterInterface_ParseOwnershipTransferred_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseOwnershipTransferred_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterOwnershipTransferred, error)) *FeeQuoterInterface_ParseOwnershipTransferred_Call { - _c.Call.Return(run) - return _c -} - -// ParsePremiumMultiplierWeiPerEthUpdated provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParsePremiumMultiplierWeiPerEthUpdated(log types.Log) (*fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParsePremiumMultiplierWeiPerEthUpdated") - } - - var r0 *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParsePremiumMultiplierWeiPerEthUpdated' -type FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call struct { - *mock.Call -} - -// ParsePremiumMultiplierWeiPerEthUpdated is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParsePremiumMultiplierWeiPerEthUpdated(log interface{}) *FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call { - return &FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call{Call: _e.mock.On("ParsePremiumMultiplierWeiPerEthUpdated", log)} -} - -func (_c *FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, _a1 error) *FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, error)) *FeeQuoterInterface_ParsePremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Return(run) - return _c -} - -// ParsePriceFeedPerTokenUpdated provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParsePriceFeedPerTokenUpdated(log types.Log) (*fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParsePriceFeedPerTokenUpdated") - } - - var r0 *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterPriceFeedPerTokenUpdated) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParsePriceFeedPerTokenUpdated' -type FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call struct { - *mock.Call -} - -// ParsePriceFeedPerTokenUpdated is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParsePriceFeedPerTokenUpdated(log interface{}) *FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call { - return &FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call{Call: _e.mock.On("ParsePriceFeedPerTokenUpdated", log)} -} - -func (_c *FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, _a1 error) *FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, error)) *FeeQuoterInterface_ParsePriceFeedPerTokenUpdated_Call { - _c.Call.Return(run) - return _c -} - -// ParseReportPermissionSet provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseReportPermissionSet(log types.Log) (*fee_quoter.FeeQuoterReportPermissionSet, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseReportPermissionSet") - } - - var r0 *fee_quoter.FeeQuoterReportPermissionSet - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterReportPermissionSet, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterReportPermissionSet); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterReportPermissionSet) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseReportPermissionSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseReportPermissionSet' -type FeeQuoterInterface_ParseReportPermissionSet_Call struct { - *mock.Call -} - -// ParseReportPermissionSet is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseReportPermissionSet(log interface{}) *FeeQuoterInterface_ParseReportPermissionSet_Call { - return &FeeQuoterInterface_ParseReportPermissionSet_Call{Call: _e.mock.On("ParseReportPermissionSet", log)} -} - -func (_c *FeeQuoterInterface_ParseReportPermissionSet_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseReportPermissionSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseReportPermissionSet_Call) Return(_a0 *fee_quoter.FeeQuoterReportPermissionSet, _a1 error) *FeeQuoterInterface_ParseReportPermissionSet_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseReportPermissionSet_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterReportPermissionSet, error)) *FeeQuoterInterface_ParseReportPermissionSet_Call { - _c.Call.Return(run) - return _c -} - -// ParseTokenTransferFeeConfigDeleted provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseTokenTransferFeeConfigDeleted(log types.Log) (*fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseTokenTransferFeeConfigDeleted") - } - - var r0 *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseTokenTransferFeeConfigDeleted' -type FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call struct { - *mock.Call -} - -// ParseTokenTransferFeeConfigDeleted is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseTokenTransferFeeConfigDeleted(log interface{}) *FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call { - return &FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call{Call: _e.mock.On("ParseTokenTransferFeeConfigDeleted", log)} -} - -func (_c *FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call) Return(_a0 *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, _a1 error) *FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, error)) *FeeQuoterInterface_ParseTokenTransferFeeConfigDeleted_Call { - _c.Call.Return(run) - return _c -} - -// ParseTokenTransferFeeConfigUpdated provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseTokenTransferFeeConfigUpdated(log types.Log) (*fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseTokenTransferFeeConfigUpdated") - } - - var r0 *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseTokenTransferFeeConfigUpdated' -type FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call struct { - *mock.Call -} - -// ParseTokenTransferFeeConfigUpdated is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseTokenTransferFeeConfigUpdated(log interface{}) *FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call { - return &FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call{Call: _e.mock.On("ParseTokenTransferFeeConfigUpdated", log)} -} - -func (_c *FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, _a1 error) *FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, error)) *FeeQuoterInterface_ParseTokenTransferFeeConfigUpdated_Call { - _c.Call.Return(run) - return _c -} - -// ParseUsdPerTokenUpdated provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseUsdPerTokenUpdated(log types.Log) (*fee_quoter.FeeQuoterUsdPerTokenUpdated, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseUsdPerTokenUpdated") - } - - var r0 *fee_quoter.FeeQuoterUsdPerTokenUpdated - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterUsdPerTokenUpdated, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterUsdPerTokenUpdated); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterUsdPerTokenUpdated) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseUsdPerTokenUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseUsdPerTokenUpdated' -type FeeQuoterInterface_ParseUsdPerTokenUpdated_Call struct { - *mock.Call -} - -// ParseUsdPerTokenUpdated is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseUsdPerTokenUpdated(log interface{}) *FeeQuoterInterface_ParseUsdPerTokenUpdated_Call { - return &FeeQuoterInterface_ParseUsdPerTokenUpdated_Call{Call: _e.mock.On("ParseUsdPerTokenUpdated", log)} -} - -func (_c *FeeQuoterInterface_ParseUsdPerTokenUpdated_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseUsdPerTokenUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseUsdPerTokenUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterUsdPerTokenUpdated, _a1 error) *FeeQuoterInterface_ParseUsdPerTokenUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseUsdPerTokenUpdated_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterUsdPerTokenUpdated, error)) *FeeQuoterInterface_ParseUsdPerTokenUpdated_Call { - _c.Call.Return(run) - return _c -} - -// ParseUsdPerUnitGasUpdated provides a mock function with given fields: log -func (_m *FeeQuoterInterface) ParseUsdPerUnitGasUpdated(log types.Log) (*fee_quoter.FeeQuoterUsdPerUnitGasUpdated, error) { - ret := _m.Called(log) - - if len(ret) == 0 { - panic("no return value specified for ParseUsdPerUnitGasUpdated") - } - - var r0 *fee_quoter.FeeQuoterUsdPerUnitGasUpdated - var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*fee_quoter.FeeQuoterUsdPerUnitGasUpdated, error)); ok { - return rf(log) - } - if rf, ok := ret.Get(0).(func(types.Log) *fee_quoter.FeeQuoterUsdPerUnitGasUpdated); ok { - r0 = rf(log) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*fee_quoter.FeeQuoterUsdPerUnitGasUpdated) - } - } - - if rf, ok := ret.Get(1).(func(types.Log) error); ok { - r1 = rf(log) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseUsdPerUnitGasUpdated' -type FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call struct { - *mock.Call -} - -// ParseUsdPerUnitGasUpdated is a helper method to define mock.On call -// - log types.Log -func (_e *FeeQuoterInterface_Expecter) ParseUsdPerUnitGasUpdated(log interface{}) *FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call { - return &FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call{Call: _e.mock.On("ParseUsdPerUnitGasUpdated", log)} -} - -func (_c *FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call) Run(run func(log types.Log)) *FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(types.Log)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call) Return(_a0 *fee_quoter.FeeQuoterUsdPerUnitGasUpdated, _a1 error) *FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call) RunAndReturn(run func(types.Log) (*fee_quoter.FeeQuoterUsdPerUnitGasUpdated, error)) *FeeQuoterInterface_ParseUsdPerUnitGasUpdated_Call { - _c.Call.Return(run) - return _c -} - -// ProcessMessageArgs provides a mock function with given fields: opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver -func (_m *FeeQuoterInterface) ProcessMessageArgs(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, messageReceiver []byte) (fee_quoter.ProcessMessageArgs, error) { - ret := _m.Called(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver) - - if len(ret) == 0 { - panic("no return value specified for ProcessMessageArgs") - } - - var r0 fee_quoter.ProcessMessageArgs - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte, []byte) (fee_quoter.ProcessMessageArgs, error)); ok { - return rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte, []byte) fee_quoter.ProcessMessageArgs); ok { - r0 = rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver) - } else { - r0 = ret.Get(0).(fee_quoter.ProcessMessageArgs) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte, []byte) error); ok { - r1 = rf(opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ProcessMessageArgs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessMessageArgs' -type FeeQuoterInterface_ProcessMessageArgs_Call struct { - *mock.Call -} - -// ProcessMessageArgs is a helper method to define mock.On call -// - opts *bind.CallOpts -// - destChainSelector uint64 -// - feeToken common.Address -// - feeTokenAmount *big.Int -// - extraArgs []byte -// - messageReceiver []byte -func (_e *FeeQuoterInterface_Expecter) ProcessMessageArgs(opts interface{}, destChainSelector interface{}, feeToken interface{}, feeTokenAmount interface{}, extraArgs interface{}, messageReceiver interface{}) *FeeQuoterInterface_ProcessMessageArgs_Call { - return &FeeQuoterInterface_ProcessMessageArgs_Call{Call: _e.mock.On("ProcessMessageArgs", opts, destChainSelector, feeToken, feeTokenAmount, extraArgs, messageReceiver)} -} - -func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64, feeToken common.Address, feeTokenAmount *big.Int, extraArgs []byte, messageReceiver []byte)) *FeeQuoterInterface_ProcessMessageArgs_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(uint64), args[2].(common.Address), args[3].(*big.Int), args[4].([]byte), args[5].([]byte)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) Return(_a0 fee_quoter.ProcessMessageArgs, _a1 error) *FeeQuoterInterface_ProcessMessageArgs_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ProcessMessageArgs_Call) RunAndReturn(run func(*bind.CallOpts, uint64, common.Address, *big.Int, []byte, []byte) (fee_quoter.ProcessMessageArgs, error)) *FeeQuoterInterface_ProcessMessageArgs_Call { - _c.Call.Return(run) - return _c -} - -// ProcessPoolReturnData provides a mock function with given fields: opts, destChainSelector, onRampTokenTransfers, sourceTokenAmounts -func (_m *FeeQuoterInterface) ProcessPoolReturnData(opts *bind.CallOpts, destChainSelector uint64, onRampTokenTransfers []fee_quoter.InternalEVM2AnyTokenTransfer, sourceTokenAmounts []fee_quoter.ClientEVMTokenAmount) ([][]byte, error) { - ret := _m.Called(opts, destChainSelector, onRampTokenTransfers, sourceTokenAmounts) - - if len(ret) == 0 { - panic("no return value specified for ProcessPoolReturnData") - } - - var r0 [][]byte - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, []fee_quoter.InternalEVM2AnyTokenTransfer, []fee_quoter.ClientEVMTokenAmount) ([][]byte, error)); ok { - return rf(opts, destChainSelector, onRampTokenTransfers, sourceTokenAmounts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint64, []fee_quoter.InternalEVM2AnyTokenTransfer, []fee_quoter.ClientEVMTokenAmount) [][]byte); ok { - r0 = rf(opts, destChainSelector, onRampTokenTransfers, sourceTokenAmounts) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([][]byte) - } - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint64, []fee_quoter.InternalEVM2AnyTokenTransfer, []fee_quoter.ClientEVMTokenAmount) error); ok { - r1 = rf(opts, destChainSelector, onRampTokenTransfers, sourceTokenAmounts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_ProcessPoolReturnData_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ProcessPoolReturnData' -type FeeQuoterInterface_ProcessPoolReturnData_Call struct { - *mock.Call -} - -// ProcessPoolReturnData is a helper method to define mock.On call -// - opts *bind.CallOpts -// - destChainSelector uint64 -// - onRampTokenTransfers []fee_quoter.InternalEVM2AnyTokenTransfer -// - sourceTokenAmounts []fee_quoter.ClientEVMTokenAmount -func (_e *FeeQuoterInterface_Expecter) ProcessPoolReturnData(opts interface{}, destChainSelector interface{}, onRampTokenTransfers interface{}, sourceTokenAmounts interface{}) *FeeQuoterInterface_ProcessPoolReturnData_Call { - return &FeeQuoterInterface_ProcessPoolReturnData_Call{Call: _e.mock.On("ProcessPoolReturnData", opts, destChainSelector, onRampTokenTransfers, sourceTokenAmounts)} -} - -func (_c *FeeQuoterInterface_ProcessPoolReturnData_Call) Run(run func(opts *bind.CallOpts, destChainSelector uint64, onRampTokenTransfers []fee_quoter.InternalEVM2AnyTokenTransfer, sourceTokenAmounts []fee_quoter.ClientEVMTokenAmount)) *FeeQuoterInterface_ProcessPoolReturnData_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(uint64), args[2].([]fee_quoter.InternalEVM2AnyTokenTransfer), args[3].([]fee_quoter.ClientEVMTokenAmount)) - }) - return _c -} - -func (_c *FeeQuoterInterface_ProcessPoolReturnData_Call) Return(_a0 [][]byte, _a1 error) *FeeQuoterInterface_ProcessPoolReturnData_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_ProcessPoolReturnData_Call) RunAndReturn(run func(*bind.CallOpts, uint64, []fee_quoter.InternalEVM2AnyTokenTransfer, []fee_quoter.ClientEVMTokenAmount) ([][]byte, error)) *FeeQuoterInterface_ProcessPoolReturnData_Call { - _c.Call.Return(run) - return _c -} - -// SetReportPermissions provides a mock function with given fields: opts, permissions -func (_m *FeeQuoterInterface) SetReportPermissions(opts *bind.TransactOpts, permissions []fee_quoter.KeystoneFeedsPermissionHandlerPermission) (*types.Transaction, error) { - ret := _m.Called(opts, permissions) - - if len(ret) == 0 { - panic("no return value specified for SetReportPermissions") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.KeystoneFeedsPermissionHandlerPermission) (*types.Transaction, error)); ok { - return rf(opts, permissions) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.KeystoneFeedsPermissionHandlerPermission) *types.Transaction); ok { - r0 = rf(opts, permissions) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []fee_quoter.KeystoneFeedsPermissionHandlerPermission) error); ok { - r1 = rf(opts, permissions) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_SetReportPermissions_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SetReportPermissions' -type FeeQuoterInterface_SetReportPermissions_Call struct { - *mock.Call -} - -// SetReportPermissions is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - permissions []fee_quoter.KeystoneFeedsPermissionHandlerPermission -func (_e *FeeQuoterInterface_Expecter) SetReportPermissions(opts interface{}, permissions interface{}) *FeeQuoterInterface_SetReportPermissions_Call { - return &FeeQuoterInterface_SetReportPermissions_Call{Call: _e.mock.On("SetReportPermissions", opts, permissions)} -} - -func (_c *FeeQuoterInterface_SetReportPermissions_Call) Run(run func(opts *bind.TransactOpts, permissions []fee_quoter.KeystoneFeedsPermissionHandlerPermission)) *FeeQuoterInterface_SetReportPermissions_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].([]fee_quoter.KeystoneFeedsPermissionHandlerPermission)) - }) - return _c -} - -func (_c *FeeQuoterInterface_SetReportPermissions_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_SetReportPermissions_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_SetReportPermissions_Call) RunAndReturn(run func(*bind.TransactOpts, []fee_quoter.KeystoneFeedsPermissionHandlerPermission) (*types.Transaction, error)) *FeeQuoterInterface_SetReportPermissions_Call { - _c.Call.Return(run) - return _c -} - -// SupportsInterface provides a mock function with given fields: opts, interfaceId -func (_m *FeeQuoterInterface) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { - ret := _m.Called(opts, interfaceId) - - if len(ret) == 0 { - panic("no return value specified for SupportsInterface") - } - - var r0 bool - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, [4]byte) (bool, error)); ok { - return rf(opts, interfaceId) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts, [4]byte) bool); ok { - r0 = rf(opts, interfaceId) - } else { - r0 = ret.Get(0).(bool) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts, [4]byte) error); ok { - r1 = rf(opts, interfaceId) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_SupportsInterface_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'SupportsInterface' -type FeeQuoterInterface_SupportsInterface_Call struct { - *mock.Call -} - -// SupportsInterface is a helper method to define mock.On call -// - opts *bind.CallOpts -// - interfaceId [4]byte -func (_e *FeeQuoterInterface_Expecter) SupportsInterface(opts interface{}, interfaceId interface{}) *FeeQuoterInterface_SupportsInterface_Call { - return &FeeQuoterInterface_SupportsInterface_Call{Call: _e.mock.On("SupportsInterface", opts, interfaceId)} -} - -func (_c *FeeQuoterInterface_SupportsInterface_Call) Run(run func(opts *bind.CallOpts, interfaceId [4]byte)) *FeeQuoterInterface_SupportsInterface_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].([4]byte)) - }) - return _c -} - -func (_c *FeeQuoterInterface_SupportsInterface_Call) Return(_a0 bool, _a1 error) *FeeQuoterInterface_SupportsInterface_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_SupportsInterface_Call) RunAndReturn(run func(*bind.CallOpts, [4]byte) (bool, error)) *FeeQuoterInterface_SupportsInterface_Call { - _c.Call.Return(run) - return _c -} - -// TransferOwnership provides a mock function with given fields: opts, to -func (_m *FeeQuoterInterface) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { - ret := _m.Called(opts, to) - - if len(ret) == 0 { - panic("no return value specified for TransferOwnership") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, common.Address) (*types.Transaction, error)); ok { - return rf(opts, to) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, common.Address) *types.Transaction); ok { - r0 = rf(opts, to) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, common.Address) error); ok { - r1 = rf(opts, to) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_TransferOwnership_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransferOwnership' -type FeeQuoterInterface_TransferOwnership_Call struct { - *mock.Call -} - -// TransferOwnership is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - to common.Address -func (_e *FeeQuoterInterface_Expecter) TransferOwnership(opts interface{}, to interface{}) *FeeQuoterInterface_TransferOwnership_Call { - return &FeeQuoterInterface_TransferOwnership_Call{Call: _e.mock.On("TransferOwnership", opts, to)} -} - -func (_c *FeeQuoterInterface_TransferOwnership_Call) Run(run func(opts *bind.TransactOpts, to common.Address)) *FeeQuoterInterface_TransferOwnership_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].(common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_TransferOwnership_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_TransferOwnership_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_TransferOwnership_Call) RunAndReturn(run func(*bind.TransactOpts, common.Address) (*types.Transaction, error)) *FeeQuoterInterface_TransferOwnership_Call { - _c.Call.Return(run) - return _c -} - -// TypeAndVersion provides a mock function with given fields: opts -func (_m *FeeQuoterInterface) TypeAndVersion(opts *bind.CallOpts) (string, error) { - ret := _m.Called(opts) - - if len(ret) == 0 { - panic("no return value specified for TypeAndVersion") - } - - var r0 string - var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (string, error)); ok { - return rf(opts) - } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) string); ok { - r0 = rf(opts) - } else { - r0 = ret.Get(0).(string) - } - - if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { - r1 = rf(opts) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_TypeAndVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TypeAndVersion' -type FeeQuoterInterface_TypeAndVersion_Call struct { - *mock.Call -} - -// TypeAndVersion is a helper method to define mock.On call -// - opts *bind.CallOpts -func (_e *FeeQuoterInterface_Expecter) TypeAndVersion(opts interface{}) *FeeQuoterInterface_TypeAndVersion_Call { - return &FeeQuoterInterface_TypeAndVersion_Call{Call: _e.mock.On("TypeAndVersion", opts)} -} - -func (_c *FeeQuoterInterface_TypeAndVersion_Call) Run(run func(opts *bind.CallOpts)) *FeeQuoterInterface_TypeAndVersion_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts)) - }) - return _c -} - -func (_c *FeeQuoterInterface_TypeAndVersion_Call) Return(_a0 string, _a1 error) *FeeQuoterInterface_TypeAndVersion_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_TypeAndVersion_Call) RunAndReturn(run func(*bind.CallOpts) (string, error)) *FeeQuoterInterface_TypeAndVersion_Call { - _c.Call.Return(run) - return _c -} - -// UpdatePrices provides a mock function with given fields: opts, priceUpdates -func (_m *FeeQuoterInterface) UpdatePrices(opts *bind.TransactOpts, priceUpdates fee_quoter.InternalPriceUpdates) (*types.Transaction, error) { - ret := _m.Called(opts, priceUpdates) - - if len(ret) == 0 { - panic("no return value specified for UpdatePrices") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, fee_quoter.InternalPriceUpdates) (*types.Transaction, error)); ok { - return rf(opts, priceUpdates) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, fee_quoter.InternalPriceUpdates) *types.Transaction); ok { - r0 = rf(opts, priceUpdates) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, fee_quoter.InternalPriceUpdates) error); ok { - r1 = rf(opts, priceUpdates) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_UpdatePrices_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdatePrices' -type FeeQuoterInterface_UpdatePrices_Call struct { - *mock.Call -} - -// UpdatePrices is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - priceUpdates fee_quoter.InternalPriceUpdates -func (_e *FeeQuoterInterface_Expecter) UpdatePrices(opts interface{}, priceUpdates interface{}) *FeeQuoterInterface_UpdatePrices_Call { - return &FeeQuoterInterface_UpdatePrices_Call{Call: _e.mock.On("UpdatePrices", opts, priceUpdates)} -} - -func (_c *FeeQuoterInterface_UpdatePrices_Call) Run(run func(opts *bind.TransactOpts, priceUpdates fee_quoter.InternalPriceUpdates)) *FeeQuoterInterface_UpdatePrices_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].(fee_quoter.InternalPriceUpdates)) - }) - return _c -} - -func (_c *FeeQuoterInterface_UpdatePrices_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_UpdatePrices_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_UpdatePrices_Call) RunAndReturn(run func(*bind.TransactOpts, fee_quoter.InternalPriceUpdates) (*types.Transaction, error)) *FeeQuoterInterface_UpdatePrices_Call { - _c.Call.Return(run) - return _c -} - -// UpdateTokenPriceFeeds provides a mock function with given fields: opts, tokenPriceFeedUpdates -func (_m *FeeQuoterInterface) UpdateTokenPriceFeeds(opts *bind.TransactOpts, tokenPriceFeedUpdates []fee_quoter.FeeQuoterTokenPriceFeedUpdate) (*types.Transaction, error) { - ret := _m.Called(opts, tokenPriceFeedUpdates) - - if len(ret) == 0 { - panic("no return value specified for UpdateTokenPriceFeeds") - } - - var r0 *types.Transaction - var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterTokenPriceFeedUpdate) (*types.Transaction, error)); ok { - return rf(opts, tokenPriceFeedUpdates) - } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterTokenPriceFeedUpdate) *types.Transaction); ok { - r0 = rf(opts, tokenPriceFeedUpdates) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*types.Transaction) - } - } - - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []fee_quoter.FeeQuoterTokenPriceFeedUpdate) error); ok { - r1 = rf(opts, tokenPriceFeedUpdates) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_UpdateTokenPriceFeeds_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateTokenPriceFeeds' -type FeeQuoterInterface_UpdateTokenPriceFeeds_Call struct { - *mock.Call -} - -// UpdateTokenPriceFeeds is a helper method to define mock.On call -// - opts *bind.TransactOpts -// - tokenPriceFeedUpdates []fee_quoter.FeeQuoterTokenPriceFeedUpdate -func (_e *FeeQuoterInterface_Expecter) UpdateTokenPriceFeeds(opts interface{}, tokenPriceFeedUpdates interface{}) *FeeQuoterInterface_UpdateTokenPriceFeeds_Call { - return &FeeQuoterInterface_UpdateTokenPriceFeeds_Call{Call: _e.mock.On("UpdateTokenPriceFeeds", opts, tokenPriceFeedUpdates)} -} - -func (_c *FeeQuoterInterface_UpdateTokenPriceFeeds_Call) Run(run func(opts *bind.TransactOpts, tokenPriceFeedUpdates []fee_quoter.FeeQuoterTokenPriceFeedUpdate)) *FeeQuoterInterface_UpdateTokenPriceFeeds_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].([]fee_quoter.FeeQuoterTokenPriceFeedUpdate)) - }) - return _c -} - -func (_c *FeeQuoterInterface_UpdateTokenPriceFeeds_Call) Return(_a0 *types.Transaction, _a1 error) *FeeQuoterInterface_UpdateTokenPriceFeeds_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_UpdateTokenPriceFeeds_Call) RunAndReturn(run func(*bind.TransactOpts, []fee_quoter.FeeQuoterTokenPriceFeedUpdate) (*types.Transaction, error)) *FeeQuoterInterface_UpdateTokenPriceFeeds_Call { - _c.Call.Return(run) - return _c -} - -// WatchAuthorizedCallerAdded provides a mock function with given fields: opts, sink -func (_m *FeeQuoterInterface) WatchAuthorizedCallerAdded(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterAuthorizedCallerAdded) (event.Subscription, error) { - ret := _m.Called(opts, sink) - - if len(ret) == 0 { - panic("no return value specified for WatchAuthorizedCallerAdded") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterAuthorizedCallerAdded) (event.Subscription, error)); ok { - return rf(opts, sink) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterAuthorizedCallerAdded) event.Subscription); ok { - r0 = rf(opts, sink) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterAuthorizedCallerAdded) error); ok { - r1 = rf(opts, sink) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchAuthorizedCallerAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchAuthorizedCallerAdded' -type FeeQuoterInterface_WatchAuthorizedCallerAdded_Call struct { - *mock.Call -} - -// WatchAuthorizedCallerAdded is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterAuthorizedCallerAdded -func (_e *FeeQuoterInterface_Expecter) WatchAuthorizedCallerAdded(opts interface{}, sink interface{}) *FeeQuoterInterface_WatchAuthorizedCallerAdded_Call { - return &FeeQuoterInterface_WatchAuthorizedCallerAdded_Call{Call: _e.mock.On("WatchAuthorizedCallerAdded", opts, sink)} -} - -func (_c *FeeQuoterInterface_WatchAuthorizedCallerAdded_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterAuthorizedCallerAdded)) *FeeQuoterInterface_WatchAuthorizedCallerAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterAuthorizedCallerAdded)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchAuthorizedCallerAdded_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchAuthorizedCallerAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchAuthorizedCallerAdded_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterAuthorizedCallerAdded) (event.Subscription, error)) *FeeQuoterInterface_WatchAuthorizedCallerAdded_Call { - _c.Call.Return(run) - return _c -} - -// WatchAuthorizedCallerRemoved provides a mock function with given fields: opts, sink -func (_m *FeeQuoterInterface) WatchAuthorizedCallerRemoved(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterAuthorizedCallerRemoved) (event.Subscription, error) { - ret := _m.Called(opts, sink) - - if len(ret) == 0 { - panic("no return value specified for WatchAuthorizedCallerRemoved") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterAuthorizedCallerRemoved) (event.Subscription, error)); ok { - return rf(opts, sink) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterAuthorizedCallerRemoved) event.Subscription); ok { - r0 = rf(opts, sink) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterAuthorizedCallerRemoved) error); ok { - r1 = rf(opts, sink) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchAuthorizedCallerRemoved' -type FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call struct { - *mock.Call -} - -// WatchAuthorizedCallerRemoved is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterAuthorizedCallerRemoved -func (_e *FeeQuoterInterface_Expecter) WatchAuthorizedCallerRemoved(opts interface{}, sink interface{}) *FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call { - return &FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call{Call: _e.mock.On("WatchAuthorizedCallerRemoved", opts, sink)} -} - -func (_c *FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterAuthorizedCallerRemoved)) *FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterAuthorizedCallerRemoved)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterAuthorizedCallerRemoved) (event.Subscription, error)) *FeeQuoterInterface_WatchAuthorizedCallerRemoved_Call { - _c.Call.Return(run) - return _c -} - -// WatchDestChainAdded provides a mock function with given fields: opts, sink, destChainSelector -func (_m *FeeQuoterInterface) WatchDestChainAdded(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterDestChainAdded, destChainSelector []uint64) (event.Subscription, error) { - ret := _m.Called(opts, sink, destChainSelector) - - if len(ret) == 0 { - panic("no return value specified for WatchDestChainAdded") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterDestChainAdded, []uint64) (event.Subscription, error)); ok { - return rf(opts, sink, destChainSelector) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterDestChainAdded, []uint64) event.Subscription); ok { - r0 = rf(opts, sink, destChainSelector) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterDestChainAdded, []uint64) error); ok { - r1 = rf(opts, sink, destChainSelector) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchDestChainAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchDestChainAdded' -type FeeQuoterInterface_WatchDestChainAdded_Call struct { - *mock.Call -} - -// WatchDestChainAdded is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterDestChainAdded -// - destChainSelector []uint64 -func (_e *FeeQuoterInterface_Expecter) WatchDestChainAdded(opts interface{}, sink interface{}, destChainSelector interface{}) *FeeQuoterInterface_WatchDestChainAdded_Call { - return &FeeQuoterInterface_WatchDestChainAdded_Call{Call: _e.mock.On("WatchDestChainAdded", opts, sink, destChainSelector)} -} - -func (_c *FeeQuoterInterface_WatchDestChainAdded_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterDestChainAdded, destChainSelector []uint64)) *FeeQuoterInterface_WatchDestChainAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterDestChainAdded), args[2].([]uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchDestChainAdded_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchDestChainAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchDestChainAdded_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterDestChainAdded, []uint64) (event.Subscription, error)) *FeeQuoterInterface_WatchDestChainAdded_Call { - _c.Call.Return(run) - return _c -} - -// WatchDestChainConfigUpdated provides a mock function with given fields: opts, sink, destChainSelector -func (_m *FeeQuoterInterface) WatchDestChainConfigUpdated(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterDestChainConfigUpdated, destChainSelector []uint64) (event.Subscription, error) { - ret := _m.Called(opts, sink, destChainSelector) - - if len(ret) == 0 { - panic("no return value specified for WatchDestChainConfigUpdated") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterDestChainConfigUpdated, []uint64) (event.Subscription, error)); ok { - return rf(opts, sink, destChainSelector) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterDestChainConfigUpdated, []uint64) event.Subscription); ok { - r0 = rf(opts, sink, destChainSelector) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterDestChainConfigUpdated, []uint64) error); ok { - r1 = rf(opts, sink, destChainSelector) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchDestChainConfigUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchDestChainConfigUpdated' -type FeeQuoterInterface_WatchDestChainConfigUpdated_Call struct { - *mock.Call -} - -// WatchDestChainConfigUpdated is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterDestChainConfigUpdated -// - destChainSelector []uint64 -func (_e *FeeQuoterInterface_Expecter) WatchDestChainConfigUpdated(opts interface{}, sink interface{}, destChainSelector interface{}) *FeeQuoterInterface_WatchDestChainConfigUpdated_Call { - return &FeeQuoterInterface_WatchDestChainConfigUpdated_Call{Call: _e.mock.On("WatchDestChainConfigUpdated", opts, sink, destChainSelector)} -} - -func (_c *FeeQuoterInterface_WatchDestChainConfigUpdated_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterDestChainConfigUpdated, destChainSelector []uint64)) *FeeQuoterInterface_WatchDestChainConfigUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterDestChainConfigUpdated), args[2].([]uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchDestChainConfigUpdated_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchDestChainConfigUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchDestChainConfigUpdated_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterDestChainConfigUpdated, []uint64) (event.Subscription, error)) *FeeQuoterInterface_WatchDestChainConfigUpdated_Call { - _c.Call.Return(run) - return _c -} - -// WatchFeeTokenAdded provides a mock function with given fields: opts, sink, feeToken -func (_m *FeeQuoterInterface) WatchFeeTokenAdded(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterFeeTokenAdded, feeToken []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, feeToken) - - if len(ret) == 0 { - panic("no return value specified for WatchFeeTokenAdded") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterFeeTokenAdded, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, feeToken) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterFeeTokenAdded, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, feeToken) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterFeeTokenAdded, []common.Address) error); ok { - r1 = rf(opts, sink, feeToken) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchFeeTokenAdded_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchFeeTokenAdded' -type FeeQuoterInterface_WatchFeeTokenAdded_Call struct { - *mock.Call -} - -// WatchFeeTokenAdded is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterFeeTokenAdded -// - feeToken []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchFeeTokenAdded(opts interface{}, sink interface{}, feeToken interface{}) *FeeQuoterInterface_WatchFeeTokenAdded_Call { - return &FeeQuoterInterface_WatchFeeTokenAdded_Call{Call: _e.mock.On("WatchFeeTokenAdded", opts, sink, feeToken)} -} - -func (_c *FeeQuoterInterface_WatchFeeTokenAdded_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterFeeTokenAdded, feeToken []common.Address)) *FeeQuoterInterface_WatchFeeTokenAdded_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterFeeTokenAdded), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchFeeTokenAdded_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchFeeTokenAdded_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchFeeTokenAdded_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterFeeTokenAdded, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchFeeTokenAdded_Call { - _c.Call.Return(run) - return _c -} - -// WatchFeeTokenRemoved provides a mock function with given fields: opts, sink, feeToken -func (_m *FeeQuoterInterface) WatchFeeTokenRemoved(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterFeeTokenRemoved, feeToken []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, feeToken) - - if len(ret) == 0 { - panic("no return value specified for WatchFeeTokenRemoved") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterFeeTokenRemoved, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, feeToken) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterFeeTokenRemoved, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, feeToken) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterFeeTokenRemoved, []common.Address) error); ok { - r1 = rf(opts, sink, feeToken) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchFeeTokenRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchFeeTokenRemoved' -type FeeQuoterInterface_WatchFeeTokenRemoved_Call struct { - *mock.Call -} - -// WatchFeeTokenRemoved is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterFeeTokenRemoved -// - feeToken []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchFeeTokenRemoved(opts interface{}, sink interface{}, feeToken interface{}) *FeeQuoterInterface_WatchFeeTokenRemoved_Call { - return &FeeQuoterInterface_WatchFeeTokenRemoved_Call{Call: _e.mock.On("WatchFeeTokenRemoved", opts, sink, feeToken)} -} - -func (_c *FeeQuoterInterface_WatchFeeTokenRemoved_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterFeeTokenRemoved, feeToken []common.Address)) *FeeQuoterInterface_WatchFeeTokenRemoved_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterFeeTokenRemoved), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchFeeTokenRemoved_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchFeeTokenRemoved_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchFeeTokenRemoved_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterFeeTokenRemoved, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchFeeTokenRemoved_Call { - _c.Call.Return(run) - return _c -} - -// WatchOwnershipTransferRequested provides a mock function with given fields: opts, sink, from, to -func (_m *FeeQuoterInterface) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, from, to) - - if len(ret) == 0 { - panic("no return value specified for WatchOwnershipTransferRequested") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterOwnershipTransferRequested, []common.Address, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, from, to) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterOwnershipTransferRequested, []common.Address, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, from, to) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterOwnershipTransferRequested, []common.Address, []common.Address) error); ok { - r1 = rf(opts, sink, from, to) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchOwnershipTransferRequested_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchOwnershipTransferRequested' -type FeeQuoterInterface_WatchOwnershipTransferRequested_Call struct { - *mock.Call -} - -// WatchOwnershipTransferRequested is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterOwnershipTransferRequested -// - from []common.Address -// - to []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchOwnershipTransferRequested(opts interface{}, sink interface{}, from interface{}, to interface{}) *FeeQuoterInterface_WatchOwnershipTransferRequested_Call { - return &FeeQuoterInterface_WatchOwnershipTransferRequested_Call{Call: _e.mock.On("WatchOwnershipTransferRequested", opts, sink, from, to)} -} - -func (_c *FeeQuoterInterface_WatchOwnershipTransferRequested_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterOwnershipTransferRequested, from []common.Address, to []common.Address)) *FeeQuoterInterface_WatchOwnershipTransferRequested_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterOwnershipTransferRequested), args[2].([]common.Address), args[3].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchOwnershipTransferRequested_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchOwnershipTransferRequested_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchOwnershipTransferRequested_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterOwnershipTransferRequested, []common.Address, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchOwnershipTransferRequested_Call { - _c.Call.Return(run) - return _c -} - -// WatchOwnershipTransferred provides a mock function with given fields: opts, sink, from, to -func (_m *FeeQuoterInterface) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, from, to) - - if len(ret) == 0 { - panic("no return value specified for WatchOwnershipTransferred") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterOwnershipTransferred, []common.Address, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, from, to) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterOwnershipTransferred, []common.Address, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, from, to) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterOwnershipTransferred, []common.Address, []common.Address) error); ok { - r1 = rf(opts, sink, from, to) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchOwnershipTransferred_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchOwnershipTransferred' -type FeeQuoterInterface_WatchOwnershipTransferred_Call struct { - *mock.Call -} - -// WatchOwnershipTransferred is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterOwnershipTransferred -// - from []common.Address -// - to []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchOwnershipTransferred(opts interface{}, sink interface{}, from interface{}, to interface{}) *FeeQuoterInterface_WatchOwnershipTransferred_Call { - return &FeeQuoterInterface_WatchOwnershipTransferred_Call{Call: _e.mock.On("WatchOwnershipTransferred", opts, sink, from, to)} -} - -func (_c *FeeQuoterInterface_WatchOwnershipTransferred_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterOwnershipTransferred, from []common.Address, to []common.Address)) *FeeQuoterInterface_WatchOwnershipTransferred_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterOwnershipTransferred), args[2].([]common.Address), args[3].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchOwnershipTransferred_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchOwnershipTransferred_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchOwnershipTransferred_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterOwnershipTransferred, []common.Address, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchOwnershipTransferred_Call { - _c.Call.Return(run) - return _c -} - -// WatchPremiumMultiplierWeiPerEthUpdated provides a mock function with given fields: opts, sink, token -func (_m *FeeQuoterInterface) WatchPremiumMultiplierWeiPerEthUpdated(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, token []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, token) - - if len(ret) == 0 { - panic("no return value specified for WatchPremiumMultiplierWeiPerEthUpdated") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, token) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, []common.Address) error); ok { - r1 = rf(opts, sink, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchPremiumMultiplierWeiPerEthUpdated' -type FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call struct { - *mock.Call -} - -// WatchPremiumMultiplierWeiPerEthUpdated is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchPremiumMultiplierWeiPerEthUpdated(opts interface{}, sink interface{}, token interface{}) *FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call { - return &FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call{Call: _e.mock.On("WatchPremiumMultiplierWeiPerEthUpdated", opts, sink, token)} -} - -func (_c *FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, token []common.Address)) *FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterPremiumMultiplierWeiPerEthUpdated, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchPremiumMultiplierWeiPerEthUpdated_Call { - _c.Call.Return(run) - return _c -} - -// WatchPriceFeedPerTokenUpdated provides a mock function with given fields: opts, sink, token -func (_m *FeeQuoterInterface) WatchPriceFeedPerTokenUpdated(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, token []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, token) - - if len(ret) == 0 { - panic("no return value specified for WatchPriceFeedPerTokenUpdated") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, token) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, []common.Address) error); ok { - r1 = rf(opts, sink, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchPriceFeedPerTokenUpdated' -type FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call struct { - *mock.Call -} - -// WatchPriceFeedPerTokenUpdated is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchPriceFeedPerTokenUpdated(opts interface{}, sink interface{}, token interface{}) *FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call { - return &FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call{Call: _e.mock.On("WatchPriceFeedPerTokenUpdated", opts, sink, token)} -} - -func (_c *FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, token []common.Address)) *FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterPriceFeedPerTokenUpdated, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchPriceFeedPerTokenUpdated_Call { - _c.Call.Return(run) - return _c -} - -// WatchReportPermissionSet provides a mock function with given fields: opts, sink, reportId -func (_m *FeeQuoterInterface) WatchReportPermissionSet(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterReportPermissionSet, reportId [][32]byte) (event.Subscription, error) { - ret := _m.Called(opts, sink, reportId) - - if len(ret) == 0 { - panic("no return value specified for WatchReportPermissionSet") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterReportPermissionSet, [][32]byte) (event.Subscription, error)); ok { - return rf(opts, sink, reportId) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterReportPermissionSet, [][32]byte) event.Subscription); ok { - r0 = rf(opts, sink, reportId) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterReportPermissionSet, [][32]byte) error); ok { - r1 = rf(opts, sink, reportId) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchReportPermissionSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchReportPermissionSet' -type FeeQuoterInterface_WatchReportPermissionSet_Call struct { - *mock.Call -} - -// WatchReportPermissionSet is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterReportPermissionSet -// - reportId [][32]byte -func (_e *FeeQuoterInterface_Expecter) WatchReportPermissionSet(opts interface{}, sink interface{}, reportId interface{}) *FeeQuoterInterface_WatchReportPermissionSet_Call { - return &FeeQuoterInterface_WatchReportPermissionSet_Call{Call: _e.mock.On("WatchReportPermissionSet", opts, sink, reportId)} -} - -func (_c *FeeQuoterInterface_WatchReportPermissionSet_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterReportPermissionSet, reportId [][32]byte)) *FeeQuoterInterface_WatchReportPermissionSet_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterReportPermissionSet), args[2].([][32]byte)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchReportPermissionSet_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchReportPermissionSet_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchReportPermissionSet_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterReportPermissionSet, [][32]byte) (event.Subscription, error)) *FeeQuoterInterface_WatchReportPermissionSet_Call { - _c.Call.Return(run) - return _c -} - -// WatchTokenTransferFeeConfigDeleted provides a mock function with given fields: opts, sink, destChainSelector, token -func (_m *FeeQuoterInterface) WatchTokenTransferFeeConfigDeleted(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, destChainSelector []uint64, token []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, destChainSelector, token) - - if len(ret) == 0 { - panic("no return value specified for WatchTokenTransferFeeConfigDeleted") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, []uint64, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, destChainSelector, token) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, []uint64, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, destChainSelector, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, []uint64, []common.Address) error); ok { - r1 = rf(opts, sink, destChainSelector, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchTokenTransferFeeConfigDeleted' -type FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call struct { - *mock.Call -} - -// WatchTokenTransferFeeConfigDeleted is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted -// - destChainSelector []uint64 -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchTokenTransferFeeConfigDeleted(opts interface{}, sink interface{}, destChainSelector interface{}, token interface{}) *FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call { - return &FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call{Call: _e.mock.On("WatchTokenTransferFeeConfigDeleted", opts, sink, destChainSelector, token)} -} - -func (_c *FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, destChainSelector []uint64, token []common.Address)) *FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted), args[2].([]uint64), args[3].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigDeleted, []uint64, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchTokenTransferFeeConfigDeleted_Call { - _c.Call.Return(run) - return _c -} - -// WatchTokenTransferFeeConfigUpdated provides a mock function with given fields: opts, sink, destChainSelector, token -func (_m *FeeQuoterInterface) WatchTokenTransferFeeConfigUpdated(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, destChainSelector []uint64, token []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, destChainSelector, token) - - if len(ret) == 0 { - panic("no return value specified for WatchTokenTransferFeeConfigUpdated") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, []uint64, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, destChainSelector, token) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, []uint64, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, destChainSelector, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, []uint64, []common.Address) error); ok { - r1 = rf(opts, sink, destChainSelector, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchTokenTransferFeeConfigUpdated' -type FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call struct { - *mock.Call -} - -// WatchTokenTransferFeeConfigUpdated is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated -// - destChainSelector []uint64 -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchTokenTransferFeeConfigUpdated(opts interface{}, sink interface{}, destChainSelector interface{}, token interface{}) *FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call { - return &FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call{Call: _e.mock.On("WatchTokenTransferFeeConfigUpdated", opts, sink, destChainSelector, token)} -} - -func (_c *FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, destChainSelector []uint64, token []common.Address)) *FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated), args[2].([]uint64), args[3].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterTokenTransferFeeConfigUpdated, []uint64, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchTokenTransferFeeConfigUpdated_Call { - _c.Call.Return(run) - return _c -} - -// WatchUsdPerTokenUpdated provides a mock function with given fields: opts, sink, token -func (_m *FeeQuoterInterface) WatchUsdPerTokenUpdated(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterUsdPerTokenUpdated, token []common.Address) (event.Subscription, error) { - ret := _m.Called(opts, sink, token) - - if len(ret) == 0 { - panic("no return value specified for WatchUsdPerTokenUpdated") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterUsdPerTokenUpdated, []common.Address) (event.Subscription, error)); ok { - return rf(opts, sink, token) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterUsdPerTokenUpdated, []common.Address) event.Subscription); ok { - r0 = rf(opts, sink, token) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterUsdPerTokenUpdated, []common.Address) error); ok { - r1 = rf(opts, sink, token) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchUsdPerTokenUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchUsdPerTokenUpdated' -type FeeQuoterInterface_WatchUsdPerTokenUpdated_Call struct { - *mock.Call -} - -// WatchUsdPerTokenUpdated is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterUsdPerTokenUpdated -// - token []common.Address -func (_e *FeeQuoterInterface_Expecter) WatchUsdPerTokenUpdated(opts interface{}, sink interface{}, token interface{}) *FeeQuoterInterface_WatchUsdPerTokenUpdated_Call { - return &FeeQuoterInterface_WatchUsdPerTokenUpdated_Call{Call: _e.mock.On("WatchUsdPerTokenUpdated", opts, sink, token)} -} - -func (_c *FeeQuoterInterface_WatchUsdPerTokenUpdated_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterUsdPerTokenUpdated, token []common.Address)) *FeeQuoterInterface_WatchUsdPerTokenUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterUsdPerTokenUpdated), args[2].([]common.Address)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchUsdPerTokenUpdated_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchUsdPerTokenUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchUsdPerTokenUpdated_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterUsdPerTokenUpdated, []common.Address) (event.Subscription, error)) *FeeQuoterInterface_WatchUsdPerTokenUpdated_Call { - _c.Call.Return(run) - return _c -} - -// WatchUsdPerUnitGasUpdated provides a mock function with given fields: opts, sink, destChain -func (_m *FeeQuoterInterface) WatchUsdPerUnitGasUpdated(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterUsdPerUnitGasUpdated, destChain []uint64) (event.Subscription, error) { - ret := _m.Called(opts, sink, destChain) - - if len(ret) == 0 { - panic("no return value specified for WatchUsdPerUnitGasUpdated") - } - - var r0 event.Subscription - var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterUsdPerUnitGasUpdated, []uint64) (event.Subscription, error)); ok { - return rf(opts, sink, destChain) - } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterUsdPerUnitGasUpdated, []uint64) event.Subscription); ok { - r0 = rf(opts, sink, destChain) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(event.Subscription) - } - } - - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterUsdPerUnitGasUpdated, []uint64) error); ok { - r1 = rf(opts, sink, destChain) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchUsdPerUnitGasUpdated' -type FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call struct { - *mock.Call -} - -// WatchUsdPerUnitGasUpdated is a helper method to define mock.On call -// - opts *bind.WatchOpts -// - sink chan<- *fee_quoter.FeeQuoterUsdPerUnitGasUpdated -// - destChain []uint64 -func (_e *FeeQuoterInterface_Expecter) WatchUsdPerUnitGasUpdated(opts interface{}, sink interface{}, destChain interface{}) *FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call { - return &FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call{Call: _e.mock.On("WatchUsdPerUnitGasUpdated", opts, sink, destChain)} -} - -func (_c *FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *fee_quoter.FeeQuoterUsdPerUnitGasUpdated, destChain []uint64)) *FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *fee_quoter.FeeQuoterUsdPerUnitGasUpdated), args[2].([]uint64)) - }) - return _c -} - -func (_c *FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call) Return(_a0 event.Subscription, _a1 error) *FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call { - _c.Call.Return(_a0, _a1) - return _c -} - -func (_c *FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *fee_quoter.FeeQuoterUsdPerUnitGasUpdated, []uint64) (event.Subscription, error)) *FeeQuoterInterface_WatchUsdPerUnitGasUpdated_Call { - _c.Call.Return(run) - return _c -} - -// NewFeeQuoterInterface creates a new instance of FeeQuoterInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewFeeQuoterInterface(t interface { - mock.TestingT - Cleanup(func()) -}) *FeeQuoterInterface { - mock := &FeeQuoterInterface{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/core/gethwrappers/ccip/mocks/v1_2_0/evm2_evm_off_ramp_interface.go b/core/gethwrappers/ccip/mocks/v1_2_0/evm2_evm_off_ramp_interface.go index 7a20a3bd068..983ef7cd49a 100644 --- a/core/gethwrappers/ccip/mocks/v1_2_0/evm2_evm_off_ramp_interface.go +++ b/core/gethwrappers/ccip/mocks/v1_2_0/evm2_evm_off_ramp_interface.go @@ -10,7 +10,7 @@ import ( event "github.com/ethereum/go-ethereum/event" - evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0" + evm_2_evm_offramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" generated "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" @@ -138,7 +138,7 @@ func (_c *EVM2EVMOffRampInterface_Address_Call) RunAndReturn(run func() common.A } // ApplyPoolUpdates provides a mock function with given fields: opts, removes, adds -func (_m *EVM2EVMOffRampInterface) ApplyPoolUpdates(opts *bind.TransactOpts, removes []evm_2_evm_offramp_1_2_0.InternalPoolUpdate, adds []evm_2_evm_offramp_1_2_0.InternalPoolUpdate) (*types.Transaction, error) { +func (_m *EVM2EVMOffRampInterface) ApplyPoolUpdates(opts *bind.TransactOpts, removes []evm_2_evm_offramp.InternalPoolUpdate, adds []evm_2_evm_offramp.InternalPoolUpdate) (*types.Transaction, error) { ret := _m.Called(opts, removes, adds) if len(ret) == 0 { @@ -147,10 +147,10 @@ func (_m *EVM2EVMOffRampInterface) ApplyPoolUpdates(opts *bind.TransactOpts, rem var r0 *types.Transaction var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []evm_2_evm_offramp_1_2_0.InternalPoolUpdate, []evm_2_evm_offramp_1_2_0.InternalPoolUpdate) (*types.Transaction, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []evm_2_evm_offramp.InternalPoolUpdate, []evm_2_evm_offramp.InternalPoolUpdate) (*types.Transaction, error)); ok { return rf(opts, removes, adds) } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []evm_2_evm_offramp_1_2_0.InternalPoolUpdate, []evm_2_evm_offramp_1_2_0.InternalPoolUpdate) *types.Transaction); ok { + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []evm_2_evm_offramp.InternalPoolUpdate, []evm_2_evm_offramp.InternalPoolUpdate) *types.Transaction); ok { r0 = rf(opts, removes, adds) } else { if ret.Get(0) != nil { @@ -158,7 +158,7 @@ func (_m *EVM2EVMOffRampInterface) ApplyPoolUpdates(opts *bind.TransactOpts, rem } } - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []evm_2_evm_offramp_1_2_0.InternalPoolUpdate, []evm_2_evm_offramp_1_2_0.InternalPoolUpdate) error); ok { + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []evm_2_evm_offramp.InternalPoolUpdate, []evm_2_evm_offramp.InternalPoolUpdate) error); ok { r1 = rf(opts, removes, adds) } else { r1 = ret.Error(1) @@ -174,15 +174,15 @@ type EVM2EVMOffRampInterface_ApplyPoolUpdates_Call struct { // ApplyPoolUpdates is a helper method to define mock.On call // - opts *bind.TransactOpts -// - removes []evm_2_evm_offramp_1_2_0.InternalPoolUpdate -// - adds []evm_2_evm_offramp_1_2_0.InternalPoolUpdate +// - removes []evm_2_evm_offramp.InternalPoolUpdate +// - adds []evm_2_evm_offramp.InternalPoolUpdate func (_e *EVM2EVMOffRampInterface_Expecter) ApplyPoolUpdates(opts interface{}, removes interface{}, adds interface{}) *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call { return &EVM2EVMOffRampInterface_ApplyPoolUpdates_Call{Call: _e.mock.On("ApplyPoolUpdates", opts, removes, adds)} } -func (_c *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call) Run(run func(opts *bind.TransactOpts, removes []evm_2_evm_offramp_1_2_0.InternalPoolUpdate, adds []evm_2_evm_offramp_1_2_0.InternalPoolUpdate)) *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call { +func (_c *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call) Run(run func(opts *bind.TransactOpts, removes []evm_2_evm_offramp.InternalPoolUpdate, adds []evm_2_evm_offramp.InternalPoolUpdate)) *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].([]evm_2_evm_offramp_1_2_0.InternalPoolUpdate), args[2].([]evm_2_evm_offramp_1_2_0.InternalPoolUpdate)) + run(args[0].(*bind.TransactOpts), args[1].([]evm_2_evm_offramp.InternalPoolUpdate), args[2].([]evm_2_evm_offramp.InternalPoolUpdate)) }) return _c } @@ -192,13 +192,13 @@ func (_c *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call) Return(_a0 *types.Trans return _c } -func (_c *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call) RunAndReturn(run func(*bind.TransactOpts, []evm_2_evm_offramp_1_2_0.InternalPoolUpdate, []evm_2_evm_offramp_1_2_0.InternalPoolUpdate) (*types.Transaction, error)) *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call { +func (_c *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call) RunAndReturn(run func(*bind.TransactOpts, []evm_2_evm_offramp.InternalPoolUpdate, []evm_2_evm_offramp.InternalPoolUpdate) (*types.Transaction, error)) *EVM2EVMOffRampInterface_ApplyPoolUpdates_Call { _c.Call.Return(run) return _c } // CcipReceive provides a mock function with given fields: opts, arg0 -func (_m *EVM2EVMOffRampInterface) CcipReceive(opts *bind.CallOpts, arg0 evm_2_evm_offramp_1_2_0.ClientAny2EVMMessage) error { +func (_m *EVM2EVMOffRampInterface) CcipReceive(opts *bind.CallOpts, arg0 evm_2_evm_offramp.ClientAny2EVMMessage) error { ret := _m.Called(opts, arg0) if len(ret) == 0 { @@ -206,7 +206,7 @@ func (_m *EVM2EVMOffRampInterface) CcipReceive(opts *bind.CallOpts, arg0 evm_2_e } var r0 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts, evm_2_evm_offramp_1_2_0.ClientAny2EVMMessage) error); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts, evm_2_evm_offramp.ClientAny2EVMMessage) error); ok { r0 = rf(opts, arg0) } else { r0 = ret.Error(0) @@ -222,14 +222,14 @@ type EVM2EVMOffRampInterface_CcipReceive_Call struct { // CcipReceive is a helper method to define mock.On call // - opts *bind.CallOpts -// - arg0 evm_2_evm_offramp_1_2_0.ClientAny2EVMMessage +// - arg0 evm_2_evm_offramp.ClientAny2EVMMessage func (_e *EVM2EVMOffRampInterface_Expecter) CcipReceive(opts interface{}, arg0 interface{}) *EVM2EVMOffRampInterface_CcipReceive_Call { return &EVM2EVMOffRampInterface_CcipReceive_Call{Call: _e.mock.On("CcipReceive", opts, arg0)} } -func (_c *EVM2EVMOffRampInterface_CcipReceive_Call) Run(run func(opts *bind.CallOpts, arg0 evm_2_evm_offramp_1_2_0.ClientAny2EVMMessage)) *EVM2EVMOffRampInterface_CcipReceive_Call { +func (_c *EVM2EVMOffRampInterface_CcipReceive_Call) Run(run func(opts *bind.CallOpts, arg0 evm_2_evm_offramp.ClientAny2EVMMessage)) *EVM2EVMOffRampInterface_CcipReceive_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.CallOpts), args[1].(evm_2_evm_offramp_1_2_0.ClientAny2EVMMessage)) + run(args[0].(*bind.CallOpts), args[1].(evm_2_evm_offramp.ClientAny2EVMMessage)) }) return _c } @@ -239,28 +239,28 @@ func (_c *EVM2EVMOffRampInterface_CcipReceive_Call) Return(_a0 error) *EVM2EVMOf return _c } -func (_c *EVM2EVMOffRampInterface_CcipReceive_Call) RunAndReturn(run func(*bind.CallOpts, evm_2_evm_offramp_1_2_0.ClientAny2EVMMessage) error) *EVM2EVMOffRampInterface_CcipReceive_Call { +func (_c *EVM2EVMOffRampInterface_CcipReceive_Call) RunAndReturn(run func(*bind.CallOpts, evm_2_evm_offramp.ClientAny2EVMMessage) error) *EVM2EVMOffRampInterface_CcipReceive_Call { _c.Call.Return(run) return _c } // CurrentRateLimiterState provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) CurrentRateLimiterState(opts *bind.CallOpts) (evm_2_evm_offramp_1_2_0.RateLimiterTokenBucket, error) { +func (_m *EVM2EVMOffRampInterface) CurrentRateLimiterState(opts *bind.CallOpts) (evm_2_evm_offramp.RateLimiterTokenBucket, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for CurrentRateLimiterState") } - var r0 evm_2_evm_offramp_1_2_0.RateLimiterTokenBucket + var r0 evm_2_evm_offramp.RateLimiterTokenBucket var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.RateLimiterTokenBucket, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp.RateLimiterTokenBucket, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp_1_2_0.RateLimiterTokenBucket); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp.RateLimiterTokenBucket); ok { r0 = rf(opts) } else { - r0 = ret.Get(0).(evm_2_evm_offramp_1_2_0.RateLimiterTokenBucket) + r0 = ret.Get(0).(evm_2_evm_offramp.RateLimiterTokenBucket) } if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { @@ -290,18 +290,18 @@ func (_c *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call) Run(run func(opt return _c } -func (_c *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call) Return(_a0 evm_2_evm_offramp_1_2_0.RateLimiterTokenBucket, _a1 error) *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call { +func (_c *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call) Return(_a0 evm_2_evm_offramp.RateLimiterTokenBucket, _a1 error) *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.RateLimiterTokenBucket, error)) *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call { +func (_c *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp.RateLimiterTokenBucket, error)) *EVM2EVMOffRampInterface_CurrentRateLimiterState_Call { _c.Call.Return(run) return _c } // ExecuteSingleMessage provides a mock function with given fields: opts, message, offchainTokenData -func (_m *EVM2EVMOffRampInterface) ExecuteSingleMessage(opts *bind.TransactOpts, message evm_2_evm_offramp_1_2_0.InternalEVM2EVMMessage, offchainTokenData [][]byte) (*types.Transaction, error) { +func (_m *EVM2EVMOffRampInterface) ExecuteSingleMessage(opts *bind.TransactOpts, message evm_2_evm_offramp.InternalEVM2EVMMessage, offchainTokenData [][]byte) (*types.Transaction, error) { ret := _m.Called(opts, message, offchainTokenData) if len(ret) == 0 { @@ -310,10 +310,10 @@ func (_m *EVM2EVMOffRampInterface) ExecuteSingleMessage(opts *bind.TransactOpts, var r0 *types.Transaction var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.InternalEVM2EVMMessage, [][]byte) (*types.Transaction, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp.InternalEVM2EVMMessage, [][]byte) (*types.Transaction, error)); ok { return rf(opts, message, offchainTokenData) } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.InternalEVM2EVMMessage, [][]byte) *types.Transaction); ok { + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp.InternalEVM2EVMMessage, [][]byte) *types.Transaction); ok { r0 = rf(opts, message, offchainTokenData) } else { if ret.Get(0) != nil { @@ -321,7 +321,7 @@ func (_m *EVM2EVMOffRampInterface) ExecuteSingleMessage(opts *bind.TransactOpts, } } - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.InternalEVM2EVMMessage, [][]byte) error); ok { + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, evm_2_evm_offramp.InternalEVM2EVMMessage, [][]byte) error); ok { r1 = rf(opts, message, offchainTokenData) } else { r1 = ret.Error(1) @@ -337,15 +337,15 @@ type EVM2EVMOffRampInterface_ExecuteSingleMessage_Call struct { // ExecuteSingleMessage is a helper method to define mock.On call // - opts *bind.TransactOpts -// - message evm_2_evm_offramp_1_2_0.InternalEVM2EVMMessage +// - message evm_2_evm_offramp.InternalEVM2EVMMessage // - offchainTokenData [][]byte func (_e *EVM2EVMOffRampInterface_Expecter) ExecuteSingleMessage(opts interface{}, message interface{}, offchainTokenData interface{}) *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call { return &EVM2EVMOffRampInterface_ExecuteSingleMessage_Call{Call: _e.mock.On("ExecuteSingleMessage", opts, message, offchainTokenData)} } -func (_c *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call) Run(run func(opts *bind.TransactOpts, message evm_2_evm_offramp_1_2_0.InternalEVM2EVMMessage, offchainTokenData [][]byte)) *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call { +func (_c *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call) Run(run func(opts *bind.TransactOpts, message evm_2_evm_offramp.InternalEVM2EVMMessage, offchainTokenData [][]byte)) *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].(evm_2_evm_offramp_1_2_0.InternalEVM2EVMMessage), args[2].([][]byte)) + run(args[0].(*bind.TransactOpts), args[1].(evm_2_evm_offramp.InternalEVM2EVMMessage), args[2].([][]byte)) }) return _c } @@ -355,29 +355,29 @@ func (_c *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call) Return(_a0 *types.T return _c } -func (_c *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call) RunAndReturn(run func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.InternalEVM2EVMMessage, [][]byte) (*types.Transaction, error)) *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call { +func (_c *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call) RunAndReturn(run func(*bind.TransactOpts, evm_2_evm_offramp.InternalEVM2EVMMessage, [][]byte) (*types.Transaction, error)) *EVM2EVMOffRampInterface_ExecuteSingleMessage_Call { _c.Call.Return(run) return _c } // FilterAdminSet provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) FilterAdminSet(opts *bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSetIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterAdminSet(opts *bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampAdminSetIterator, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for FilterAdminSet") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSetIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampAdminSetIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSetIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampAdminSetIterator, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSetIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp.EVM2EVMOffRampAdminSetIterator); ok { r0 = rf(opts) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSetIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampAdminSetIterator) } } @@ -408,34 +408,34 @@ func (_c *EVM2EVMOffRampInterface_FilterAdminSet_Call) Run(run func(opts *bind.F return _c } -func (_c *EVM2EVMOffRampInterface_FilterAdminSet_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSetIterator, _a1 error) *EVM2EVMOffRampInterface_FilterAdminSet_Call { +func (_c *EVM2EVMOffRampInterface_FilterAdminSet_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampAdminSetIterator, _a1 error) *EVM2EVMOffRampInterface_FilterAdminSet_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterAdminSet_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSetIterator, error)) *EVM2EVMOffRampInterface_FilterAdminSet_Call { +func (_c *EVM2EVMOffRampInterface_FilterAdminSet_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampAdminSetIterator, error)) *EVM2EVMOffRampInterface_FilterAdminSet_Call { _c.Call.Return(run) return _c } // FilterConfigSet provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) FilterConfigSet(opts *bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSetIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterConfigSet(opts *bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSetIterator, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for FilterConfigSet") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSetIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampConfigSetIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSetIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSetIterator, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSetIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp.EVM2EVMOffRampConfigSetIterator); ok { r0 = rf(opts) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSetIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampConfigSetIterator) } } @@ -466,34 +466,34 @@ func (_c *EVM2EVMOffRampInterface_FilterConfigSet_Call) Run(run func(opts *bind. return _c } -func (_c *EVM2EVMOffRampInterface_FilterConfigSet_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSetIterator, _a1 error) *EVM2EVMOffRampInterface_FilterConfigSet_Call { +func (_c *EVM2EVMOffRampInterface_FilterConfigSet_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampConfigSetIterator, _a1 error) *EVM2EVMOffRampInterface_FilterConfigSet_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterConfigSet_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSetIterator, error)) *EVM2EVMOffRampInterface_FilterConfigSet_Call { +func (_c *EVM2EVMOffRampInterface_FilterConfigSet_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSetIterator, error)) *EVM2EVMOffRampInterface_FilterConfigSet_Call { _c.Call.Return(run) return _c } // FilterConfigSet0 provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) FilterConfigSet0(opts *bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0Iterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterConfigSet0(opts *bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet0Iterator, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for FilterConfigSet0") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0Iterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0Iterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0Iterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet0Iterator, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0Iterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0Iterator); ok { r0 = rf(opts) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0Iterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampConfigSet0Iterator) } } @@ -524,34 +524,34 @@ func (_c *EVM2EVMOffRampInterface_FilterConfigSet0_Call) Run(run func(opts *bind return _c } -func (_c *EVM2EVMOffRampInterface_FilterConfigSet0_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0Iterator, _a1 error) *EVM2EVMOffRampInterface_FilterConfigSet0_Call { +func (_c *EVM2EVMOffRampInterface_FilterConfigSet0_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0Iterator, _a1 error) *EVM2EVMOffRampInterface_FilterConfigSet0_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterConfigSet0_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0Iterator, error)) *EVM2EVMOffRampInterface_FilterConfigSet0_Call { +func (_c *EVM2EVMOffRampInterface_FilterConfigSet0_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet0Iterator, error)) *EVM2EVMOffRampInterface_FilterConfigSet0_Call { _c.Call.Return(run) return _c } // FilterExecutionStateChanged provides a mock function with given fields: opts, sequenceNumber, messageId -func (_m *EVM2EVMOffRampInterface) FilterExecutionStateChanged(opts *bind.FilterOpts, sequenceNumber []uint64, messageId [][32]byte) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChangedIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterExecutionStateChanged(opts *bind.FilterOpts, sequenceNumber []uint64, messageId [][32]byte) (*evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChangedIterator, error) { ret := _m.Called(opts, sequenceNumber, messageId) if len(ret) == 0 { panic("no return value specified for FilterExecutionStateChanged") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChangedIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChangedIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, [][32]byte) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChangedIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, [][32]byte) (*evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChangedIterator, error)); ok { return rf(opts, sequenceNumber, messageId) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, [][32]byte) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChangedIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, [][32]byte) *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChangedIterator); ok { r0 = rf(opts, sequenceNumber, messageId) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChangedIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChangedIterator) } } @@ -584,34 +584,34 @@ func (_c *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call) Run(run func return _c } -func (_c *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChangedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call { +func (_c *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChangedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64, [][32]byte) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChangedIterator, error)) *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call { +func (_c *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64, [][32]byte) (*evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChangedIterator, error)) *EVM2EVMOffRampInterface_FilterExecutionStateChanged_Call { _c.Call.Return(run) return _c } // FilterOwnershipTransferRequested provides a mock function with given fields: opts, from, to -func (_m *EVM2EVMOffRampInterface) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequestedIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequestedIterator, error) { ret := _m.Called(opts, from, to) if len(ret) == 0 { panic("no return value specified for FilterOwnershipTransferRequested") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequestedIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequestedIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequestedIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequestedIterator, error)); ok { return rf(opts, from, to) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequestedIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequestedIterator); ok { r0 = rf(opts, from, to) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequestedIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequestedIterator) } } @@ -644,34 +644,34 @@ func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call) Run(run return _c } -func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequestedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call { +func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequestedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address, []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequestedIterator, error)) *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call { +func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address, []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequestedIterator, error)) *EVM2EVMOffRampInterface_FilterOwnershipTransferRequested_Call { _c.Call.Return(run) return _c } // FilterOwnershipTransferred provides a mock function with given fields: opts, from, to -func (_m *EVM2EVMOffRampInterface) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferredIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferredIterator, error) { ret := _m.Called(opts, from, to) if len(ret) == 0 { panic("no return value specified for FilterOwnershipTransferred") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferredIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferredIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferredIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferredIterator, error)); ok { return rf(opts, from, to) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferredIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferredIterator); ok { r0 = rf(opts, from, to) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferredIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferredIterator) } } @@ -704,34 +704,34 @@ func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call) Run(run func( return _c } -func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferredIterator, _a1 error) *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call { +func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferredIterator, _a1 error) *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address, []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferredIterator, error)) *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call { +func (_c *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address, []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferredIterator, error)) *EVM2EVMOffRampInterface_FilterOwnershipTransferred_Call { _c.Call.Return(run) return _c } // FilterPoolAdded provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) FilterPoolAdded(opts *bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAddedIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterPoolAdded(opts *bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampPoolAddedIterator, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for FilterPoolAdded") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAddedIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampPoolAddedIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAddedIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampPoolAddedIterator, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAddedIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp.EVM2EVMOffRampPoolAddedIterator); ok { r0 = rf(opts) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAddedIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampPoolAddedIterator) } } @@ -762,34 +762,34 @@ func (_c *EVM2EVMOffRampInterface_FilterPoolAdded_Call) Run(run func(opts *bind. return _c } -func (_c *EVM2EVMOffRampInterface_FilterPoolAdded_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAddedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterPoolAdded_Call { +func (_c *EVM2EVMOffRampInterface_FilterPoolAdded_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampPoolAddedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterPoolAdded_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterPoolAdded_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAddedIterator, error)) *EVM2EVMOffRampInterface_FilterPoolAdded_Call { +func (_c *EVM2EVMOffRampInterface_FilterPoolAdded_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampPoolAddedIterator, error)) *EVM2EVMOffRampInterface_FilterPoolAdded_Call { _c.Call.Return(run) return _c } // FilterPoolRemoved provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) FilterPoolRemoved(opts *bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemovedIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterPoolRemoved(opts *bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampPoolRemovedIterator, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for FilterPoolRemoved") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemovedIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampPoolRemovedIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemovedIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampPoolRemovedIterator, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemovedIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp.EVM2EVMOffRampPoolRemovedIterator); ok { r0 = rf(opts) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemovedIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampPoolRemovedIterator) } } @@ -820,34 +820,34 @@ func (_c *EVM2EVMOffRampInterface_FilterPoolRemoved_Call) Run(run func(opts *bin return _c } -func (_c *EVM2EVMOffRampInterface_FilterPoolRemoved_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemovedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterPoolRemoved_Call { +func (_c *EVM2EVMOffRampInterface_FilterPoolRemoved_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampPoolRemovedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterPoolRemoved_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterPoolRemoved_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemovedIterator, error)) *EVM2EVMOffRampInterface_FilterPoolRemoved_Call { +func (_c *EVM2EVMOffRampInterface_FilterPoolRemoved_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampPoolRemovedIterator, error)) *EVM2EVMOffRampInterface_FilterPoolRemoved_Call { _c.Call.Return(run) return _c } // FilterSkippedIncorrectNonce provides a mock function with given fields: opts, nonce, sender -func (_m *EVM2EVMOffRampInterface) FilterSkippedIncorrectNonce(opts *bind.FilterOpts, nonce []uint64, sender []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonceIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterSkippedIncorrectNonce(opts *bind.FilterOpts, nonce []uint64, sender []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonceIterator, error) { ret := _m.Called(opts, nonce, sender) if len(ret) == 0 { panic("no return value specified for FilterSkippedIncorrectNonce") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonceIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonceIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonceIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonceIterator, error)); ok { return rf(opts, nonce, sender) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonceIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonceIterator); ok { r0 = rf(opts, nonce, sender) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonceIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonceIterator) } } @@ -880,34 +880,34 @@ func (_c *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call) Run(run func return _c } -func (_c *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonceIterator, _a1 error) *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call { +func (_c *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonceIterator, _a1 error) *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64, []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonceIterator, error)) *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call { +func (_c *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64, []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonceIterator, error)) *EVM2EVMOffRampInterface_FilterSkippedIncorrectNonce_Call { _c.Call.Return(run) return _c } // FilterSkippedSenderWithPreviousRampMessageInflight provides a mock function with given fields: opts, nonce, sender -func (_m *EVM2EVMOffRampInterface) FilterSkippedSenderWithPreviousRampMessageInflight(opts *bind.FilterOpts, nonce []uint64, sender []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterSkippedSenderWithPreviousRampMessageInflight(opts *bind.FilterOpts, nonce []uint64, sender []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator, error) { ret := _m.Called(opts, nonce, sender) if len(ret) == 0 { panic("no return value specified for FilterSkippedSenderWithPreviousRampMessageInflight") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator, error)); ok { return rf(opts, nonce, sender) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []uint64, []common.Address) *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator); ok { r0 = rf(opts, nonce, sender) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator) } } @@ -940,34 +940,34 @@ func (_c *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInfl return _c } -func (_c *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInflight_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator, _a1 error) *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInflight_Call { +func (_c *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInflight_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator, _a1 error) *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInflight_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInflight_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64, []common.Address) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator, error)) *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInflight_Call { +func (_c *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInflight_Call) RunAndReturn(run func(*bind.FilterOpts, []uint64, []common.Address) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflightIterator, error)) *EVM2EVMOffRampInterface_FilterSkippedSenderWithPreviousRampMessageInflight_Call { _c.Call.Return(run) return _c } // FilterTransmitted provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) FilterTransmitted(opts *bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmittedIterator, error) { +func (_m *EVM2EVMOffRampInterface) FilterTransmitted(opts *bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampTransmittedIterator, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for FilterTransmitted") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmittedIterator + var r0 *evm_2_evm_offramp.EVM2EVMOffRampTransmittedIterator var r1 error - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmittedIterator, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampTransmittedIterator, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmittedIterator); ok { + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp.EVM2EVMOffRampTransmittedIterator); ok { r0 = rf(opts) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmittedIterator) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampTransmittedIterator) } } @@ -998,12 +998,12 @@ func (_c *EVM2EVMOffRampInterface_FilterTransmitted_Call) Run(run func(opts *bin return _c } -func (_c *EVM2EVMOffRampInterface_FilterTransmitted_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmittedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterTransmitted_Call { +func (_c *EVM2EVMOffRampInterface_FilterTransmitted_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampTransmittedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterTransmitted_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_FilterTransmitted_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmittedIterator, error)) *EVM2EVMOffRampInterface_FilterTransmitted_Call { +func (_c *EVM2EVMOffRampInterface_FilterTransmitted_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampTransmittedIterator, error)) *EVM2EVMOffRampInterface_FilterTransmitted_Call { _c.Call.Return(run) return _c } @@ -1126,22 +1126,22 @@ func (_c *EVM2EVMOffRampInterface_GetDestinationTokens_Call) RunAndReturn(run fu } // GetDynamicConfig provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) GetDynamicConfig(opts *bind.CallOpts) (evm_2_evm_offramp_1_2_0.EVM2EVMOffRampDynamicConfig, error) { +func (_m *EVM2EVMOffRampInterface) GetDynamicConfig(opts *bind.CallOpts) (evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for GetDynamicConfig") } - var r0 evm_2_evm_offramp_1_2_0.EVM2EVMOffRampDynamicConfig + var r0 evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.EVM2EVMOffRampDynamicConfig, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp_1_2_0.EVM2EVMOffRampDynamicConfig); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig); ok { r0 = rf(opts) } else { - r0 = ret.Get(0).(evm_2_evm_offramp_1_2_0.EVM2EVMOffRampDynamicConfig) + r0 = ret.Get(0).(evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig) } if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { @@ -1171,12 +1171,12 @@ func (_c *EVM2EVMOffRampInterface_GetDynamicConfig_Call) Run(run func(opts *bind return _c } -func (_c *EVM2EVMOffRampInterface_GetDynamicConfig_Call) Return(_a0 evm_2_evm_offramp_1_2_0.EVM2EVMOffRampDynamicConfig, _a1 error) *EVM2EVMOffRampInterface_GetDynamicConfig_Call { +func (_c *EVM2EVMOffRampInterface_GetDynamicConfig_Call) Return(_a0 evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig, _a1 error) *EVM2EVMOffRampInterface_GetDynamicConfig_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_GetDynamicConfig_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.EVM2EVMOffRampDynamicConfig, error)) *EVM2EVMOffRampInterface_GetDynamicConfig_Call { +func (_c *EVM2EVMOffRampInterface_GetDynamicConfig_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp.EVM2EVMOffRampDynamicConfig, error)) *EVM2EVMOffRampInterface_GetDynamicConfig_Call { _c.Call.Return(run) return _c } @@ -1414,22 +1414,22 @@ func (_c *EVM2EVMOffRampInterface_GetSenderNonce_Call) RunAndReturn(run func(*bi } // GetStaticConfig provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) GetStaticConfig(opts *bind.CallOpts) (evm_2_evm_offramp_1_2_0.EVM2EVMOffRampStaticConfig, error) { +func (_m *EVM2EVMOffRampInterface) GetStaticConfig(opts *bind.CallOpts) (evm_2_evm_offramp.EVM2EVMOffRampStaticConfig, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for GetStaticConfig") } - var r0 evm_2_evm_offramp_1_2_0.EVM2EVMOffRampStaticConfig + var r0 evm_2_evm_offramp.EVM2EVMOffRampStaticConfig var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.EVM2EVMOffRampStaticConfig, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp.EVM2EVMOffRampStaticConfig, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp_1_2_0.EVM2EVMOffRampStaticConfig); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp.EVM2EVMOffRampStaticConfig); ok { r0 = rf(opts) } else { - r0 = ret.Get(0).(evm_2_evm_offramp_1_2_0.EVM2EVMOffRampStaticConfig) + r0 = ret.Get(0).(evm_2_evm_offramp.EVM2EVMOffRampStaticConfig) } if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { @@ -1459,12 +1459,12 @@ func (_c *EVM2EVMOffRampInterface_GetStaticConfig_Call) Run(run func(opts *bind. return _c } -func (_c *EVM2EVMOffRampInterface_GetStaticConfig_Call) Return(_a0 evm_2_evm_offramp_1_2_0.EVM2EVMOffRampStaticConfig, _a1 error) *EVM2EVMOffRampInterface_GetStaticConfig_Call { +func (_c *EVM2EVMOffRampInterface_GetStaticConfig_Call) Return(_a0 evm_2_evm_offramp.EVM2EVMOffRampStaticConfig, _a1 error) *EVM2EVMOffRampInterface_GetStaticConfig_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_GetStaticConfig_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.EVM2EVMOffRampStaticConfig, error)) *EVM2EVMOffRampInterface_GetStaticConfig_Call { +func (_c *EVM2EVMOffRampInterface_GetStaticConfig_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp.EVM2EVMOffRampStaticConfig, error)) *EVM2EVMOffRampInterface_GetStaticConfig_Call { _c.Call.Return(run) return _c } @@ -1644,22 +1644,22 @@ func (_c *EVM2EVMOffRampInterface_GetTransmitters_Call) RunAndReturn(run func(*b } // LatestConfigDetails provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) LatestConfigDetails(opts *bind.CallOpts) (evm_2_evm_offramp_1_2_0.LatestConfigDetails, error) { +func (_m *EVM2EVMOffRampInterface) LatestConfigDetails(opts *bind.CallOpts) (evm_2_evm_offramp.LatestConfigDetails, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for LatestConfigDetails") } - var r0 evm_2_evm_offramp_1_2_0.LatestConfigDetails + var r0 evm_2_evm_offramp.LatestConfigDetails var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.LatestConfigDetails, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp.LatestConfigDetails, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp_1_2_0.LatestConfigDetails); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp.LatestConfigDetails); ok { r0 = rf(opts) } else { - r0 = ret.Get(0).(evm_2_evm_offramp_1_2_0.LatestConfigDetails) + r0 = ret.Get(0).(evm_2_evm_offramp.LatestConfigDetails) } if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { @@ -1689,33 +1689,33 @@ func (_c *EVM2EVMOffRampInterface_LatestConfigDetails_Call) Run(run func(opts *b return _c } -func (_c *EVM2EVMOffRampInterface_LatestConfigDetails_Call) Return(_a0 evm_2_evm_offramp_1_2_0.LatestConfigDetails, _a1 error) *EVM2EVMOffRampInterface_LatestConfigDetails_Call { +func (_c *EVM2EVMOffRampInterface_LatestConfigDetails_Call) Return(_a0 evm_2_evm_offramp.LatestConfigDetails, _a1 error) *EVM2EVMOffRampInterface_LatestConfigDetails_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_LatestConfigDetails_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.LatestConfigDetails, error)) *EVM2EVMOffRampInterface_LatestConfigDetails_Call { +func (_c *EVM2EVMOffRampInterface_LatestConfigDetails_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp.LatestConfigDetails, error)) *EVM2EVMOffRampInterface_LatestConfigDetails_Call { _c.Call.Return(run) return _c } // LatestConfigDigestAndEpoch provides a mock function with given fields: opts -func (_m *EVM2EVMOffRampInterface) LatestConfigDigestAndEpoch(opts *bind.CallOpts) (evm_2_evm_offramp_1_2_0.LatestConfigDigestAndEpoch, error) { +func (_m *EVM2EVMOffRampInterface) LatestConfigDigestAndEpoch(opts *bind.CallOpts) (evm_2_evm_offramp.LatestConfigDigestAndEpoch, error) { ret := _m.Called(opts) if len(ret) == 0 { panic("no return value specified for LatestConfigDigestAndEpoch") } - var r0 evm_2_evm_offramp_1_2_0.LatestConfigDigestAndEpoch + var r0 evm_2_evm_offramp.LatestConfigDigestAndEpoch var r1 error - if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.LatestConfigDigestAndEpoch, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (evm_2_evm_offramp.LatestConfigDigestAndEpoch, error)); ok { return rf(opts) } - if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp_1_2_0.LatestConfigDigestAndEpoch); ok { + if rf, ok := ret.Get(0).(func(*bind.CallOpts) evm_2_evm_offramp.LatestConfigDigestAndEpoch); ok { r0 = rf(opts) } else { - r0 = ret.Get(0).(evm_2_evm_offramp_1_2_0.LatestConfigDigestAndEpoch) + r0 = ret.Get(0).(evm_2_evm_offramp.LatestConfigDigestAndEpoch) } if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { @@ -1745,18 +1745,18 @@ func (_c *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call) Run(run func( return _c } -func (_c *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call) Return(_a0 evm_2_evm_offramp_1_2_0.LatestConfigDigestAndEpoch, _a1 error) *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call { +func (_c *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call) Return(_a0 evm_2_evm_offramp.LatestConfigDigestAndEpoch, _a1 error) *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp_1_2_0.LatestConfigDigestAndEpoch, error)) *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call { +func (_c *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call) RunAndReturn(run func(*bind.CallOpts) (evm_2_evm_offramp.LatestConfigDigestAndEpoch, error)) *EVM2EVMOffRampInterface_LatestConfigDigestAndEpoch_Call { _c.Call.Return(run) return _c } // ManuallyExecute provides a mock function with given fields: opts, report, gasLimitOverrides -func (_m *EVM2EVMOffRampInterface) ManuallyExecute(opts *bind.TransactOpts, report evm_2_evm_offramp_1_2_0.InternalExecutionReport, gasLimitOverrides []*big.Int) (*types.Transaction, error) { +func (_m *EVM2EVMOffRampInterface) ManuallyExecute(opts *bind.TransactOpts, report evm_2_evm_offramp.InternalExecutionReport, gasLimitOverrides []*big.Int) (*types.Transaction, error) { ret := _m.Called(opts, report, gasLimitOverrides) if len(ret) == 0 { @@ -1765,10 +1765,10 @@ func (_m *EVM2EVMOffRampInterface) ManuallyExecute(opts *bind.TransactOpts, repo var r0 *types.Transaction var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.InternalExecutionReport, []*big.Int) (*types.Transaction, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp.InternalExecutionReport, []*big.Int) (*types.Transaction, error)); ok { return rf(opts, report, gasLimitOverrides) } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.InternalExecutionReport, []*big.Int) *types.Transaction); ok { + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp.InternalExecutionReport, []*big.Int) *types.Transaction); ok { r0 = rf(opts, report, gasLimitOverrides) } else { if ret.Get(0) != nil { @@ -1776,7 +1776,7 @@ func (_m *EVM2EVMOffRampInterface) ManuallyExecute(opts *bind.TransactOpts, repo } } - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.InternalExecutionReport, []*big.Int) error); ok { + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, evm_2_evm_offramp.InternalExecutionReport, []*big.Int) error); ok { r1 = rf(opts, report, gasLimitOverrides) } else { r1 = ret.Error(1) @@ -1792,15 +1792,15 @@ type EVM2EVMOffRampInterface_ManuallyExecute_Call struct { // ManuallyExecute is a helper method to define mock.On call // - opts *bind.TransactOpts -// - report evm_2_evm_offramp_1_2_0.InternalExecutionReport +// - report evm_2_evm_offramp.InternalExecutionReport // - gasLimitOverrides []*big.Int func (_e *EVM2EVMOffRampInterface_Expecter) ManuallyExecute(opts interface{}, report interface{}, gasLimitOverrides interface{}) *EVM2EVMOffRampInterface_ManuallyExecute_Call { return &EVM2EVMOffRampInterface_ManuallyExecute_Call{Call: _e.mock.On("ManuallyExecute", opts, report, gasLimitOverrides)} } -func (_c *EVM2EVMOffRampInterface_ManuallyExecute_Call) Run(run func(opts *bind.TransactOpts, report evm_2_evm_offramp_1_2_0.InternalExecutionReport, gasLimitOverrides []*big.Int)) *EVM2EVMOffRampInterface_ManuallyExecute_Call { +func (_c *EVM2EVMOffRampInterface_ManuallyExecute_Call) Run(run func(opts *bind.TransactOpts, report evm_2_evm_offramp.InternalExecutionReport, gasLimitOverrides []*big.Int)) *EVM2EVMOffRampInterface_ManuallyExecute_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].(evm_2_evm_offramp_1_2_0.InternalExecutionReport), args[2].([]*big.Int)) + run(args[0].(*bind.TransactOpts), args[1].(evm_2_evm_offramp.InternalExecutionReport), args[2].([]*big.Int)) }) return _c } @@ -1810,7 +1810,7 @@ func (_c *EVM2EVMOffRampInterface_ManuallyExecute_Call) Return(_a0 *types.Transa return _c } -func (_c *EVM2EVMOffRampInterface_ManuallyExecute_Call) RunAndReturn(run func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.InternalExecutionReport, []*big.Int) (*types.Transaction, error)) *EVM2EVMOffRampInterface_ManuallyExecute_Call { +func (_c *EVM2EVMOffRampInterface_ManuallyExecute_Call) RunAndReturn(run func(*bind.TransactOpts, evm_2_evm_offramp.InternalExecutionReport, []*big.Int) (*types.Transaction, error)) *EVM2EVMOffRampInterface_ManuallyExecute_Call { _c.Call.Return(run) return _c } @@ -1874,23 +1874,23 @@ func (_c *EVM2EVMOffRampInterface_Owner_Call) RunAndReturn(run func(*bind.CallOp } // ParseAdminSet provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseAdminSet(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet, error) { +func (_m *EVM2EVMOffRampInterface) ParseAdminSet(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampAdminSet, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseAdminSet") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet + var r0 *evm_2_evm_offramp.EVM2EVMOffRampAdminSet var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampAdminSet, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampAdminSet); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampAdminSet) } } @@ -1921,34 +1921,34 @@ func (_c *EVM2EVMOffRampInterface_ParseAdminSet_Call) Run(run func(log types.Log return _c } -func (_c *EVM2EVMOffRampInterface_ParseAdminSet_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet, _a1 error) *EVM2EVMOffRampInterface_ParseAdminSet_Call { +func (_c *EVM2EVMOffRampInterface_ParseAdminSet_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampAdminSet, _a1 error) *EVM2EVMOffRampInterface_ParseAdminSet_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseAdminSet_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet, error)) *EVM2EVMOffRampInterface_ParseAdminSet_Call { +func (_c *EVM2EVMOffRampInterface_ParseAdminSet_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampAdminSet, error)) *EVM2EVMOffRampInterface_ParseAdminSet_Call { _c.Call.Return(run) return _c } // ParseConfigSet provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseConfigSet(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet, error) { +func (_m *EVM2EVMOffRampInterface) ParseConfigSet(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseConfigSet") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet + var r0 *evm_2_evm_offramp.EVM2EVMOffRampConfigSet var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampConfigSet); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampConfigSet) } } @@ -1979,34 +1979,34 @@ func (_c *EVM2EVMOffRampInterface_ParseConfigSet_Call) Run(run func(log types.Lo return _c } -func (_c *EVM2EVMOffRampInterface_ParseConfigSet_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet, _a1 error) *EVM2EVMOffRampInterface_ParseConfigSet_Call { +func (_c *EVM2EVMOffRampInterface_ParseConfigSet_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampConfigSet, _a1 error) *EVM2EVMOffRampInterface_ParseConfigSet_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseConfigSet_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet, error)) *EVM2EVMOffRampInterface_ParseConfigSet_Call { +func (_c *EVM2EVMOffRampInterface_ParseConfigSet_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet, error)) *EVM2EVMOffRampInterface_ParseConfigSet_Call { _c.Call.Return(run) return _c } // ParseConfigSet0 provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseConfigSet0(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0, error) { +func (_m *EVM2EVMOffRampInterface) ParseConfigSet0(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet0, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseConfigSet0") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0 + var r0 *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0 var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet0, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampConfigSet0) } } @@ -2037,34 +2037,34 @@ func (_c *EVM2EVMOffRampInterface_ParseConfigSet0_Call) Run(run func(log types.L return _c } -func (_c *EVM2EVMOffRampInterface_ParseConfigSet0_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0, _a1 error) *EVM2EVMOffRampInterface_ParseConfigSet0_Call { +func (_c *EVM2EVMOffRampInterface_ParseConfigSet0_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0, _a1 error) *EVM2EVMOffRampInterface_ParseConfigSet0_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseConfigSet0_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0, error)) *EVM2EVMOffRampInterface_ParseConfigSet0_Call { +func (_c *EVM2EVMOffRampInterface_ParseConfigSet0_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampConfigSet0, error)) *EVM2EVMOffRampInterface_ParseConfigSet0_Call { _c.Call.Return(run) return _c } // ParseExecutionStateChanged provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseExecutionStateChanged(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, error) { +func (_m *EVM2EVMOffRampInterface) ParseExecutionStateChanged(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseExecutionStateChanged") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged + var r0 *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged) } } @@ -2095,12 +2095,12 @@ func (_c *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call) Run(run func( return _c } -func (_c *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, _a1 error) *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call { +func (_c *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, _a1 error) *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, error)) *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call { +func (_c *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, error)) *EVM2EVMOffRampInterface_ParseExecutionStateChanged_Call { _c.Call.Return(run) return _c } @@ -2164,23 +2164,23 @@ func (_c *EVM2EVMOffRampInterface_ParseLog_Call) RunAndReturn(run func(types.Log } // ParseOwnershipTransferRequested provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseOwnershipTransferRequested(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, error) { +func (_m *EVM2EVMOffRampInterface) ParseOwnershipTransferRequested(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseOwnershipTransferRequested") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested + var r0 *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested) } } @@ -2211,34 +2211,34 @@ func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call) Run(run return _c } -func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, _a1 error) *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call { +func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, _a1 error) *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, error)) *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call { +func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, error)) *EVM2EVMOffRampInterface_ParseOwnershipTransferRequested_Call { _c.Call.Return(run) return _c } // ParseOwnershipTransferred provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseOwnershipTransferred(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, error) { +func (_m *EVM2EVMOffRampInterface) ParseOwnershipTransferred(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseOwnershipTransferred") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred + var r0 *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred) } } @@ -2269,34 +2269,34 @@ func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call) Run(run func(l return _c } -func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, _a1 error) *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call { +func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, _a1 error) *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, error)) *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call { +func (_c *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, error)) *EVM2EVMOffRampInterface_ParseOwnershipTransferred_Call { _c.Call.Return(run) return _c } // ParsePoolAdded provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParsePoolAdded(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded, error) { +func (_m *EVM2EVMOffRampInterface) ParsePoolAdded(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampPoolAdded, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParsePoolAdded") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded + var r0 *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampPoolAdded, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampPoolAdded) } } @@ -2327,34 +2327,34 @@ func (_c *EVM2EVMOffRampInterface_ParsePoolAdded_Call) Run(run func(log types.Lo return _c } -func (_c *EVM2EVMOffRampInterface_ParsePoolAdded_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded, _a1 error) *EVM2EVMOffRampInterface_ParsePoolAdded_Call { +func (_c *EVM2EVMOffRampInterface_ParsePoolAdded_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded, _a1 error) *EVM2EVMOffRampInterface_ParsePoolAdded_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParsePoolAdded_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded, error)) *EVM2EVMOffRampInterface_ParsePoolAdded_Call { +func (_c *EVM2EVMOffRampInterface_ParsePoolAdded_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampPoolAdded, error)) *EVM2EVMOffRampInterface_ParsePoolAdded_Call { _c.Call.Return(run) return _c } // ParsePoolRemoved provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParsePoolRemoved(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved, error) { +func (_m *EVM2EVMOffRampInterface) ParsePoolRemoved(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParsePoolRemoved") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved + var r0 *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved) } } @@ -2385,34 +2385,34 @@ func (_c *EVM2EVMOffRampInterface_ParsePoolRemoved_Call) Run(run func(log types. return _c } -func (_c *EVM2EVMOffRampInterface_ParsePoolRemoved_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved, _a1 error) *EVM2EVMOffRampInterface_ParsePoolRemoved_Call { +func (_c *EVM2EVMOffRampInterface_ParsePoolRemoved_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved, _a1 error) *EVM2EVMOffRampInterface_ParsePoolRemoved_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParsePoolRemoved_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved, error)) *EVM2EVMOffRampInterface_ParsePoolRemoved_Call { +func (_c *EVM2EVMOffRampInterface_ParsePoolRemoved_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved, error)) *EVM2EVMOffRampInterface_ParsePoolRemoved_Call { _c.Call.Return(run) return _c } // ParseSkippedIncorrectNonce provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseSkippedIncorrectNonce(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, error) { +func (_m *EVM2EVMOffRampInterface) ParseSkippedIncorrectNonce(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseSkippedIncorrectNonce") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce + var r0 *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce) } } @@ -2443,34 +2443,34 @@ func (_c *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call) Run(run func( return _c } -func (_c *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, _a1 error) *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call { +func (_c *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, _a1 error) *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, error)) *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call { +func (_c *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, error)) *EVM2EVMOffRampInterface_ParseSkippedIncorrectNonce_Call { _c.Call.Return(run) return _c } // ParseSkippedSenderWithPreviousRampMessageInflight provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseSkippedSenderWithPreviousRampMessageInflight(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, error) { +func (_m *EVM2EVMOffRampInterface) ParseSkippedSenderWithPreviousRampMessageInflight(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseSkippedSenderWithPreviousRampMessageInflight") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight + var r0 *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight) } } @@ -2501,34 +2501,34 @@ func (_c *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInfli return _c } -func (_c *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInflight_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, _a1 error) *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInflight_Call { +func (_c *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInflight_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, _a1 error) *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInflight_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInflight_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, error)) *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInflight_Call { +func (_c *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInflight_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, error)) *EVM2EVMOffRampInterface_ParseSkippedSenderWithPreviousRampMessageInflight_Call { _c.Call.Return(run) return _c } // ParseTransmitted provides a mock function with given fields: log -func (_m *EVM2EVMOffRampInterface) ParseTransmitted(log types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted, error) { +func (_m *EVM2EVMOffRampInterface) ParseTransmitted(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampTransmitted, error) { ret := _m.Called(log) if len(ret) == 0 { panic("no return value specified for ParseTransmitted") } - var r0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted + var r0 *evm_2_evm_offramp.EVM2EVMOffRampTransmitted var r1 error - if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted, error)); ok { + if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampTransmitted, error)); ok { return rf(log) } - if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted); ok { + if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampTransmitted); ok { r0 = rf(log) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted) + r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampTransmitted) } } @@ -2559,12 +2559,12 @@ func (_c *EVM2EVMOffRampInterface_ParseTransmitted_Call) Run(run func(log types. return _c } -func (_c *EVM2EVMOffRampInterface_ParseTransmitted_Call) Return(_a0 *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted, _a1 error) *EVM2EVMOffRampInterface_ParseTransmitted_Call { +func (_c *EVM2EVMOffRampInterface_ParseTransmitted_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampTransmitted, _a1 error) *EVM2EVMOffRampInterface_ParseTransmitted_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *EVM2EVMOffRampInterface_ParseTransmitted_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted, error)) *EVM2EVMOffRampInterface_ParseTransmitted_Call { +func (_c *EVM2EVMOffRampInterface_ParseTransmitted_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampTransmitted, error)) *EVM2EVMOffRampInterface_ParseTransmitted_Call { _c.Call.Return(run) return _c } @@ -2693,7 +2693,7 @@ func (_c *EVM2EVMOffRampInterface_SetOCR2Config_Call) RunAndReturn(run func(*bin } // SetRateLimiterConfig provides a mock function with given fields: opts, config -func (_m *EVM2EVMOffRampInterface) SetRateLimiterConfig(opts *bind.TransactOpts, config evm_2_evm_offramp_1_2_0.RateLimiterConfig) (*types.Transaction, error) { +func (_m *EVM2EVMOffRampInterface) SetRateLimiterConfig(opts *bind.TransactOpts, config evm_2_evm_offramp.RateLimiterConfig) (*types.Transaction, error) { ret := _m.Called(opts, config) if len(ret) == 0 { @@ -2702,10 +2702,10 @@ func (_m *EVM2EVMOffRampInterface) SetRateLimiterConfig(opts *bind.TransactOpts, var r0 *types.Transaction var r1 error - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.RateLimiterConfig) (*types.Transaction, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp.RateLimiterConfig) (*types.Transaction, error)); ok { return rf(opts, config) } - if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.RateLimiterConfig) *types.Transaction); ok { + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, evm_2_evm_offramp.RateLimiterConfig) *types.Transaction); ok { r0 = rf(opts, config) } else { if ret.Get(0) != nil { @@ -2713,7 +2713,7 @@ func (_m *EVM2EVMOffRampInterface) SetRateLimiterConfig(opts *bind.TransactOpts, } } - if rf, ok := ret.Get(1).(func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.RateLimiterConfig) error); ok { + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, evm_2_evm_offramp.RateLimiterConfig) error); ok { r1 = rf(opts, config) } else { r1 = ret.Error(1) @@ -2729,14 +2729,14 @@ type EVM2EVMOffRampInterface_SetRateLimiterConfig_Call struct { // SetRateLimiterConfig is a helper method to define mock.On call // - opts *bind.TransactOpts -// - config evm_2_evm_offramp_1_2_0.RateLimiterConfig +// - config evm_2_evm_offramp.RateLimiterConfig func (_e *EVM2EVMOffRampInterface_Expecter) SetRateLimiterConfig(opts interface{}, config interface{}) *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call { return &EVM2EVMOffRampInterface_SetRateLimiterConfig_Call{Call: _e.mock.On("SetRateLimiterConfig", opts, config)} } -func (_c *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call) Run(run func(opts *bind.TransactOpts, config evm_2_evm_offramp_1_2_0.RateLimiterConfig)) *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call { +func (_c *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call) Run(run func(opts *bind.TransactOpts, config evm_2_evm_offramp.RateLimiterConfig)) *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.TransactOpts), args[1].(evm_2_evm_offramp_1_2_0.RateLimiterConfig)) + run(args[0].(*bind.TransactOpts), args[1].(evm_2_evm_offramp.RateLimiterConfig)) }) return _c } @@ -2746,7 +2746,7 @@ func (_c *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call) Return(_a0 *types.T return _c } -func (_c *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call) RunAndReturn(run func(*bind.TransactOpts, evm_2_evm_offramp_1_2_0.RateLimiterConfig) (*types.Transaction, error)) *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call { +func (_c *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call) RunAndReturn(run func(*bind.TransactOpts, evm_2_evm_offramp.RateLimiterConfig) (*types.Transaction, error)) *EVM2EVMOffRampInterface_SetRateLimiterConfig_Call { _c.Call.Return(run) return _c } @@ -2930,7 +2930,7 @@ func (_c *EVM2EVMOffRampInterface_TypeAndVersion_Call) RunAndReturn(run func(*bi } // WatchAdminSet provides a mock function with given fields: opts, sink -func (_m *EVM2EVMOffRampInterface) WatchAdminSet(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchAdminSet(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet) (event.Subscription, error) { ret := _m.Called(opts, sink) if len(ret) == 0 { @@ -2939,10 +2939,10 @@ func (_m *EVM2EVMOffRampInterface) WatchAdminSet(opts *bind.WatchOpts, sink chan var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet) (event.Subscription, error)); ok { return rf(opts, sink) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet) event.Subscription); ok { r0 = rf(opts, sink) } else { if ret.Get(0) != nil { @@ -2950,7 +2950,7 @@ func (_m *EVM2EVMOffRampInterface) WatchAdminSet(opts *bind.WatchOpts, sink chan } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet) error); ok { r1 = rf(opts, sink) } else { r1 = ret.Error(1) @@ -2966,14 +2966,14 @@ type EVM2EVMOffRampInterface_WatchAdminSet_Call struct { // WatchAdminSet is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet func (_e *EVM2EVMOffRampInterface_Expecter) WatchAdminSet(opts interface{}, sink interface{}) *EVM2EVMOffRampInterface_WatchAdminSet_Call { return &EVM2EVMOffRampInterface_WatchAdminSet_Call{Call: _e.mock.On("WatchAdminSet", opts, sink)} } -func (_c *EVM2EVMOffRampInterface_WatchAdminSet_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet)) *EVM2EVMOffRampInterface_WatchAdminSet_Call { +func (_c *EVM2EVMOffRampInterface_WatchAdminSet_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet)) *EVM2EVMOffRampInterface_WatchAdminSet_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet)) }) return _c } @@ -2983,13 +2983,13 @@ func (_c *EVM2EVMOffRampInterface_WatchAdminSet_Call) Return(_a0 event.Subscript return _c } -func (_c *EVM2EVMOffRampInterface_WatchAdminSet_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampAdminSet) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchAdminSet_Call { +func (_c *EVM2EVMOffRampInterface_WatchAdminSet_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampAdminSet) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchAdminSet_Call { _c.Call.Return(run) return _c } // WatchConfigSet provides a mock function with given fields: opts, sink -func (_m *EVM2EVMOffRampInterface) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet) (event.Subscription, error) { ret := _m.Called(opts, sink) if len(ret) == 0 { @@ -2998,10 +2998,10 @@ func (_m *EVM2EVMOffRampInterface) WatchConfigSet(opts *bind.WatchOpts, sink cha var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet) (event.Subscription, error)); ok { return rf(opts, sink) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet) event.Subscription); ok { r0 = rf(opts, sink) } else { if ret.Get(0) != nil { @@ -3009,7 +3009,7 @@ func (_m *EVM2EVMOffRampInterface) WatchConfigSet(opts *bind.WatchOpts, sink cha } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet) error); ok { r1 = rf(opts, sink) } else { r1 = ret.Error(1) @@ -3025,14 +3025,14 @@ type EVM2EVMOffRampInterface_WatchConfigSet_Call struct { // WatchConfigSet is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet func (_e *EVM2EVMOffRampInterface_Expecter) WatchConfigSet(opts interface{}, sink interface{}) *EVM2EVMOffRampInterface_WatchConfigSet_Call { return &EVM2EVMOffRampInterface_WatchConfigSet_Call{Call: _e.mock.On("WatchConfigSet", opts, sink)} } -func (_c *EVM2EVMOffRampInterface_WatchConfigSet_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet)) *EVM2EVMOffRampInterface_WatchConfigSet_Call { +func (_c *EVM2EVMOffRampInterface_WatchConfigSet_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet)) *EVM2EVMOffRampInterface_WatchConfigSet_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet)) }) return _c } @@ -3042,13 +3042,13 @@ func (_c *EVM2EVMOffRampInterface_WatchConfigSet_Call) Return(_a0 event.Subscrip return _c } -func (_c *EVM2EVMOffRampInterface_WatchConfigSet_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchConfigSet_Call { +func (_c *EVM2EVMOffRampInterface_WatchConfigSet_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchConfigSet_Call { _c.Call.Return(run) return _c } // WatchConfigSet0 provides a mock function with given fields: opts, sink -func (_m *EVM2EVMOffRampInterface) WatchConfigSet0(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchConfigSet0(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0) (event.Subscription, error) { ret := _m.Called(opts, sink) if len(ret) == 0 { @@ -3057,10 +3057,10 @@ func (_m *EVM2EVMOffRampInterface) WatchConfigSet0(opts *bind.WatchOpts, sink ch var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0) (event.Subscription, error)); ok { return rf(opts, sink) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0) event.Subscription); ok { r0 = rf(opts, sink) } else { if ret.Get(0) != nil { @@ -3068,7 +3068,7 @@ func (_m *EVM2EVMOffRampInterface) WatchConfigSet0(opts *bind.WatchOpts, sink ch } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0) error); ok { r1 = rf(opts, sink) } else { r1 = ret.Error(1) @@ -3084,14 +3084,14 @@ type EVM2EVMOffRampInterface_WatchConfigSet0_Call struct { // WatchConfigSet0 is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0 +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0 func (_e *EVM2EVMOffRampInterface_Expecter) WatchConfigSet0(opts interface{}, sink interface{}) *EVM2EVMOffRampInterface_WatchConfigSet0_Call { return &EVM2EVMOffRampInterface_WatchConfigSet0_Call{Call: _e.mock.On("WatchConfigSet0", opts, sink)} } -func (_c *EVM2EVMOffRampInterface_WatchConfigSet0_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0)) *EVM2EVMOffRampInterface_WatchConfigSet0_Call { +func (_c *EVM2EVMOffRampInterface_WatchConfigSet0_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0)) *EVM2EVMOffRampInterface_WatchConfigSet0_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0)) }) return _c } @@ -3101,13 +3101,13 @@ func (_c *EVM2EVMOffRampInterface_WatchConfigSet0_Call) Return(_a0 event.Subscri return _c } -func (_c *EVM2EVMOffRampInterface_WatchConfigSet0_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampConfigSet0) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchConfigSet0_Call { +func (_c *EVM2EVMOffRampInterface_WatchConfigSet0_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigSet0) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchConfigSet0_Call { _c.Call.Return(run) return _c } // WatchExecutionStateChanged provides a mock function with given fields: opts, sink, sequenceNumber, messageId -func (_m *EVM2EVMOffRampInterface) WatchExecutionStateChanged(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, sequenceNumber []uint64, messageId [][32]byte) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchExecutionStateChanged(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, sequenceNumber []uint64, messageId [][32]byte) (event.Subscription, error) { ret := _m.Called(opts, sink, sequenceNumber, messageId) if len(ret) == 0 { @@ -3116,10 +3116,10 @@ func (_m *EVM2EVMOffRampInterface) WatchExecutionStateChanged(opts *bind.WatchOp var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, []uint64, [][32]byte) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, []uint64, [][32]byte) (event.Subscription, error)); ok { return rf(opts, sink, sequenceNumber, messageId) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, []uint64, [][32]byte) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, []uint64, [][32]byte) event.Subscription); ok { r0 = rf(opts, sink, sequenceNumber, messageId) } else { if ret.Get(0) != nil { @@ -3127,7 +3127,7 @@ func (_m *EVM2EVMOffRampInterface) WatchExecutionStateChanged(opts *bind.WatchOp } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, []uint64, [][32]byte) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, []uint64, [][32]byte) error); ok { r1 = rf(opts, sink, sequenceNumber, messageId) } else { r1 = ret.Error(1) @@ -3143,16 +3143,16 @@ type EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call struct { // WatchExecutionStateChanged is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged // - sequenceNumber []uint64 // - messageId [][32]byte func (_e *EVM2EVMOffRampInterface_Expecter) WatchExecutionStateChanged(opts interface{}, sink interface{}, sequenceNumber interface{}, messageId interface{}) *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call { return &EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call{Call: _e.mock.On("WatchExecutionStateChanged", opts, sink, sequenceNumber, messageId)} } -func (_c *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, sequenceNumber []uint64, messageId [][32]byte)) *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call { +func (_c *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, sequenceNumber []uint64, messageId [][32]byte)) *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged), args[2].([]uint64), args[3].([][32]byte)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged), args[2].([]uint64), args[3].([][32]byte)) }) return _c } @@ -3162,13 +3162,13 @@ func (_c *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call) Return(_a0 ev return _c } -func (_c *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampExecutionStateChanged, []uint64, [][32]byte) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call { +func (_c *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampExecutionStateChanged, []uint64, [][32]byte) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchExecutionStateChanged_Call { _c.Call.Return(run) return _c } // WatchOwnershipTransferRequested provides a mock function with given fields: opts, sink, from, to -func (_m *EVM2EVMOffRampInterface) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { ret := _m.Called(opts, sink, from, to) if len(ret) == 0 { @@ -3177,10 +3177,10 @@ func (_m *EVM2EVMOffRampInterface) WatchOwnershipTransferRequested(opts *bind.Wa var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, []common.Address, []common.Address) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, []common.Address, []common.Address) (event.Subscription, error)); ok { return rf(opts, sink, from, to) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, []common.Address, []common.Address) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, []common.Address, []common.Address) event.Subscription); ok { r0 = rf(opts, sink, from, to) } else { if ret.Get(0) != nil { @@ -3188,7 +3188,7 @@ func (_m *EVM2EVMOffRampInterface) WatchOwnershipTransferRequested(opts *bind.Wa } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, []common.Address, []common.Address) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, []common.Address, []common.Address) error); ok { r1 = rf(opts, sink, from, to) } else { r1 = ret.Error(1) @@ -3204,16 +3204,16 @@ type EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call struct { // WatchOwnershipTransferRequested is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested // - from []common.Address // - to []common.Address func (_e *EVM2EVMOffRampInterface_Expecter) WatchOwnershipTransferRequested(opts interface{}, sink interface{}, from interface{}, to interface{}) *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call { return &EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call{Call: _e.mock.On("WatchOwnershipTransferRequested", opts, sink, from, to)} } -func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, from []common.Address, to []common.Address)) *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call { +func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, from []common.Address, to []common.Address)) *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested), args[2].([]common.Address), args[3].([]common.Address)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested), args[2].([]common.Address), args[3].([]common.Address)) }) return _c } @@ -3223,13 +3223,13 @@ func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call) Return(_ return _c } -func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferRequested, []common.Address, []common.Address) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call { +func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferRequested, []common.Address, []common.Address) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchOwnershipTransferRequested_Call { _c.Call.Return(run) return _c } // WatchOwnershipTransferred provides a mock function with given fields: opts, sink, from, to -func (_m *EVM2EVMOffRampInterface) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { ret := _m.Called(opts, sink, from, to) if len(ret) == 0 { @@ -3238,10 +3238,10 @@ func (_m *EVM2EVMOffRampInterface) WatchOwnershipTransferred(opts *bind.WatchOpt var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, []common.Address, []common.Address) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, []common.Address, []common.Address) (event.Subscription, error)); ok { return rf(opts, sink, from, to) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, []common.Address, []common.Address) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, []common.Address, []common.Address) event.Subscription); ok { r0 = rf(opts, sink, from, to) } else { if ret.Get(0) != nil { @@ -3249,7 +3249,7 @@ func (_m *EVM2EVMOffRampInterface) WatchOwnershipTransferred(opts *bind.WatchOpt } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, []common.Address, []common.Address) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, []common.Address, []common.Address) error); ok { r1 = rf(opts, sink, from, to) } else { r1 = ret.Error(1) @@ -3265,16 +3265,16 @@ type EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call struct { // WatchOwnershipTransferred is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred // - from []common.Address // - to []common.Address func (_e *EVM2EVMOffRampInterface_Expecter) WatchOwnershipTransferred(opts interface{}, sink interface{}, from interface{}, to interface{}) *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call { return &EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call{Call: _e.mock.On("WatchOwnershipTransferred", opts, sink, from, to)} } -func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, from []common.Address, to []common.Address)) *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call { +func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, from []common.Address, to []common.Address)) *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred), args[2].([]common.Address), args[3].([]common.Address)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred), args[2].([]common.Address), args[3].([]common.Address)) }) return _c } @@ -3284,13 +3284,13 @@ func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call) Return(_a0 eve return _c } -func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampOwnershipTransferred, []common.Address, []common.Address) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call { +func (_c *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampOwnershipTransferred, []common.Address, []common.Address) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchOwnershipTransferred_Call { _c.Call.Return(run) return _c } // WatchPoolAdded provides a mock function with given fields: opts, sink -func (_m *EVM2EVMOffRampInterface) WatchPoolAdded(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchPoolAdded(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded) (event.Subscription, error) { ret := _m.Called(opts, sink) if len(ret) == 0 { @@ -3299,10 +3299,10 @@ func (_m *EVM2EVMOffRampInterface) WatchPoolAdded(opts *bind.WatchOpts, sink cha var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded) (event.Subscription, error)); ok { return rf(opts, sink) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded) event.Subscription); ok { r0 = rf(opts, sink) } else { if ret.Get(0) != nil { @@ -3310,7 +3310,7 @@ func (_m *EVM2EVMOffRampInterface) WatchPoolAdded(opts *bind.WatchOpts, sink cha } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded) error); ok { r1 = rf(opts, sink) } else { r1 = ret.Error(1) @@ -3326,14 +3326,14 @@ type EVM2EVMOffRampInterface_WatchPoolAdded_Call struct { // WatchPoolAdded is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded func (_e *EVM2EVMOffRampInterface_Expecter) WatchPoolAdded(opts interface{}, sink interface{}) *EVM2EVMOffRampInterface_WatchPoolAdded_Call { return &EVM2EVMOffRampInterface_WatchPoolAdded_Call{Call: _e.mock.On("WatchPoolAdded", opts, sink)} } -func (_c *EVM2EVMOffRampInterface_WatchPoolAdded_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded)) *EVM2EVMOffRampInterface_WatchPoolAdded_Call { +func (_c *EVM2EVMOffRampInterface_WatchPoolAdded_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded)) *EVM2EVMOffRampInterface_WatchPoolAdded_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded)) }) return _c } @@ -3343,13 +3343,13 @@ func (_c *EVM2EVMOffRampInterface_WatchPoolAdded_Call) Return(_a0 event.Subscrip return _c } -func (_c *EVM2EVMOffRampInterface_WatchPoolAdded_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolAdded) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchPoolAdded_Call { +func (_c *EVM2EVMOffRampInterface_WatchPoolAdded_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolAdded) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchPoolAdded_Call { _c.Call.Return(run) return _c } // WatchPoolRemoved provides a mock function with given fields: opts, sink -func (_m *EVM2EVMOffRampInterface) WatchPoolRemoved(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchPoolRemoved(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved) (event.Subscription, error) { ret := _m.Called(opts, sink) if len(ret) == 0 { @@ -3358,10 +3358,10 @@ func (_m *EVM2EVMOffRampInterface) WatchPoolRemoved(opts *bind.WatchOpts, sink c var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved) (event.Subscription, error)); ok { return rf(opts, sink) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved) event.Subscription); ok { r0 = rf(opts, sink) } else { if ret.Get(0) != nil { @@ -3369,7 +3369,7 @@ func (_m *EVM2EVMOffRampInterface) WatchPoolRemoved(opts *bind.WatchOpts, sink c } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved) error); ok { r1 = rf(opts, sink) } else { r1 = ret.Error(1) @@ -3385,14 +3385,14 @@ type EVM2EVMOffRampInterface_WatchPoolRemoved_Call struct { // WatchPoolRemoved is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved func (_e *EVM2EVMOffRampInterface_Expecter) WatchPoolRemoved(opts interface{}, sink interface{}) *EVM2EVMOffRampInterface_WatchPoolRemoved_Call { return &EVM2EVMOffRampInterface_WatchPoolRemoved_Call{Call: _e.mock.On("WatchPoolRemoved", opts, sink)} } -func (_c *EVM2EVMOffRampInterface_WatchPoolRemoved_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved)) *EVM2EVMOffRampInterface_WatchPoolRemoved_Call { +func (_c *EVM2EVMOffRampInterface_WatchPoolRemoved_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved)) *EVM2EVMOffRampInterface_WatchPoolRemoved_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved)) }) return _c } @@ -3402,13 +3402,13 @@ func (_c *EVM2EVMOffRampInterface_WatchPoolRemoved_Call) Return(_a0 event.Subscr return _c } -func (_c *EVM2EVMOffRampInterface_WatchPoolRemoved_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampPoolRemoved) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchPoolRemoved_Call { +func (_c *EVM2EVMOffRampInterface_WatchPoolRemoved_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampPoolRemoved) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchPoolRemoved_Call { _c.Call.Return(run) return _c } // WatchSkippedIncorrectNonce provides a mock function with given fields: opts, sink, nonce, sender -func (_m *EVM2EVMOffRampInterface) WatchSkippedIncorrectNonce(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, nonce []uint64, sender []common.Address) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchSkippedIncorrectNonce(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, nonce []uint64, sender []common.Address) (event.Subscription, error) { ret := _m.Called(opts, sink, nonce, sender) if len(ret) == 0 { @@ -3417,10 +3417,10 @@ func (_m *EVM2EVMOffRampInterface) WatchSkippedIncorrectNonce(opts *bind.WatchOp var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, []uint64, []common.Address) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, []uint64, []common.Address) (event.Subscription, error)); ok { return rf(opts, sink, nonce, sender) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, []uint64, []common.Address) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, []uint64, []common.Address) event.Subscription); ok { r0 = rf(opts, sink, nonce, sender) } else { if ret.Get(0) != nil { @@ -3428,7 +3428,7 @@ func (_m *EVM2EVMOffRampInterface) WatchSkippedIncorrectNonce(opts *bind.WatchOp } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, []uint64, []common.Address) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, []uint64, []common.Address) error); ok { r1 = rf(opts, sink, nonce, sender) } else { r1 = ret.Error(1) @@ -3444,16 +3444,16 @@ type EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call struct { // WatchSkippedIncorrectNonce is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce // - nonce []uint64 // - sender []common.Address func (_e *EVM2EVMOffRampInterface_Expecter) WatchSkippedIncorrectNonce(opts interface{}, sink interface{}, nonce interface{}, sender interface{}) *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call { return &EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call{Call: _e.mock.On("WatchSkippedIncorrectNonce", opts, sink, nonce, sender)} } -func (_c *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, nonce []uint64, sender []common.Address)) *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call { +func (_c *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, nonce []uint64, sender []common.Address)) *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce), args[2].([]uint64), args[3].([]common.Address)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce), args[2].([]uint64), args[3].([]common.Address)) }) return _c } @@ -3463,13 +3463,13 @@ func (_c *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call) Return(_a0 ev return _c } -func (_c *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedIncorrectNonce, []uint64, []common.Address) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call { +func (_c *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedIncorrectNonce, []uint64, []common.Address) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchSkippedIncorrectNonce_Call { _c.Call.Return(run) return _c } // WatchSkippedSenderWithPreviousRampMessageInflight provides a mock function with given fields: opts, sink, nonce, sender -func (_m *EVM2EVMOffRampInterface) WatchSkippedSenderWithPreviousRampMessageInflight(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, nonce []uint64, sender []common.Address) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchSkippedSenderWithPreviousRampMessageInflight(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, nonce []uint64, sender []common.Address) (event.Subscription, error) { ret := _m.Called(opts, sink, nonce, sender) if len(ret) == 0 { @@ -3478,10 +3478,10 @@ func (_m *EVM2EVMOffRampInterface) WatchSkippedSenderWithPreviousRampMessageInfl var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, []uint64, []common.Address) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, []uint64, []common.Address) (event.Subscription, error)); ok { return rf(opts, sink, nonce, sender) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, []uint64, []common.Address) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, []uint64, []common.Address) event.Subscription); ok { r0 = rf(opts, sink, nonce, sender) } else { if ret.Get(0) != nil { @@ -3489,7 +3489,7 @@ func (_m *EVM2EVMOffRampInterface) WatchSkippedSenderWithPreviousRampMessageInfl } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, []uint64, []common.Address) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, []uint64, []common.Address) error); ok { r1 = rf(opts, sink, nonce, sender) } else { r1 = ret.Error(1) @@ -3505,16 +3505,16 @@ type EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_C // WatchSkippedSenderWithPreviousRampMessageInflight is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight // - nonce []uint64 // - sender []common.Address func (_e *EVM2EVMOffRampInterface_Expecter) WatchSkippedSenderWithPreviousRampMessageInflight(opts interface{}, sink interface{}, nonce interface{}, sender interface{}) *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call { return &EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call{Call: _e.mock.On("WatchSkippedSenderWithPreviousRampMessageInflight", opts, sink, nonce, sender)} } -func (_c *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, nonce []uint64, sender []common.Address)) *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call { +func (_c *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, nonce []uint64, sender []common.Address)) *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight), args[2].([]uint64), args[3].([]common.Address)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight), args[2].([]uint64), args[3].([]common.Address)) }) return _c } @@ -3524,13 +3524,13 @@ func (_c *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInfli return _c } -func (_c *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, []uint64, []common.Address) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call { +func (_c *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampSkippedSenderWithPreviousRampMessageInflight, []uint64, []common.Address) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchSkippedSenderWithPreviousRampMessageInflight_Call { _c.Call.Return(run) return _c } // WatchTransmitted provides a mock function with given fields: opts, sink -func (_m *EVM2EVMOffRampInterface) WatchTransmitted(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted) (event.Subscription, error) { +func (_m *EVM2EVMOffRampInterface) WatchTransmitted(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampTransmitted) (event.Subscription, error) { ret := _m.Called(opts, sink) if len(ret) == 0 { @@ -3539,10 +3539,10 @@ func (_m *EVM2EVMOffRampInterface) WatchTransmitted(opts *bind.WatchOpts, sink c var r0 event.Subscription var r1 error - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted) (event.Subscription, error)); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampTransmitted) (event.Subscription, error)); ok { return rf(opts, sink) } - if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted) event.Subscription); ok { + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampTransmitted) event.Subscription); ok { r0 = rf(opts, sink) } else { if ret.Get(0) != nil { @@ -3550,7 +3550,7 @@ func (_m *EVM2EVMOffRampInterface) WatchTransmitted(opts *bind.WatchOpts, sink c } } - if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted) error); ok { + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampTransmitted) error); ok { r1 = rf(opts, sink) } else { r1 = ret.Error(1) @@ -3566,14 +3566,14 @@ type EVM2EVMOffRampInterface_WatchTransmitted_Call struct { // WatchTransmitted is a helper method to define mock.On call // - opts *bind.WatchOpts -// - sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted +// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampTransmitted func (_e *EVM2EVMOffRampInterface_Expecter) WatchTransmitted(opts interface{}, sink interface{}) *EVM2EVMOffRampInterface_WatchTransmitted_Call { return &EVM2EVMOffRampInterface_WatchTransmitted_Call{Call: _e.mock.On("WatchTransmitted", opts, sink)} } -func (_c *EVM2EVMOffRampInterface_WatchTransmitted_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted)) *EVM2EVMOffRampInterface_WatchTransmitted_Call { +func (_c *EVM2EVMOffRampInterface_WatchTransmitted_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampTransmitted)) *EVM2EVMOffRampInterface_WatchTransmitted_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted)) + run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampTransmitted)) }) return _c } @@ -3583,7 +3583,7 @@ func (_c *EVM2EVMOffRampInterface_WatchTransmitted_Call) Return(_a0 event.Subscr return _c } -func (_c *EVM2EVMOffRampInterface_WatchTransmitted_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp_1_2_0.EVM2EVMOffRampTransmitted) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchTransmitted_Call { +func (_c *EVM2EVMOffRampInterface_WatchTransmitted_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampTransmitted) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchTransmitted_Call { _c.Call.Return(run) return _c } diff --git a/core/gethwrappers/generation/generate/genwrapper/genwrapper.go b/core/gethwrappers/generation/generate/genwrapper/genwrapper.go index 380d6827553..06c8ceb3fc6 100644 --- a/core/gethwrappers/generation/generate/genwrapper/genwrapper.go +++ b/core/gethwrappers/generation/generate/genwrapper/genwrapper.go @@ -10,16 +10,34 @@ import ( gethwrappers2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers" ) -func GenWrapper(abiPath string, binPath string, className string, pkgName string) { +// GenWrapper generates a contract wrapper for the given contract. +// +// abiPath is the path to the contract's ABI JSON file. +// +// binPath is the path to the contract's binary file, typically with .bin extension. +// +// className is the name of the generated contract class. +// +// pkgName is the name of the package the contract will be generated in. Try +// to follow idiomatic Go package naming conventions where possible. +// +// outDirSuffixInput is the directory suffix to generate the wrapper in. If not provided, the +// wrapper will be generated in the default location. The default location is +// /generated//.go. The suffix will take place after +// the /generated, so the overridden location would be +// /generated///.go. +func GenWrapper(abiPath, binPath, className, pkgName, outDirSuffixInput string) { fmt.Println("Generating", pkgName, "contract wrapper") cwd, err := os.Getwd() // gethwrappers directory if err != nil { gethwrappers2.Exit("could not get working directory", err) } - outDir := filepath.Join(cwd, "generated", pkgName) + outDir := filepath.Join(cwd, "generated", outDirSuffixInput, pkgName) if mkdErr := os.MkdirAll(outDir, 0700); err != nil { - gethwrappers2.Exit("failed to create wrapper dir", mkdErr) + gethwrappers2.Exit( + fmt.Sprintf("failed to create wrapper dir, outDirSuffixInput: %s (could be empty)", outDirSuffixInput), + mkdErr) } outPath := filepath.Join(outDir, pkgName+".go") diff --git a/core/gethwrappers/generation/generate/wrap.go b/core/gethwrappers/generation/generate/wrap.go index db251101cc3..e962e9f808a 100644 --- a/core/gethwrappers/generation/generate/wrap.go +++ b/core/gethwrappers/generation/generate/wrap.go @@ -12,5 +12,10 @@ func main() { className := os.Args[3] pkgName := os.Args[4] - genwrapper.GenWrapper(abiPath, binPath, className, pkgName) + var outDirSuffix string + if len(os.Args) >= 6 { + outDirSuffix = os.Args[5] + } + + genwrapper.GenWrapper(abiPath, binPath, className, pkgName, outDirSuffix) } diff --git a/core/gethwrappers/generation/wrap.go b/core/gethwrappers/generation/wrap.go index 8bbdf61483c..ea87d51b30d 100644 --- a/core/gethwrappers/generation/wrap.go +++ b/core/gethwrappers/generation/wrap.go @@ -15,8 +15,13 @@ func main() { className := os.Args[2] pkgName := os.Args[3] + var outDirSuffix string + if len(os.Args) >= 5 { + outDirSuffix = os.Args[4] + } + abiPath := rootDir + project + "/" + className + "/" + className + ".sol/" + className + ".abi.json" binPath := rootDir + project + "/" + className + "/" + className + ".sol/" + className + ".bin" - genwrapper.GenWrapper(abiPath, binPath, className, pkgName) + genwrapper.GenWrapper(abiPath, binPath, className, pkgName, outDirSuffix) } diff --git a/core/scripts/ccip/revert-reason/handler/reason.go b/core/scripts/ccip/revert-reason/handler/reason.go index ee354aca928..98ab4b273ce 100644 --- a/core/scripts/ccip/revert-reason/handler/reason.go +++ b/core/scripts/ccip/revert-reason/handler/reason.go @@ -14,22 +14,25 @@ import ( "github.com/ethereum/go-ethereum/ethclient" "github.com/pkg/errors" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool_1_4_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool_1_4_0" + burn_mint_token_pool_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/burn_mint_token_pool" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + lock_release_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/lock_release_token_pool" + usdc_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" ) diff --git a/core/services/ocr2/plugins/ccip/ccipcommit/ocr2_test.go b/core/services/ocr2/plugins/ccip/ccipcommit/ocr2_test.go index d878fca01f7..de442057cf2 100644 --- a/core/services/ocr2/plugins/ccip/ccipcommit/ocr2_test.go +++ b/core/services/ocr2/plugins/ccip/ccipcommit/ocr2_test.go @@ -31,7 +31,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/gas/mocks" "github.com/smartcontractkit/chainlink-integrations/evm/utils" mocks2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip" diff --git a/core/services/ocr2/plugins/ccip/clo_ccip_integration_test.go b/core/services/ocr2/plugins/ccip/clo_ccip_integration_test.go index b5052e98f93..ee1a773041f 100644 --- a/core/services/ocr2/plugins/ccip/clo_ccip_integration_test.go +++ b/core/services/ocr2/plugins/ccip/clo_ccip_integration_test.go @@ -12,7 +12,8 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/mock_v3_aggregator_contract" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" diff --git a/core/services/ocr2/plugins/ccip/integration_test.go b/core/services/ocr2/plugins/ccip/integration_test.go index 6a1aef98d0c..eedf212422a 100644 --- a/core/services/ocr2/plugins/ccip/integration_test.go +++ b/core/services/ocr2/plugins/ccip/integration_test.go @@ -11,6 +11,7 @@ import ( gethtypes "github.com/ethereum/go-ethereum/core/types" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip" @@ -18,8 +19,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/mock_v3_aggregator_contract" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" diff --git a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go index 97e659cc916..e3047cd0f4f 100644 --- a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go +++ b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go @@ -11,8 +11,9 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_1_2_0" + commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" "github.com/smartcontractkit/chainlink/v2/core/logger" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader.go index 933123c1f16..951517ac025 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader.go @@ -13,7 +13,8 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go index 4d12a8f9e2a..61215f60ca9 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go @@ -26,9 +26,9 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_helper_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" + commit_store_helper_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store_helper" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store.go index e06bb0ba3d9..a975eacb28b 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store.go @@ -12,7 +12,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp.go index 568c6ffe6e4..8c99fb07f3f 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp.go @@ -13,9 +13,10 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go index b3cb4f512cf..e04c9c82738 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go @@ -15,16 +15,18 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_helper" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store_helper" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" "github.com/smartcontractkit/chainlink/v2/core/logger" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go index 017c8a089fb..ce7534b580d 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go @@ -19,11 +19,12 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go index 5278ecc0fe0..52fb3579885 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go @@ -25,7 +25,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go index a88b881cdf8..38823cf60e9 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go @@ -22,8 +22,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_1_2_0" + commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/hasher.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/hasher.go index 29e6c0c7e80..61e223ccec4 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/hasher.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/hasher.go @@ -10,7 +10,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/hashutil" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/utils" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/hasher_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/hasher_test.go index 7dac6f9bd74..0feb968bc4c 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/hasher_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/hasher_test.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/hashutil" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go index 89b0c827203..5aa51180cc0 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go @@ -21,9 +21,10 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_reader_unit_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_reader_unit_test.go index 2fdb48955d7..12da2298f59 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_reader_unit_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_reader_unit_test.go @@ -18,10 +18,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0" + evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" mock_contracts "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/mocks/v1_2_0" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp.go index e821e212eed..90fdc56dc3d 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp.go @@ -15,9 +15,10 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/price_registry.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/price_registry.go index 15ae78fca75..f240a3f2ae8 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/price_registry.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/price_registry.go @@ -13,10 +13,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" + "github.com/smartcontractkit/chainlink-integrations/evm/client" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/test_helpers.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/test_helpers.go index 40aa304f336..d1dc3f79711 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/test_helpers.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/test_helpers.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/require" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/token_pool.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/token_pool.go index a0850ebb2e9..c7c2b607672 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/token_pool.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/token_pool.go @@ -5,7 +5,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_2_0" + burn_mint_token_pool_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/burn_mint_token_pool" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_4_0/token_pool.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_4_0/token_pool.go index caf652b9e4e..e223e488424 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_4_0/token_pool.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_4_0/token_pool.go @@ -3,9 +3,9 @@ package v1_4_0 import ( "github.com/ethereum/go-ethereum/common" + burn_mint_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/burn_mint_token_pool" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_4_0" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/commit_store.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/commit_store.go index 34761db0403..3bbaf9b8dea 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/commit_store.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/commit_store.go @@ -13,7 +13,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/hasher.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/hasher.go index e70e3c547ea..f77c82aa0a1 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/hasher.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/hasher.go @@ -7,7 +7,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/hashutil" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/hasher_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/hasher_test.go index 2a585f7bd1e..b193b5e7982 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/hasher_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/hasher_test.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/hashutil" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go index fddf1c236d9..df11ec00e49 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go @@ -11,11 +11,13 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" + "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp.go index e1ce2fc2878..b5f689bc02a 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp.go @@ -16,9 +16,10 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go index d0541680a45..6dd23147db3 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go @@ -14,10 +14,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/pkg/leafer/leafer.go b/core/services/ocr2/plugins/ccip/pkg/leafer/leafer.go index a5ea56f0bbd..8a774f7f731 100644 --- a/core/services/ocr2/plugins/ccip/pkg/leafer/leafer.go +++ b/core/services/ocr2/plugins/ccip/pkg/leafer/leafer.go @@ -9,8 +9,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/hashutil" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0" ) diff --git a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go index 8d3eeb72751..c83a45d9afc 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go @@ -29,20 +29,21 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_helper" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_helper_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" + commit_store_helper_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store_helper" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store_helper" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/weth9" "github.com/smartcontractkit/chainlink/v2/core/logger" diff --git a/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go b/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go index 70f06183299..bd01b642aef 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go @@ -43,14 +43,15 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-integrations/evm/utils" evmUtils "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + evmcapabilities "github.com/smartcontractkit/chainlink/v2/core/capabilities" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" configv2 "github.com/smartcontractkit/chainlink/v2/core/config/toml" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/logger/audit" diff --git a/core/services/ocr2/plugins/ccip/testhelpers/offramp.go b/core/services/ocr2/plugins/ccip/testhelpers/offramp.go index b4fc85d2c66..94674c88e4a 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/offramp.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/offramp.go @@ -10,7 +10,8 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" mock_contracts "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/mocks" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" ) diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go index 17de9939c60..6ca4370a100 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go @@ -28,19 +28,20 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - burn_mint_token_pool "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool_1_4_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_1_2_0" - evm_2_evm_offramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" - evm_2_evm_onramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool_1_0_0" - lock_release_token_pool "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool_1_4_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" + evm_2_evm_offramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" + burn_mint_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/burn_mint_token_pool" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" + lock_release_token_pool_1_0_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/lock_release_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" + evm_2_evm_onramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + lock_release_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/lock_release_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/weth9" @@ -182,7 +183,7 @@ type Common struct { User *bind.TransactOpts Chain *backends.SimulatedBackend LinkToken *link_token_interface.LinkToken - LinkTokenPool *lock_release_token_pool.LockReleaseTokenPool + LinkTokenPool *lock_release_token_pool_1_4_0.LockReleaseTokenPool CustomToken *link_token_interface.LinkToken WrappedNative *weth9.WETH9 WrappedNativePool *lock_release_token_pool_1_0_0.LockReleaseTokenPool @@ -610,7 +611,7 @@ func (c *CCIPContracts) SetupLockAndMintTokenPool( return [20]byte{}, nil, err } - destPoolAddress, _, destPool, err := burn_mint_token_pool.DeployBurnMintTokenPool( + destPoolAddress, _, destPool, err := burn_mint_token_pool_1_4_0.DeployBurnMintTokenPool( c.Dest.User, c.Dest.Chain, destTokenAddress, @@ -629,16 +630,16 @@ func (c *CCIPContracts) SetupLockAndMintTokenPool( } _, err = destPool.ApplyChainUpdates(c.Dest.User, - []burn_mint_token_pool.TokenPoolChainUpdate{ + []burn_mint_token_pool_1_4_0.TokenPoolChainUpdate{ { RemoteChainSelector: c.Source.ChainSelector, Allowed: true, - OutboundRateLimiterConfig: burn_mint_token_pool.RateLimiterConfig{ + OutboundRateLimiterConfig: burn_mint_token_pool_1_4_0.RateLimiterConfig{ IsEnabled: true, Capacity: HundredLink, Rate: big.NewInt(1e18), }, - InboundRateLimiterConfig: burn_mint_token_pool.RateLimiterConfig{ + InboundRateLimiterConfig: burn_mint_token_pool_1_4_0.RateLimiterConfig{ IsEnabled: true, Capacity: HundredLink, Rate: big.NewInt(1e18), @@ -650,7 +651,7 @@ func (c *CCIPContracts) SetupLockAndMintTokenPool( } c.Dest.Chain.Commit() - sourcePoolAddress, _, sourcePool, err := lock_release_token_pool.DeployLockReleaseTokenPool( + sourcePoolAddress, _, sourcePool, err := lock_release_token_pool_1_4_0.DeployLockReleaseTokenPool( c.Source.User, c.Source.Chain, sourceTokenAddress, @@ -665,16 +666,16 @@ func (c *CCIPContracts) SetupLockAndMintTokenPool( c.Source.Chain.Commit() // set onRamp as valid caller for source pool - _, err = sourcePool.ApplyChainUpdates(c.Source.User, []lock_release_token_pool.TokenPoolChainUpdate{ + _, err = sourcePool.ApplyChainUpdates(c.Source.User, []lock_release_token_pool_1_4_0.TokenPoolChainUpdate{ { RemoteChainSelector: c.Dest.ChainSelector, Allowed: true, - OutboundRateLimiterConfig: lock_release_token_pool.RateLimiterConfig{ + OutboundRateLimiterConfig: lock_release_token_pool_1_4_0.RateLimiterConfig{ IsEnabled: true, Capacity: HundredLink, Rate: big.NewInt(1e18), }, - InboundRateLimiterConfig: lock_release_token_pool.RateLimiterConfig{ + InboundRateLimiterConfig: lock_release_token_pool_1_4_0.RateLimiterConfig{ IsEnabled: true, Capacity: HundredLink, Rate: big.NewInt(1e18), @@ -860,7 +861,7 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh sourceWeth9Pool, err := lock_release_token_pool_1_0_0.NewLockReleaseTokenPool(sourceWeth9PoolAddress, sourceChain.Client()) require.NoError(t, err) - sourcePoolAddress, _, _, err := lock_release_token_pool.DeployLockReleaseTokenPool( + sourcePoolAddress, _, _, err := lock_release_token_pool_1_4_0.DeployLockReleaseTokenPool( sourceUser, sourceChain.Client(), sourceLinkTokenAddress, @@ -871,7 +872,7 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh ) require.NoError(t, err) sourceChain.Commit() - sourcePool, err := lock_release_token_pool.NewLockReleaseTokenPool(sourcePoolAddress, sourceChain.Client()) + sourcePool, err := lock_release_token_pool_1_4_0.NewLockReleaseTokenPool(sourcePoolAddress, sourceChain.Client()) require.NoError(t, err) // Deploy custom token pool source @@ -993,15 +994,15 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh require.NoError(t, err) _, err = sourcePool.ApplyChainUpdates( sourceUser, - []lock_release_token_pool.TokenPoolChainUpdate{{ + []lock_release_token_pool_1_4_0.TokenPoolChainUpdate{{ RemoteChainSelector: DestChainSelector, Allowed: true, - OutboundRateLimiterConfig: lock_release_token_pool.RateLimiterConfig{ + OutboundRateLimiterConfig: lock_release_token_pool_1_4_0.RateLimiterConfig{ IsEnabled: true, Capacity: HundredLink, Rate: big.NewInt(1e18), }, - InboundRateLimiterConfig: lock_release_token_pool.RateLimiterConfig{ + InboundRateLimiterConfig: lock_release_token_pool_1_4_0.RateLimiterConfig{ IsEnabled: true, Capacity: HundredLink, Rate: big.NewInt(1e18), @@ -1043,7 +1044,7 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh destChain.Commit() destLinkToken, err := link_token_interface.NewLinkToken(destLinkTokenAddress, destChain.Client()) require.NoError(t, err) - destPoolAddress, _, _, err := lock_release_token_pool.DeployLockReleaseTokenPool( + destPoolAddress, _, _, err := lock_release_token_pool_1_4_0.DeployLockReleaseTokenPool( destUser, destChain.Client(), destLinkTokenAddress, @@ -1054,7 +1055,7 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh ) require.NoError(t, err) destChain.Commit() - destPool, err := lock_release_token_pool.NewLockReleaseTokenPool(destPoolAddress, destChain.Client()) + destPool, err := lock_release_token_pool_1_4_0.NewLockReleaseTokenPool(destPoolAddress, destChain.Client()) require.NoError(t, err) destChain.Commit() @@ -1144,15 +1145,15 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh offRamp, err := evm_2_evm_offramp.NewEVM2EVMOffRamp(offRampAddress, destChain.Client()) require.NoError(t, err) _, err = destPool.ApplyChainUpdates(destUser, - []lock_release_token_pool.TokenPoolChainUpdate{{ + []lock_release_token_pool_1_4_0.TokenPoolChainUpdate{{ RemoteChainSelector: sourceChainSelector, Allowed: true, - OutboundRateLimiterConfig: lock_release_token_pool.RateLimiterConfig{ + OutboundRateLimiterConfig: lock_release_token_pool_1_4_0.RateLimiterConfig{ IsEnabled: true, Capacity: HundredLink, Rate: big.NewInt(1e18), }, - InboundRateLimiterConfig: lock_release_token_pool.RateLimiterConfig{ + InboundRateLimiterConfig: lock_release_token_pool_1_4_0.RateLimiterConfig{ IsEnabled: true, Capacity: HundredLink, Rate: big.NewInt(1e18), @@ -1455,7 +1456,7 @@ func (args *ManualExecArgs) execute(report *commit_store_1_2_0.CommitStoreCommit seqNr := args.SeqNr // Build a merkle tree for the report mctx := hashutil.NewKeccak() - onRampContract, err := evm_2_evm_onramp_1_2_0.NewEVM2EVMOnRamp(common.HexToAddress(args.OnRamp), args.SourceChain) + onRampContract, err := evm_2_evm_onramp.NewEVM2EVMOnRamp(common.HexToAddress(args.OnRamp), args.SourceChain) if err != nil { return nil, err } diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go index 80d80cc586c..9d67ba62104 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go @@ -43,13 +43,14 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-integrations/evm/utils" evmUtils "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + evmcapabilities "github.com/smartcontractkit/chainlink/v2/core/capabilities" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" configv2 "github.com/smartcontractkit/chainlink/v2/core/config/toml" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" + commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" + evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/logger/audit" diff --git a/core/services/relay/evm/commit_provider.go b/core/services/relay/evm/commit_provider.go index f1c5514828c..9997f10cdce 100644 --- a/core/services/relay/evm/commit_provider.go +++ b/core/services/relay/evm/commit_provider.go @@ -14,10 +14,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" + "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig" ) diff --git a/core/services/relay/evm/exec_provider.go b/core/services/relay/evm/exec_provider.go index 538daec3cae..ead1dc9e421 100644 --- a/core/services/relay/evm/exec_provider.go +++ b/core/services/relay/evm/exec_provider.go @@ -16,6 +16,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/tokendata/lbtc" @@ -23,7 +25,6 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/tokendata/usdc" diff --git a/deployment/ccip/changeset/cs_accept_admin_role.go b/deployment/ccip/changeset/cs_accept_admin_role.go index 98c103b5826..fd66a575671 100644 --- a/deployment/ccip/changeset/cs_accept_admin_role.go +++ b/deployment/ccip/changeset/cs_accept_admin_role.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) var _ deployment.ChangeSet[TokenAdminRegistryChangesetConfig] = AcceptAdminRoleChangeset diff --git a/deployment/ccip/changeset/cs_active_candidate_test.go b/deployment/ccip/changeset/cs_active_candidate_test.go index 97c8c2ffe90..c8d118a4fec 100644 --- a/deployment/ccip/changeset/cs_active_candidate_test.go +++ b/deployment/ccip/changeset/cs_active_candidate_test.go @@ -18,8 +18,8 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/deployment/ccip/changeset/cs_add_lane_test.go b/deployment/ccip/changeset/cs_add_lane_test.go index 18f86d98a68..5be37122a51 100644 --- a/deployment/ccip/changeset/cs_add_lane_test.go +++ b/deployment/ccip/changeset/cs_add_lane_test.go @@ -10,7 +10,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" ) func TestAddLanesWithTestRouter(t *testing.T) { diff --git a/deployment/ccip/changeset/cs_ccip_home.go b/deployment/ccip/changeset/cs_ccip_home.go index 98761118d4f..d85b98caaf8 100644 --- a/deployment/ccip/changeset/cs_ccip_home.go +++ b/deployment/ccip/changeset/cs_ccip_home.go @@ -30,7 +30,7 @@ import ( commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" ) diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go index d2c26376635..26c78f1a2fd 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/cs_chain_contracts.go @@ -18,6 +18,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" @@ -25,11 +27,10 @@ import ( "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" ) const ( @@ -1094,7 +1095,7 @@ func UpdateOffRampSourcesChangeset(e deployment.Environment, cfg UpdateOffRampSo Router: router, IsEnabled: update.IsEnabled, // TODO: how would this work when the onRamp is nonEVM? - OnRamp: common.LeftPadBytes(onRamp.Address().Bytes(), 32), + OnRamp: common.LeftPadBytes(onRamp.Address().Bytes(), 32), IsRMNVerificationDisabled: update.IsRMNVerificationDisabled, }) } diff --git a/deployment/ccip/changeset/cs_chain_contracts_test.go b/deployment/ccip/changeset/cs_chain_contracts_test.go index 37706eef40e..ed0f60472b8 100644 --- a/deployment/ccip/changeset/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/cs_chain_contracts_test.go @@ -13,10 +13,11 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" ) func TestUpdateOnRampsDests(t *testing.T) { diff --git a/deployment/ccip/changeset/cs_configure_token_pools.go b/deployment/ccip/changeset/cs_configure_token_pools.go index 7fbd3eb3c01..40a566d6e76 100644 --- a/deployment/ccip/changeset/cs_configure_token_pools.go +++ b/deployment/ccip/changeset/cs_configure_token_pools.go @@ -12,10 +12,12 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" + "github.com/smartcontractkit/chainlink/deployment" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) var _ deployment.ChangeSet[ConfigureTokenPoolContractsConfig] = ConfigureTokenPoolContractsChangeset diff --git a/deployment/ccip/changeset/cs_configure_token_pools_test.go b/deployment/ccip/changeset/cs_configure_token_pools_test.go index 65ee859647a..9df4abda608 100644 --- a/deployment/ccip/changeset/cs_configure_token_pools_test.go +++ b/deployment/ccip/changeset/cs_configure_token_pools_test.go @@ -16,7 +16,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/environment/memory" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/deployment/ccip/changeset/cs_deploy_chain.go b/deployment/ccip/changeset/cs_deploy_chain.go index 49a37c504e8..0717e674b7b 100644 --- a/deployment/ccip/changeset/cs_deploy_chain.go +++ b/deployment/ccip/changeset/cs_deploy_chain.go @@ -15,14 +15,14 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote" ) var _ deployment.ChangeSet[DeployChainContractsConfig] = DeployChainContractsChangeset diff --git a/deployment/ccip/changeset/cs_deploy_token_pools.go b/deployment/ccip/changeset/cs_deploy_token_pools.go index c90266f46a2..5666636dcbb 100644 --- a/deployment/ccip/changeset/cs_deploy_token_pools.go +++ b/deployment/ccip/changeset/cs_deploy_token_pools.go @@ -10,13 +10,16 @@ import ( "github.com/ethereum/go-ethereum/core/types" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_from_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_with_from_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" ) diff --git a/deployment/ccip/changeset/cs_home_chain.go b/deployment/ccip/changeset/cs_home_chain.go index 7dec23610b4..b3fbb990991 100644 --- a/deployment/ccip/changeset/cs_home_chain.go +++ b/deployment/ccip/changeset/cs_home_chain.go @@ -21,8 +21,8 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types" ) diff --git a/deployment/ccip/changeset/cs_prerequisites.go b/deployment/ccip/changeset/cs_prerequisites.go index 4871a51f250..84b49862686 100644 --- a/deployment/ccip/changeset/cs_prerequisites.go +++ b/deployment/ccip/changeset/cs_prerequisites.go @@ -12,18 +12,19 @@ import ( "github.com/smartcontractkit/chainlink-ccip/pkg/reader" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_messenger" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/registry_module_owner_custom" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/mock_usdc_token_messenger" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/mock_usdc_token_transmitter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/registry_module_owner_custom" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/multicall3" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/weth9" diff --git a/deployment/ccip/changeset/cs_propose_admin_role.go b/deployment/ccip/changeset/cs_propose_admin_role.go index 52728ff2311..b04fd6b74b1 100644 --- a/deployment/ccip/changeset/cs_propose_admin_role.go +++ b/deployment/ccip/changeset/cs_propose_admin_role.go @@ -6,8 +6,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) var _ deployment.ChangeSet[TokenAdminRegistryChangesetConfig] = ProposeAdminRoleChangeset diff --git a/deployment/ccip/changeset/cs_set_pool.go b/deployment/ccip/changeset/cs_set_pool.go index 8db2f5dedbc..6e2f9feb755 100644 --- a/deployment/ccip/changeset/cs_set_pool.go +++ b/deployment/ccip/changeset/cs_set_pool.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) var _ deployment.ChangeSet[TokenAdminRegistryChangesetConfig] = SetPoolChangeset diff --git a/deployment/ccip/changeset/cs_transfer_admin_role.go b/deployment/ccip/changeset/cs_transfer_admin_role.go index a3116e1ea1f..fe82d8d0d41 100644 --- a/deployment/ccip/changeset/cs_transfer_admin_role.go +++ b/deployment/ccip/changeset/cs_transfer_admin_role.go @@ -7,8 +7,9 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) var _ deployment.ChangeSet[TokenAdminRegistryChangesetConfig] = TransferAdminRoleChangeset diff --git a/deployment/ccip/changeset/cs_update_rmn_config.go b/deployment/ccip/changeset/cs_update_rmn_config.go index d3a7783bc7c..a543b622354 100644 --- a/deployment/ccip/changeset/cs_update_rmn_config.go +++ b/deployment/ccip/changeset/cs_update_rmn_config.go @@ -14,9 +14,9 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" ) diff --git a/deployment/ccip/changeset/internal/deploy_home_chain.go b/deployment/ccip/changeset/internal/deploy_home_chain.go index 36d36d93460..863ed4071a4 100644 --- a/deployment/ccip/changeset/internal/deploy_home_chain.go +++ b/deployment/ccip/changeset/internal/deploy_home_chain.go @@ -21,8 +21,8 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" ) diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go index cce5ddbf02d..8af120a2201 100644 --- a/deployment/ccip/changeset/state.go +++ b/deployment/ccip/changeset/state.go @@ -8,22 +8,24 @@ import ( "github.com/Masterminds/semver/v3" "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_from_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/log_message_data_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/log_message_data_receiver" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_with_from_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc677" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_messenger" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/mock_usdc_token_messenger" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/mock_usdc_token_transmitter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" @@ -43,19 +45,21 @@ import ( chain_selectors "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/registry_module_owner_custom" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/registry_module_owner_custom" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote" capabilities_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" diff --git a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go index a7a3a3fa169..3f935472c77 100644 --- a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go +++ b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go @@ -10,11 +10,12 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" ) // Use this when testhelpers.DeployedEnv is available (usually in ephemeral test environments). diff --git a/deployment/ccip/changeset/testhelpers/test_assertions.go b/deployment/ccip/changeset/testhelpers/test_assertions.go index e7364e79628..ff026962ce6 100644 --- a/deployment/ccip/changeset/testhelpers/test_assertions.go +++ b/deployment/ccip/changeset/testhelpers/test_assertions.go @@ -24,8 +24,8 @@ import ( commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" ) func ConfirmGasPriceUpdatedForAll( diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 786943daecc..2046e0aadfe 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -22,7 +22,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry" "github.com/smartcontractkit/chainlink/v2/core/services/relay" @@ -53,10 +53,11 @@ import ( solTestReceiver "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_ccip_receiver" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/mock_ethusd_aggregator_wrapper" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/aggregator_v3_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" diff --git a/deployment/ccip/changeset/testhelpers/test_params.go b/deployment/ccip/changeset/testhelpers/test_params.go index 8e43c08919f..30843e7831f 100644 --- a/deployment/ccip/changeset/testhelpers/test_params.go +++ b/deployment/ccip/changeset/testhelpers/test_params.go @@ -3,7 +3,7 @@ package testhelpers import ( "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" ) diff --git a/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go b/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go index ebaa3b8ec37..75c4c2993a0 100644 --- a/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_usdc_helpers.go @@ -9,8 +9,8 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" ) diff --git a/deployment/ccip/changeset/testhelpers/v1_5/test_helpers.go b/deployment/ccip/changeset/testhelpers/v1_5/test_helpers.go index aafd7dce1c1..c2793f400ae 100644 --- a/deployment/ccip/changeset/testhelpers/v1_5/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/v1_5/test_helpers.go @@ -24,10 +24,10 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" v1_5changeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" plugintesthelpers "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers" ) diff --git a/deployment/ccip/changeset/token_pools.go b/deployment/ccip/changeset/token_pools.go index 6d7fd41b98a..e257ccca8c6 100644 --- a/deployment/ccip/changeset/token_pools.go +++ b/deployment/ccip/changeset/token_pools.go @@ -9,10 +9,11 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" ) diff --git a/deployment/ccip/changeset/v1_5/cs_lane_contracts.go b/deployment/ccip/changeset/v1_5/cs_lane_contracts.go index 6f6f0d54a69..23b47ceb4dc 100644 --- a/deployment/ccip/changeset/v1_5/cs_lane_contracts.go +++ b/deployment/ccip/changeset/v1_5/cs_lane_contracts.go @@ -7,11 +7,11 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" ) var _ deployment.ChangeSet[DeployLanesConfig] = DeployLanesChangeset diff --git a/deployment/ccip/changeset/v1_5/cs_ocr2_config.go b/deployment/ccip/changeset/v1_5/cs_ocr2_config.go index 2babf666da2..991a773bd3c 100644 --- a/deployment/ccip/changeset/v1_5/cs_ocr2_config.go +++ b/deployment/ccip/changeset/v1_5/cs_ocr2_config.go @@ -12,7 +12,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers" ) diff --git a/deployment/ccip/changeset/v1_5/cs_rmn.go b/deployment/ccip/changeset/v1_5/cs_rmn.go index 531d907b724..539dc5f4d5c 100644 --- a/deployment/ccip/changeset/v1_5/cs_rmn.go +++ b/deployment/ccip/changeset/v1_5/cs_rmn.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" commoncs "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" ) var _ deployment.ChangeSet[PermaBlessCommitStoreConfig] = PermaBlessCommitStoreChangeset diff --git a/deployment/ccip/changeset/v1_5/e2e_test.go b/deployment/ccip/changeset/v1_5/e2e_test.go index a428c624fc3..d763e194bfc 100644 --- a/deployment/ccip/changeset/v1_5/e2e_test.go +++ b/deployment/ccip/changeset/v1_5/e2e_test.go @@ -9,13 +9,15 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/v1_5" v1_5changeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" ) // This test only works if the destination chain id is 1337 diff --git a/deployment/ccip/view/v1_0/rmn_proxy_contract.go b/deployment/ccip/view/v1_0/rmn_proxy_contract.go index 5a2ea2807f6..688297d313e 100644 --- a/deployment/ccip/view/v1_0/rmn_proxy_contract.go +++ b/deployment/ccip/view/v1_0/rmn_proxy_contract.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" ) type RMNProxyView struct { diff --git a/deployment/ccip/view/v1_2/price_registry.go b/deployment/ccip/view/v1_2/price_registry.go index 269c48fccaf..15da69021e5 100644 --- a/deployment/ccip/view/v1_2/price_registry.go +++ b/deployment/ccip/view/v1_2/price_registry.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" ) type PriceRegistryView struct { diff --git a/deployment/ccip/view/v1_2/price_registry_test.go b/deployment/ccip/view/v1_2/price_registry_test.go index 8248f55335b..944ad463423 100644 --- a/deployment/ccip/view/v1_2/price_registry_test.go +++ b/deployment/ccip/view/v1_2/price_registry_test.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/environment/memory" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/deployment/ccip/view/v1_2/router.go b/deployment/ccip/view/v1_2/router.go index f1de1a1d5b0..53bcc1b6e1c 100644 --- a/deployment/ccip/view/v1_2/router.go +++ b/deployment/ccip/view/v1_2/router.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" ) type RouterView struct { diff --git a/deployment/ccip/view/v1_5/commit_store.go b/deployment/ccip/view/v1_5/commit_store.go index 396aa8b737a..6521cfdd81e 100644 --- a/deployment/ccip/view/v1_5/commit_store.go +++ b/deployment/ccip/view/v1_5/commit_store.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" ) type CommitStoreView struct { diff --git a/deployment/ccip/view/v1_5/offramp.go b/deployment/ccip/view/v1_5/offramp.go index 95d92c445e4..9cd7e67bd12 100644 --- a/deployment/ccip/view/v1_5/offramp.go +++ b/deployment/ccip/view/v1_5/offramp.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" ) type OffRampView struct { diff --git a/deployment/ccip/view/v1_5/offramp_test.go b/deployment/ccip/view/v1_5/offramp_test.go index 47370501424..1ba33ca2a0d 100644 --- a/deployment/ccip/view/v1_5/offramp_test.go +++ b/deployment/ccip/view/v1_5/offramp_test.go @@ -2,6 +2,7 @@ package v1_5 import ( "encoding/json" + "math/big" "testing" "github.com/ethereum/go-ethereum/common" @@ -10,12 +11,10 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" - "math/big" - "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/environment/memory" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/deployment/ccip/view/v1_5/onramp.go b/deployment/ccip/view/v1_5/onramp.go index c211c493cbc..277665ea041 100644 --- a/deployment/ccip/view/v1_5/onramp.go +++ b/deployment/ccip/view/v1_5/onramp.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" ) type OnRampView struct { diff --git a/deployment/ccip/view/v1_5/onramp_test.go b/deployment/ccip/view/v1_5/onramp_test.go index 6ce21c9f032..bca9d088363 100644 --- a/deployment/ccip/view/v1_5/onramp_test.go +++ b/deployment/ccip/view/v1_5/onramp_test.go @@ -12,7 +12,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/environment/memory" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/deployment/ccip/view/v1_5/rmn.go b/deployment/ccip/view/v1_5/rmn.go index 19535cf508e..794809438f6 100644 --- a/deployment/ccip/view/v1_5/rmn.go +++ b/deployment/ccip/view/v1_5/rmn.go @@ -5,7 +5,7 @@ import ( "fmt" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" ) type RMNView struct { diff --git a/deployment/ccip/view/v1_5/rmn_test.go b/deployment/ccip/view/v1_5/rmn_test.go index f4ea35a116f..192223702d6 100644 --- a/deployment/ccip/view/v1_5/rmn_test.go +++ b/deployment/ccip/view/v1_5/rmn_test.go @@ -10,7 +10,7 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink/deployment/environment/memory" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/deployment/ccip/view/v1_5/tokenadminregistry.go b/deployment/ccip/view/v1_5/tokenadminregistry.go index e4a88996247..b7de81dc899 100644 --- a/deployment/ccip/view/v1_5/tokenadminregistry.go +++ b/deployment/ccip/view/v1_5/tokenadminregistry.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" ) const ( diff --git a/deployment/ccip/view/v1_5_1/token_pool.go b/deployment/ccip/view/v1_5_1/token_pool.go index c782cb1f6cf..06f64e2eec8 100644 --- a/deployment/ccip/view/v1_5_1/token_pool.go +++ b/deployment/ccip/view/v1_5_1/token_pool.go @@ -7,13 +7,14 @@ import ( "github.com/ethereum/go-ethereum/common" "golang.org/x/exp/maps" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_from_mint_token_pool" + "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_from_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_with_from_mint_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" ) type TokenPoolContract interface { diff --git a/deployment/ccip/view/v1_6/ccip_home.go b/deployment/ccip/view/v1_6/ccip_home.go index 04b7dc8c1af..e8fcf81d21b 100644 --- a/deployment/ccip/view/v1_6/ccip_home.go +++ b/deployment/ccip/view/v1_6/ccip_home.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" ) diff --git a/deployment/ccip/view/v1_6/ccip_home_test.go b/deployment/ccip/view/v1_6/ccip_home_test.go index 5d6200a604b..9c17254bc42 100644 --- a/deployment/ccip/view/v1_6/ccip_home_test.go +++ b/deployment/ccip/view/v1_6/ccip_home_test.go @@ -10,7 +10,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/environment/memory" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/deployment/ccip/view/v1_6/feequoter.go b/deployment/ccip/view/v1_6/feequoter.go index 1fd10b3fb63..10062e6d199 100644 --- a/deployment/ccip/view/v1_6/feequoter.go +++ b/deployment/ccip/view/v1_6/feequoter.go @@ -7,9 +7,9 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_2" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - router1_2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + router1_2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" ) type FeeQuoterView struct { diff --git a/deployment/ccip/view/v1_6/noncemanager.go b/deployment/ccip/view/v1_6/noncemanager.go index 0559d96adbd..2f74e1d1455 100644 --- a/deployment/ccip/view/v1_6/noncemanager.go +++ b/deployment/ccip/view/v1_6/noncemanager.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager" ) type NonceManagerView struct { diff --git a/deployment/ccip/view/v1_6/offramp.go b/deployment/ccip/view/v1_6/offramp.go index ba88e53e8bb..67f4450d4f3 100644 --- a/deployment/ccip/view/v1_6/offramp.go +++ b/deployment/ccip/view/v1_6/offramp.go @@ -5,8 +5,8 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_2" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - router1_2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + router1_2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" ) type OffRampView struct { diff --git a/deployment/ccip/view/v1_6/onramp.go b/deployment/ccip/view/v1_6/onramp.go index 80aeafc5661..7887bf6744d 100644 --- a/deployment/ccip/view/v1_6/onramp.go +++ b/deployment/ccip/view/v1_6/onramp.go @@ -5,11 +5,12 @@ import ( "github.com/ethereum/go-ethereum/common" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + "github.com/smartcontractkit/chainlink/deployment/ccip/view/v1_2" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - router1_2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" + router1_2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" ) type OnRampView struct { diff --git a/deployment/ccip/view/v1_6/rmnhome.go b/deployment/ccip/view/v1_6/rmnhome.go index 5a99c5d752c..18b1bb892bc 100644 --- a/deployment/ccip/view/v1_6/rmnhome.go +++ b/deployment/ccip/view/v1_6/rmnhome.go @@ -9,7 +9,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" ) type RMNHomeView struct { diff --git a/deployment/ccip/view/v1_6/rmnremote.go b/deployment/ccip/view/v1_6/rmnremote.go index e05754c2f0d..36df620196d 100644 --- a/deployment/ccip/view/v1_6/rmnremote.go +++ b/deployment/ccip/view/v1_6/rmnremote.go @@ -2,7 +2,7 @@ package v1_6 import ( "github.com/smartcontractkit/chainlink/deployment/common/view/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote" ) type RMNRemoteView struct { diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index c5b401644ff..4d415c119be 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -22,7 +22,7 @@ import ( commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/environment/devenv" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/relay" ) diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go index 3932fcfdddf..b4a7fa191cb 100644 --- a/integration-tests/ccip-tests/actions/ccip_helpers.go +++ b/integration-tests/ccip-tests/actions/ccip_helpers.go @@ -46,6 +46,7 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/k8s/pkg/helm/reorg" "github.com/smartcontractkit/chainlink-testing-framework/lib/networks" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" + "github.com/smartcontractkit/chainlink/deployment/environment/nodeclient" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/contracts" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/contracts/laneconfig" @@ -55,16 +56,17 @@ import ( "github.com/smartcontractkit/chainlink/integration-tests/docker/test_env" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/token_pool" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/ccipexec" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" diff --git a/integration-tests/ccip-tests/contracts/contract_deployer.go b/integration-tests/ccip-tests/contracts/contract_deployer.go index 13a20c670b8..e4afca8625f 100644 --- a/integration-tests/ccip-tests/contracts/contract_deployer.go +++ b/integration-tests/ccip-tests/contracts/contract_deployer.go @@ -24,30 +24,33 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-testing-framework/lib/blockchain" + commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" + evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/deployment/environment/nodeclient" "github.com/smartcontractkit/chainlink/integration-tests/contracts" "github.com/smartcontractkit/chainlink/integration-tests/wrappers" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool_1_4_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_lbtc_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_messenger" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool_1_4_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool_1_4_0" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/mock_usdc_token_messenger" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/mock_usdc_token_transmitter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/token_pool" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + lock_release_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/lock_release_token_pool" + token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/token_pool" + usdc_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_lbtc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" diff --git a/integration-tests/ccip-tests/contracts/contract_models.go b/integration-tests/ccip-tests/contracts/contract_models.go index bcc209bd198..4af9e77d7fb 100644 --- a/integration-tests/ccip-tests/contracts/contract_models.go +++ b/integration-tests/ccip-tests/contracts/contract_models.go @@ -18,30 +18,33 @@ import ( "golang.org/x/exp/rand" "github.com/smartcontractkit/chainlink-testing-framework/lib/blockchain" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_lbtc_token_pool" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_lbtc_token_pool" "github.com/smartcontractkit/chainlink/integration-tests/wrappers" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_offramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool_1_4_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_usdc_token_transmitter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/price_registry_1_2_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_admin_registry" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool_1_4_0" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/usdc_token_pool_1_4_0" + commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" + evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/mock_usdc_token_transmitter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/token_pool" + evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + lock_release_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/lock_release_token_pool" + token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/token_pool" + usdc_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/usdc_token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" diff --git a/integration-tests/ccip-tests/contracts/lm_contracts.go b/integration-tests/ccip-tests/contracts/lm_contracts.go index f51369ee977..2609238a5f8 100644 --- a/integration-tests/ccip-tests/contracts/lm_contracts.go +++ b/integration-tests/ccip-tests/contracts/lm_contracts.go @@ -13,7 +13,7 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/blockchain" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/liquiditymanager/generated/arbitrum_l1_bridge_adapter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/liquiditymanager/generated/arbitrum_l2_bridge_adapter" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/liquiditymanager/generated/liquiditymanager" diff --git a/integration-tests/ccip-tests/contracts/multicall.go b/integration-tests/ccip-tests/contracts/multicall.go index 094a6152be6..e37c61b2b40 100644 --- a/integration-tests/ccip-tests/contracts/multicall.go +++ b/integration-tests/ccip-tests/contracts/multicall.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/blockchain" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" ) diff --git a/integration-tests/ccip-tests/load/ccip_loadgen.go b/integration-tests/ccip-tests/load/ccip_loadgen.go index 064d18026c3..059615a3679 100644 --- a/integration-tests/ccip-tests/load/ccip_loadgen.go +++ b/integration-tests/ccip-tests/load/ccip_loadgen.go @@ -30,7 +30,9 @@ import ( "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testreporters" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/testhelpers" ) diff --git a/integration-tests/ccip-tests/load/helper.go b/integration-tests/ccip-tests/load/helper.go index 47e379809af..afeecba0e71 100644 --- a/integration-tests/ccip-tests/load/helper.go +++ b/integration-tests/ccip-tests/load/helper.go @@ -26,7 +26,7 @@ import ( "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/actions" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testconfig" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testsetups" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" ) type ChaosConfig struct { diff --git a/integration-tests/ccip-tests/smoke/ccip_test.go b/integration-tests/ccip-tests/smoke/ccip_test.go index e52fd993c34..2ba319f59c8 100644 --- a/integration-tests/ccip-tests/smoke/ccip_test.go +++ b/integration-tests/ccip-tests/smoke/ccip_test.go @@ -16,10 +16,11 @@ import ( "github.com/smartcontractkit/chainlink-testing-framework/lib/logging" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/osutil" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" + "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/lock_release_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/token_pool" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/lock_release_token_pool" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/actions" "github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testsetups" diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index c8e45008b8d..1f3fe9c8bfa 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -16,12 +16,14 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-testing-framework/wasp" + "github.com/smartcontractkit/chainlink/deployment" ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/integration-tests/testconfig/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" ) type SeqNumRange struct { diff --git a/integration-tests/load/ccip/helpers.go b/integration-tests/load/ccip/helpers.go index a9d98b78795..6db3b1d0fa1 100644 --- a/integration-tests/load/ccip/helpers.go +++ b/integration-tests/load/ccip/helpers.go @@ -11,12 +11,13 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" chainselectors "github.com/smartcontractkit/chain-selectors" + "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-testing-framework/wasp" - "github.com/smartcontractkit/chainlink/deployment" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" ) const ( diff --git a/integration-tests/smoke/ccip/ccip_add_chain_test.go b/integration-tests/smoke/ccip/ccip_add_chain_test.go index 1fd959c7d4d..d26c8bfb258 100644 --- a/integration-tests/smoke/ccip/ccip_add_chain_test.go +++ b/integration-tests/smoke/ccip/ccip_add_chain_test.go @@ -14,8 +14,8 @@ import ( ccipcs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" "github.com/stretchr/testify/require" "golang.org/x/exp/maps" diff --git a/integration-tests/smoke/ccip/ccip_batching_test.go b/integration-tests/smoke/ccip/ccip_batching_test.go index 71e31e9cd70..32ee6947d13 100644 --- a/integration-tests/smoke/ccip/ccip_batching_test.go +++ b/integration-tests/smoke/ccip/ccip_batching_test.go @@ -20,9 +20,9 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/multicall3" ) diff --git a/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go b/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go index c3edf090e88..c7d17974449 100644 --- a/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go +++ b/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go @@ -1,9 +1,8 @@ package ccip import ( - "testing" - "math/big" + "testing" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" @@ -14,8 +13,8 @@ import ( commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote" ) var ( diff --git a/integration-tests/smoke/ccip/ccip_disable_lane_test.go b/integration-tests/smoke/ccip/ccip_disable_lane_test.go index 6622a6061e9..91c1f9f6a7f 100644 --- a/integration-tests/smoke/ccip/ccip_disable_lane_test.go +++ b/integration-tests/smoke/ccip/ccip_disable_lane_test.go @@ -11,12 +11,13 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" ) // Intention of this test is to ensure that the lane can be disabled and enabled correctly diff --git a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go index 6f4deea8b23..2ac95f0af43 100644 --- a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go +++ b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go @@ -25,8 +25,8 @@ import ( "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" ) var ( diff --git a/integration-tests/smoke/ccip/ccip_fees_test.go b/integration-tests/smoke/ccip/ccip_fees_test.go index acb9fd4b145..5507f92096a 100644 --- a/integration-tests/smoke/ccip/ccip_fees_test.go +++ b/integration-tests/smoke/ccip/ccip_fees_test.go @@ -18,7 +18,8 @@ import ( testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/assets" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/weth9" "github.com/smartcontractkit/chainlink/v2/core/logger" diff --git a/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go b/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go index 42fcacc58f3..37668260c51 100644 --- a/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go +++ b/integration-tests/smoke/ccip/ccip_gas_price_updates_test.go @@ -17,7 +17,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" ) // Test_CCIPGasPriceUpdates tests that chain fee price updates are propagated correctly when diff --git a/integration-tests/smoke/ccip/ccip_message_limitations_test.go b/integration-tests/smoke/ccip/ccip_message_limitations_test.go index ea775e5445d..11682f8003c 100644 --- a/integration-tests/smoke/ccip/ccip_message_limitations_test.go +++ b/integration-tests/smoke/ccip/ccip_message_limitations_test.go @@ -17,7 +17,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" ) func Test_CCIPMessageLimitations(t *testing.T) { diff --git a/integration-tests/smoke/ccip/ccip_messaging_test.go b/integration-tests/smoke/ccip/ccip_messaging_test.go index 7e122c18de7..cb4accf34bd 100644 --- a/integration-tests/smoke/ccip/ccip_messaging_test.go +++ b/integration-tests/smoke/ccip/ccip_messaging_test.go @@ -19,7 +19,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" mt "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/messagingtest" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" ) func Test_CCIPMessaging(t *testing.T) { diff --git a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go index 5d193054adb..1520621c0b2 100644 --- a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go +++ b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go @@ -14,18 +14,21 @@ import ( chainselectors "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" v1_5testhelpers "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/v1_5" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/v1_5" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ) diff --git a/integration-tests/smoke/ccip/ccip_ooo_execution_test.go b/integration-tests/smoke/ccip/ccip_ooo_execution_test.go index 48bb24f5346..04afceebe49 100644 --- a/integration-tests/smoke/ccip/ccip_ooo_execution_test.go +++ b/integration-tests/smoke/ccip/ccip_ooo_execution_test.go @@ -18,7 +18,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index 289752a0307..1c267e3c1e2 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -43,15 +43,16 @@ import ( evmchaintypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + evmconfig "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_reader_tester" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_proxy_contract" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_reader_tester" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm" evmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" diff --git a/integration-tests/smoke/ccip/ccip_rmn_test.go b/integration-tests/smoke/ccip/ccip_rmn_test.go index 08a297f093a..133152d9419 100644 --- a/integration-tests/smoke/ccip/ccip_rmn_test.go +++ b/integration-tests/smoke/ccip/ccip_rmn_test.go @@ -25,9 +25,9 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/environment/devenv" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_home" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/rmn_remote" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_remote" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" ) diff --git a/integration-tests/smoke/ccip/ccip_token_price_updates_test.go b/integration-tests/smoke/ccip/ccip_token_price_updates_test.go index 8498417a6b6..9e852e97923 100644 --- a/integration-tests/smoke/ccip/ccip_token_price_updates_test.go +++ b/integration-tests/smoke/ccip/ccip_token_price_updates_test.go @@ -21,7 +21,7 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/fee_quoter" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" ) func Test_CCIPTokenPriceUpdates(t *testing.T) { diff --git a/integration-tests/smoke/ccip/ccip_token_transfer_test.go b/integration-tests/smoke/ccip/ccip_token_transfer_test.go index 6544bc1379d..827047e193a 100644 --- a/integration-tests/smoke/ccip/ccip_token_transfer_test.go +++ b/integration-tests/smoke/ccip/ccip_token_transfer_test.go @@ -11,12 +11,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" - - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/integration-tests/smoke/ccip/ccip_usdc_test.go b/integration-tests/smoke/ccip/ccip_usdc_test.go index d4f39e15b1d..22c8ecec061 100644 --- a/integration-tests/smoke/ccip/ccip_usdc_test.go +++ b/integration-tests/smoke/ccip/ccip_usdc_test.go @@ -18,7 +18,8 @@ import ( testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/burn_mint_erc677" "github.com/smartcontractkit/chainlink/v2/core/logger" ) From 6bb0914ad69ef50b8a62f17cb94b755fd74da5d1 Mon Sep 17 00:00:00 2001 From: Chris Amora <27789416+ChrisAmora@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:38:32 -0300 Subject: [PATCH 31/83] feat: add jd initial register changeset (#16307) * feat: add jd initial register changeset * fix: lint --- deployment/data-streams/README.md | 15 +++ deployment/data-streams/changeset/README.md | 11 ++ .../changeset/jd_register_nodes.go | 97 +++++++++++++++++ .../changeset/jd_register_nodes_test.go | 102 ++++++++++++++++++ deployment/environment/memory/job_client.go | 40 ++++++- 5 files changed, 260 insertions(+), 5 deletions(-) create mode 100644 deployment/data-streams/README.md create mode 100644 deployment/data-streams/changeset/README.md create mode 100644 deployment/data-streams/changeset/jd_register_nodes.go create mode 100644 deployment/data-streams/changeset/jd_register_nodes_test.go diff --git a/deployment/data-streams/README.md b/deployment/data-streams/README.md new file mode 100644 index 00000000000..92fcab520d8 --- /dev/null +++ b/deployment/data-streams/README.md @@ -0,0 +1,15 @@ +# Data Streams Deployments and Configurations + +This module provides a set of workflows for deploying and configuring **Data Streams** contracts. These workflows streamline the process of setting up and maintaining the necessary on-chain components, ensuring consistent and reliable management across different environments. + +## Overview + +- **Contracts Location**: The primary contracts for Data Streams reside under [contracts/src/v0.8/llo-feeds](../../contracts/src/v0.8/llo-feeds). + +## Interaction with Job Distributor + +In addition to managing contract deployments, this module contains **changesets** that facilitate and standardize interaction with the **Job Distributor**. These changesets ensure: + +- Consistent integration patterns between Data Streams contracts and the Job Distributor. +- Streamlined updates and rollouts across multiple contracts and environments. +- Improved maintainability and clarity in how Data Streams and the Job Distributor communicate and synchronize. diff --git a/deployment/data-streams/changeset/README.md b/deployment/data-streams/changeset/README.md new file mode 100644 index 00000000000..179a762875a --- /dev/null +++ b/deployment/data-streams/changeset/README.md @@ -0,0 +1,11 @@ +## Overview + +This directory contains **changesets**, which define specific operations that can be invoked by migrations to modify the on-chain system state. + +### Naming Conventions + +- **`deploy_`**: Deploys a new on-chain contract. +- **`call_`**: Calls a function on an existing on-chain contract. +- **`jd_`**: Interacts with the Job Distributor. + +Files named exactly after these prefixes contain shared code or utility functions relevant to that category of changeset. diff --git a/deployment/data-streams/changeset/jd_register_nodes.go b/deployment/data-streams/changeset/jd_register_nodes.go new file mode 100644 index 00000000000..28002371924 --- /dev/null +++ b/deployment/data-streams/changeset/jd_register_nodes.go @@ -0,0 +1,97 @@ +package changeset + +import ( + "errors" + "fmt" + "strconv" + + nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" + "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes" + "github.com/smartcontractkit/chainlink/deployment" +) + +type RegisterNodesInput struct { + EnvLabel string + ProductName string + DONs DONConfigMap +} + +type DONConfigMap map[string]DONConfig + +type DONConfig struct { + Name string `json:"name"` + ChannelConfigStore string `json:"channelConfigStore"` + Verifier string `json:"verifier"` + Configurator string `json:"configurator"` + Nodes []NodeCfg `json:"nodes"` +} + +type NodeCfg struct { + Name string `json:"name"` + CSAKey string `json:"csa_key"` + IsBootstrap bool `json:"isBootstrap"` +} + +// RegisterNodesWithJD registers each node from the config with the Job Distributor. +// It logs errors but continues to register remaining nodes even if some fail (we may revisit this in the future). +func RegisterNodesWithJD(e deployment.Environment, cfg RegisterNodesInput) (deployment.ChangesetOutput, error) { + baseLabels := []*ptypes.Label{ + { + Key: "product", + Value: &cfg.ProductName, + }, + { + Key: "environment", + Value: &cfg.EnvLabel, + }, + } + + for _, don := range cfg.DONs { + for _, node := range don.Nodes { + labels := append([]*ptypes.Label(nil), baseLabels...) + isBootstrapStr := strconv.FormatBool(node.IsBootstrap) + + labels = append(labels, &ptypes.Label{ + Key: "isBootstrap", + Value: &isBootstrapStr, + }) + + nodeID, err := e.Offchain.RegisterNode(e.GetContext(), &nodev1.RegisterNodeRequest{ + Name: node.Name, + PublicKey: node.CSAKey, + Labels: labels, + }) + if err != nil { + e.Logger.Errorw("failed to register node", "node", node.Name, "error", err) + } else { + e.Logger.Infow("registered node", "name", node.Name, "id", nodeID) + } + } + } + + return deployment.ChangesetOutput{}, nil +} + +func (cfg RegisterNodesInput) Validate() error { + if cfg.EnvLabel == "" { + return errors.New("EnvLabel must not be empty") + } + if cfg.ProductName == "" { + return errors.New("ProductName must not be empty") + } + + for donName, don := range cfg.DONs { + if don.Name == "" { + return fmt.Errorf("DON[%s] has empty Name", donName) + } + for _, node := range don.Nodes { + if node.Name == "" { + return fmt.Errorf("DON[%s] has node with empty Name", donName) + } + if node.CSAKey == "" { + return fmt.Errorf("DON[%s] node %s has empty CSAKey", donName, node.Name) + } + } + } + return nil +} diff --git a/deployment/data-streams/changeset/jd_register_nodes_test.go b/deployment/data-streams/changeset/jd_register_nodes_test.go new file mode 100644 index 00000000000..9667e6c352a --- /dev/null +++ b/deployment/data-streams/changeset/jd_register_nodes_test.go @@ -0,0 +1,102 @@ +package changeset + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "go.uber.org/zap/zapcore" + + "github.com/smartcontractkit/chainlink/deployment/common/changeset" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +func TestRegisterNodesWithJD(t *testing.T) { + t.Parallel() + lggr := logger.TestLogger(t) + e := memory.NewMemoryEnvironment(t, lggr, zapcore.InfoLevel, memory.MemoryEnvironmentConfig{Chains: 1, Nodes: 1}) + + nodeP2pKey := e.NodeIDs[0] + + jobClient, ok := e.Offchain.(*memory.JobClient) + + require.True(t, ok, "expected Offchain to be of type *memory.JobClient") + require.Lenf(t, jobClient.Nodes, 1, "expected exactly 1 node") + require.Emptyf(t, jobClient.RegisteredNodes, "no registered nodes expected") + + csaKey := jobClient.Nodes[nodeP2pKey].Keys.CSA.PublicKeyString() + + e, err := changeset.ApplyChangesets(t, e, nil, []changeset.ChangesetApplication{ + { + Changeset: changeset.WrapChangeSet(RegisterNodesWithJD), + Config: RegisterNodesInput{ + EnvLabel: "test-env", + ProductName: "test-product", + DONs: DONConfigMap{ + "don1": { + Name: "don1", + Nodes: []NodeCfg{ + {Name: "node1", CSAKey: csaKey}, + }, + }, + }, + }, + }, + }) + require.NoError(t, err) + require.Lenf(t, jobClient.RegisteredNodes, 1, "1 registered node expected") + require.NotNilf(t, jobClient.RegisteredNodes[csaKey], "expected node with csa key %s to be registered", csaKey) +} + +func TestRegisterNodesInput_Validate(t *testing.T) { + t.Run("valid input", func(t *testing.T) { + cfg := RegisterNodesInput{ + EnvLabel: "test-env", + ProductName: "test-product", + DONs: DONConfigMap{ + "don1": { + Name: "MyDON", + Nodes: []NodeCfg{ + {Name: "node1", CSAKey: "0xabc", IsBootstrap: false}, + }, + }, + }, + } + err := cfg.Validate() + require.NoError(t, err, "expected valid config to pass validation") + }) + + t.Run("missing product name", func(t *testing.T) { + cfg := RegisterNodesInput{ + EnvLabel: "test-env", + DONs: DONConfigMap{ + "don2": { + Name: "AnotherDON", + Nodes: []NodeCfg{ + {Name: "node1", CSAKey: "0xdef"}, + }, + }, + }, + } + err := cfg.Validate() + require.Error(t, err, "expected an error when ProductName is empty") + }) + + t.Run("missing CSAKey", func(t *testing.T) { + cfg := RegisterNodesInput{ + EnvLabel: "test-env", + ProductName: "test-product", + DONs: DONConfigMap{ + "don3": { + Name: "EmptyCSA", + Nodes: []NodeCfg{ + {Name: "node1", CSAKey: "", IsBootstrap: true}, + }, + }, + }, + } + err := cfg.Validate() + require.Error(t, err, "expected an error when CSAKey is empty") + }) +} diff --git a/deployment/environment/memory/job_client.go b/deployment/environment/memory/job_client.go index 658e02f3d1f..37ee50ef37e 100644 --- a/deployment/environment/memory/job_client.go +++ b/deployment/environment/memory/job_client.go @@ -26,7 +26,8 @@ import ( ) type JobClient struct { - Nodes map[string]Node + Nodes map[string]Node + RegisteredNodes map[string]Node } func (j JobClient) BatchProposeJob(ctx context.Context, in *jobv1.BatchProposeJobRequest, opts ...grpc.CallOption) (*jobv1.BatchProposeJobResponse, error) { @@ -49,9 +50,38 @@ func (j JobClient) EnableNode(ctx context.Context, in *nodev1.EnableNodeRequest, panic("implement me") } -func (j JobClient) RegisterNode(ctx context.Context, in *nodev1.RegisterNodeRequest, opts ...grpc.CallOption) (*nodev1.RegisterNodeResponse, error) { - // TODO implement me - panic("implement me") +func (j *JobClient) RegisterNode(ctx context.Context, in *nodev1.RegisterNodeRequest, opts ...grpc.CallOption) (*nodev1.RegisterNodeResponse, error) { + if in == nil || in.GetPublicKey() == "" { + return nil, errors.New("public key is required") + } + + if _, exists := j.RegisteredNodes[in.GetPublicKey()]; exists { + return nil, fmt.Errorf("node with Public Key %s is already registered", in.GetPublicKey()) + } + + var foundNode *Node + for _, node := range j.Nodes { + if node.Keys.CSA.ID() == in.GetPublicKey() { + foundNode = &node + break + } + } + + if foundNode == nil { + return nil, fmt.Errorf("node with Public Key %s is not known", in.GetPublicKey()) + } + + j.RegisteredNodes[in.GetPublicKey()] = *foundNode + + return &nodev1.RegisterNodeResponse{ + Node: &nodev1.Node{ + Id: in.GetPublicKey(), + PublicKey: in.GetPublicKey(), + IsEnabled: true, + IsConnected: true, + Labels: in.Labels, + }, + }, nil } func (j JobClient) UpdateNode(ctx context.Context, in *nodev1.UpdateNodeRequest, opts ...grpc.CallOption) (*nodev1.UpdateNodeResponse, error) { @@ -335,7 +365,7 @@ func (j JobClient) ReplayLogs(selectorToBlock map[uint64]uint64) error { } func NewMemoryJobClient(nodesByPeerID map[string]Node) *JobClient { - return &JobClient{nodesByPeerID} + return &JobClient{nodesByPeerID, make(map[string]Node)} } func ApplyNodeFilter(filter *nodev1.ListNodesRequest_Filter, node *nodev1.Node) bool { From e4abaac2dd09a6f40bf9ce3faf18eac4baf6fc01 Mon Sep 17 00:00:00 2001 From: dimitris Date: Wed, 12 Feb 2025 15:55:49 +0200 Subject: [PATCH 32/83] Upgrade chainlink-ccip and apply config for async merkleRoot observations (#16347) * async mrp obs * upgrade cl-ccip * upgrade cl-ccip --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/ccip/changeset/cs_ccip_home.go | 10 +++++++--- .../ccip/changeset/internal/deploy_home_chain.go | 5 +++++ deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- 12 files changed, 27 insertions(+), 18 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index a90296ba3ea..8dca24aa093 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -302,7 +302,7 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 9b60cb8e5ba..11389d846d5 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1113,8 +1113,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 h1:0ppmV08aZdRcoaaNqKE9TYA4PF9UYEVuJ84sXEIN+co= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/deployment/ccip/changeset/cs_ccip_home.go b/deployment/ccip/changeset/cs_ccip_home.go index d85b98caaf8..1303800c4e0 100644 --- a/deployment/ccip/changeset/cs_ccip_home.go +++ b/deployment/ccip/changeset/cs_ccip_home.go @@ -15,13 +15,14 @@ import ( "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/timelock" "golang.org/x/exp/maps" - "github.com/smartcontractkit/chainlink-ccip/chainconfig" - "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" - "github.com/smartcontractkit/chainlink-ccip/pluginconfig" "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" + "github.com/smartcontractkit/chainlink-ccip/chainconfig" + "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink-ccip/pluginconfig" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" @@ -202,6 +203,9 @@ func WithDefaultCommitOffChainConfig(feedChainSel uint64, tokenInfo map[ccipocr3 RMNSignaturesTimeout: 30 * time.Minute, MaxMerkleTreeSize: merklemulti.MaxNumberTreeLeaves, SignObservationPrefix: "chainlink ccip 1.6 rmn observation", + MerkleRootAsyncObserverDisabled: false, + MerkleRootAsyncObserverSyncFreq: 4 * time.Second, + MerkleRootAsyncObserverSyncTimeout: 12 * time.Second, } } else { if params.CommitOffChainConfig.TokenInfo == nil { diff --git a/deployment/ccip/changeset/internal/deploy_home_chain.go b/deployment/ccip/changeset/internal/deploy_home_chain.go index 863ed4071a4..fb91ab3163d 100644 --- a/deployment/ccip/changeset/internal/deploy_home_chain.go +++ b/deployment/ccip/changeset/internal/deploy_home_chain.go @@ -302,6 +302,11 @@ func BuildOCR3ConfigForCCIPHome( SignObservationPrefix: commitOffchainCfg.SignObservationPrefix, RMNEnabled: commitOffchainCfg.RMNEnabled, RMNSignaturesTimeout: commitOffchainCfg.RMNSignaturesTimeout, + MerkleRootAsyncObserverSyncFreq: commitOffchainCfg.MerkleRootAsyncObserverSyncFreq, + MerkleRootAsyncObserverSyncTimeout: commitOffchainCfg.MerkleRootAsyncObserverSyncTimeout, + InflightPriceCheckRetries: commitOffchainCfg.InflightPriceCheckRetries, + TransmissionDelayMultiplier: commitOffchainCfg.TransmissionDelayMultiplier, + FeeInfo: commitOffchainCfg.FeeInfo, }) } else { if execOffchainCfg == nil { diff --git a/deployment/go.mod b/deployment/go.mod index 46b50d4460e..a8a8272dbc5 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -31,7 +31,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index 574e8f0be17..bfcb9f6f85c 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1110,8 +1110,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 h1:0ppmV08aZdRcoaaNqKE9TYA4PF9UYEVuJ84sXEIN+co= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/go.mod b/go.mod index 64625e89e53..10f96d37b72 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index a7acdc271d1..6741b1fd333 100644 --- a/go.sum +++ b/go.sum @@ -1010,8 +1010,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086 h1:IR0K3EBoJPkfGEWaNLFdeGKSJcGpvXJsZfgzdsJl5cI= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211150519-b2a6a3dfe086/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 8ebe81a7f5e..6473bcbd088 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 5e3d1f90395..65bf14cd417 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1360,8 +1360,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 h1:0ppmV08aZdRcoaaNqKE9TYA4PF9UYEVuJ84sXEIN+co= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 8071edeb4d5..bf547618da4 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 1738c372886..e2e677a7afc 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1343,8 +1343,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7 h1:0ppmV08aZdRcoaaNqKE9TYA4PF9UYEVuJ84sXEIN+co= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250211204327-6aca485891a7/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= From dac280765ff5a6bf9620bcebe95b16ae9e8fb15f Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 12 Feb 2025 09:17:48 -0500 Subject: [PATCH 33/83] Use correct frequency for flushing delete queue (#16333) --- .../llo/mercurytransmitter/persistence_manager.go | 8 ++++---- .../llo/mercurytransmitter/persistence_manager_test.go | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/services/llo/mercurytransmitter/persistence_manager.go b/core/services/llo/mercurytransmitter/persistence_manager.go index c8dd8ce6208..2527edac935 100644 --- a/core/services/llo/mercurytransmitter/persistence_manager.go +++ b/core/services/llo/mercurytransmitter/persistence_manager.go @@ -25,7 +25,7 @@ const ( // FlushDeletesFrequency controls how often we wake up to check if there // are records in the delete queue, and if so, attempt to drain the queue // and delete them all. - FlushDeletesFrequency = 1 * time.Second + FlushDeletesFrequency = 15 * time.Second // PruneFrequency controls how often we wake up to check to see if the // transmissions table has exceeded its allowed size, and if so, truncate @@ -133,9 +133,9 @@ func (pm *persistenceManager) runFlushDeletesLoop() { ticker := services.TickerConfig{ // Don't prune right away, wait some time for the application to settle // down first - Initial: services.DefaultJitter.Apply(pm.pruneFrequency), + Initial: services.DefaultJitter.Apply(pm.flushDeletesFrequency), JitterPct: services.DefaultJitter, - }.NewTicker(pm.pruneFrequency) + }.NewTicker(pm.flushDeletesFrequency) defer ticker.Stop() for { select { @@ -196,7 +196,7 @@ func (pm *persistenceManager) deleteTransmissions(ctx context.Context, hashes [] break } } - pm.lggr.Debugw("Deleted queued transmit requests", "nDeleted", len(hashes)) + pm.lggr.Debugw("Flushed delete queue", "nDeleted", len(hashes)) } func (pm *persistenceManager) runPruneLoop() { diff --git a/core/services/llo/mercurytransmitter/persistence_manager_test.go b/core/services/llo/mercurytransmitter/persistence_manager_test.go index a90fea588ae..4418f16b8f0 100644 --- a/core/services/llo/mercurytransmitter/persistence_manager_test.go +++ b/core/services/llo/mercurytransmitter/persistence_manager_test.go @@ -97,7 +97,7 @@ func TestPersistenceManagerAsyncDelete(t *testing.T) { // Wait for next poll. observedLogs.TakeAll() - testutils.WaitForLogMessage(t, observedLogs, "Deleted queued transmit requests") + testutils.WaitForLogMessage(t, observedLogs, "Flushed delete queue") result, err := pm.Load(ctx) require.NoError(t, err) From ce2ed4e138ae7293ff8d57188f75140cb3c79858 Mon Sep 17 00:00:00 2001 From: Rafael Felix Correa Date: Wed, 12 Feb 2025 16:22:58 +0100 Subject: [PATCH 34/83] bump crib-deploy-environment action to latest (#16349) --- .github/actions/crib/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/crib/action.yml b/.github/actions/crib/action.yml index a877d0ff4b3..bf8af2d00ab 100644 --- a/.github/actions/crib/action.yml +++ b/.github/actions/crib/action.yml @@ -112,7 +112,7 @@ runs: aws-role-duration-seconds: "1800" - name: Deploy and validate CRIB Environment for Core - uses: smartcontractkit/.github/actions/crib-deploy-environment@265e28cc322771651688493303785323e3482b15 # crib-deploy-environment@8.2.1 + uses: smartcontractkit/.github/actions/crib-deploy-environment@9e5e6b9d746287641f80af9decf42a0791056e5b # crib-deploy-environment@8.5.2 id: deploy-crib with: github-token: ${{ steps.token.outputs.access-token }} From 68acae7cd7ada7714ebc7619b4b879d1d68990ae Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:41:38 -0500 Subject: [PATCH 35/83] add Solana changeset to source build artifacts (#16300) * add helper to build solana programs * unused var * wip * remove extra file * wip after rebase * move file * add file * bump sha * bump sha * fix path * allow optional cleaning * remove test helper change * test commit * feat: solana tooling dev * test * Update cs_deploy_chain_test.go * Revert "feat: solana tooling dev" This reverts commit 6bb66ee88c31b081d1e2c740f07fc3fd61502a3a. * cleaning * cleaning * cleaning --------- Co-authored-by: yashnevatia --- .gitignore | 1 + .../ccip/changeset/solana/cs_build_solana.go | 165 ++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 deployment/ccip/changeset/solana/cs_build_solana.go diff --git a/.gitignore b/.gitignore index b02f7241b32..96219eb520e 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,7 @@ race.* .covdata core/services/job/testdata/wasm/testmodule.wasm core/services/job/testdata/wasm/testmodule.br +temp-repo # DB state ./db/ diff --git a/deployment/ccip/changeset/solana/cs_build_solana.go b/deployment/ccip/changeset/solana/cs_build_solana.go new file mode 100644 index 00000000000..82755f407a2 --- /dev/null +++ b/deployment/ccip/changeset/solana/cs_build_solana.go @@ -0,0 +1,165 @@ +package solana + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "path/filepath" + + chainsel "github.com/smartcontractkit/chain-selectors" + + "github.com/smartcontractkit/chainlink/deployment" +) + +var _ deployment.ChangeSet[BuildSolanaConfig] = BuildSolanaChangeset + +// Configuration +const ( + repoURL = "https://github.com/smartcontractkit/chainlink-ccip.git" + cloneDir = "./temp-repo" + anchorDir = "chains/solana/contracts" // Path to the Anchor project within the repo + deployDir = "chains/solana/contracts/target/deploy" +) + +// Run a command in a specific directory +func runCommand(command string, args []string, workDir string) (string, error) { + cmd := exec.Command(command, args...) + cmd.Dir = workDir + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err := cmd.Run() + if err != nil { + return stderr.String(), err + } + return stdout.String(), nil +} + +// Clone and checkout the specific revision of the repo +func cloneRepo(e deployment.Environment, revision string) error { + // Remove the clone directory if it already exists + if _, err := os.Stat(cloneDir); !os.IsNotExist(err) { + os.RemoveAll(cloneDir) + } + + e.Logger.Debugw("Cloning repository", "url", repoURL, "revision", revision) + _, err := runCommand("git", []string{"clone", repoURL, cloneDir}, ".") + if err != nil { + return fmt.Errorf("failed to clone repository: %w", err) + } + + e.Logger.Debugw("Checking out revision", "revision", revision) + _, err = runCommand("git", []string{"checkout", revision}, cloneDir) + if err != nil { + return fmt.Errorf("failed to checkout revision %s: %w", revision, err) + } + + return nil +} + +// Replace keys in Rust files +func replaceKeys(e deployment.Environment) error { + solanaDir := filepath.Join(cloneDir, anchorDir, "..") + e.Logger.Debugw("Replacing keys", "solanaDir", solanaDir) + output, err := runCommand("make", []string{"docker-update-contracts"}, solanaDir) + if err != nil { + fmt.Println(output) + return fmt.Errorf("anchor key replacement failed: %s %w", output, err) + } + return nil +} + +func copyFile(srcFile string, destDir string) error { + output, err := runCommand("cp", []string{srcFile, destDir}, ".") + if err != nil { + return fmt.Errorf("failed to copy file: %s %w", output, err) + } + return nil +} + +// Build the project with Anchor +func buildProject(e deployment.Environment) error { + solanaDir := filepath.Join(cloneDir, anchorDir, "..") + e.Logger.Debugw("Building project", "solanaDir", solanaDir) + output, err := runCommand("make", []string{"docker-build-contracts"}, solanaDir) + if err != nil { + return fmt.Errorf("anchor build failed: %s %w", output, err) + } + return nil +} + +type BuildSolanaConfig struct { + ChainSelector uint64 + GitCommitSha string + DestinationDir string + IsUpgrade bool + CleanDestinationDir bool + CreateDestinationDir bool +} + +func BuildSolanaChangeset(e deployment.Environment, config BuildSolanaConfig) (deployment.ChangesetOutput, error) { + _, ok := e.SolChains[config.ChainSelector] + if !ok { + return deployment.ChangesetOutput{}, fmt.Errorf("chain %d not found in environment", config.ChainSelector) + } + family, err := chainsel.GetSelectorFamily(config.ChainSelector) + if err != nil { + return deployment.ChangesetOutput{}, err + } + if family != chainsel.FamilySolana { + return deployment.ChangesetOutput{}, fmt.Errorf("chain is not solana chain %d", config.ChainSelector) + } + + // Clone the repository + if err := cloneRepo(e, config.GitCommitSha); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error cloning repo: %w", err) + } + + // Upgrades don't need to generate keys, we upgrade the program in place + if !config.IsUpgrade { + if err := replaceKeys(e); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error replacing keys: %w", err) + } + } + + // Build the project with Anchor + if err := buildProject(e); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error building project: %w", err) + } + + if config.CleanDestinationDir { + e.Logger.Debugw("Cleaning destination dir", "destinationDir", config.DestinationDir) + if err := os.RemoveAll(config.DestinationDir); err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("error cleaning build folder: %w", err) + } + e.Logger.Debugw("Creating destination dir", "destinationDir", config.DestinationDir) + err = os.MkdirAll(config.DestinationDir, os.ModePerm) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create build directory: %w", err) + } + } else if config.CreateDestinationDir { + e.Logger.Debugw("Creating destination dir", "destinationDir", config.DestinationDir) + err := os.MkdirAll(config.DestinationDir, os.ModePerm) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to create build directory: %w", err) + } + } + + deployFilePath := filepath.Join(cloneDir, deployDir) + e.Logger.Debugw("Reading deploy directory", "deployFilePath", deployFilePath) + files, err := os.ReadDir(deployFilePath) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to read deploy directory: %w", err) + } + + for _, file := range files { + filePath := filepath.Join(deployFilePath, file.Name()) + e.Logger.Debugw("Copying file", "filePath", filePath, "destinationDir", config.DestinationDir) + err := copyFile(filePath, config.DestinationDir) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to copy file: %w", err) + } + } + return deployment.ChangesetOutput{}, nil +} From 8df2e6586c52f3d080a2cf07537c033f4a54e611 Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Wed, 12 Feb 2025 11:01:31 -0500 Subject: [PATCH 36/83] deploy transferable solana (#16324) * deploy transferable * feat: solana tooling dev * cleaning * Revert "feat: solana tooling dev" This reverts commit 6bb66ee88c31b081d1e2c740f07fc3fd61502a3a. * cleaning --------- Co-authored-by: yashnevatia --- .../changeset/testhelpers/test_helpers.go | 146 +++++++++++++++--- 1 file changed, 124 insertions(+), 22 deletions(-) diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 2046e0aadfe..6245d10fbb2 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -51,7 +51,9 @@ import ( solRouter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_router" solFeeQuoter "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" solTestReceiver "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_ccip_receiver" + solTestTokenPool "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/test_token_pool" solState "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/state" + solTokenUtil "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/tokens" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/burn_mint_token_pool" @@ -798,6 +800,128 @@ func DeployTransferableToken( return srcToken, srcPool, dstToken, dstPool, nil } +// assuming one out of the src and dst is solana and the other is evm +func DeployTransferableTokenSolana( + t *testing.T, + lggr logger.Logger, + e deployment.Environment, + evmChainSel, solChainSel uint64, + evmDeployer *bind.TransactOpts, + addresses deployment.AddressBook, + evmTokenName string, +) (*burn_mint_erc677.BurnMintERC677, + *burn_mint_token_pool.BurnMintTokenPool, solana.PublicKey, error) { + state, err := changeset.LoadOnchainState(e) + require.NoError(t, err) + + // deploy evm token + evmToken, evmPool, err := deployTransferTokenOneEnd(lggr, e.Chains[evmChainSel], evmDeployer, addresses, evmTokenName) + if err != nil { + return nil, nil, solana.PublicKey{}, err + } + if err := attachTokenToTheRegistry(e.Chains[evmChainSel], state.Chains[evmChainSel], evmDeployer, evmToken.Address(), evmPool.Address()); err != nil { + return nil, nil, solana.PublicKey{}, err + } + require.NoError(t, err) + + // deploy solana token + e, err = commoncs.ApplyChangesets(t, e, nil, []commoncs.ChangesetApplication{ + { // this makes the deployer the mint authority by default + Changeset: commoncs.WrapChangeSet(changeset_solana.DeploySolanaToken), + Config: changeset_solana.DeploySolanaTokenConfig{ + ChainSelector: solChainSel, + TokenProgramName: deployment.SPL2022Tokens, + TokenDecimals: 9, + }, + }, + }) + require.NoError(t, err) + + state, err = changeset.LoadOnchainState(e) + require.NoError(t, err) + solTokenAddress := state.SolChains[solChainSel].SPL2022Tokens[0] + solDeployerKey := e.SolChains[solChainSel].DeployerKey.PublicKey() + e, err = commoncs.ApplyChangesets(t, e, nil, []commoncs.ChangesetApplication{ + { // create the ata for the deployerKey + Changeset: commoncs.WrapChangeSet(changeset_solana.CreateSolanaTokenATA), + Config: changeset_solana.CreateSolanaTokenATAConfig{ + ChainSelector: solChainSel, + TokenPubkey: solTokenAddress, + TokenProgram: deployment.SPL2022Tokens, + ATAList: []string{solDeployerKey.String()}, + }, + }, + { // mint the token to the deployerKey + Changeset: commoncs.WrapChangeSet(changeset_solana.MintSolanaToken), + Config: changeset_solana.MintSolanaTokenConfig{ + ChainSelector: solChainSel, + TokenPubkey: solTokenAddress, + TokenProgram: deployment.SPL2022Tokens, + AmountToAddress: map[string]uint64{ + solDeployerKey.String(): uint64(1000), + }, + }, + }, + { // deploy token pool and set the burn/mint authority to the tokenPool + Changeset: commoncs.WrapChangeSet(changeset_solana.AddTokenPool), + Config: changeset_solana.TokenPoolConfig{ + ChainSelector: solChainSel, + TokenPubKey: solTokenAddress.String(), + TokenProgramName: deployment.SPL2022Tokens, + PoolType: solTestTokenPool.BurnAndMint_PoolType, + Authority: solDeployerKey.String(), + }, + }, + }) + require.NoError(t, err) + + // configure evm + poolConfigPDA, err := solTokenUtil.TokenPoolConfigAddress(solTokenAddress, state.SolChains[solChainSel].TokenPool) + require.NoError(t, err) + err = setTokenPoolCounterPart(e.Chains[evmChainSel], evmPool, evmDeployer, solChainSel, solTokenAddress.Bytes(), poolConfigPDA.Bytes()) + require.NoError(t, err) + + err = grantMintBurnPermissions(lggr, e.Chains[evmChainSel], evmToken, evmDeployer, evmPool.Address()) + require.NoError(t, err) + + // configure solana + e, err = commoncs.ApplyChangesets(t, e, nil, []commoncs.ChangesetApplication{ + { + Changeset: commoncs.WrapChangeSet(changeset_solana.SetupTokenPoolForRemoteChain), + Config: changeset_solana.RemoteChainTokenPoolConfig{ + SolChainSelector: solChainSel, + RemoteChainSelector: evmChainSel, + SolTokenPubKey: solTokenAddress.String(), + RemoteConfig: solTestTokenPool.RemoteConfig{ + // this can be potentially read from the state if we are given the token symbol + PoolAddresses: []solTestTokenPool.RemoteAddress{ + { + Address: evmPool.Address().Bytes(), + }, + }, + TokenAddress: solTestTokenPool.RemoteAddress{ + Address: evmToken.Address().Bytes(), + }, + Decimals: 9, + }, + InboundRateLimit: solTestTokenPool.RateLimitConfig{ + Enabled: true, + Capacity: uint64(1000), + Rate: 1, + }, + OutboundRateLimit: solTestTokenPool.RateLimitConfig{ + Enabled: true, + Capacity: uint64(1000), + Rate: 1, + }, + }, + }, + }) + + require.NoError(t, err) + return evmToken, evmPool, solTokenAddress, nil +} + func deployTokenPoolsInParallel( lggr logger.Logger, chains map[uint64]deployment.Chain, @@ -934,28 +1058,6 @@ func setTokenPoolCounterPart( return fmt.Errorf("failed to apply chain updates on token pool %s: %w", tokenPool.Address(), err) } - _, err = chain.Confirm(tx) - if err != nil { - return err - } - - supported, err := tokenPool.IsSupportedChain(&bind.CallOpts{}, destChainSelector) - if err != nil { - return err - } - if !supported { - return fmt.Errorf("token pool %s is not supported on chain %d", tokenPool.Address(), destChainSelector) - } - - tx, err = tokenPool.AddRemotePool( - actor, - destChainSelector, - destTokenPoolAddress, - ) - if err != nil { - return fmt.Errorf("failed to set remote pool on token pool %s: %w", tokenPool.Address(), err) - } - _, err = chain.Confirm(tx) return err } From 469707978d45fe3bc3dfc3a4778a637027c5c8ab Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Wed, 12 Feb 2025 10:24:24 -0600 Subject: [PATCH 37/83] core/cmd: tolerate multiple NonceAt calls (#16348) --- core/cmd/eth_keys_commands_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/cmd/eth_keys_commands_test.go b/core/cmd/eth_keys_commands_test.go index 39efc9b275e..e3c500358ac 100644 --- a/core/cmd/eth_keys_commands_test.go +++ b/core/cmd/eth_keys_commands_test.go @@ -92,7 +92,7 @@ func TestShell_ListETHKeys(t *testing.T) { ethClient := newEthMock(t) ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(42), nil) ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(commonassets.NewLinkFromJuels(13), nil) - ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Once() + ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Maybe() app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Enabled = ptr(true) c.EVM[0].NonceAutoSync = ptr(false) @@ -117,7 +117,7 @@ func TestShell_ListETHKeys_Error(t *testing.T) { ethClient := newEthMock(t) ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("fake error")) ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("fake error")) - ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Once() + ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Maybe() app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Enabled = ptr(true) c.EVM[0].NonceAutoSync = ptr(false) @@ -171,7 +171,7 @@ func TestShell_CreateETHKey(t *testing.T) { ethClient := newEthMock(t) ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(42), nil) ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(commonassets.NewLinkFromJuels(42), nil) - ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Once() + ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Maybe() app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Enabled = ptr(true) @@ -246,7 +246,7 @@ func TestShell_ImportExportETHKey_NoChains(t *testing.T) { ethClient := newEthMock(t) ethClient.On("BalanceAt", mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(42), nil) ethClient.On("LINKBalance", mock.Anything, mock.Anything, mock.Anything).Return(commonassets.NewLinkFromJuels(42), nil) - ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Once() + ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Maybe() app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Enabled = ptr(true) c.EVM[0].NonceAutoSync = ptr(false) @@ -350,7 +350,7 @@ func TestShell_ImportExportETHKey_WithChains(t *testing.T) { t.Cleanup(func() { deleteKeyExportFile(t) }) ethClient := newEthMock(t) - ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Once() + ethClient.On("NonceAt", mock.Anything, mock.Anything, mock.Anything).Return(uint64(0), nil).Maybe() app := startNewApplicationV2(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM[0].Enabled = ptr(true) c.EVM[0].NonceAutoSync = ptr(false) From 75763abb5f9348f0aefd7ce7caddae679ed06357 Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Wed, 12 Feb 2025 09:54:57 -0800 Subject: [PATCH 38/83] chore: disable solana artifact builds for race tests (#16340) --- .github/workflows/ci-core.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index 8c3af9e18c0..d6080830a24 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -188,6 +188,7 @@ jobs: - cmd: go_core_race_tests # use 64cores for certain scheduled runs only os: ${{ needs.run-frequency.outputs.two-per-day-frequency == 'true' && 'ubuntu-latest-64cores-256GB' || 'ubuntu-latest-32cores-128GB' }} + build-solana-artifacts: 'false' name: Core Tests (${{ matrix.type.cmd }}) # We don't directly merge dependabot PRs, so let's not waste the resources if: ${{ github.actor != 'dependabot[bot]' }} From 7890f4e7cb5f55ab1d344aad710a436355553859 Mon Sep 17 00:00:00 2001 From: Austin <107539019+0xAustinWang@users.noreply.github.com> Date: Thu, 13 Feb 2025 02:30:54 +0800 Subject: [PATCH 39/83] Aw/load test aws (#16104) * prepping to run load tests on aws * load test adjustments * working refactor to speed up deployment * 10 lanes load test, working loki * somec hanges * changes for pr * changesets keep changing * add concurrency * go lint * 30 chains * add logging, make the setup functional * pr changes * export functions for crib to use * PR comments * revert import changes that was breaking build * PR comments, improvements to metrics management * cleanup * fix imports * imports * all changes, mostly imports and parallelization of changesets * parallelization * lint * lint * changes to support round num meetric * Deploy transferable tokens to test message and tokens with data * metrics management * revert changeset parallelization, go mods * shadow variables * go mod * lint * WIP add token pools for link token in crib deployment * WIP making link work * cleaning up and parallelizing router approval per sender * use enum names in merics * use sync map to coordinate map changes * merge issues * golint, goimports * Grant burn and mint roles to token pools * clean up * goimport --------- Co-authored-by: asoliman --- core/scripts/go.sum | 4 - deployment/environment/crib/ccip_deployer.go | 478 +++++++++++++----- deployment/environment/crib/helpers.go | 97 ++-- deployment/environment/devenv/chain.go | 109 ++-- deployment/environment/devenv/don.go | 36 +- deployment/go.mod | 2 - deployment/go.sum | 4 - integration-tests/load/ccip/ccip_test.go | 137 ++++- .../load/ccip/destination_gun.go | 80 +-- integration-tests/load/ccip/helpers.go | 211 ++++---- integration-tests/load/ccip/metrics.go | 151 ++++++ integration-tests/load/go.mod | 2 +- integration-tests/testconfig/ccip/ccip.toml | 16 +- integration-tests/testconfig/ccip/load.go | 37 +- 14 files changed, 954 insertions(+), 410 deletions(-) create mode 100644 integration-tests/load/ccip/metrics.go diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 11389d846d5..4c74aa982d2 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -654,8 +654,6 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -670,8 +668,6 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 4d415c119be..9503aa3583f 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -6,9 +6,12 @@ import ( "fmt" "math/big" - "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_1/token_pool" + + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" "github.com/smartcontractkit/chainlink-ccip/chainconfig" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/ethereum/go-ethereum/common" @@ -28,7 +31,7 @@ import ( ) // DeployHomeChainContracts deploys the home chain contracts so that the chainlink nodes can use the CR address in Capabilities.ExternalRegistry -// Afterwards, we call DeployHomeChainChangeset changeset with nodeinfo ( the peer id and all) +// Afterward, we call DeployHomeChainChangeset changeset with nodeinfo ( the peer id and all) func DeployHomeChainContracts(ctx context.Context, lggr logger.Logger, envConfig devenv.EnvironmentConfig, homeChainSel uint64, feedChainSel uint64) (deployment.CapabilityRegistryConfig, deployment.AddressBook, error) { e, _, err := devenv.NewEnvironment(func() context.Context { return ctx }, lggr, envConfig) if err != nil { @@ -98,22 +101,177 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de return DeployCCIPOutput{}, fmt.Errorf("failed to initiate new environment: %w", err) } e.ExistingAddresses = ab - chainSelectors := e.AllChainSelectors() - var prereqCfgs []changeset.DeployPrerequisiteConfigPerChain - for _, chain := range e.AllChainSelectors() { - prereqCfgs = append(prereqCfgs, changeset.DeployPrerequisiteConfigPerChain{ - ChainSelector: chain, - }) + + // ------ Part 1 ----- + // Setup because we only need to deploy the contracts and distribute job specs + fmt.Println("setting up chains...") + *e, err = setupChains(lggr, e, homeChainSel) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up chain: %w", err) + } + + state, err := changeset.LoadOnchainState(*e) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to load onchain state: %w", err) + } + + fmt.Println("setting up lanes...") + // Add all lanes + *e, err = setupLanes(e, state) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for connecting lanes: %w", err) + } + // ------ Part 1 ----- + + // ----- Part 2 ----- + fmt.Println("setting up ocr...") + *e, err = setupOCR(e, homeChainSel, feedChainSel) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up OCR: %w", err) + } + + // distribute funds to transmitters + // we need to use the nodeinfo from the envConfig here, because multiAddr is not + // populated in the environment variable + fmt.Println("distributing funds...") + err = distributeTransmitterFunds(lggr, don.PluginNodes(), *e) + if err != nil { + return DeployCCIPOutput{}, err + } + + addresses, err := e.ExistingAddresses.Addresses() + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to convert address book to address book map: %w", err) + } + return DeployCCIPOutput{ + AddressBook: *deployment.NewMemoryAddressBookFromMap(addresses), + NodeIDs: e.NodeIDs, + }, nil +} + +// DeployCCIPChains is a group of changesets used from CRIB to set up new chains +// It sets up CCIP contracts on all chains. We expect that MCMS has already been deployed and set up +func DeployCCIPChains(ctx context.Context, lggr logger.Logger, envConfig devenv.EnvironmentConfig, homeChainSel, feedChainSel uint64, ab deployment.AddressBook) (DeployCCIPOutput, error) { + e, _, err := devenv.NewEnvironment(func() context.Context { return ctx }, lggr, envConfig) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to initiate new environment: %w", err) + } + e.ExistingAddresses = ab + + // Setup because we only need to deploy the contracts and distribute job specs + fmt.Println("setting up chains...") + *e, err = setupChains(lggr, e, homeChainSel) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up chain: %w", err) + } + addresses, err := e.ExistingAddresses.Addresses() + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to get convert address book to address book map: %w", err) + } + return DeployCCIPOutput{ + AddressBook: *deployment.NewMemoryAddressBookFromMap(addresses), + NodeIDs: e.NodeIDs, + }, nil +} + +// ConnectCCIPLanes is a group of changesets used from CRIB to set up new lanes +// It creates a fully connected mesh where all chains are connected to all chains +func ConnectCCIPLanes(ctx context.Context, lggr logger.Logger, envConfig devenv.EnvironmentConfig, homeChainSel, feedChainSel uint64, ab deployment.AddressBook) (DeployCCIPOutput, error) { + e, _, err := devenv.NewEnvironment(func() context.Context { return ctx }, lggr, envConfig) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to initiate new environment: %w", err) + } + e.ExistingAddresses = ab + + state, err := changeset.LoadOnchainState(*e) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to load onchain state: %w", err) + } + + fmt.Println("setting up lanes...") + // Add all lanes + *e, err = setupLanes(e, state) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for connecting lanes: %w", err) + } + + addresses, err := e.ExistingAddresses.Addresses() + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to get convert address book to address book map: %w", err) + } + return DeployCCIPOutput{ + AddressBook: *deployment.NewMemoryAddressBookFromMap(addresses), + NodeIDs: e.NodeIDs, + }, nil +} + +// ConfigureCCIPOCR is a group of changesets used from CRIB to configure OCR on a new setup +// This sets up OCR on all chains in the envConfig by configuring the CCIP home chain +func ConfigureCCIPOCR(ctx context.Context, lggr logger.Logger, envConfig devenv.EnvironmentConfig, homeChainSel, feedChainSel uint64, ab deployment.AddressBook) (DeployCCIPOutput, error) { + e, _, err := devenv.NewEnvironment(func() context.Context { return ctx }, lggr, envConfig) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to initiate new environment: %w", err) + } + e.ExistingAddresses = ab + + fmt.Println("setting up ocr...") + *e, err = setupOCR(e, homeChainSel, feedChainSel) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up OCR: %w", err) + } + + addresses, err := e.ExistingAddresses.Addresses() + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to get convert address book to address book map: %w", err) + } + return DeployCCIPOutput{ + AddressBook: *deployment.NewMemoryAddressBookFromMap(addresses), + NodeIDs: e.NodeIDs, + }, nil +} + +// FundCCIPTransmitters is used from CRIB to provide funds to the node transmitters +// This function sends funds from the deployer key to the chainlink node transmitters +func FundCCIPTransmitters(ctx context.Context, lggr logger.Logger, envConfig devenv.EnvironmentConfig, ab deployment.AddressBook) (DeployCCIPOutput, error) { + e, don, err := devenv.NewEnvironment(func() context.Context { return ctx }, lggr, envConfig) + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to initiate new environment: %w", err) + } + e.ExistingAddresses = ab + + // distribute funds to transmitters + // we need to use the nodeinfo from the envConfig here, because multiAddr is not + // populated in the environment variable + fmt.Println("distributing funds...") + err = distributeTransmitterFunds(lggr, don.PluginNodes(), *e) + if err != nil { + return DeployCCIPOutput{}, err } - // set up chains + addresses, err := e.ExistingAddresses.Addresses() + if err != nil { + return DeployCCIPOutput{}, fmt.Errorf("failed to get convert address book to address book map: %w", err) + } + return DeployCCIPOutput{ + AddressBook: *deployment.NewMemoryAddressBookFromMap(addresses), + NodeIDs: e.NodeIDs, + }, nil +} + +func setupChains(lggr logger.Logger, e *deployment.Environment, homeChainSel uint64) (deployment.Environment, error) { + chainSelectors := e.AllChainSelectors() chainConfigs := make(map[uint64]changeset.ChainConfig) nodeInfo, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) if err != nil { - return DeployCCIPOutput{}, fmt.Errorf("failed to get node info from env: %w", err) + return *e, fmt.Errorf("failed to get node info from env: %w", err) } + prereqCfgs := make([]changeset.DeployPrerequisiteConfigPerChain, 0) contractParams := make(map[uint64]changeset.ChainContractParams) + for _, chain := range chainSelectors { + prereqCfgs = append(prereqCfgs, changeset.DeployPrerequisiteConfigPerChain{ + ChainSelector: chain, + }) chainConfigs[chain] = changeset.ChainConfig{ Readers: nodeInfo.NonBootstraps().PeerIDs(), FChain: 1, @@ -128,9 +286,7 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de OffRampParams: changeset.DefaultOffRampParams(), } } - - // Setup because we only need to deploy the contracts and distribute job specs - *e, err = commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ + env, err := commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ { Changeset: commonchangeset.WrapChangeSet(changeset.UpdateChainConfigChangeset), Config: changeset.UpdateChainConfigConfig{ @@ -166,19 +322,197 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de Config: struct{}{}, }, }) + if err != nil { + return *e, fmt.Errorf("failed to apply changesets: %w", err) + } + lggr.Infow("setup Link pools") + return setupLinkPools(&env) +} + +func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { state, err := changeset.LoadOnchainState(*e) if err != nil { - return DeployCCIPOutput{}, fmt.Errorf("failed to load onchain state: %w", err) + return *e, fmt.Errorf("failed to load onchain state: %w", err) + } + chainSelectors := e.AllChainSelectors() + poolInput := make(map[uint64]changeset.DeployTokenPoolInput) + pools := make(map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo) + for _, chain := range chainSelectors { + poolInput[chain] = changeset.DeployTokenPoolInput{ + Type: changeset.BurnMintTokenPool, + LocalTokenDecimals: 18, + AllowList: []common.Address{}, + TokenAddress: state.Chains[chain].LinkToken.Address(), + } + pools[chain] = map[changeset.TokenSymbol]changeset.TokenPoolInfo{ + changeset.LinkSymbol: { + Type: changeset.BurnMintTokenPool, + Version: deployment.Version1_5_1, + ExternalAdmin: e.Chains[chain].DeployerKey.From, + }, + } + } + env, err := commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ + { + Changeset: commonchangeset.WrapChangeSet(changeset.DeployTokenPoolContractsChangeset), + Config: changeset.DeployTokenPoolContractsConfig{ + TokenSymbol: changeset.LinkSymbol, + NewPools: poolInput, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), + Config: changeset.TokenAdminRegistryChangesetConfig{ + Pools: pools, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAdminRoleChangeset), + Config: changeset.TokenAdminRegistryChangesetConfig{ + Pools: pools, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(changeset.SetPoolChangeset), + Config: changeset.TokenAdminRegistryChangesetConfig{ + Pools: pools, + }, + }, + }) + + if err != nil { + return *e, fmt.Errorf("failed to apply changesets: %w", err) + } + + state, err = changeset.LoadOnchainState(env) + if err != nil { + return *e, fmt.Errorf("failed to load onchain state: %w", err) } + for _, chain := range chainSelectors { + linkPool := state.Chains[chain].BurnMintTokenPools[changeset.LinkSymbol][deployment.Version1_5_1] + linkToken := state.Chains[chain].LinkToken + tx, err := linkToken.GrantMintAndBurnRoles(e.Chains[chain].DeployerKey, linkPool.Address()) + _, err = deployment.ConfirmIfNoError(e.Chains[chain], tx, err) + if err != nil { + return *e, fmt.Errorf("failed to grant mint and burn roles for link pool: %w", err) + } + } + return env, err +} + +func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (deployment.Environment, error) { + onRampUpdatesByChain := make(map[uint64]map[uint64]changeset.OnRampDestinationUpdate) + pricesByChain := make(map[uint64]changeset.FeeQuoterPriceUpdatePerSource) + feeQuoterDestsUpdatesByChain := make(map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig) + updateOffRampSources := make(map[uint64]map[uint64]changeset.OffRampSourceUpdate) + updateRouterChanges := make(map[uint64]changeset.RouterUpdates) + poolUpdates := make(map[uint64]changeset.TokenPoolConfig) + for src := range e.Chains { + onRampUpdatesByChain[src] = make(map[uint64]changeset.OnRampDestinationUpdate) + pricesByChain[src] = changeset.FeeQuoterPriceUpdatePerSource{ + TokenPrices: map[common.Address]*big.Int{ + state.Chains[src].LinkToken.Address(): testhelpers.DefaultLinkPrice, + state.Chains[src].Weth9.Address(): testhelpers.DefaultWethPrice, + }, + GasPrices: make(map[uint64]*big.Int), + } + feeQuoterDestsUpdatesByChain[src] = make(map[uint64]fee_quoter.FeeQuoterDestChainConfig) + updateOffRampSources[src] = make(map[uint64]changeset.OffRampSourceUpdate) + updateRouterChanges[src] = changeset.RouterUpdates{ + OffRampUpdates: make(map[uint64]bool), + OnRampUpdates: make(map[uint64]bool), + } + rateLimitPerChain := make(changeset.RateLimiterPerChain) + + for dst := range e.Chains { + if src != dst { + onRampUpdatesByChain[src][dst] = changeset.OnRampDestinationUpdate{ + IsEnabled: true, + AllowListEnabled: false, + } + pricesByChain[src].GasPrices[dst] = testhelpers.DefaultGasPrice + feeQuoterDestsUpdatesByChain[src][dst] = changeset.DefaultFeeQuoterDestChainConfig(true) + + updateOffRampSources[src][dst] = changeset.OffRampSourceUpdate{ + IsEnabled: true, + IsRMNVerificationDisabled: true, + } + + updateRouterChanges[src].OffRampUpdates[dst] = true + updateRouterChanges[src].OnRampUpdates[dst] = true + rateLimitPerChain[dst] = changeset.RateLimiterConfig{ + Inbound: token_pool.RateLimiterConfig{ + IsEnabled: false, + Capacity: big.NewInt(0), + Rate: big.NewInt(0), + }, + Outbound: token_pool.RateLimiterConfig{ + IsEnabled: false, + Capacity: big.NewInt(0), + Rate: big.NewInt(0), + }, + } + } + } + + poolUpdates[src] = changeset.TokenPoolConfig{ + Type: changeset.BurnMintTokenPool, + Version: deployment.Version1_5_1, + ChainUpdates: rateLimitPerChain, + } + } + + return commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ + { + Changeset: commonchangeset.WrapChangeSet(changeset.ConfigureTokenPoolContractsChangeset), + Config: changeset.ConfigureTokenPoolContractsConfig{ + TokenSymbol: changeset.LinkSymbol, + PoolUpdates: poolUpdates, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), + Config: changeset.UpdateOnRampDestsConfig{ + UpdatesByChain: onRampUpdatesByChain, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterPricesChangeset), + Config: changeset.UpdateFeeQuoterPricesConfig{ + PricesByChain: pricesByChain, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterDestsChangeset), + Config: changeset.UpdateFeeQuoterDestsConfig{ + UpdatesByChain: feeQuoterDestsUpdatesByChain, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOffRampSourcesChangeset), + Config: changeset.UpdateOffRampSourcesConfig{ + UpdatesByChain: updateOffRampSources, + }, + }, + { + Changeset: commonchangeset.WrapChangeSet(changeset.UpdateRouterRampsChangeset), + Config: changeset.UpdateRouterRampsConfig{ + UpdatesByChain: updateRouterChanges, + }, + }, + }) +} + +func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64) (deployment.Environment, error) { + chainSelectors := e.AllChainSelectors() var ocrConfigPerSelector = make(map[uint64]changeset.CCIPOCRParams) for selector := range e.Chains { ocrConfigPerSelector[selector] = changeset.DeriveCCIPOCRParams(changeset.WithDefaultCommitOffChainConfig(feedChainSel, nil), changeset.WithDefaultExecuteOffChainConfig(nil), ) } - - *e, err = commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ + return commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ { // Add the DONs and candidate commit OCR instances for the chain. Changeset: commonchangeset.WrapChangeSet(changeset.AddDonAndSetCandidateChangeset), @@ -230,116 +564,10 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de // Enable the OCR config on the remote chains. Changeset: commonchangeset.WrapChangeSet(changeset.SetOCR3OffRampChangeset), Config: changeset.SetOCR3OffRampConfig{ - HomeChainSel: homeChainSel, - RemoteChainSels: chainSelectors, + HomeChainSel: homeChainSel, + RemoteChainSels: chainSelectors, + CCIPHomeConfigType: globals.ConfigTypeActive, }, }, }) - if err != nil { - return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets: %w", err) - } - - // Add all lanes - for src := range e.Chains { - for dst := range e.Chains { - if src != dst { - stateChain1 := state.Chains[src] - newEnv, err := commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), - Config: changeset.UpdateOnRampDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ - src: { - dst: { - IsEnabled: true, - AllowListEnabled: false, - }, - }, - }, - }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - Config: changeset.UpdateFeeQuoterPricesConfig{ - PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ - src: { - TokenPrices: map[common.Address]*big.Int{ - stateChain1.LinkToken.Address(): testhelpers.DefaultLinkPrice, - stateChain1.Weth9.Address(): testhelpers.DefaultWethPrice, - }, - GasPrices: map[uint64]*big.Int{ - dst: testhelpers.DefaultGasPrice, - }, - }, - }, - }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - Config: changeset.UpdateFeeQuoterDestsConfig{ - UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ - src: { - dst: changeset.DefaultFeeQuoterDestChainConfig(true), - }, - }, - }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOffRampSourcesChangeset), - Config: changeset.UpdateOffRampSourcesConfig{ - UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ - dst: { - src: { - IsEnabled: true, - IsRMNVerificationDisabled: true, - }, - }, - }, - }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateRouterRampsChangeset), - Config: changeset.UpdateRouterRampsConfig{ - UpdatesByChain: map[uint64]changeset.RouterUpdates{ - src: { - OffRampUpdates: map[uint64]bool{ - dst: true, - }, - OnRampUpdates: map[uint64]bool{ - dst: true, - }, - }, - dst: { - OffRampUpdates: map[uint64]bool{ - src: true, - }, - OnRampUpdates: map[uint64]bool{ - src: true, - }, - }, - }, - }, - }, - }) - if err != nil { - return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets: %w", err) - } - e = &newEnv - } - } - } - - // distribute funds to transmitters - // we need to use the nodeinfo from the envConfig here, because multiAddr is not - // populated in the environment variable - distributeFunds(lggr, don.PluginNodes(), *e) - - addresses, err := e.ExistingAddresses.Addresses() - if err != nil { - return DeployCCIPOutput{}, fmt.Errorf("failed to get convert address book to address book map: %w", err) - } - return DeployCCIPOutput{ - AddressBook: *deployment.NewMemoryAddressBookFromMap(addresses), - NodeIDs: e.NodeIDs, - }, err } diff --git a/deployment/environment/crib/helpers.go b/deployment/environment/crib/helpers.go index 75ae84f505b..8cd6c6311eb 100644 --- a/deployment/environment/crib/helpers.go +++ b/deployment/environment/crib/helpers.go @@ -2,43 +2,41 @@ package crib import ( "context" - "sync" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" gethtypes "github.com/ethereum/go-ethereum/core/types" chainsel "github.com/smartcontractkit/chain-selectors" + "golang.org/x/sync/errgroup" "math/big" + "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/conversions" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/environment/devenv" - "github.com/smartcontractkit/chainlink/v2/core/logger" ) -var wg = &sync.WaitGroup{} - -func distributeFunds(lggr logger.Logger, nodeInfo []devenv.Node, env deployment.Environment) { +func distributeTransmitterFunds(lggr logger.Logger, nodeInfo []devenv.Node, env deployment.Environment) error { transmittersStr := make([]common.Address, 0) - fundingAmount := new(big.Int).Mul(deployment.UBigInt(5), deployment.UBigInt(1e17)) // 0.5 ETH - minThreshold := new(big.Int).Mul(deployment.UBigInt(5), deployment.UBigInt(1e16)) // 0.05 ETH + fundingAmount := new(big.Int).Mul(deployment.UBigInt(100), deployment.UBigInt(1e18)) // 100 ETH + minThreshold := new(big.Int).Mul(deployment.UBigInt(5), deployment.UBigInt(1e16)) // 0.05 ETH + g := new(errgroup.Group) for sel, chain := range env.Chains { - wg.Add(1) - go func(sel uint64, chain deployment.Chain) { - defer wg.Done() + sel, chain := sel, chain + g.Go(func() error { for _, n := range nodeInfo { chainID, err := chainsel.ChainIdFromSelector(sel) if err != nil { lggr.Errorw("could not get chain id from selector", "selector", sel, "err", err) - continue + return err } addr := common.HexToAddress(n.AccountAddr[chainID]) - balance, err := chain.Client.BalanceAt(context.Background(), addr, nil) + balance, err := chain.Client.BalanceAt(env.GetContext(), addr, nil) if err != nil { lggr.Errorw("error fetching balance for %s: %v\n", n.Name, err) - continue + return err } if balance.Cmp(minThreshold) < 0 { lggr.Infow( @@ -50,43 +48,48 @@ func distributeFunds(lggr logger.Logger, nodeInfo []devenv.Node, env deployment. transmittersStr = append(transmittersStr, addr) } } - latesthdr, err := chain.Client.HeaderByNumber(context.Background(), nil) - if err != nil { - lggr.Errorw("could not get header, skipping chain", "chain", sel, "err", err) - return - } - block := latesthdr.Number - - nonce, err := chain.Client.NonceAt(context.Background(), chain.DeployerKey.From, block) - if err != nil { - lggr.Warnw("could not get latest nonce for deployer key", "err", err) - return - } - for _, transmitter := range transmittersStr { - tx := gethtypes.NewTransaction(nonce, transmitter, fundingAmount, uint64(1000000), big.NewInt(1000000), nil) + return SendFundsToAccounts(env.GetContext(), lggr, chain, transmittersStr, fundingAmount, sel) + }) + } - signedTx, err := chain.DeployerKey.Signer(chain.DeployerKey.From, tx) - if err != nil { - lggr.Errorw("could not sign transaction to transmitter on ", "chain", sel, "transmitter", transmitter, "err", err) - continue - } + return g.Wait() +} - lggr.Infow("sending transaction for ", "transmitter", transmitter.String(), "chain", sel) - err = chain.Client.SendTransaction(context.Background(), signedTx) - if err != nil { - lggr.Errorw("could not send transaction to transmitter on ", "chain", sel, "transmitter", transmitter, "err", err) - continue - } +func SendFundsToAccounts(ctx context.Context, lggr logger.Logger, chain deployment.Chain, accounts []common.Address, fundingAmount *big.Int, sel uint64) error { + latesthdr, err := chain.Client.HeaderByNumber(ctx, nil) + if err != nil { + lggr.Errorw("could not get header, skipping chain", "chain", sel, "err", err) + return err + } + block := latesthdr.Number - _, err = bind.WaitMined(context.Background(), chain.Client, signedTx) - if err != nil { - lggr.Errorw("could not mine transaction to transmitter on ", "chain", sel) - continue - } - nonce++ - } - }(sel, chain) + nonce, err := chain.Client.NonceAt(context.Background(), chain.DeployerKey.From, block) + if err != nil { + lggr.Warnw("could not get latest nonce for deployer key", "err", err) + return err } + for _, address := range accounts { + tx := gethtypes.NewTransaction(nonce, address, fundingAmount, uint64(1000000), big.NewInt(1000000), nil) + + signedTx, err := chain.DeployerKey.Signer(chain.DeployerKey.From, tx) + if err != nil { + lggr.Errorw("could not sign transaction for sending funds to ", "chain", sel, "account", address, "err", err) + return err + } - wg.Wait() + lggr.Infow("sending transaction for ", "account", address.String(), "chain", sel) + err = chain.Client.SendTransaction(context.Background(), signedTx) + if err != nil { + lggr.Errorw("could not send transaction to address on ", "chain", sel, "address", address, "err", err) + return err + } + + _, err = bind.WaitMined(context.Background(), chain.Client, signedTx) + if err != nil { + lggr.Errorw("could not mine transaction to address on ", "chain", sel) + return err + } + nonce++ + } + return nil } diff --git a/deployment/environment/devenv/chain.go b/deployment/environment/devenv/chain.go index c53cb82a7ed..22ed24cc6f8 100644 --- a/deployment/environment/devenv/chain.go +++ b/deployment/environment/devenv/chain.go @@ -5,8 +5,11 @@ import ( "errors" "fmt" "math/big" + "sync" "time" + "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -94,58 +97,70 @@ func (c *ChainConfig) SetDeployerKey(pvtKeyStr *string) error { func NewChains(logger logger.Logger, configs []ChainConfig) (map[uint64]deployment.Chain, error) { chains := make(map[uint64]deployment.Chain) + var syncMap sync.Map + g := new(errgroup.Group) for _, chainCfg := range configs { - selector, err := chainselectors.SelectorFromChainId(chainCfg.ChainID) - if err != nil { - return nil, fmt.Errorf("failed to get selector from chain id %d: %w", chainCfg.ChainID, err) - } - // TODO : better client handling - var ec *ethclient.Client - for _, rpc := range chainCfg.WSRPCs { - ec, err = ethclient.Dial(rpc.External) + chainCfg := chainCfg + g.Go(func() error { + selector, err := chainselectors.SelectorFromChainId(chainCfg.ChainID) if err != nil { - logger.Warnf("failed to dial ws rpc %s", rpc) - continue + return fmt.Errorf("failed to get selector from chain id %d: %w", chainCfg.ChainID, err) } - logger.Infof("connected to ws rpc %s", rpc) - break - } - if ec == nil { - return nil, fmt.Errorf("failed to connect to chain %s", chainCfg.ChainName) - } - chainInfo, err := deployment.ChainInfo(selector) - if err != nil { - return nil, fmt.Errorf("failed to get chain info for chain %s: %w", chainCfg.ChainName, err) - } - chains[selector] = deployment.Chain{ - Selector: selector, - Client: ec, - DeployerKey: chainCfg.DeployerKey, - Confirm: func(tx *types.Transaction) (uint64, error) { - var blockNumber uint64 - if tx == nil { - return 0, fmt.Errorf("tx was nil, nothing to confirm chain %s", chainInfo.ChainName) - } - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute) - defer cancel() - receipt, err := bind.WaitMined(ctx, ec, tx) + // TODO : better client handling + var ec *ethclient.Client + for _, rpc := range chainCfg.WSRPCs { + ec, err = ethclient.Dial(rpc.External) if err != nil { - return blockNumber, fmt.Errorf("failed to get confirmed receipt for chain %s: %w", chainInfo.ChainName, err) + logger.Warnf("failed to dial ws rpc %s: %s", rpc, err) + continue } - if receipt == nil { - return blockNumber, fmt.Errorf("receipt was nil for tx %s chain %s", tx.Hash().Hex(), chainInfo.ChainName) - } - blockNumber = receipt.BlockNumber.Uint64() - if receipt.Status == 0 { - errReason, err := deployment.GetErrorReasonFromTx(ec, chainCfg.DeployerKey.From, tx, receipt) - if err == nil && errReason != "" { - return blockNumber, fmt.Errorf("tx %s reverted,error reason: %s chain %s", tx.Hash().Hex(), errReason, chainInfo.ChainName) + logger.Infof("connected to ws rpc %s", rpc) + break + } + if ec == nil { + return fmt.Errorf("failed to connect to chain %s", chainCfg.ChainName) + } + chainInfo, err := deployment.ChainInfo(selector) + if err != nil { + return fmt.Errorf("failed to get chain info for chain %s: %w", chainCfg.ChainName, err) + } + syncMap.Store(selector, deployment.Chain{ + Selector: selector, + Client: ec, + DeployerKey: chainCfg.DeployerKey, + Confirm: func(tx *types.Transaction) (uint64, error) { + var blockNumber uint64 + if tx == nil { + return 0, fmt.Errorf("tx was nil, nothing to confirm chain %s", chainInfo.ChainName) } - return blockNumber, fmt.Errorf("tx %s reverted, could not decode error reason chain %s", tx.Hash().Hex(), chainInfo.ChainName) - } - return blockNumber, nil - }, - } + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Minute) + defer cancel() + receipt, err := bind.WaitMined(ctx, ec, tx) + if err != nil { + return blockNumber, fmt.Errorf("failed to get confirmed receipt for chain %s: %w", chainInfo.ChainName, err) + } + if receipt == nil { + return blockNumber, fmt.Errorf("receipt was nil for tx %s chain %s", tx.Hash().Hex(), chainInfo.ChainName) + } + blockNumber = receipt.BlockNumber.Uint64() + if receipt.Status == 0 { + errReason, err := deployment.GetErrorReasonFromTx(ec, chainCfg.DeployerKey.From, tx, receipt) + if err == nil && errReason != "" { + return blockNumber, fmt.Errorf("tx %s reverted,error reason: %s chain %s", tx.Hash().Hex(), errReason, chainInfo.ChainName) + } + return blockNumber, fmt.Errorf("tx %s reverted, could not decode error reason chain %s", tx.Hash().Hex(), chainInfo.ChainName) + } + return blockNumber, nil + }, + }) + return nil + }) } - return chains, nil + err := g.Wait() + + syncMap.Range(func(sel, value interface{}) bool { + chains[sel.(uint64)] = value.(deployment.Chain) + return true + }) + return chains, err } diff --git a/deployment/environment/devenv/don.go b/deployment/environment/devenv/don.go index 10685764ac1..50ec3805377 100644 --- a/deployment/environment/devenv/don.go +++ b/deployment/environment/devenv/don.go @@ -8,9 +8,10 @@ import ( "strings" "time" + "golang.org/x/sync/errgroup" + chainsel "github.com/smartcontractkit/chain-selectors" - "github.com/hashicorp/go-multierror" "github.com/rs/zerolog" "github.com/sethvargo/go-retry" @@ -75,22 +76,26 @@ func (don *DON) NodeIds() []string { } func (don *DON) CreateSupportedChains(ctx context.Context, chains []ChainConfig, jd JobDistributor) error { - var err error + g := new(errgroup.Group) for i := range don.Nodes { - node := &don.Nodes[i] - var jdChains []JDChainConfigInput - for _, chain := range chains { - jdChains = append(jdChains, JDChainConfigInput{ - ChainID: chain.ChainID, - ChainType: chain.ChainType, - }) - } - if err1 := node.CreateCCIPOCRSupportedChains(ctx, jdChains, jd); err1 != nil { - err = multierror.Append(err, err1) - } - don.Nodes[i] = *node + i := i + g.Go(func() error { + node := &don.Nodes[i] + var jdChains []JDChainConfigInput + for _, chain := range chains { + jdChains = append(jdChains, JDChainConfigInput{ + ChainID: chain.ChainID, + ChainType: chain.ChainType, + }) + } + if err1 := node.CreateCCIPOCRSupportedChains(ctx, jdChains, jd); err1 != nil { + return err1 + } + don.Nodes[i] = *node + return nil + }) } - return err + return g.Wait() } // NewRegisteredDON creates a DON with the given node info, registers the nodes with the job distributor @@ -375,7 +380,6 @@ func (n *Node) RegisterNodeToJobDistributor(ctx context.Context, jd JobDistribut Name: n.Name, }) // node already registered, fetch it's id - // TODO: check for rpc code = "AlreadyExists" instead if err != nil && strings.Contains(err.Error(), "AlreadyExists") { nodesResponse, err := jd.ListNodes(ctx, &nodev1.ListNodesRequest{ Filter: &nodev1.ListNodesRequest_Filter{ diff --git a/deployment/go.mod b/deployment/go.mod index a8a8272dbc5..f450e6e5b81 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -23,7 +23,6 @@ require ( github.com/go-resty/resty/v2 v2.15.3 github.com/google/uuid v1.6.0 github.com/hashicorp/consul/sdk v0.16.1 - github.com/hashicorp/go-multierror v1.1.1 github.com/mr-tron/base58 v1.2.0 github.com/pelletier/go-toml/v2 v2.2.3 github.com/pkg/errors v0.9.1 @@ -232,7 +231,6 @@ require ( github.com/gtank/merlin v0.1.1 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-envparse v0.1.0 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index bfcb9f6f85c..3c68775a2b0 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -658,8 +658,6 @@ github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyN github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= github.com/hashicorp/consul/sdk v0.16.1/go.mod h1:fSXvwxB2hmh1FMZCNl6PwX0Q/1wdWtHJcZ7Ea5tns0s= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -674,8 +672,6 @@ github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJ github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= diff --git a/integration-tests/load/ccip/ccip_test.go b/integration-tests/load/ccip/ccip_test.go index 44bf4e5689d..f23409334f4 100644 --- a/integration-tests/load/ccip/ccip_test.go +++ b/integration-tests/load/ccip/ccip_test.go @@ -1,26 +1,32 @@ package ccip import ( + "context" + "math/big" "sync" "testing" "time" + "github.com/ethereum/go-ethereum/common/math" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/stretchr/testify/require" - "context" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-testing-framework/wasp" ccipchangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" - crib "github.com/smartcontractkit/chainlink/deployment/environment/crib" + "github.com/smartcontractkit/chainlink/deployment/environment/crib" tc "github.com/smartcontractkit/chainlink/integration-tests/testconfig" ) var ( CommonTestLabels = map[string]string{ - "branch": "ccip_load_crib", - "commit": "ccip_load_crib", + "branch": "ccip_load_1_6", + "commit": "ccip_load_1_6", } wg sync.WaitGroup ) @@ -39,19 +45,15 @@ const simChainTestKey = "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7 // Stop the chains, cleanup the environment func TestCCIPLoad_RPS(t *testing.T) { // comment out when executing the test - t.Skip("Skipping test as this test should not be auto triggered") + // t.Skip("Skipping test as this test should not be auto triggered") lggr := logger.Test(t) + ctx, cancel := context.WithCancel(tests.Context(t)) + defer cancel() // get user defined configurations config, err := tc.GetConfig([]string{"Load"}, tc.CCIP) require.NoError(t, err) - lggr.Infof("loaded ccip test config: %+v", config.CCIP.Load) userOverrides := config.CCIP.Load - userOverrides.Validate(t) - - // apply user defined test duration - ctx, cancel := context.WithTimeout(context.Background(), userOverrides.GetTestDuration()) - defer cancel() // generate environment from crib-produced files cribEnv := crib.NewDevspaceEnvFromStateDir(*userOverrides.CribEnvDirectory) @@ -60,11 +62,12 @@ func TestCCIPLoad_RPS(t *testing.T) { env, err := crib.NewDeployEnvironmentFromCribOutput(lggr, cribDeployOutput) require.NoError(t, err) require.NotNil(t, env) + userOverrides.Validate(t, env) - // initialize loki using endpoint from user defined env vars - loki, err := wasp.NewLokiClient(wasp.NewLokiConfig(userOverrides.LokiEndpoint, nil, nil, nil)) + // initialize additional accounts on other chains + transmitKeys, err := fundAdditionalKeys(lggr, *env, env.AllChainSelectors()[:*userOverrides.NumDestinationChains]) require.NoError(t, err) - defer loki.StopNow() + // todo: defer returning funds // Keep track of the block number for each chain so that event subscription can be done from that block. startBlocks := make(map[uint64]*uint64) @@ -72,20 +75,59 @@ func TestCCIPLoad_RPS(t *testing.T) { require.NoError(t, err) errChan := make(chan error) + defer close(errChan) finalSeqNrCommitChannels := make(map[uint64]chan finalSeqNrReport) finalSeqNrExecChannels := make(map[uint64]chan finalSeqNrReport) + mm := NewMetricsManager(t, env.Logger) + go mm.Start(ctx) + defer mm.Stop() + // gunMap holds a destinationGun for every enabled destination chain gunMap := make(map[uint64]*DestinationGun) p := wasp.NewProfile() // Only create a destination gun if we have decided to send traffic to this chain - for _, cs := range *userOverrides.EnabledDestionationChains { + for ind := range *userOverrides.NumDestinationChains { + cs := env.AllChainSelectors()[ind] latesthdr, err := env.Chains[cs].Client.HeaderByNumber(ctx, nil) require.NoError(t, err) block := latesthdr.Number.Uint64() startBlocks[cs] = &block - gunMap[cs], err = NewDestinationGun(env.Logger, cs, *env, state.Chains[cs].Receiver.Address(), userOverrides, loki) + messageKeys := make(map[uint64]*bind.TransactOpts) + other := env.AllChainSelectorsExcluding([]uint64{cs}) + var mu sync.Mutex + var wg2 sync.WaitGroup + wg2.Add(len(other)) + for _, src := range other { + go func(src uint64) { + defer wg2.Done() + mu.Lock() + messageKeys[src] = transmitKeys[src][ind] + mu.Unlock() + err := prepareAccountToSendLink( + t, + state, + *env, + src, + messageKeys[src], + ) + require.NoError(t, err) + }(src) + } + wg2.Wait() + + gunMap[cs], err = NewDestinationGun( + env.Logger, + cs, + *env, + &state, + state.Chains[cs].Receiver.Address(), + userOverrides, + messageKeys, + ind, + mm.InputChan, + ) if err != nil { lggr.Errorw("Failed to initialize DestinationGun for", "chainSelector", cs, "error", err) t.Fatal(err) @@ -96,30 +138,30 @@ func TestCCIPLoad_RPS(t *testing.T) { finalSeqNrExecChannels[cs] = make(chan finalSeqNrReport) wg.Add(2) - go subscribeDeferredCommitEvents( + go subscribeCommitEvents( ctx, lggr, state.Chains[cs].OffRamp, otherChains, &block, - loki, cs, env.Chains[cs].Client, finalSeqNrCommitChannels[cs], errChan, - &wg) + &wg, + mm.InputChan) go subscribeExecutionEvents( ctx, lggr, state.Chains[cs].OffRamp, otherChains, &block, - loki, cs, env.Chains[cs].Client, finalSeqNrExecChannels[cs], errChan, - &wg) + &wg, + mm.InputChan) } requestFrequency, err := time.ParseDuration(*userOverrides.RequestFrequency) @@ -141,7 +183,7 @@ func TestCCIPLoad_RPS(t *testing.T) { // so if there are 3 generators, it would be 3 requests per 5 seconds over the network Gun: gun, Labels: CommonTestLabels, - LokiConfig: wasp.NewLokiConfig(config.CCIP.Load.LokiEndpoint, nil, nil, nil), + LokiConfig: wasp.NewEnvLokiConfig(), // use the same loki client using `NewLokiClient` with the same config for sending events })) } @@ -171,9 +213,54 @@ func TestCCIPLoad_RPS(t *testing.T) { } } + // after load is finished, wait for a "timeout duration" before considering that messages are timed out + timeout := userOverrides.GetTimeoutDuration() + if timeout != 0 { + testTimer := time.NewTimer(timeout) + go func() { + <-testTimer.C + mm.Stop() + cancel() + }() + } + wg.Wait() - lggr.Infow("finished wait group") - for err := range errChan { - require.NoError(t, err) + lggr.Infow("closed event subscribers") +} + +func prepareAccountToSendLink( + t *testing.T, + state ccipchangeset.CCIPOnChainState, + e deployment.Environment, + src uint64, + srcAccount *bind.TransactOpts) error { + lggr := logger.Test(t) + srcDeployer := e.Chains[src].DeployerKey + lggr.Infow("Setting up link token", "src", src) + srcLink := state.Chains[src].LinkToken + + lggr.Infow("Granting mint and burn roles") + tx, err := srcLink.GrantMintAndBurnRoles(srcDeployer, srcAccount.From) + _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) + require.NoError(t, err) + + lggr.Infow("Minting transfer amounts") + //-------------------------------------------------------------------------------------------- + tx, err = srcLink.Mint( + srcAccount, + srcAccount.From, + big.NewInt(20_000), + ) + _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) + if err != nil { + return err } + + //-------------------------------------------------------------------------------------------- + lggr.Infow("Approving routers") + // Approve the router to spend the tokens and confirm the tx's + // To prevent having to approve the router for every transfer, we approve a sufficiently large amount + tx, err = srcLink.Approve(srcAccount, state.Chains[src].Router.Address(), math.MaxBig256) + _, err = deployment.ConfirmIfNoError(e.Chains[src], tx, err) + return err } diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index 1f3fe9c8bfa..851a306d2ac 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -4,9 +4,9 @@ import ( "context" "errors" "fmt" + "math" "math/big" "math/rand" - "time" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" @@ -34,35 +34,50 @@ type SeqNumRange struct { type DestinationGun struct { l logger.Logger env deployment.Environment + state *ccipchangeset.CCIPOnChainState seqNums map[testhelpers.SourceDestPair]SeqNumRange roundNum *atomic.Int32 chainSelector uint64 receiver common.Address testConfig *ccip.LoadConfig - loki *wasp.LokiClient + messageKeys map[uint64]*bind.TransactOpts + chainOffset int + metricPipe chan messageData } -func NewDestinationGun(l logger.Logger, chainSelector uint64, env deployment.Environment, receiver common.Address, overrides *ccip.LoadConfig, loki *wasp.LokiClient) (*DestinationGun, error) { +func NewDestinationGun( + l logger.Logger, + chainSelector uint64, + env deployment.Environment, + state *ccipchangeset.CCIPOnChainState, + receiver common.Address, + overrides *ccip.LoadConfig, + messageKeys map[uint64]*bind.TransactOpts, + chainOffset int, + metricPipe chan messageData, +) (*DestinationGun, error) { seqNums := make(map[testhelpers.SourceDestPair]SeqNumRange) for _, cs := range env.AllChainSelectorsExcluding([]uint64{chainSelector}) { - // query for the actual sequence number seqNums[testhelpers.SourceDestPair{ SourceChainSelector: cs, DestChainSelector: chainSelector, }] = SeqNumRange{ - Start: atomic.NewUint64(0), + Start: atomic.NewUint64(math.MaxUint64), End: atomic.NewUint64(0), } } dg := DestinationGun{ l: l, env: env, + state: state, seqNums: seqNums, roundNum: &atomic.Int32{}, chainSelector: chainSelector, receiver: receiver, testConfig: overrides, - loki: loki, + messageKeys: messageKeys, + chainOffset: chainOffset, + metricPipe: metricPipe, } err := dg.Validate() @@ -104,10 +119,7 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { return &wasp.Response{Error: err.Error(), Group: waspGroup, Failed: true} } - lokiLabels, err := setLokiLabels(src, m.chainSelector) - if err != nil { - m.l.Errorw("Failed setting loki labels", "error", err) - } + acc := m.messageKeys[src] csPair := testhelpers.SourceDestPair{ SourceChainSelector: src, @@ -116,7 +128,7 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { r := state.Chains[src].Router - msg, err := m.GetMessage() + msg, err := m.GetMessage(src) if err != nil { return &wasp.Response{Error: err.Error(), Group: waspGroup, Failed: true} } @@ -132,8 +144,8 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { return &wasp.Response{Error: err.Error(), Group: waspGroup, Failed: true} } if msg.FeeToken == common.HexToAddress("0x0") { - m.env.Chains[src].DeployerKey.Value = fee - defer func() { m.env.Chains[src].DeployerKey.Value = nil }() + acc.Value = big.NewInt(0).Mul(big.NewInt(6), fee) + defer func() { acc.Value = nil }() } m.l.Debugw("sending message ", "srcChain", src, @@ -142,7 +154,7 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { "fee", fee, "msg", msg) tx, err := r.CcipSend( - m.env.Chains[src].DeployerKey, + acc, m.chainSelector, msg) if err != nil { @@ -180,19 +192,29 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { "destChain", m.chainSelector, "sequence number", it.Event.SequenceNumber) - SendMetricsToLoki(m.l, m.loki, lokiLabels, &LokiMetric{ - EventType: transmitted, - Timestamp: time.Now(), - SequenceNumber: it.Event.SequenceNumber, - }) + // push metric to metric manager for eventual distribution to loki + blockNum = it.Event.Raw.BlockNumber + header, err := m.env.Chains[src].Client.HeaderByNumber(m.env.GetContext(), new(big.Int).SetUint64(blockNum)) + if err != nil { + return &wasp.Response{Error: "Could not get timestamp of block number", Group: waspGroup, Failed: true} + } + m.metricPipe <- messageData{ + eventType: transmitted, + srcDstSeqNum: srcDstSeqNum{ + src: src, + dst: m.chainSelector, + seqNum: it.Event.SequenceNumber, + }, + timestamp: header.Time, + round: int(requestedRound), + } - // if this is the first time we are sending a message, set the start sequence number - // if we ran into a concurrency issue, store the lowest sequence number - if it.Event.SequenceNumber < m.seqNums[csPair].Start.Load() || m.seqNums[csPair].End.Load() == 0 { + // always store the lowest seen number as the start seq num + if it.Event.SequenceNumber < m.seqNums[csPair].Start.Load() { m.seqNums[csPair].Start.Store(it.Event.SequenceNumber) } - // only store the greatest sequence number we have seen as the maximum + // always store the greatest sequence number we have seen as the maximum if it.Event.SequenceNumber > m.seqNums[csPair].End.Load() { m.seqNums[csPair].End.Store(it.Event.SequenceNumber) } @@ -208,12 +230,12 @@ func (m *DestinationGun) MustSourceChain() (uint64, error) { if len(otherCS) == 0 { return 0, errors.New("no other chains to send from") } - index := int(m.roundNum.Load()) % len(otherCS) + index := (int(m.roundNum.Load()) + m.chainOffset) % len(otherCS) return otherCS[index], nil } // GetMessage will return the message to be sent while considering expected load of different messages -func (m *DestinationGun) GetMessage() (router.ClientEVM2AnyMessage, error) { +func (m *DestinationGun) GetMessage(src uint64) (router.ClientEVM2AnyMessage, error) { rcv, err := utils.ABIEncode(`[{"type":"address"}]`, m.receiver) if err != nil { m.l.Error("Error encoding receiver address") @@ -232,8 +254,8 @@ func (m *DestinationGun) GetMessage() (router.ClientEVM2AnyMessage, error) { Receiver: rcv, TokenAmounts: []router.ClientEVMTokenAmount{ { - Token: common.HexToAddress("0x0"), - Amount: big.NewInt(100), + Token: m.state.Chains[src].LinkToken.Address(), + Amount: big.NewInt(1), }, }, Data: common.Hex2Bytes("0xabcdefabcdef"), @@ -245,8 +267,8 @@ func (m *DestinationGun) GetMessage() (router.ClientEVM2AnyMessage, error) { Data: common.Hex2Bytes("message with token"), TokenAmounts: []router.ClientEVMTokenAmount{ { - Token: common.HexToAddress("0x0"), - Amount: big.NewInt(100), + Token: m.state.Chains[src].LinkToken.Address(), + Amount: big.NewInt(1), }, }, FeeToken: common.HexToAddress("0x0"), diff --git a/integration-tests/load/ccip/helpers.go b/integration-tests/load/ccip/helpers.go index 6db3b1d0fa1..b2ec7fadc7e 100644 --- a/integration-tests/load/ccip/helpers.go +++ b/integration-tests/load/ccip/helpers.go @@ -3,18 +3,27 @@ package ccip import ( "context" "errors" - "math/big" - "strconv" + "fmt" + "math" + "slices" "sync" "time" + "golang.org/x/sync/errgroup" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + + "github.com/smartcontractkit/chainlink-testing-framework/seth" + "github.com/smartcontractkit/chainlink/deployment/environment/crib" + "github.com/ethereum/go-ethereum/accounts/abi/bind" chainselectors "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "math/big" + "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-testing-framework/wasp" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" @@ -24,42 +33,18 @@ const ( transmitted = iota committed executed - LokiLoadLabel = "ccip_load_test" - ErrLokiClient = "failed to create Loki client for monitoring" - ErrLokiPush = "failed to push metrics to Loki" tickerDuration = 30 * time.Second ) +var ( + fundingAmount = new(big.Int).Mul(deployment.UBigInt(10), deployment.UBigInt(1e18)) // 100 eth +) + // todo: Have a different struct for commit/exec? type LokiMetric struct { - EventType int `json:"event_type"` - Timestamp time.Time `json:"timestamp"` - GasUsed uint64 `json:"gas_used"` - SequenceNumber uint64 `json:"sequence_number"` -} - -func SendMetricsToLoki(l logger.Logger, lc *wasp.LokiClient, updatedLabels map[string]string, metrics *LokiMetric) { - if err := lc.HandleStruct(wasp.LabelsMapToModel(updatedLabels), time.Now(), metrics); err != nil { - l.Error(ErrLokiPush) - } -} - -func setLokiLabels(src, dst uint64) (map[string]string, error) { - srcChainID, err := chainselectors.GetChainIDFromSelector(src) - if err != nil { - return nil, err - } - dstChainID, err := chainselectors.GetChainIDFromSelector(dst) - if err != nil { - return nil, err - } - return map[string]string{ - "sourceEvmChainId": srcChainID, - "sourceSelector": strconv.FormatUint(src, 10), - "destEvmChainId": dstChainID, - "destinationSelector": strconv.FormatUint(dst, 10), - "testType": LokiLoadLabel, - }, nil + SequenceNumber uint64 `json:"sequence_number"` + CommitDuration uint64 `json:"commit_duration"` + ExecDuration uint64 `json:"exec_duration"` } type finalSeqNrReport struct { @@ -67,24 +52,23 @@ type finalSeqNrReport struct { expectedSeqNrRange ccipocr3.SeqNumRange } -func subscribeDeferredCommitEvents( +func subscribeCommitEvents( ctx context.Context, lggr logger.Logger, offRamp offramp.OffRampInterface, srcChains []uint64, startBlock *uint64, - loki *wasp.LokiClient, chainSelector uint64, client deployment.OnchainClient, finalSeqNrs chan finalSeqNrReport, errChan chan error, wg *sync.WaitGroup, + metricPipe chan messageData, ) { defer wg.Done() lggr.Infow("starting commit event subscriber for ", - "destChainSelector", chainSelector, - "offRamp", offRamp.Address().String(), + "destChain", chainSelector, "startblock", startBlock, ) seenMessages := make(map[uint64][]uint64) @@ -97,8 +81,9 @@ func subscribeDeferredCommitEvents( } sink := make(chan *offramp.OffRampCommitReportAccepted) + // todo: add event.Resubscriber if we move to unreliable rpcs subscription, err := offRamp.WatchCommitReportAccepted(&bind.WatchOpts{ - Context: context.Background(), + Context: ctx, Start: startBlock, }, sink) if err != nil { @@ -119,47 +104,51 @@ func subscribeDeferredCommitEvents( for _, mr := range append(report.BlessedMerkleRoots, report.UnblessedMerkleRoots...) { lggr.Infow("Received commit report ", "sourceChain", mr.SourceChainSelector, - "offRamp", offRamp.Address().String(), + "destChain", chainSelector, "minSeqNr", mr.MinSeqNr, "maxSeqNr", mr.MaxSeqNr) - lokiLabels, err := setLokiLabels(mr.SourceChainSelector, chainSelector) - if err != nil { - errChan <- err - // don't return here, we still want to push metrics to loki - } - // push metrics to loki here + // push metrics to state manager for eventual distribution to loki for i := mr.MinSeqNr; i <= mr.MaxSeqNr; i++ { blockNum := report.Raw.BlockNumber header, err := client.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNum)) if err != nil { errChan <- err } - timestamp := time.Unix(int64(header.Time), 0) //nolint:gosec // disable G115 - SendMetricsToLoki(lggr, loki, lokiLabels, &LokiMetric{ - EventType: committed, - Timestamp: timestamp, - SequenceNumber: i, - }) + data := messageData{ + eventType: committed, + srcDstSeqNum: srcDstSeqNum{ + src: mr.SourceChainSelector, + dst: chainSelector, + seqNum: i, + }, + timestamp: header.Time, + } + metricPipe <- data seenMessages[mr.SourceChainSelector] = append(seenMessages[mr.SourceChainSelector], i) } } } case <-ctx.Done(): lggr.Errorw("timed out waiting for commit report", - "offRamp", offRamp.Address().String(), + "destChain", chainSelector, "sourceChains", srcChains, "expectedSeqNumbers", expectedRange) errChan <- errors.New("timed out waiting for commit report") return case finalSeqNrUpdate, ok := <-finalSeqNrs: - if ok { // only add to range if channel is still open + if finalSeqNrUpdate.expectedSeqNrRange.Start() == math.MaxUint64 { + delete(completedSrcChains, finalSeqNrUpdate.sourceChainSelector) + delete(seenMessages, finalSeqNrUpdate.sourceChainSelector) + } else if ok { + // only add to range if channel is still open expectedRange[finalSeqNrUpdate.sourceChainSelector] = finalSeqNrUpdate.expectedSeqNrRange } case <-ticker.C: lggr.Infow("ticking, checking committed events", + "destChain", chainSelector, "seenMessages", seenMessages, "expectedRange", expectedRange, "completedSrcChains", completedSrcChains) @@ -168,12 +157,13 @@ func subscribeDeferredCommitEvents( if !completedSrcChains[srcChain] { // else, check if all expected sequence numbers have been seen // todo: We might need to modify if there are other non-load test txns on network - if len(seenMessages[srcChain]) >= seqNumRange.Length() { + if len(seenMessages[srcChain]) >= seqNumRange.Length() && slices.Contains(seenMessages[srcChain], uint64(seqNumRange.End())) { completedSrcChains[srcChain] = true + delete(expectedRange, srcChain) + delete(seenMessages, srcChain) lggr.Infow("committed all sequence numbers for ", "sourceChain", srcChain, - "destChain", chainSelector, - "seqNumRange", seqNumRange) + "destChain", chainSelector) } } } @@ -187,7 +177,7 @@ func subscribeDeferredCommitEvents( } } if allComplete { - lggr.Infow("all chains have committed all expected sequence numbers") + lggr.Infof("received commits from expected source chains for all expected sequence numbers to chainSelector %d", chainSelector) return } } @@ -200,19 +190,17 @@ func subscribeExecutionEvents( offRamp offramp.OffRampInterface, srcChains []uint64, startBlock *uint64, - loki *wasp.LokiClient, chainSelector uint64, client deployment.OnchainClient, finalSeqNrs chan finalSeqNrReport, errChan chan error, wg *sync.WaitGroup, + metricPipe chan messageData, ) { defer wg.Done() - defer close(errChan) lggr.Infow("starting execution event subscriber for ", - "destChainSelector", chainSelector, - "offRamp", offRamp.Address().String(), + "destChain", chainSelector, "startblock", startBlock, ) seenMessages := make(map[uint64][]uint64) @@ -224,10 +212,11 @@ func subscribeExecutionEvents( } sink := make(chan *offramp.OffRampExecutionStateChanged) + // todo: add event.Resubscriber if we move to unreliable rpcs subscription, err := offRamp.WatchExecutionStateChanged(&bind.WatchOpts{ - Context: context.Background(), + Context: ctx, Start: startBlock, - }, sink, srcChains, nil, nil) + }, sink, nil, nil, nil) if err != nil { errChan <- err return @@ -244,31 +233,32 @@ func subscribeExecutionEvents( errChan <- subErr return case event := <-sink: - lggr.Debugw("received execution event", - "event", event) - lokiLabels, err := setLokiLabels(event.SourceChainSelector, chainSelector) - if err != nil { - errChan <- err - // don't return here, we still want to push metrics to loki - } + lggr.Debugw("received execution event for", + "destChain", chainSelector, + "sourceChain", event.SourceChainSelector, + "sequenceNumber", event.SequenceNumber, + "blockNumber", event.Raw.BlockNumber) // push metrics to loki here blockNum := event.Raw.BlockNumber header, err := client.HeaderByNumber(ctx, new(big.Int).SetUint64(blockNum)) if err != nil { errChan <- err } - timestamp := time.Unix(int64(header.Time), 0) //nolint:gosec // disable G115 - SendMetricsToLoki(lggr, loki, lokiLabels, &LokiMetric{ - EventType: executed, - Timestamp: timestamp, - GasUsed: event.GasUsed.Uint64(), - SequenceNumber: event.SequenceNumber, - }) + data := messageData{ + eventType: executed, + srcDstSeqNum: srcDstSeqNum{ + src: event.SourceChainSelector, + dst: chainSelector, + seqNum: event.SequenceNumber, + }, + timestamp: header.Time, + } + metricPipe <- data seenMessages[event.SourceChainSelector] = append(seenMessages[event.SourceChainSelector], event.SequenceNumber) case <-ctx.Done(): lggr.Errorw("timed out waiting for execution event", - "offRamp", offRamp.Address().String(), + "destChain", chainSelector, "sourceChains", srcChains, "expectedSeqNumbers", expectedRange, "seenMessages", seenMessages, @@ -277,10 +267,16 @@ func subscribeExecutionEvents( return case finalSeqNrUpdate := <-finalSeqNrs: - expectedRange[finalSeqNrUpdate.sourceChainSelector] = finalSeqNrUpdate.expectedSeqNrRange + if finalSeqNrUpdate.expectedSeqNrRange.Start() == math.MaxUint64 { + delete(completedSrcChains, finalSeqNrUpdate.sourceChainSelector) + delete(seenMessages, finalSeqNrUpdate.sourceChainSelector) + } else { + expectedRange[finalSeqNrUpdate.sourceChainSelector] = finalSeqNrUpdate.expectedSeqNrRange + } case <-ticker.C: lggr.Infow("ticking, checking executed events", + "destChain", chainSelector, "seenMessages", seenMessages, "expectedRange", expectedRange, "completedSrcChains", completedSrcChains) @@ -289,11 +285,11 @@ func subscribeExecutionEvents( // if this chain has already been marked as completed, skip if !completedSrcChains[srcChain] { // else, check if all expected sequence numbers have been seen - if len(seenMessages[srcChain]) >= seqNumRange.Length() { + if len(seenMessages[srcChain]) >= seqNumRange.Length() && slices.Contains(seenMessages[srcChain], uint64(seqNumRange.End())) { completedSrcChains[srcChain] = true lggr.Infow("executed all sequence numbers for ", - "sourceChain", srcChain, "destChain", chainSelector, + "sourceChain", srcChain, "seqNumRange", seqNumRange) } } @@ -307,10 +303,55 @@ func subscribeExecutionEvents( } } if allComplete { - lggr.Infow("all chains have executed all expected sequence numbers", - "expectedSeqNumbers", expectedRange) + lggr.Infow("all messages have been executed for all expected sequence numbers", + "destChain", chainSelector) return } } } } + +// this function will create len(targetChains) new addresses, and send funds to them on every targetChain +func fundAdditionalKeys(lggr logger.Logger, e deployment.Environment, destChains []uint64) (map[uint64][]*bind.TransactOpts, error) { + deployerMap := make(map[uint64][]*bind.TransactOpts) + addressMap := make(map[uint64][]common.Address) + numAccounts := len(destChains) + for chain := range e.Chains { + deployerMap[chain] = make([]*bind.TransactOpts, 0, numAccounts) + addressMap[chain] = make([]common.Address, 0, numAccounts) + for range numAccounts { + addr, pk, err := seth.NewAddress() + if err != nil { + return nil, fmt.Errorf("failed to create new address: %w", err) + } + pvtKey, err := crypto.HexToECDSA(pk) + if err != nil { + return nil, fmt.Errorf("failed to convert private key to ECDSA: %w", err) + } + chainID, err := chainselectors.ChainIdFromSelector(chain) + if err != nil { + return nil, fmt.Errorf("could not get chain id from selector: %w", err) + } + + deployer, err := bind.NewKeyedTransactorWithChainID(pvtKey, new(big.Int).SetUint64(chainID)) + if err != nil { + return nil, fmt.Errorf("failed to create transactor: %w", err) + } + deployerMap[chain] = append(deployerMap[chain], deployer) + addressMap[chain] = append(addressMap[chain], common.HexToAddress(addr)) + } + } + + g := new(errgroup.Group) + for sel, addresses := range addressMap { + sel, addresses := sel, addresses + g.Go(func() error { + return crib.SendFundsToAccounts(e.GetContext(), lggr, e.Chains[sel], addresses, fundingAmount, sel) + }) + } + + if err := g.Wait(); err != nil { + return nil, err + } + return deployerMap, nil +} diff --git a/integration-tests/load/ccip/metrics.go b/integration-tests/load/ccip/metrics.go new file mode 100644 index 00000000000..b913594e92c --- /dev/null +++ b/integration-tests/load/ccip/metrics.go @@ -0,0 +1,151 @@ +package ccip + +import ( + "context" + "strconv" + + chainselectors "github.com/smartcontractkit/chain-selectors" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-testing-framework/wasp" + + "testing" + "time" +) + +const ( + LokiLoadLabel = "ccipv2_load_test" + ErrLokiPush = "failed to push metrics to Loki" +) + +// MetricsManager is used for maintaining state of different sequence numbers +// Once we've received all expected timestamps, it pushes the metrics to Loki +type MetricManager struct { + lggr logger.Logger + loki *wasp.LokiClient + InputChan chan messageData + state map[srcDstSeqNum]metricState +} + +type metricState struct { + timestamps [3]uint64 + round int +} + +type srcDstSeqNum struct { + src uint64 + dst uint64 + seqNum uint64 +} + +type messageData struct { + eventType int + srcDstSeqNum + timestamp uint64 + round int +} + +func NewMetricsManager(t *testing.T, l logger.Logger) *MetricManager { + // initialize loki using endpoint from user defined env vars + loki, err := wasp.NewLokiClient(wasp.NewEnvLokiConfig()) + require.NoError(t, err) + + return &MetricManager{ + lggr: l, + loki: loki, + InputChan: make(chan messageData), + state: make(map[srcDstSeqNum]metricState), + } +} + +func (mm *MetricManager) Stop() { + close(mm.InputChan) +} + +func (mm *MetricManager) Start(ctx context.Context) { + for { + select { + case <-ctx.Done(): + mm.lggr.Infow("received timeout, pushing remaining state to loki") + // any remaining data in state should be pushed to loki as incomplete + for srcDstSeqNum, metricState := range mm.state { + commitDuration, execDuration := uint64(0), uint64(0) + timestamps := metricState.timestamps + if timestamps[committed] != 0 && timestamps[transmitted] != 0 { + commitDuration = timestamps[committed] - timestamps[transmitted] + } + if timestamps[executed] != 0 && timestamps[committed] != 0 { + execDuration = timestamps[executed] - timestamps[committed] + } + + lokiLabels, err := setLokiLabels(srcDstSeqNum.src, srcDstSeqNum.dst, metricState.round) + if err != nil { + mm.lggr.Error("error setting loki labels", "error", err) + // don't return here, we still want to push metrics to loki + } + SendMetricsToLoki(mm.lggr, mm.loki, lokiLabels, &LokiMetric{ + ExecDuration: execDuration, + CommitDuration: commitDuration, + SequenceNumber: srcDstSeqNum.seqNum, + }) + } + close(mm.InputChan) + mm.loki.Stop() + return + case data := <-mm.InputChan: + if _, ok := mm.state[data.srcDstSeqNum]; !ok { + mm.state[data.srcDstSeqNum] = metricState{ + timestamps: [3]uint64{0, 0, 0}, + } + } + + state := mm.state[data.srcDstSeqNum] + state.timestamps[data.eventType] = data.timestamp + if data.eventType == transmitted && data.round != -1 { + state.round = data.round + } + mm.state[data.srcDstSeqNum] = state + if data.eventType == executed { + mm.lggr.Infow("new state for received seqNum is ", "dst", data.dst, "seqNum", data.seqNum, "round", state.round, "timestamps", state.timestamps) + } + // we have all data needed to push to Loki + if state.timestamps[transmitted] != 0 && state.timestamps[committed] != 0 && state.timestamps[executed] != 0 { + lokiLabels, err := setLokiLabels(data.src, data.dst, mm.state[data.srcDstSeqNum].round) + if err != nil { + mm.lggr.Error("error setting loki labels", "error", err) + } + SendMetricsToLoki(mm.lggr, mm.loki, lokiLabels, &LokiMetric{ + ExecDuration: state.timestamps[executed] - state.timestamps[committed], + CommitDuration: state.timestamps[committed] - state.timestamps[executed], + SequenceNumber: data.seqNum, + }) + + delete(mm.state, data.srcDstSeqNum) + } + } + } +} + +func SendMetricsToLoki(l logger.Logger, lc *wasp.LokiClient, updatedLabels map[string]string, metrics *LokiMetric) { + if err := lc.HandleStruct(wasp.LabelsMapToModel(updatedLabels), time.Now(), metrics); err != nil { + l.Error(ErrLokiPush) + } +} + +func setLokiLabels(src, dst uint64, round int) (map[string]string, error) { + srcChainID, err := chainselectors.GetChainIDFromSelector(src) + if err != nil { + return nil, err + } + dstChainID, err := chainselectors.GetChainIDFromSelector(dst) + if err != nil { + return nil, err + } + return map[string]string{ + "sourceEvmChainId": srcChainID, + "destEvmChainId": dstChainID, + "roundNum": strconv.Itoa(round), + "testType": LokiLoadLabel, + }, nil +} diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index bf547618da4..7b155c6bce9 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -40,6 +40,7 @@ require ( go.uber.org/atomic v1.11.0 go.uber.org/ratelimit v0.3.1 golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c + golang.org/x/sync v0.10.0 ) require ( @@ -506,7 +507,6 @@ require ( golang.org/x/mod v0.22.0 // indirect golang.org/x/net v0.34.0 // indirect golang.org/x/oauth2 v0.23.0 // indirect - golang.org/x/sync v0.10.0 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/term v0.28.0 // indirect golang.org/x/text v0.21.0 // indirect diff --git a/integration-tests/testconfig/ccip/ccip.toml b/integration-tests/testconfig/ccip/ccip.toml index 13188e6a134..bf5e64127d4 100644 --- a/integration-tests/testconfig/ccip/ccip.toml +++ b/integration-tests/testconfig/ccip/ccip.toml @@ -242,16 +242,14 @@ addresses_to_fund = [ ephemeral_addresses_number = 0 [Load.CCIP.Load] -# replace this with the loki endpoint of the crib stack -LokiEndpoint = "http://loki.localhost/loki/api/v1/push" -# MessageTypeWeights corresponds with [data only, token only, message with data] -MessageTypeWeights = [100,0,0] +# MessageTypeWeights corresponds with [data only, token only, message with token] +#MessageTypeWeights = [100,0,0] +MessageTypeWeights = [10,45,45] # each destination chain will receive 1 incoming request per RequestFrequency for the duration of LoadDuration RequestFrequency = "10s" -LoadDuration = "1m" -# test duration -TestDuration = "5h" +LoadDuration = "30s" # destination chain selectors to send messages to -EnabledDestionationChains = [3379446385462418246] +NumDestinationChains = 2 # Directory where we receive environment configuration from crib -CribEnvDirectory = "/Users/austin.wang/ccip-core/repos/crib/deployments/ccip-v2/.tmp" \ No newline at end of file +CribEnvDirectory = "../../../../crib/deployments/ccip-v2/.tmp" +TimeoutDuration = "1h" \ No newline at end of file diff --git a/integration-tests/testconfig/ccip/load.go b/integration-tests/testconfig/ccip/load.go index cfb013dcfb5..ddea267e8f0 100644 --- a/integration-tests/testconfig/ccip/load.go +++ b/integration-tests/testconfig/ccip/load.go @@ -4,33 +4,35 @@ import ( "testing" "time" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/stretchr/testify/require" ) type LoadConfig struct { - LoadDuration *string - LokiEndpoint *string - MessageTypeWeights *[]int - RequestFrequency *string - EnabledDestionationChains *[]uint64 - CribEnvDirectory *string - TestDuration *string + LoadDuration *string + MessageTypeWeights *[]int + RequestFrequency *string + CribEnvDirectory *string + NumDestinationChains *int + TimeoutDuration *string } -func (l *LoadConfig) Validate(t *testing.T) { - ld, err := time.ParseDuration(*l.LoadDuration) +func (l *LoadConfig) Validate(t *testing.T, e *deployment.Environment) { + _, err := time.ParseDuration(*l.LoadDuration) require.NoError(t, err, "LoadDuration must be a valid duration") - td, err := time.ParseDuration(*l.TestDuration) - require.NoError(t, err, "TestDuration must be a valid duration") - - require.GreaterOrEqual(t, td, ld, "TestDuration must be greater than or equal to LoadDuration") + _, err = time.ParseDuration(*l.TimeoutDuration) + require.NoError(t, err, "TimeoutDuration must be a valid duration") agg := 0 for _, w := range *l.MessageTypeWeights { agg += w } require.Equal(t, 100, agg, "Sum of MessageTypeWeights must be 100") + + require.GreaterOrEqual(t, *l.NumDestinationChains, 1, "NumDestinationChains must be greater than or equal to 1") + require.GreaterOrEqual(t, len(e.Chains), *l.NumDestinationChains, "NumDestinationChains must be less than or equal to the number of chains in the environment") } func (l *LoadConfig) GetLoadDuration() time.Duration { @@ -38,7 +40,10 @@ func (l *LoadConfig) GetLoadDuration() time.Duration { return ld } -func (l *LoadConfig) GetTestDuration() time.Duration { - td, _ := time.ParseDuration(*l.TestDuration) - return td +func (l *LoadConfig) GetTimeoutDuration() time.Duration { + ld, _ := time.ParseDuration(*l.TimeoutDuration) + if ld == 0 { + return 30 * time.Minute + } + return ld } From f84bbe0a67f410578b14ea65ea2f488e045f14a7 Mon Sep 17 00:00:00 2001 From: krehermann <16602512+krehermann@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:11:53 -0700 Subject: [PATCH 40/83] fix(cre-300): allow state view missing evm (#16339) * fix(cre-300): allow state view missing evm * linter, test --- deployment/common/view/nops.go | 8 ++- deployment/environment.go | 37 ++++++++-- deployment/environment_test.go | 123 +++++++++++++++++++++++++++++++++ 3 files changed, 159 insertions(+), 9 deletions(-) diff --git a/deployment/common/view/nops.go b/deployment/common/view/nops.go index 74f011dfe44..43053ec0508 100644 --- a/deployment/common/view/nops.go +++ b/deployment/common/view/nops.go @@ -33,10 +33,12 @@ type OCRKeyView struct { KeyBundleID string `json:"keyBundleID"` } -func GenerateNopsView(nodeIds []string, oc deployment.OffchainClient) (map[string]NopView, error) { +func GenerateNopsView(nodeIDs []string, oc deployment.OffchainClient) (map[string]NopView, error) { nv := make(map[string]NopView) - nodes, err := deployment.NodeInfo(nodeIds, oc) - if err != nil { + nodes, err := deployment.NodeInfo(nodeIDs, oc) + if errors.Is(err, deployment.ErrMissingNodeMetadata) { + fmt.Printf("WARNING: Missing node metadata:\n%s", err.Error()) + } else if err != nil { return nv, err } for _, node := range nodes { diff --git a/deployment/environment.go b/deployment/environment.go index b0588bd66a5..2ef75c6154a 100644 --- a/deployment/environment.go +++ b/deployment/environment.go @@ -377,8 +377,16 @@ type NodeChainConfigsLister interface { ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNodeChainConfigsRequest, opts ...grpc.CallOption) (*nodev1.ListNodeChainConfigsResponse, error) } +var ErrMissingNodeMetadata = errors.New("missing node metadata") + // Gathers all the node info through JD required to be able to set // OCR config for example. nodeIDs can be JD IDs or PeerIDs +// +// It is optimistic execution and will attempt to return an element for all +// nodes in the input list that exists in JD +// +// If some subset of nodes cannot have all their metadata returned, the error with be +// [ErrMissingNodeMetadata] and the caller can choose to handle or continue. func NodeInfo(nodeIDs []string, oc NodeChainConfigsLister) (Nodes, error) { if len(nodeIDs) == 0 { return nil, nil @@ -412,6 +420,8 @@ func NodeInfo(nodeIDs []string, oc NodeChainConfigsLister) (Nodes, error) { } var nodes []Node + onlyMissingEVMChain := true + var xerr error for _, node := range nodesFromJD.GetNodes() { // TODO: Filter should accept multiple nodes nodeChainConfigs, err := oc.ListNodeChainConfigs(context.Background(), &nodev1.ListNodeChainConfigsRequest{Filter: &nodev1.ListNodeChainConfigsRequest_Filter{ @@ -422,20 +432,35 @@ func NodeInfo(nodeIDs []string, oc NodeChainConfigsLister) (Nodes, error) { } n, err := NewNodeFromJD(node, nodeChainConfigs.ChainConfigs) if err != nil { - return nil, fmt.Errorf("failed to create deployment node from JD metadata: %w", err) + xerr = errors.Join(xerr, err) + if !errors.Is(err, ErrMissingEVMChain) { + onlyMissingEVMChain = false + } } - nodes = append(nodes, *n) } - - return nodes, nil + if xerr != nil && onlyMissingEVMChain { + xerr = errors.Join(ErrMissingNodeMetadata, xerr) + } + return nodes, xerr } +var ErrMissingEVMChain = errors.New("no EVM chain found") + +// NewNodeFromJD creates a Node from a JD Node. Populating all the fields requires an enabled +// EVM chain and OCR2 config. If this does not exist, the Node will be returned with +// the minimal fields populated and return a [ErrMissingEVMChain] error. func NewNodeFromJD(jdNode *nodev1.Node, chainConfigs []*nodev1.ChainConfig) (*Node, error) { // the protobuf does not map well to the domain model // we have to infer the p2p key, bootstrap and multiaddr from some chain config // arbitrarily pick the first EVM chain config // we use EVM because the home or registry chain is always EVM + emptyNode := &Node{ + NodeID: jdNode.Id, + Name: jdNode.Name, + CSAKey: jdNode.PublicKey, + SelToOCRConfig: make(map[chain_selectors.ChainDetails]OCRConfig), + } var goldenConfig *nodev1.ChainConfig for _, chainConfig := range chainConfigs { if chainConfig.Chain.Type == nodev1.ChainType_CHAIN_TYPE_EVM { @@ -444,7 +469,7 @@ func NewNodeFromJD(jdNode *nodev1.Node, chainConfigs []*nodev1.ChainConfig) (*No } } if goldenConfig == nil { - return nil, errors.New("no EVM chain config found") + return emptyNode, fmt.Errorf("node '%s', id '%s', csa '%s': %w", jdNode.Name, jdNode.Id, jdNode.PublicKey, ErrMissingEVMChain) } selToOCRConfig := make(map[chain_selectors.ChainDetails]OCRConfig) bootstrap := goldenConfig.Ocr2Config.IsBootstrap @@ -452,7 +477,7 @@ func NewNodeFromJD(jdNode *nodev1.Node, chainConfigs []*nodev1.ChainConfig) (*No var err error selToOCRConfig, err = chainConfigsToOCRConfig(chainConfigs) if err != nil { - return nil, fmt.Errorf("failed to get chain to ocr config: %w", err) + return emptyNode, fmt.Errorf("failed to get chain to ocr config: %w", err) } } return &Node{ diff --git a/deployment/environment_test.go b/deployment/environment_test.go index 149b8a08f2c..fd96248a02c 100644 --- a/deployment/environment_test.go +++ b/deployment/environment_test.go @@ -7,6 +7,7 @@ import ( "strconv" "testing" + gethcommon "github.com/ethereum/go-ethereum/common" chain_selectors "github.com/smartcontractkit/chain-selectors" types2 "github.com/smartcontractkit/libocr/offchainreporting2/types" types3 "github.com/smartcontractkit/libocr/offchainreporting2plus/types" @@ -301,3 +302,125 @@ func hexFrom32Byte(t *testing.T, s string) string { b := test32Byte(t, s) return hex.EncodeToString(b[:]) } + +func TestNewNodeFromJD(t *testing.T) { + type args struct { + jdNode *nodev1.Node + chainConfigs []*nodev1.ChainConfig + } + tests := []struct { + name string + args args + want *Node + checkErr func(t *testing.T, err error) + }{ + { + name: "ok", + args: args{ + jdNode: &nodev1.Node{ + Id: "node-id1", + Name: "node1", + PublicKey: "node-pub-key", + }, + chainConfigs: []*nodev1.ChainConfig{ + { + + Chain: &nodev1.Chain{ + Type: nodev1.ChainType_CHAIN_TYPE_EVM, + Id: strconv.FormatUint(chain_selectors.ETHEREUM_MAINNET_ARBITRUM_1.EvmChainID, 10), + }, + NodeId: "node-id1", + Ocr2Config: &nodev1.OCR2Config{ + OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ + BundleId: "bundle1", + OffchainPublicKey: hexFrom32Byte(t, "offchain-pub-key1"), + OnchainSigningAddress: gethcommon.HexToAddress("0x1").Hex(), + ConfigPublicKey: hexFrom32Byte(t, "config-encryption-pub-key1"), + }, + P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ + PeerId: testPeerID(t, "peer-id1").String(), + }, + }, + }, + }, + }, + want: &Node{ + NodeID: "node-id1", + Name: "node1", + CSAKey: "node-pub-key", + SelToOCRConfig: map[chain_selectors.ChainDetails]OCRConfig{ + { + ChainSelector: chain_selectors.ETHEREUM_MAINNET_ARBITRUM_1.Selector, + ChainName: chain_selectors.ETHEREUM_MAINNET_ARBITRUM_1.Name, + }: { + KeyBundleID: "bundle1", + OffchainPublicKey: test32Byte(t, "offchain-pub-key1"), + OnchainPublicKey: types2.OnchainPublicKey(gethcommon.HexToAddress("0x1").Bytes()), + ConfigEncryptionPublicKey: types3.ConfigEncryptionPublicKey(test32Byte(t, "config-encryption-pub-key1")), + + PeerID: testPeerID(t, "peer-id1"), + }, + }, + PeerID: testPeerID(t, "peer-id1"), + }, + }, + { + name: "no evm chain", + args: args{ + jdNode: &nodev1.Node{ + Id: "node-id1", + Name: "node1", + PublicKey: "node-pub-key", + }, + chainConfigs: []*nodev1.ChainConfig{ + { + Chain: &nodev1.Chain{ + Type: nodev1.ChainType_CHAIN_TYPE_APTOS, + Id: strconv.FormatUint(chain_selectors.APTOS_TESTNET.ChainID, 10), + }, + NodeId: "node-id1", + Ocr2Config: &nodev1.OCR2Config{ + OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ + BundleId: "bundle1", + OffchainPublicKey: hexFrom32Byte(t, "offchain-pub-key1"), + OnchainSigningAddress: gethcommon.HexToAddress("0x1").Hex(), + ConfigPublicKey: hexFrom32Byte(t, "config-encryption-pub-key1"), + }, + P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ + PeerId: testPeerID(t, "peer-id1").String(), + }, + }, + }, + }, + }, + checkErr: func(t *testing.T, err error) { + require.ErrorIs(t, err, ErrMissingEVMChain) + }, + want: &Node{ + NodeID: "node-id1", + Name: "node1", + CSAKey: "node-pub-key", + SelToOCRConfig: map[chain_selectors.ChainDetails]OCRConfig{}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewNodeFromJD(tt.args.jdNode, tt.args.chainConfigs) + if tt.checkErr != nil { + tt.checkErr(t, err) + return + } + assert.Equal(t, tt.want.PeerID, got.PeerID) + assert.Equal(t, tt.want.CSAKey, got.CSAKey) + assert.Equal(t, tt.want.NodeID, got.NodeID) + assert.Equal(t, tt.want.Name, got.Name) + for k, v := range tt.want.SelToOCRConfig { + assert.Equal(t, v, got.SelToOCRConfig[k]) + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("NewNodeFromJD() = %v, want %v", got, tt.want) + } + }) + } +} From dd71b6e6dcba666211c99223dff3e12e14784447 Mon Sep 17 00:00:00 2001 From: Christian Edward Jackson-Gruber Date: Wed, 12 Feb 2025 13:49:18 -0800 Subject: [PATCH 41/83] Update CODEOWNERS for /deployments (#16364) Currently a new sub-package /deployment/ccip/changeset/solana was added, and only one team was added. Refactors and infra changes have no global owner there. --- .github/CODEOWNERS | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ebcf5e2a374..3a8c82cffae 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -145,9 +145,9 @@ core/scripts/gateway @smartcontractkit/dev-services # Deployment tooling /deployment @smartcontractkit/ccip-tooling @smartcontractkit/ccip-offchain @smartcontractkit/keystone @smartcontractkit/core @smartcontractkit/deployment-automation -/deployment/ccip @smartcontractkit/ccip-tooling @smartcontractkit/ccip-offchain @smartcontractkit/deployment-automation +/deployment/ccip @smartcontractkit/ccip-tooling @smartcontractkit/ccip-offchain @smartcontractkit/core @smartcontractkit/deployment-automation /deployment/keystone @smartcontractkit/keystone @smartcontractkit/core @smartcontractkit/deployment-automation -/deployment/ccip/changeset/solana @smartcontractkit/solana-tooling +/deployment/ccip/changeset/solana @smartcontractkit/solana-tooling @smartcontractkit/core @smartcontractkit/deployment-automation # TODO: As more products add their deployment logic here, add the team as an owner # CI/CD From 7016f76eac06a6bb9fc906b7d13674a5f686e0f7 Mon Sep 17 00:00:00 2001 From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com> Date: Wed, 12 Feb 2025 14:36:30 -0800 Subject: [PATCH 42/83] Mcms state updates (#16330) * changes * mcms state updates * more update * fix lint --- deployment/common/changeset/internal/mcms.go | 12 ++- .../common/changeset/save_existing_test.go | 85 +++++++++++++++++++ deployment/common/changeset/state.go | 18 ++++ deployment/common/types/types.go | 13 +++ 4 files changed, 124 insertions(+), 4 deletions(-) diff --git a/deployment/common/changeset/internal/mcms.go b/deployment/common/changeset/internal/mcms.go index f1888322613..eba9299e770 100644 --- a/deployment/common/changeset/internal/mcms.go +++ b/deployment/common/changeset/internal/mcms.go @@ -4,6 +4,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/smartcontractkit/ccip-owner-contracts/pkg/config" owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" + "golang.org/x/sync/errgroup" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -81,13 +82,16 @@ func DeployMCMSWithTimelockContractsBatch( ab deployment.AddressBook, cfgByChain map[uint64]types.MCMSWithTimelockConfig, ) error { + deployGrp := errgroup.Group{} for chainSel, cfg := range cfgByChain { - _, err := DeployMCMSWithTimelockContracts(lggr, chains[chainSel], ab, cfg) - if err != nil { + cfg := cfg + chainSel := chainSel + deployGrp.Go(func() error { + _, err := DeployMCMSWithTimelockContracts(lggr, chains[chainSel], ab, cfg) return err - } + }) } - return nil + return deployGrp.Wait() } // DeployMCMSWithTimelockContracts deploys an MCMS for diff --git a/deployment/common/changeset/save_existing_test.go b/deployment/common/changeset/save_existing_test.go index dc001e030c8..f1e4daaec51 100644 --- a/deployment/common/changeset/save_existing_test.go +++ b/deployment/common/changeset/save_existing_test.go @@ -9,6 +9,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -47,8 +48,92 @@ func TestSaveExisting(t *testing.T) { require.NoError(t, err) require.NoError(t, dummyEnv.ExistingAddresses.Merge(output.AddressBook)) addresses, err := dummyEnv.ExistingAddresses.Addresses() + require.NoError(t, err) require.Len(t, addresses, 2) addressForChain1, exists := addresses[chainsel.TEST_90000001.Selector] require.True(t, exists) require.Len(t, addressForChain1, 1) } + +func TestSaveExistingAddressWithLabels(t *testing.T) { + dummyEnv := deployment.Environment{ + Name: "dummy", + Logger: logger.TestLogger(t), + ExistingAddresses: deployment.NewMemoryAddressBook(), + Chains: map[uint64]deployment.Chain{ + chainsel.TEST_90000001.Selector: {}, + chainsel.TEST_90000002.Selector: {}, + }, + } + dummyType1 := deployment.TypeAndVersion{ + Type: "dummyType", + Version: deployment.Version1_5_0, + } + dummyType1.AddLabel("label1") + dummyType1.AddLabel("label2") + ExistingContracts := ExistingContractsConfig{ + ExistingContracts: []Contract{ + { + Address: common.BigToAddress(big.NewInt(1)).String(), + TypeAndVersion: dummyType1, + ChainSelector: chainsel.TEST_90000001.Selector, + }, + }, + } + + output, err := SaveExistingContractsChangeset(dummyEnv, ExistingContracts) + require.NoError(t, err) + require.NoError(t, dummyEnv.ExistingAddresses.Merge(output.AddressBook)) + addresses, err := dummyEnv.ExistingAddresses.Addresses() + require.NoError(t, err) + require.Len(t, addresses, 1) + addressForChain1, exists := addresses[chainsel.TEST_90000001.Selector] + require.True(t, exists) + require.Len(t, addressForChain1, 1) + require.Equal(t, "dummyType 1.5.0 label1 label2", addressForChain1[common.BigToAddress(big.NewInt(1)).String()].String()) +} + +func TestSaveExistingMCMSAddressWithLabels(t *testing.T) { + dummyEnv := deployment.Environment{ + Name: "dummy", + Logger: logger.TestLogger(t), + ExistingAddresses: deployment.NewMemoryAddressBook(), + Chains: map[uint64]deployment.Chain{ + chainsel.TEST_90000001.Selector: {}, + chainsel.TEST_90000002.Selector: {}, + }, + } + mcmsContractTV := deployment.TypeAndVersion{ + Type: types.ManyChainMultisig, + Version: deployment.Version1_0_0, + } + mcmsContractTV.AddLabel(types.ProposerRole.String()) + mcmsContractTV.AddLabel(types.BypasserRole.String()) + mcmsContractTV.AddLabel(types.CancellerRole.String()) + ExistingContracts := ExistingContractsConfig{ + ExistingContracts: []Contract{ + { + Address: common.BigToAddress(big.NewInt(1)).String(), + TypeAndVersion: mcmsContractTV, + ChainSelector: chainsel.TEST_90000001.Selector, + }, + }, + } + + output, err := SaveExistingContractsChangeset(dummyEnv, ExistingContracts) + require.NoError(t, err) + require.NoError(t, dummyEnv.ExistingAddresses.Merge(output.AddressBook)) + addresses, err := dummyEnv.ExistingAddresses.Addresses() + require.NoError(t, err) + require.Len(t, addresses, 1) + addressForChain1, exists := addresses[chainsel.TEST_90000001.Selector] + require.True(t, exists) + require.Len(t, addressForChain1, 1) + // load mcms state + mcmsState, err := MaybeLoadMCMSWithTimelockChainState(dummyEnv.Chains[chainsel.TEST_90000001.Selector], addressForChain1) + require.NoError(t, err) + require.NotNil(t, mcmsState) + require.NotNil(t, mcmsState.ProposerMcm) + require.NotNil(t, mcmsState.BypasserMcm) + require.NotNil(t, mcmsState.CancellerMcm) +} diff --git a/deployment/common/changeset/state.go b/deployment/common/changeset/state.go index f57686d1d03..f081907d319 100644 --- a/deployment/common/changeset/state.go +++ b/deployment/common/changeset/state.go @@ -94,6 +94,8 @@ func MaybeLoadMCMSWithTimelockChainState(chain deployment.Chain, addresses map[s proposer := deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0) canceller := deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0) bypasser := deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0) + // the same contract can have different roles + multichain := deployment.NewTypeAndVersion(types.ManyChainMultisig, deployment.Version1_0_0) // Convert map keys to a slice wantTypes := []deployment.TypeAndVersion{timelock, proposer, canceller, bypasser, callProxy} @@ -136,7 +138,23 @@ func MaybeLoadMCMSWithTimelockChainState(chain deployment.Chain, addresses map[s return nil, err } state.CancellerMcm = mcms + case tvStr.Type == multichain.Type && tvStr.Version.String() == multichain.Version.String(): + // the same contract can have different roles so we use the labels to determine which role it is + mcms, err := owner_helpers.NewManyChainMultiSig(common.HexToAddress(address), chain.Client) + if err != nil { + return nil, err + } + if tvStr.Labels.Contains(types.ProposerRole.String()) { + state.ProposerMcm = mcms + } + if tvStr.Labels.Contains(types.BypasserRole.String()) { + state.BypasserMcm = mcms + } + if tvStr.Labels.Contains(types.CancellerRole.String()) { + state.CancellerMcm = mcms + } } + } return &state, nil } diff --git a/deployment/common/types/types.go b/deployment/common/types/types.go index d78ddb0d414..4e4c60048e0 100644 --- a/deployment/common/types/types.go +++ b/deployment/common/types/types.go @@ -10,12 +10,21 @@ import ( "github.com/smartcontractkit/chainlink/deployment" ) +type MCMSRole string + const ( BypasserManyChainMultisig deployment.ContractType = "BypasserManyChainMultiSig" CancellerManyChainMultisig deployment.ContractType = "CancellerManyChainMultiSig" ProposerManyChainMultisig deployment.ContractType = "ProposerManyChainMultiSig" + ManyChainMultisig deployment.ContractType = "ManyChainMultiSig" RBACTimelock deployment.ContractType = "RBACTimelock" CallProxy deployment.ContractType = "CallProxy" + + // roles + ProposerRole MCMSRole = "PROPOSER" + BypasserRole MCMSRole = "BYPASSER" + CancellerRole MCMSRole = "CANCELLER" + // LinkToken is the burn/mint link token. It should be used everywhere for // new deployments. Corresponds to // https://github.com/smartcontractkit/chainlink/blob/develop/core/gethwrappers/shared/generated/link_token/link_token.go#L34 @@ -28,6 +37,10 @@ const ( StaticLinkToken deployment.ContractType = "StaticLinkToken" ) +func (role MCMSRole) String() string { + return string(role) +} + type MCMSWithTimelockConfig struct { Canceller config.Config Bypasser config.Config From 9d16d19dc3e4a577e9dca215292c44e89fd56255 Mon Sep 17 00:00:00 2001 From: tt-cll <141346969+tt-cll@users.noreply.github.com> Date: Wed, 12 Feb 2025 18:30:49 -0500 Subject: [PATCH 43/83] cache solana build artifacts (#16356) * try to cache build artifacts * use bash * change dir * add token back * try artifact found * allow upload failure * try query param * remove apostrophe * use curl to download * try with header * loop through unexpired --- .../setup-solana/build-contracts/action.yml | 93 +++++++++++-------- .github/workflows/ci-core-partial.yml | 6 ++ .github/workflows/ci-core.yml | 2 + .github/workflows/flakeguard.yml | 2 + 4 files changed, 62 insertions(+), 41 deletions(-) diff --git a/.github/actions/setup-solana/build-contracts/action.yml b/.github/actions/setup-solana/build-contracts/action.yml index 5b4be8a2e82..84c3fef0b5f 100644 --- a/.github/actions/setup-solana/build-contracts/action.yml +++ b/.github/actions/setup-solana/build-contracts/action.yml @@ -1,5 +1,10 @@ name: Solana build contracts description: Build Solana contracts +inputs: + github-token: + description: "The Github token to use for authentication" + required: true + default: ${{ github.token }} runs: using: composite @@ -22,52 +27,58 @@ runs: git checkout $short_revision echo "CHAINLINK_CCIP_COMMIT_SHORT=${short_revision}" >> $GITHUB_ENV - - name: Get Anchor Version - id: get_anchor_version + echo "ARTIFACT_NAME=solana-ccip-${short_revision}" >> $GITHUB_ENV + - name: Check if artifact exists + id: check_artifact shell: bash + env: + GH_TOKEN: ${{ inputs.github-token }} run: | - cd chainlink-ccip/chains/solana - anchor=$(make anchor_version) - echo "ANCHOR_VERSION=${anchor}" >> $GITHUB_ENV - - name: cache docker build image - id: cache-image - uses: actions/cache@v4 # v4.0.2 - with: - lookup-only: true - path: chains/solana/contracts/docker-build.tar - key: ${{ runner.os }}-solana-build-${{ env.ANCHOR_VERSION }}-${{ hashFiles('**/Cargo.lock') }} - - name: Cache cargo target dir - id: cache-target - uses: actions/cache@v4 # v4.0.2 - with: - lookup-only: true - path: chains/solana/contracts/target - key: ${{ runner.os }}-solana-contract-artifacts-${{ hashFiles('**/Cargo.lock') }} - - name: build & save image - if: steps.cache-image.outputs.cache-hit != 'true' + ARTIFACT_RESPONSE=$(gh api repos/${{ github.repository }}/actions/artifacts?name=${{ env.ARTIFACT_NAME }}) + ARTIFACT_FOUND=false + for artifact in $(echo "$ARTIFACT_RESPONSE" | jq -r '.artifacts[] | @json'); do + # Extract relevant fields directly from JSON + ARTIFACT_NAME=$(echo "$artifact" | jq -r '.name') + ARTIFACT_EXPIRED=$(echo "$artifact" | jq -r '.expired') + ARTIFACT_DOWNLOAD_URL=$(echo "$artifact" | jq -r '.archive_download_url') + + if [[ "$ARTIFACT_NAME" == "${{ env.ARTIFACT_NAME }}" && "$ARTIFACT_EXPIRED" == false ]]; then + # First non-expired artifact found, set variables and break loop + echo "Artifact found" + echo "exists=true" >> $GITHUB_ENV + echo "ARTIFACT_DOWNLOAD_URL=$ARTIFACT_DOWNLOAD_URL" >> $GITHUB_ENV + ARTIFACT_FOUND=true + break + fi + done + + if [[ "$ARTIFACT_FOUND" == false ]]; then + echo "Artifact not found or expired" + echo "exists=false" >> $GITHUB_ENV + fi + + + - name: Download artifact if it exists + if: env.exists == 'true' shell: bash run: | - cd chainlink-ccip/chains/solana/contracts - docker buildx build . -t ccip-solana:build --build-arg ANCHOR_CLI=${{ env.ANCHOR_VERSION }} - docker save -o docker-build.tar ccip-solana - - name: build & save contract compilation artifacts - if: steps.cache-target.outputs.cache-hit != 'true' + curl -L -H "Authorization: token ${{ inputs.github-token }}" -o artifact.zip ${{ env.ARTIFACT_DOWNLOAD_URL }} + unzip artifact.zip -d /home/runner/work/chainlink/chainlink/deployment/ccip/changeset/internal/solana_contracts + + - name: Build artifact if not found + if: env.exists == 'false' shell: bash run: | cd chainlink-ccip/chains/solana - docker run -v "$(pwd)/contracts":/solana/contracts ccip-solana:build bash -c "\ - set -eoux pipefail &&\ - RUSTUP_HOME=\"/root/.rustup\" &&\ - FORCE_COLOR=1 &&\ - cd /solana/contracts &&\ - anchor build &&\ - chmod -R 755 ./target" - - name: move built contracts to test folder - shell: bash - run: | - # copy the built contracts so they can be used in the chainlink tests + make docker-build-contracts + # copy the built contracts so they can be used in the chainlink tests mkdir -p /home/runner/work/chainlink/chainlink/deployment/ccip/changeset/internal/solana_contracts - cp chainlink-ccip/chains/solana/contracts/target/deploy/*.so /home/runner/work/chainlink/chainlink/deployment/ccip/changeset/internal/solana_contracts - - # save the revision of the built chainlink-ccip solana contracts - echo ${{ env.CHAINLINK_CCIP_COMMIT_SHORT }} > /home/runner/work/chainlink/chainlink/deployment/ccip/changeset/internal/solana_contracts/.solana_contracts_rev + cp contracts/target/deploy/*.so /home/runner/work/chainlink/chainlink/deployment/ccip/changeset/internal/solana_contracts + - name: Upload artifact (if newly built) + if: env.exists == 'false' + continue-on-error: true # don't fail if the upload fails, it might conflict with another job + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_NAME }} + path: chainlink-ccip/chains/solana/contracts/target/deploy/*.so + \ No newline at end of file diff --git a/.github/workflows/ci-core-partial.yml b/.github/workflows/ci-core-partial.yml index a0ee5c75733..e64db9cb2f5 100644 --- a/.github/workflows/ci-core-partial.yml +++ b/.github/workflows/ci-core-partial.yml @@ -84,6 +84,8 @@ jobs: - name: Build Solana artifacts uses: ./.github/actions/setup-solana/build-contracts + with: + github-token: ${{ secrets.GITHUB_TOKEN }} - name: Setup wasmd uses: ./.github/actions/setup-wasmd @@ -217,6 +219,8 @@ jobs: - name: Build Solana artifacts uses: ./.github/actions/setup-solana/build-contracts + with: + github-token: ${{ secrets.GITHUB_TOKEN }} - name: Setup wasmd uses: ./.github/actions/setup-wasmd @@ -266,6 +270,8 @@ jobs: - name: Build Solana artifacts uses: ./.github/actions/setup-solana/build-contracts + with: + github-token: ${{ secrets.GITHUB_TOKEN }} - name: Setup wasmd uses: ./.github/actions/setup-wasmd diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index d6080830a24..d99689be147 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -234,6 +234,8 @@ jobs: # do not build for core tests, core 'integration' tests, or fuzz tests if: ${{ needs.filter.outputs.should-run-ci-core == 'true' && matrix.type.build-solana-artifacts != 'false' }} uses: ./.github/actions/setup-solana/build-contracts + with: + github-token: ${{ secrets.GITHUB_TOKEN }} - name: Setup wasmd if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }} diff --git a/.github/workflows/flakeguard.yml b/.github/workflows/flakeguard.yml index ba20378a79a..3b956b9128b 100644 --- a/.github/workflows/flakeguard.yml +++ b/.github/workflows/flakeguard.yml @@ -296,6 +296,8 @@ jobs: - name: Build Solana artifacts uses: ./.github/actions/setup-solana/build-contracts + with: + github-token: ${{ secrets.GH_TOKEN }} - name: Setup wasmd uses: ./.github/actions/setup-wasmd From 52661ac459c5e078d8840f286bb48737310a6126 Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Wed, 12 Feb 2025 16:09:11 -0800 Subject: [PATCH 44/83] fix: compilation errors due to build cache (#16362) --- .github/workflows/ci-core.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index d99689be147..6ac8d243c7b 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -281,7 +281,10 @@ jobs: env: OUTPUT_FILE: ./output.txt CL_DATABASE_URL: ${{ env.DB_URL }} - run: ./tools/bin/${{ matrix.type.cmd }} ./... + run: | + # See: https://github.com/golang/go/issues/69179 + GODEBUG=goindex=0 + ./tools/bin/${{ matrix.type.cmd }} ./... - name: Print Races id: print-races From cfa5e4832aa47fde06e6cf9c7f370652c9d03b55 Mon Sep 17 00:00:00 2001 From: Christian Edward Jackson-Gruber Date: Wed, 12 Feb 2025 16:13:06 -0800 Subject: [PATCH 45/83] Add an interface to replace the ChangeSet function type. (#16186) This preserves the existing function type (as an alias to a new function type, ChangeLogic). It adds also two function types ChangeLogic and PreconditionVerifier, to encapsulate the logic of these two functions. The interface exposes an Apply and a VerifyPreconditions method. The aforementioned function types can be used with a convenience function to generate an implementation of ChangeSetV2. Alternatively, a full implementation of the interface can be built using a struct that implements those methods. Also: * Rework ChangesetApplication to pass around an interface ConfiguredChangeSet, which can be generic, and therefore avoid a lot of mess in dealing with the WrapChangeset stuff. * Pull out WrapChangeset, which existed to handle some generics which are now handled by the ConfiguredChangeSet interface. * Wire in validation to the execution of changesets in the test infrastructure, and add some tests to make sure that works. --- .../ccip/changeset/accept_ownership_test.go | 13 +- .../changeset/cs_accept_admin_role_test.go | 32 +-- .../changeset/cs_active_candidate_test.go | 69 +++--- .../ccip/changeset/cs_ccip_home_test.go | 191 +++++++-------- .../ccip/changeset/cs_chain_contracts_test.go | 109 ++++----- .../cs_configure_token_pools_test.go | 48 ++-- .../ccip/changeset/cs_deploy_chain_test.go | 44 ++-- .../changeset/cs_deploy_token_pools_test.go | 12 +- .../ccip/changeset/cs_home_chain_test.go | 41 ++-- deployment/ccip/changeset/cs_jobspec_test.go | 12 +- .../changeset/cs_propose_admin_role_test.go | 56 ++--- deployment/ccip/changeset/cs_set_pool_test.go | 40 ++-- .../changeset/cs_transfer_admin_role_test.go | 40 ++-- .../ccip/changeset/deployer_group_test.go | 96 ++++---- .../solana/cs_chain_contracts_test.go | 201 ++++++++-------- .../changeset/solana/cs_deploy_chain_test.go | 61 ++--- .../changeset/solana/cs_solana_token_test.go | 36 +-- .../changeset/testhelpers/test_environment.go | 133 +++++------ .../changeset/testhelpers/test_helpers.go | 153 ++++++------ .../testhelpers/test_token_helpers.go | 58 +++-- .../testhelpers/v1_5/test_helpers.go | 35 ++- deployment/ccip/changeset/v1_5/e2e_test.go | 13 +- deployment/changeset.go | 82 ++++++- deployment/changeset_test.go | 108 +++++++++ .../changeset/example/link_transfer_test.go | 56 ++--- .../changeset/example/mint_link_test.go | 13 +- .../common/changeset/set_config_mcms_test.go | 88 +++---- deployment/common/changeset/test_helpers.go | 47 ++-- .../common/changeset/test_helpers_test.go | 77 +++++++ .../transfer_to_mcms_with_timelock_test.go | 136 ++++++----- .../common/proposalutils/propose_test.go | 13 +- .../changeset/jd_register_nodes_test.go | 13 +- deployment/environment/crib/ccip_deployer.go | 218 +++++++++--------- .../changeset/accept_ownership_test.go | 63 +++-- .../changeset/add_capabilities_test.go | 10 +- .../keystone/changeset/add_nodes_test.go | 17 +- .../keystone/changeset/add_nops_test.go | 10 +- .../append_node_capabilities_test.go | 13 +- .../changeset/deploy_forwarder_test.go | 12 +- .../keystone/changeset/deploy_ocr3_test.go | 13 +- deployment/keystone/changeset/test/helpers.go | 63 ++--- .../keystone/changeset/update_don_test.go | 13 +- .../update_node_capabilities_test.go | 13 +- .../keystone/changeset/update_nodes_test.go | 13 +- .../update_allowed_dons_test.go | 12 +- .../update_authorized_addresses_test.go | 12 +- .../smoke/ccip/ccip_add_chain_test.go | 87 +++---- .../ccip/ccip_cs_rmn_curse_uncurse_test.go | 49 ++-- .../ccip/ccip_cs_update_rmn_config_test.go | 113 +++++---- .../smoke/ccip/ccip_fee_boosting_test.go | 24 +- .../ccip/ccip_migration_to_v_1_6_test.go | 73 +++--- 51 files changed, 1622 insertions(+), 1332 deletions(-) create mode 100644 deployment/changeset_test.go create mode 100644 deployment/common/changeset/test_helpers_test.go diff --git a/deployment/ccip/changeset/accept_ownership_test.go b/deployment/ccip/changeset/accept_ownership_test.go index 264be42cce1..1cbb55ed1cc 100644 --- a/deployment/ccip/changeset/accept_ownership_test.go +++ b/deployment/ccip/changeset/accept_ownership_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/exp/maps" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -39,13 +40,13 @@ func Test_NewAcceptOwnershipChangeset(t *testing.T) { require.NoError(t, err) // compose the transfer ownership and accept ownership changesets - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelockContracts, []commonchangeset.ChangesetApplication{ + _, err = commonchangeset.Apply(t, e.Env, timelockContracts, // note this doesn't have proposals. - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: testhelpers.GenTestTransferOwnershipConfig(e, allChains, state), - }, - }) + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + testhelpers.GenTestTransferOwnershipConfig(e, allChains, state), + ), + ) require.NoError(t, err) testhelpers.AssertTimelockOwnership(t, e, allChains, state) diff --git a/deployment/ccip/changeset/cs_accept_admin_role_test.go b/deployment/ccip/changeset/cs_accept_admin_role_test.go index 8d7c8cb6e9f..bea9b9fcdc0 100644 --- a/deployment/ccip/changeset/cs_accept_admin_role_test.go +++ b/deployment/ccip/changeset/cs_accept_admin_role_test.go @@ -102,12 +102,12 @@ func TestAcceptAdminRoleChangeset_Validations(t *testing.T) { for _, test := range tests { t.Run(test.Msg, func(t *testing.T) { - _, err := commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAdminRoleChangeset), - Config: test.Config, - }, - }) + _, err := commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + test.Config, + ), + ) require.Error(t, err) require.ErrorContains(t, err, test.ErrStr) }) @@ -143,10 +143,10 @@ func TestAcceptAdminRoleChangeset_Execution(t *testing.T) { registryOnA := state.Chains[selectorA].TokenAdminRegistry registryOnB := state.Chains[selectorB].TokenAdminRegistry - e, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + e, err = commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -163,10 +163,10 @@ func TestAcceptAdminRoleChangeset_Execution(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -183,8 +183,8 @@ func TestAcceptAdminRoleChangeset_Execution(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) configOnA, err := registryOnA.GetTokenConfig(nil, tokens[selectorA].Address) diff --git a/deployment/ccip/changeset/cs_active_candidate_test.go b/deployment/ccip/changeset/cs_active_candidate_test.go index c8d118a4fec..abf87355398 100644 --- a/deployment/ccip/changeset/cs_active_candidate_test.go +++ b/deployment/ccip/changeset/cs_active_candidate_test.go @@ -9,6 +9,7 @@ import ( "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/internal" @@ -41,10 +42,10 @@ func Test_ActiveCandidate(t *testing.T) { // Connect source to dest sourceState := state.Chains[source] - tenv.Env, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), - Config: changeset.UpdateOnRampDestsConfig{ + tenv.Env, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), + changeset.UpdateOnRampDestsConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ source: { dest: { @@ -54,10 +55,10 @@ func Test_ActiveCandidate(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - Config: changeset.UpdateFeeQuoterPricesConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), + changeset.UpdateFeeQuoterPricesConfig{ PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ source: { TokenPrices: map[common.Address]*big.Int{ @@ -70,20 +71,20 @@ func Test_ActiveCandidate(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - Config: changeset.UpdateFeeQuoterDestsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), + changeset.UpdateFeeQuoterDestsConfig{ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ source: { dest: changeset.DefaultFeeQuoterDestChainConfig(true), }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOffRampSourcesChangeset), - Config: changeset.UpdateOffRampSourcesConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), + changeset.UpdateOffRampSourcesConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ dest: { source: { @@ -93,10 +94,10 @@ func Test_ActiveCandidate(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateRouterRampsChangeset), - Config: changeset.UpdateRouterRampsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), + changeset.UpdateRouterRampsConfig{ UpdatesByChain: map[uint64]changeset.RouterUpdates{ // onRamp update on source chain source: { @@ -112,8 +113,8 @@ func Test_ActiveCandidate(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // check that source router has dest enabled @@ -125,12 +126,12 @@ func Test_ActiveCandidate(t *testing.T) { // Transfer ownership so that we can set new candidate configs // and set new config digest on the offramp. - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: testhelpers.GenTestTransferOwnershipConfig(tenv, allChains, state), - }, - }) + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + testhelpers.GenTestTransferOwnershipConfig(tenv, allChains, state), + ), + ) require.NoError(t, err) testhelpers.AssertTimelockOwnership(t, tenv, allChains, state) @@ -192,10 +193,10 @@ func Test_ActiveCandidate(t *testing.T) { // Now we can add a candidate config, send another request, and observe behavior. // The candidate config should not be able to execute messages. tokenConfig := changeset.NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds) - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetCandidateChangeset), - Config: changeset.SetCandidateChangesetConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), + changeset.SetCandidateChangesetConfig{ SetCandidateConfigBase: changeset.SetCandidateConfigBase{ HomeChainSelector: tenv.HomeChainSel, FeedChainSelector: tenv.FeedChainSel, @@ -227,8 +228,8 @@ func Test_ActiveCandidate(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // check that CCIPHome state is updated with the new candidate configs diff --git a/deployment/ccip/changeset/cs_ccip_home_test.go b/deployment/ccip/changeset/cs_ccip_home_test.go index dcd6fe9f6b6..7c4095afa74 100644 --- a/deployment/ccip/changeset/cs_ccip_home_test.go +++ b/deployment/ccip/changeset/cs_ccip_home_test.go @@ -36,10 +36,10 @@ func TestInvalidOCR3Params(t *testing.T) { require.NoError(t, err) // Need to deploy prerequisites first so that we can form the USDC config // no proposals to be made, timelock can be passed as nil here - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChainChangeset), - Config: changeset.DeployHomeChainConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), + changeset.DeployHomeChainConfig{ HomeChainSel: e.HomeChainSel, RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), @@ -48,10 +48,10 @@ func TestInvalidOCR3Params(t *testing.T) { testhelpers.TestNodeOperator: envNodes.NonBootstraps().PeerIDs(), }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployChainContractsChangeset), - Config: changeset.DeployChainContractsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), + changeset.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, ContractParamsPerChain: map[uint64]changeset.ChainContractParams{ chain1: { @@ -60,8 +60,8 @@ func TestInvalidOCR3Params(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) state, err := changeset.LoadOnchainState(e.Env) @@ -150,15 +150,16 @@ func Test_PromoteCandidate(t *testing.T) { } } // promotes zero digest on commit and ensure exec is not affected - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{ - tenv.HomeChainSel: { - Timelock: state.Chains[tenv.HomeChainSel].Timelock, - CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + _, err = commonchangeset.Apply(t, tenv.Env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + tenv.HomeChainSel: { + Timelock: state.Chains[tenv.HomeChainSel].Timelock, + CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + }, }, - }, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.PromoteCandidateChangeset), - Config: changeset.PromoteCandidateChangesetConfig{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.PromoteCandidateChangeset), + changeset.PromoteCandidateChangesetConfig{ HomeChainSelector: tenv.HomeChainSel, PluginInfo: []changeset.PromoteCandidatePluginInfo{ { @@ -169,8 +170,8 @@ func Test_PromoteCandidate(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // after promoting the zero digest, active digest should also be zero @@ -246,15 +247,16 @@ func Test_SetCandidate(t *testing.T) { } } tokenConfig := changeset.NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds) - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{ - tenv.HomeChainSel: { - Timelock: state.Chains[tenv.HomeChainSel].Timelock, - CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + _, err = commonchangeset.Apply(t, tenv.Env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + tenv.HomeChainSel: { + Timelock: state.Chains[tenv.HomeChainSel].Timelock, + CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + }, }, - }, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetCandidateChangeset), - Config: changeset.SetCandidateChangesetConfig{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), + changeset.SetCandidateChangesetConfig{ SetCandidateConfigBase: changeset.SetCandidateConfigBase{ HomeChainSelector: tenv.HomeChainSel, FeedChainSelector: tenv.FeedChainSel, @@ -283,8 +285,8 @@ func Test_SetCandidate(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // after setting a new candidate on both plugins, the candidate config digest @@ -363,15 +365,16 @@ func Test_RevokeCandidate(t *testing.T) { } } tokenConfig := changeset.NewTestTokenConfig(state.Chains[tenv.FeedChainSel].USDFeeds) - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{ - tenv.HomeChainSel: { - Timelock: state.Chains[tenv.HomeChainSel].Timelock, - CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + _, err = commonchangeset.Apply(t, tenv.Env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + tenv.HomeChainSel: { + Timelock: state.Chains[tenv.HomeChainSel].Timelock, + CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + }, }, - }, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetCandidateChangeset), - Config: changeset.SetCandidateChangesetConfig{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), + changeset.SetCandidateChangesetConfig{ SetCandidateConfigBase: changeset.SetCandidateConfigBase{ HomeChainSelector: tenv.HomeChainSel, FeedChainSelector: tenv.FeedChainSel, @@ -400,8 +403,8 @@ func Test_RevokeCandidate(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // after setting a new candidate on both plugins, the candidate config digest @@ -421,31 +424,32 @@ func Test_RevokeCandidate(t *testing.T) { require.NotEqual(t, candidateDigestExecBefore, candidateDigestExecAfter) // next we can revoke candidate - this should set the candidate digest back to zero - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{ - tenv.HomeChainSel: { - Timelock: state.Chains[tenv.HomeChainSel].Timelock, - CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + _, err = commonchangeset.Apply(t, tenv.Env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + tenv.HomeChainSel: { + Timelock: state.Chains[tenv.HomeChainSel].Timelock, + CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + }, }, - }, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.RevokeCandidateChangeset), - Config: changeset.RevokeCandidateChangesetConfig{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.RevokeCandidateChangeset), + changeset.RevokeCandidateChangesetConfig{ HomeChainSelector: tenv.HomeChainSel, RemoteChainSelector: dest, PluginType: types.PluginTypeCCIPCommit, MCMS: mcmsConfig, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.RevokeCandidateChangeset), - Config: changeset.RevokeCandidateChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.RevokeCandidateChangeset), + changeset.RevokeCandidateChangesetConfig{ HomeChainSelector: tenv.HomeChainSel, RemoteChainSelector: dest, PluginType: types.PluginTypeCCIPExec, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // after revoking the candidate, the candidate digest should be zero @@ -471,25 +475,26 @@ func transferToTimelock( source, dest uint64) { // Transfer ownership to timelock so that we can promote the zero digest later down the line. - _, err := commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{ - source: { - Timelock: state.Chains[source].Timelock, - CallProxy: state.Chains[source].CallProxy, - }, - dest: { - Timelock: state.Chains[dest].Timelock, - CallProxy: state.Chains[dest].CallProxy, - }, - tenv.HomeChainSel: { - Timelock: state.Chains[tenv.HomeChainSel].Timelock, - CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, - }, - }, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: testhelpers.GenTestTransferOwnershipConfig(tenv, []uint64{source, dest}, state), + _, err := commonchangeset.Apply(t, tenv.Env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + source: { + Timelock: state.Chains[source].Timelock, + CallProxy: state.Chains[source].CallProxy, + }, + dest: { + Timelock: state.Chains[dest].Timelock, + CallProxy: state.Chains[dest].CallProxy, + }, + tenv.HomeChainSel: { + Timelock: state.Chains[tenv.HomeChainSel].Timelock, + CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + }, }, - }) + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + testhelpers.GenTestTransferOwnershipConfig(tenv, []uint64{source, dest}, state), + ), + ) require.NoError(t, err) testhelpers.AssertTimelockOwnership(t, tenv, []uint64{source, dest}, state) } @@ -534,22 +539,23 @@ func Test_UpdateChainConfigs(t *testing.T) { MinDelay: 0, } } - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{ - tenv.HomeChainSel: { - Timelock: state.Chains[tenv.HomeChainSel].Timelock, - CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + _, err = commonchangeset.Apply(t, tenv.Env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + tenv.HomeChainSel: { + Timelock: state.Chains[tenv.HomeChainSel].Timelock, + CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + }, }, - }, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateChainConfigChangeset), - Config: changeset.UpdateChainConfigConfig{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), + changeset.UpdateChainConfigConfig{ HomeChainSelector: tenv.HomeChainSel, RemoteChainRemoves: []uint64{otherChain}, RemoteChainAdds: make(map[uint64]changeset.ChainConfig), MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // other chain should be gone @@ -558,15 +564,16 @@ func Test_UpdateChainConfigs(t *testing.T) { assert.Zero(t, chainConfigAfter.FChain) // Lets add it back now. - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, map[uint64]*proposalutils.TimelockExecutionContracts{ - tenv.HomeChainSel: { - Timelock: state.Chains[tenv.HomeChainSel].Timelock, - CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + _, err = commonchangeset.Apply(t, tenv.Env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + tenv.HomeChainSel: { + Timelock: state.Chains[tenv.HomeChainSel].Timelock, + CallProxy: state.Chains[tenv.HomeChainSel].CallProxy, + }, }, - }, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateChainConfigChangeset), - Config: changeset.UpdateChainConfigConfig{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), + changeset.UpdateChainConfigConfig{ HomeChainSelector: tenv.HomeChainSel, RemoteChainRemoves: []uint64{}, RemoteChainAdds: map[uint64]changeset.ChainConfig{ @@ -582,8 +589,8 @@ func Test_UpdateChainConfigs(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) chainConfigAfter2, err := ccipHome.GetChainConfig(nil, otherChain) diff --git a/deployment/ccip/changeset/cs_chain_contracts_test.go b/deployment/ccip/changeset/cs_chain_contracts_test.go index ed0f60472b8..75b36cdad49 100644 --- a/deployment/ccip/changeset/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/cs_chain_contracts_test.go @@ -11,6 +11,7 @@ import ( "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink-integrations/evm/utils" @@ -57,10 +58,10 @@ func TestUpdateOnRampsDests(t *testing.T) { MinDelay: 0, } } - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), - Config: changeset.UpdateOnRampDestsConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), + changeset.UpdateOnRampDestsConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ source: { dest: { @@ -79,8 +80,8 @@ func TestUpdateOnRampsDests(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert the onramp configuration is as we expect. @@ -133,10 +134,10 @@ func TestUpdateOnRampDynamicConfig(t *testing.T) { MinDelay: 0, } } - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampDynamicConfigChangeset), - Config: changeset.UpdateOnRampDynamicConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampDynamicConfigChangeset), + changeset.UpdateOnRampDynamicConfig{ UpdatesByChain: map[uint64]changeset.OnRampDynamicConfigUpdate{ source: { FeeAggregator: common.HexToAddress("0x1002"), @@ -147,8 +148,8 @@ func TestUpdateOnRampDynamicConfig(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert the onramp configuration is as we expect. @@ -201,10 +202,10 @@ func TestUpdateOnRampAllowList(t *testing.T) { MinDelay: 0, } } - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampAllowListChangeset), - Config: changeset.UpdateOnRampAllowListConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampAllowListChangeset), + changeset.UpdateOnRampAllowListConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OnRampAllowListUpdate{ source: { dest: { @@ -223,8 +224,8 @@ func TestUpdateOnRampAllowList(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert the onramp configuration is as we expect. @@ -331,18 +332,18 @@ func TestWithdrawOnRampFeeTokens(t *testing.T) { require.NoError(t, err) require.Equal(t, tokenAmount, onRampInitWeth) - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.WithdrawOnRampFeeTokensChangeset), - Config: changeset.WithdrawOnRampFeeTokensConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.WithdrawOnRampFeeTokensChangeset), + changeset.WithdrawOnRampFeeTokensConfig{ FeeTokensByChain: map[uint64][]common.Address{ source: {linkToken.Address(), weth9.Address()}, dest: {state.Chains[dest].LinkToken.Address(), state.Chains[dest].Weth9.Address()}, }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert that feeAggregator receives all fee tokens from OnRamp @@ -391,10 +392,10 @@ func TestUpdateOffRampsSources(t *testing.T) { MinDelay: 0, } } - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOffRampSourcesChangeset), - Config: changeset.UpdateOffRampSourcesConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), + changeset.UpdateOffRampSourcesConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ source: { dest: { @@ -413,8 +414,8 @@ func TestUpdateOffRampsSources(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert the offramp configuration is as we expect. @@ -467,10 +468,10 @@ func TestUpdateFQDests(t *testing.T) { fqCfg1 := changeset.DefaultFeeQuoterDestChainConfig(true) fqCfg2 := changeset.DefaultFeeQuoterDestChainConfig(true) fqCfg2.DestGasOverhead = 1000 - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - Config: changeset.UpdateFeeQuoterDestsConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), + changeset.UpdateFeeQuoterDestsConfig{ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ source: { dest: fqCfg1, @@ -481,8 +482,8 @@ func TestUpdateFQDests(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert the fq configuration is as we expect. @@ -533,10 +534,10 @@ func TestUpdateRouterRamps(t *testing.T) { } // Updates test router. - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateRouterRampsChangeset), - Config: changeset.UpdateRouterRampsConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), + changeset.UpdateRouterRampsConfig{ TestRouter: true, UpdatesByChain: map[uint64]changeset.RouterUpdates{ source: { @@ -558,8 +559,8 @@ func TestUpdateRouterRamps(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert the router configuration is as we expect. @@ -608,10 +609,10 @@ func TestUpdateDynamicConfigOffRampChangeset(t *testing.T) { } } msgInterceptor := utils.RandomAddress() - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateDynamicConfigOffRampChangeset), - Config: changeset.UpdateDynamicConfigOffRampConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateDynamicConfigOffRampChangeset), + changeset.UpdateDynamicConfigOffRampConfig{ Updates: map[uint64]changeset.OffRampParams{ source: { PermissionLessExecutionThresholdSeconds: uint32(2 * 60 * 60), @@ -620,8 +621,8 @@ func TestUpdateDynamicConfigOffRampChangeset(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert the nonce manager configuration is as we expect. actualConfig, err := state.Chains[source].OffRamp.GetDynamicConfig(nil) @@ -668,10 +669,10 @@ func TestUpdateNonceManagersCS(t *testing.T) { } } - _, err = commonchangeset.ApplyChangesets(t, tenv.Env, tenv.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateNonceManagersChangeset), - Config: changeset.UpdateNonceManagerConfig{ + _, err = commonchangeset.Apply(t, tenv.Env, tenv.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), + changeset.UpdateNonceManagerConfig{ UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ source: { RemovedAuthCallers: []common.Address{state.Chains[source].OnRamp.Address()}, @@ -679,8 +680,8 @@ func TestUpdateNonceManagersCS(t *testing.T) { }, MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) // Assert the nonce manager configuration is as we expect. callers, err := state.Chains[source].NonceManager.GetAllAuthorizedCallers(nil) diff --git a/deployment/ccip/changeset/cs_configure_token_pools_test.go b/deployment/ccip/changeset/cs_configure_token_pools_test.go index 9df4abda608..682a84254fa 100644 --- a/deployment/ccip/changeset/cs_configure_token_pools_test.go +++ b/deployment/ccip/changeset/cs_configure_token_pools_test.go @@ -440,10 +440,10 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { if test.RegistrationPass != nil { // Configure & set the active pools on the registry - e, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - Config: changeset.ConfigureTokenPoolContractsConfig{ + e, err = commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), + changeset.ConfigureTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, MCMS: mcmsConfig, PoolUpdates: map[uint64]changeset.TokenPoolConfig{ @@ -463,10 +463,10 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -483,10 +483,10 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -503,10 +503,10 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetPoolChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetPoolChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -523,8 +523,8 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) for _, selector := range e.AllChainSelectors() { @@ -563,10 +563,10 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { if test.UpdatePass.UpdatePoolOnB { bType = changeset.BurnMintTokenPool } - e, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - Config: changeset.ConfigureTokenPoolContractsConfig{ + e, err = commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), + changeset.ConfigureTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, MCMS: mcmsConfig, PoolUpdates: map[uint64]changeset.TokenPoolConfig{ @@ -586,8 +586,8 @@ func TestValidateConfigureTokenPoolContracts(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) for _, selector := range e.AllChainSelectors() { diff --git a/deployment/ccip/changeset/cs_deploy_chain_test.go b/deployment/ccip/changeset/cs_deploy_chain_test.go index 027fa26ca92..94a8e5eca14 100644 --- a/deployment/ccip/changeset/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/cs_deploy_chain_test.go @@ -45,10 +45,10 @@ func TestDeployChainContractsChangeset(t *testing.T) { }) } - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChainChangeset), - Config: changeset.DeployHomeChainConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), + changeset.DeployHomeChainConfig{ HomeChainSel: homeChainSel, RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), @@ -57,29 +57,29 @@ func TestDeployChainContractsChangeset(t *testing.T) { "NodeOperator": p2pIds, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), - Config: evmSelectors, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), - Config: cfg, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployPrerequisitesChangeset), - Config: changeset.DeployPrerequisiteConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployLinkToken), + evmSelectors, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + cfg, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployPrerequisitesChangeset), + changeset.DeployPrerequisiteConfig{ Configs: prereqCfg, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployChainContractsChangeset), - Config: changeset.DeployChainContractsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), + changeset.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: contractParams, }, - }, - }) + ), + ) require.NoError(t, err) // load onchain state diff --git a/deployment/ccip/changeset/cs_deploy_token_pools_test.go b/deployment/ccip/changeset/cs_deploy_token_pools_test.go index 1b2205c9146..8e129cfbed9 100644 --- a/deployment/ccip/changeset/cs_deploy_token_pools_test.go +++ b/deployment/ccip/changeset/cs_deploy_token_pools_test.go @@ -280,17 +280,17 @@ func TestDeployTokenPoolContracts(t *testing.T) { test.Input.TokenAddress = tokens[selectorA].Address - e, err := commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - commonchangeset.ChangesetApplication{ - Changeset: commonchangeset.WrapChangeSet(changeset.DeployTokenPoolContractsChangeset), - Config: changeset.DeployTokenPoolContractsConfig{ + e, err := commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployTokenPoolContractsChangeset), + changeset.DeployTokenPoolContractsConfig{ TokenSymbol: testhelpers.TestTokenSymbol, NewPools: map[uint64]changeset.DeployTokenPoolInput{ selectorA: test.Input, }, }, - }, - }) + ), + ) require.NoError(t, err) state, err := changeset.LoadOnchainState(e) diff --git a/deployment/ccip/changeset/cs_home_chain_test.go b/deployment/ccip/changeset/cs_home_chain_test.go index a836b75952d..c4cf086ebea 100644 --- a/deployment/ccip/changeset/cs_home_chain_test.go +++ b/deployment/ccip/changeset/cs_home_chain_test.go @@ -148,15 +148,15 @@ func TestRemoveDons(t *testing.T) { // Remove a don w/o MCMS donsBefore, err := homeChain.CapabilityRegistry.GetDONs(nil) require.NoError(t, err) - e.Env, err = commoncs.ApplyChangesets(t, e.Env, nil, []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset.RemoveDONs), - Config: changeset.RemoveDONsConfig{ + e.Env, err = commoncs.Apply(t, e.Env, nil, + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.RemoveDONs), + changeset.RemoveDONsConfig{ HomeChainSel: e.HomeChainSel, DonIDs: []uint32{donsBefore[0].Id}, }, - }, - }) + ), + ) require.NoError(t, err) donsAfter, err := homeChain.CapabilityRegistry.GetDONs(nil) require.NoError(t, err) @@ -165,30 +165,31 @@ func TestRemoveDons(t *testing.T) { // Remove a don w/ MCMS donsBefore, err = homeChain.CapabilityRegistry.GetDONs(nil) require.NoError(t, err) - e.Env, err = commoncs.ApplyChangesets(t, e.Env, map[uint64]*proposalutils.TimelockExecutionContracts{ - e.HomeChainSel: { - Timelock: s.Chains[e.HomeChainSel].Timelock, - CallProxy: s.Chains[e.HomeChainSel].CallProxy, + e.Env, err = commoncs.Apply(t, e.Env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + e.HomeChainSel: { + Timelock: s.Chains[e.HomeChainSel].Timelock, + CallProxy: s.Chains[e.HomeChainSel].CallProxy, + }, }, - }, []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(commoncs.TransferToMCMSWithTimelock), - Config: commoncs.TransferToMCMSWithTimelockConfig{ + commoncs.Configure( + deployment.CreateLegacyChangeSet(commoncs.TransferToMCMSWithTimelock), + commoncs.TransferToMCMSWithTimelockConfig{ ContractsByChain: map[uint64][]common.Address{ e.HomeChainSel: {homeChain.CapabilityRegistry.Address()}, }, MinDelay: 0, }, - }, - { - Changeset: commoncs.WrapChangeSet(changeset.RemoveDONs), - Config: changeset.RemoveDONsConfig{ + ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.RemoveDONs), + changeset.RemoveDONsConfig{ HomeChainSel: e.HomeChainSel, DonIDs: []uint32{donsBefore[0].Id}, MCMS: &changeset.MCMSConfig{MinDelay: 0}, }, - }, - }) + ), + ) require.NoError(t, err) donsAfter, err = homeChain.CapabilityRegistry.GetDONs(nil) require.NoError(t, err) diff --git a/deployment/ccip/changeset/cs_jobspec_test.go b/deployment/ccip/changeset/cs_jobspec_test.go index d7ec83b017d..96b86eaeb2d 100644 --- a/deployment/ccip/changeset/cs_jobspec_test.go +++ b/deployment/ccip/changeset/cs_jobspec_test.go @@ -19,10 +19,10 @@ func TestJobSpecChangeset(t *testing.T) { e := tenv.Env nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) require.NoError(t, err) - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChainChangeset), - Config: changeset.DeployHomeChainConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), + changeset.DeployHomeChainConfig{ HomeChainSel: tenv.HomeChainSel, RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), @@ -31,8 +31,8 @@ func TestJobSpecChangeset(t *testing.T) { testhelpers.TestNodeOperator: nodes.NonBootstraps().PeerIDs(), }, }, - }, - }) + ), + ) require.NoError(t, err) output, err := changeset.CCIPCapabilityJobspecChangeset(e, nil) require.NoError(t, err) diff --git a/deployment/ccip/changeset/cs_propose_admin_role_test.go b/deployment/ccip/changeset/cs_propose_admin_role_test.go index 9157f2c6874..37ea908087b 100644 --- a/deployment/ccip/changeset/cs_propose_admin_role_test.go +++ b/deployment/ccip/changeset/cs_propose_admin_role_test.go @@ -32,10 +32,10 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { } // We want an administrator to exist to force failure in the last test - e, err := commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + e, err := commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -46,10 +46,10 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -60,8 +60,8 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) tests := []struct { @@ -145,12 +145,12 @@ func TestProposeAdminRoleChangeset_Validations(t *testing.T) { for _, test := range tests { t.Run(test.Msg, func(t *testing.T) { - _, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: test.Config, - }, - }) + _, err = commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + test.Config, + ), + ) require.Error(t, err) require.ErrorContains(t, err, test.ErrStr) }) @@ -186,10 +186,10 @@ func TestProposeAdminRoleChangeset_ExecutionWithoutExternalAdmin(t *testing.T) { registryOnA := state.Chains[selectorA].TokenAdminRegistry registryOnB := state.Chains[selectorB].TokenAdminRegistry - e, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + e, err = commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -206,8 +206,8 @@ func TestProposeAdminRoleChangeset_ExecutionWithoutExternalAdmin(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) configOnA, err := registryOnA.GetTokenConfig(nil, tokens[selectorA].Address) @@ -260,10 +260,10 @@ func TestProposeAdminRoleChangeset_ExecutionWithExternalAdmin(t *testing.T) { registryOnA := state.Chains[selectorA].TokenAdminRegistry registryOnB := state.Chains[selectorB].TokenAdminRegistry - _, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + _, err = commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -282,8 +282,8 @@ func TestProposeAdminRoleChangeset_ExecutionWithExternalAdmin(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) configOnA, err := registryOnA.GetTokenConfig(nil, tokens[selectorA].Address) diff --git a/deployment/ccip/changeset/cs_set_pool_test.go b/deployment/ccip/changeset/cs_set_pool_test.go index f20ef7c214a..e19c15c4db5 100644 --- a/deployment/ccip/changeset/cs_set_pool_test.go +++ b/deployment/ccip/changeset/cs_set_pool_test.go @@ -102,12 +102,12 @@ func TestSetPoolChangeset_Validations(t *testing.T) { for _, test := range tests { t.Run(test.Msg, func(t *testing.T) { - _, err := commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetPoolChangeset), - Config: test.Config, - }, - }) + _, err := commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetPoolChangeset), + test.Config, + ), + ) require.Error(t, err) require.ErrorContains(t, err, test.ErrStr) }) @@ -143,10 +143,10 @@ func TestSetPoolChangeset_Execution(t *testing.T) { registryOnA := state.Chains[selectorA].TokenAdminRegistry registryOnB := state.Chains[selectorB].TokenAdminRegistry - _, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + _, err = commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -163,10 +163,10 @@ func TestSetPoolChangeset_Execution(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -183,10 +183,10 @@ func TestSetPoolChangeset_Execution(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetPoolChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetPoolChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -203,8 +203,8 @@ func TestSetPoolChangeset_Execution(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) configOnA, err := registryOnA.GetTokenConfig(nil, tokens[selectorA].Address) diff --git a/deployment/ccip/changeset/cs_transfer_admin_role_test.go b/deployment/ccip/changeset/cs_transfer_admin_role_test.go index 5a555403fb7..8fca285acfd 100644 --- a/deployment/ccip/changeset/cs_transfer_admin_role_test.go +++ b/deployment/ccip/changeset/cs_transfer_admin_role_test.go @@ -119,12 +119,12 @@ func TestTransferAdminRoleChangeset_Validations(t *testing.T) { for _, test := range tests { t.Run(test.Msg, func(t *testing.T) { - _, err := commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.TransferAdminRoleChangeset), - Config: test.Config, - }, - }) + _, err := commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.TransferAdminRoleChangeset), + test.Config, + ), + ) require.Error(t, err) require.ErrorContains(t, err, test.ErrStr) }) @@ -162,10 +162,10 @@ func TestTransferAdminRoleChangeset_Execution(t *testing.T) { registryOnA := state.Chains[selectorA].TokenAdminRegistry registryOnB := state.Chains[selectorB].TokenAdminRegistry - _, err = commonchangeset.ApplyChangesets(t, e, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + _, err = commonchangeset.Apply(t, e, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -182,10 +182,10 @@ func TestTransferAdminRoleChangeset_Execution(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -202,10 +202,10 @@ func TestTransferAdminRoleChangeset_Execution(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.TransferAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.TransferAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ MCMS: mcmsConfig, Pools: map[uint64]map[changeset.TokenSymbol]changeset.TokenPoolInfo{ selectorA: map[changeset.TokenSymbol]changeset.TokenPoolInfo{ @@ -224,8 +224,8 @@ func TestTransferAdminRoleChangeset_Execution(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) configOnA, err := registryOnA.GetTokenConfig(nil, tokens[selectorA].Address) diff --git a/deployment/ccip/changeset/deployer_group_test.go b/deployment/ccip/changeset/deployer_group_test.go index 0f670f0d2f6..21f6688c815 100644 --- a/deployment/ccip/changeset/deployer_group_test.go +++ b/deployment/ccip/changeset/deployer_group_test.go @@ -233,31 +233,31 @@ func TestDeployerGroupMCMS(t *testing.T) { contractsByChain := make(map[uint64][]common.Address) contractsByChain[e.HomeChainSel] = []common.Address{state.Chains[e.HomeChainSel].LinkToken.Address()} - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: contractsByChain, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(dummyDeployerGroupGrantMintChangeset), - Config: tc.cfg, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(dummyDeployerGroupGrantMintChangeset), + tc.cfg, + ), + ) require.NoError(t, err) - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(dummyDeployerGroupMintChangeset), - Config: tc.cfg, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(dummyDeployerGroupMintChangeset), + tc.cfg, + ), + ) require.NoError(t, err) state, err = changeset.LoadOnchainState(e.Env) @@ -310,23 +310,23 @@ func TestDeployerGroupGenerateMultipleProposals(t *testing.T) { contractsByChain[chain] = []common.Address{state.Chains[chain].LinkToken.Address()} } - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: contractsByChain, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(dummyDeployerGroupGrantMintMultiChainChangeset), - Config: tc, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(dummyDeployerGroupGrantMintMultiChainChangeset), + tc, + ), + ) require.NoError(t, err) cs, err := dummyDeployerGroupMintMultiDeploymentContextChangeset(e.Env, tc) @@ -370,31 +370,31 @@ func TestDeployerGroupMultipleProposalsMCMS(t *testing.T) { contractsByChain[chain] = []common.Address{state.Chains[chain].LinkToken.Address()} } - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: contractsByChain, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(dummyDeployerGroupGrantMintMultiChainChangeset), - Config: cfg, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(dummyDeployerGroupGrantMintMultiChainChangeset), + cfg, + ), + ) require.NoError(t, err) - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(dummyDeployerGroupMintMultiDeploymentContextChangeset), - Config: cfg, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(dummyDeployerGroupMintMultiDeploymentContextChangeset), + cfg, + ), + ) require.NoError(t, err) state, err = changeset.LoadOnchainState(e.Env) diff --git a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go index 4ffc3c8647f..b55bb413804 100644 --- a/deployment/ccip/changeset/solana/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/solana/cs_chain_contracts_test.go @@ -36,10 +36,10 @@ func TestAddRemoteChain(t *testing.T) { _, err := ccipChangeset.LoadOnchainStateSolana(tenv.Env) require.NoError(t, err) - tenv.Env, err = commonchangeset.ApplyChangesets(t, tenv.Env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(ccipChangeset.UpdateOnRampsDestsChangeset), - Config: ccipChangeset.UpdateOnRampDestsConfig{ + tenv.Env, err = commonchangeset.Apply(t, tenv.Env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipChangeset.UpdateOnRampsDestsChangeset), + ccipChangeset.UpdateOnRampDestsConfig{ UpdatesByChain: map[uint64]map[uint64]ccipChangeset.OnRampDestinationUpdate{ evmChain: { solChain: { @@ -50,10 +50,10 @@ func TestAddRemoteChain(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset_solana.AddRemoteChainToSolana), - Config: changeset_solana.AddRemoteChainToSolanaConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.AddRemoteChainToSolana), + changeset_solana.AddRemoteChainToSolanaConfig{ ChainSelector: solChain, UpdatesByChain: map[uint64]changeset_solana.RemoteChainConfigSolana{ evmChain: { @@ -74,8 +74,8 @@ func TestAddRemoteChain(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) state, err := ccipChangeset.LoadOnchainStateSolana(tenv.Env) @@ -107,16 +107,16 @@ func TestAddTokenPool(t *testing.T) { evmChain := tenv.Env.AllChainSelectors()[0] solChain := tenv.Env.AllChainSelectorsSolana()[0] - e, err := commonchangeset.ApplyChangesets(t, tenv.Env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset_solana.DeploySolanaToken), - Config: changeset_solana.DeploySolanaTokenConfig{ + e, err := commonchangeset.Apply(t, tenv.Env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), + changeset_solana.DeploySolanaTokenConfig{ ChainSelector: solChain, TokenProgramName: deployment.SPL2022Tokens, TokenDecimals: 9, }, - }, - }) + ), + ) require.NoError(t, err) state, err := ccipChangeset.LoadOnchainStateSolana(e) @@ -125,10 +125,10 @@ func TestAddTokenPool(t *testing.T) { // TODO: can test this with solana.SolMint as well (WSOL) // https://smartcontract-it.atlassian.net/browse/INTAUTO-440 - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset_solana.AddTokenPool), - Config: changeset_solana.TokenPoolConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.AddTokenPool), + changeset_solana.TokenPoolConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenProgramName: deployment.SPL2022Tokens, @@ -136,10 +136,10 @@ func TestAddTokenPool(t *testing.T) { // this works for testing, but if we really want some other authority we need to pass in a private key for signing purposes Authority: e.SolChains[solChain].DeployerKey.PublicKey().String(), }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset_solana.SetupTokenPoolForRemoteChain), - Config: changeset_solana.RemoteChainTokenPoolConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.SetupTokenPoolForRemoteChain), + changeset_solana.RemoteChainTokenPoolConfig{ SolChainSelector: solChain, RemoteChainSelector: evmChain, SolTokenPubKey: tokenAddress.String(), @@ -160,8 +160,8 @@ func TestAddTokenPool(t *testing.T) { Rate: 0, }, }, - }, - }) + ), + ) require.NoError(t, err) // test AddTokenPool results @@ -190,16 +190,16 @@ func TestBilling(t *testing.T) { evmChain := tenv.Env.AllChainSelectors()[0] solChain := tenv.Env.AllChainSelectorsSolana()[0] - e, err := commonchangeset.ApplyChangesets(t, tenv.Env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset_solana.DeploySolanaToken), - Config: changeset_solana.DeploySolanaTokenConfig{ + e, err := commonchangeset.Apply(t, tenv.Env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), + changeset_solana.DeploySolanaTokenConfig{ ChainSelector: solChain, TokenProgramName: deployment.SPL2022Tokens, TokenDecimals: 9, }, - }, - }) + ), + ) require.NoError(t, err) state, err := ccipChangeset.LoadOnchainStateSolana(e) @@ -210,10 +210,10 @@ func TestBilling(t *testing.T) { bigNum, ok := new(big.Int).SetString("19816680000000000000", 10) require.True(t, ok) bigNum.FillBytes(value[:]) - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset_solana.AddBillingToken), - Config: changeset_solana.BillingTokenConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.AddBillingToken), + changeset_solana.BillingTokenConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenProgramName: deployment.SPL2022Tokens, @@ -227,10 +227,10 @@ func TestBilling(t *testing.T) { PremiumMultiplierWeiPerEth: 100, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset_solana.AddBillingTokenForRemoteChain), - Config: changeset_solana.BillingTokenForRemoteChainConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.AddBillingTokenForRemoteChain), + changeset_solana.BillingTokenForRemoteChainConfig{ ChainSelector: solChain, RemoteChainSelector: evmChain, TokenPubKey: tokenAddress.String(), @@ -243,8 +243,8 @@ func TestBilling(t *testing.T) { IsEnabled: true, }, }, - }, - }) + ), + ) require.NoError(t, err) billingConfigPDA, _, _ := solState.FindFqBillingTokenConfigPDA(tokenAddress, state.SolChains[solChain].FeeQuoter) @@ -269,16 +269,16 @@ func TestTokenAdminRegistry(t *testing.T) { solChain := tenv.Env.AllChainSelectorsSolana()[0] - e, err := commonchangeset.ApplyChangesets(t, tenv.Env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset_solana.DeploySolanaToken), - Config: changeset_solana.DeploySolanaTokenConfig{ + e, err := commonchangeset.Apply(t, tenv.Env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), + changeset_solana.DeploySolanaTokenConfig{ ChainSelector: solChain, TokenProgramName: deployment.SPL2022Tokens, TokenDecimals: 9, }, - }, - }) + ), + ) require.NoError(t, err) state, err := ccipChangeset.LoadOnchainStateSolana(e) @@ -289,26 +289,28 @@ func TestTokenAdminRegistry(t *testing.T) { // We have to do run the ViaOwnerInstruction testcase for linkToken as we already register a PDA for tokenAddress in the previous testcase linkTokenAddress := state.SolChains[solChain].LinkToken - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { // register token admin registry for tokenAddress via admin instruction - Changeset: commonchangeset.WrapChangeSet(changeset_solana.RegisterTokenAdminRegistry), - Config: changeset_solana.RegisterTokenAdminRegistryConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + // register token admin registry for tokenAddress via admin instruction + deployment.CreateLegacyChangeSet(changeset_solana.RegisterTokenAdminRegistry), + changeset_solana.RegisterTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenAdminRegistryAdmin: tokenAdminRegistryAdminPrivKey.PublicKey().String(), RegisterType: changeset_solana.ViaGetCcipAdminInstruction, }, - }, - { // register token admin registry for linkToken via owner instruction - Changeset: commonchangeset.WrapChangeSet(changeset_solana.RegisterTokenAdminRegistry), - Config: changeset_solana.RegisterTokenAdminRegistryConfig{ + ), + commonchangeset.Configure( + // register token admin registry for linkToken via owner instruction + deployment.CreateLegacyChangeSet(changeset_solana.RegisterTokenAdminRegistry), + changeset_solana.RegisterTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: linkTokenAddress.String(), TokenAdminRegistryAdmin: tokenAdminRegistryAdminPrivKey.PublicKey().String(), RegisterType: changeset_solana.ViaOwnerInstruction, }, - }, - }) + ), + ) require.NoError(t, err) tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenAddress, state.SolChains[solChain].Router) @@ -325,16 +327,17 @@ func TestTokenAdminRegistry(t *testing.T) { require.NoError(t, err) require.Equal(t, tokenAdminRegistryAdminPrivKey.PublicKey(), linkTokenAdminRegistryAccount.PendingAdministrator) - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { // accept admin role for tokenAddress - Changeset: commonchangeset.WrapChangeSet(changeset_solana.AcceptAdminRoleTokenAdminRegistry), - Config: changeset_solana.AcceptAdminRoleTokenAdminRegistryConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + // accept admin role for tokenAddress + deployment.CreateLegacyChangeSet(changeset_solana.AcceptAdminRoleTokenAdminRegistry), + changeset_solana.AcceptAdminRoleTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), NewRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), }, - }, - }) + ), + ) require.NoError(t, err) err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, tokenAdminRegistryPDA, &tokenAdminRegistryAccount) require.NoError(t, err) @@ -344,17 +347,18 @@ func TestTokenAdminRegistry(t *testing.T) { // TODO: transfer and accept is breaking newTokenAdminRegistryAdminPrivKey, _ := solana.NewRandomPrivateKey() - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { // transfer admin role for tokenAddress - Changeset: commonchangeset.WrapChangeSet(changeset_solana.TransferAdminRoleTokenAdminRegistry), - Config: changeset_solana.TransferAdminRoleTokenAdminRegistryConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + // transfer admin role for tokenAddress + deployment.CreateLegacyChangeSet(changeset_solana.TransferAdminRoleTokenAdminRegistry), + changeset_solana.TransferAdminRoleTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), NewRegistryAdminPublicKey: newTokenAdminRegistryAdminPrivKey.PublicKey().String(), CurrentRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), }, - }, - }) + ), + ) require.NoError(t, err) err = e.SolChains[solChain].GetAccountDataBorshInto(ctx, tokenAdminRegistryPDA, &tokenAdminRegistryAccount) require.NoError(t, err) @@ -368,32 +372,34 @@ func TestPoolLookupTable(t *testing.T) { solChain := tenv.Env.AllChainSelectorsSolana()[0] - e, err := commonchangeset.ApplyChangesets(t, tenv.Env, nil, []commonchangeset.ChangesetApplication{ - { // deploy token - Changeset: commonchangeset.WrapChangeSet(changeset_solana.DeploySolanaToken), - Config: changeset_solana.DeploySolanaTokenConfig{ + e, err := commonchangeset.Apply(t, tenv.Env, nil, + commonchangeset.Configure( + // deploy token + deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), + changeset_solana.DeploySolanaTokenConfig{ ChainSelector: solChain, TokenProgramName: deployment.SPL2022Tokens, TokenDecimals: 9, }, - }, - }) + ), + ) require.NoError(t, err) state, err := ccipChangeset.LoadOnchainStateSolana(e) require.NoError(t, err) tokenAddress := state.SolChains[solChain].SPL2022Tokens[0] - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { // add token pool lookup table - Changeset: commonchangeset.WrapChangeSet(changeset_solana.AddTokenPoolLookupTable), - Config: changeset_solana.TokenPoolLookupTableConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + // add token pool lookup table + deployment.CreateLegacyChangeSet(changeset_solana.AddTokenPoolLookupTable), + changeset_solana.TokenPoolLookupTableConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenProgram: deployment.SPL2022Tokens, }, - }, - }) + ), + ) require.NoError(t, err) state, err = ccipChangeset.LoadOnchainStateSolana(e) @@ -407,35 +413,38 @@ func TestPoolLookupTable(t *testing.T) { tokenAdminRegistryAdminPrivKey, _ := solana.NewRandomPrivateKey() - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { // register token admin registry for linkToken via owner instruction - Changeset: commonchangeset.WrapChangeSet(changeset_solana.RegisterTokenAdminRegistry), - Config: changeset_solana.RegisterTokenAdminRegistryConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + // register token admin registry for linkToken via owner instruction + deployment.CreateLegacyChangeSet(changeset_solana.RegisterTokenAdminRegistry), + changeset_solana.RegisterTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), TokenAdminRegistryAdmin: tokenAdminRegistryAdminPrivKey.PublicKey().String(), RegisterType: changeset_solana.ViaGetCcipAdminInstruction, }, - }, - { // accept admin role for tokenAddress - Changeset: commonchangeset.WrapChangeSet(changeset_solana.AcceptAdminRoleTokenAdminRegistry), - Config: changeset_solana.AcceptAdminRoleTokenAdminRegistryConfig{ + ), + commonchangeset.Configure( + // accept admin role for tokenAddress + deployment.CreateLegacyChangeSet(changeset_solana.AcceptAdminRoleTokenAdminRegistry), + changeset_solana.AcceptAdminRoleTokenAdminRegistryConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), NewRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), }, - }, - { // set pool -> this updates tokenAdminRegistryPDA, hence above changeset is required - Changeset: commonchangeset.WrapChangeSet(changeset_solana.SetPool), - Config: changeset_solana.SetPoolConfig{ + ), + commonchangeset.Configure( + // set pool -> this updates tokenAdminRegistryPDA, hence above changeset is required + deployment.CreateLegacyChangeSet(changeset_solana.SetPool), + changeset_solana.SetPoolConfig{ ChainSelector: solChain, TokenPubKey: tokenAddress.String(), PoolLookupTable: lookupTablePubKey.String(), TokenAdminRegistryAdminPrivateKey: tokenAdminRegistryAdminPrivKey.String(), WritableIndexes: []uint8{3, 4, 7}, }, - }, - }) + ), + ) require.NoError(t, err) tokenAdminRegistry := solRouter.TokenAdminRegistry{} tokenAdminRegistryPDA, _, _ := solState.FindTokenAdminRegistryPDA(tokenAddress, state.SolChains[solChain].Router) diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index 9af3955753c..97689265be2 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -49,10 +49,10 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { } testhelpers.SavePreloadedSolAddresses(t, e, solChainSelectors[0]) - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChainChangeset), - Config: changeset.DeployHomeChainConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), + changeset.DeployHomeChainConfig{ HomeChainSel: homeChainSel, RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), @@ -61,35 +61,36 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { testhelpers.TestNodeOperator: nodes.NonBootstraps().PeerIDs(), }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), - Config: e.AllChainSelectors(), - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), - Config: e.AllChainSelectorsSolana(), - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), - Config: cfg, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployPrerequisitesChangeset), - Config: changeset.DeployPrerequisiteConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployLinkToken), + e.AllChainSelectors(), + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployLinkToken), + e.AllChainSelectorsSolana(), + ), + + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + cfg, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployPrerequisitesChangeset), + changeset.DeployPrerequisiteConfig{ Configs: prereqCfg, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployChainContractsChangeset), - Config: changeset.DeployChainContractsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), + changeset.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: contractParams, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(solana.DeployChainContractsChangesetSolana), - Config: changeset.DeployChainContractsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(solana.DeployChainContractsChangesetSolana), + changeset.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: map[uint64]changeset.ChainContractParams{ solChainSelectors[0]: { @@ -98,8 +99,8 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // solana verification testhelpers.ValidateSolanaState(t, e, solChainSelectors) diff --git a/deployment/ccip/changeset/solana/cs_solana_token_test.go b/deployment/ccip/changeset/solana/cs_solana_token_test.go index f15aeb4cf22..0437c868b06 100644 --- a/deployment/ccip/changeset/solana/cs_solana_token_test.go +++ b/deployment/ccip/changeset/solana/cs_solana_token_test.go @@ -14,7 +14,6 @@ import ( ccipChangeset "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" changeset_solana "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/solana" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" - "github.com/smartcontractkit/chainlink/deployment/common/changeset" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -27,16 +26,17 @@ func TestSolanaTokenOps(t *testing.T) { SolChains: 1, }) solChain1 := e.AllChainSelectorsSolana()[0] - e, err := commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { // deployer creates token - Changeset: commonchangeset.WrapChangeSet(changeset_solana.DeploySolanaToken), - Config: changeset_solana.DeploySolanaTokenConfig{ + e, err := commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + // deployer creates token + deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), + changeset_solana.DeploySolanaTokenConfig{ ChainSelector: solChain1, TokenProgramName: deployment.SPL2022Tokens, TokenDecimals: 9, }, - }, - }) + ), + ) require.NoError(t, err) state, err := ccipChangeset.LoadOnchainStateSolana(e) @@ -47,19 +47,21 @@ func TestSolanaTokenOps(t *testing.T) { testUser, _ := solana.NewRandomPrivateKey() testUserPubKey := testUser.PublicKey() - e, err = changeset.ApplyChangesets(t, e, nil, []changeset.ChangesetApplication{ - { // deployer creates ATA for itself and testUser - Changeset: changeset.WrapChangeSet(changeset_solana.CreateSolanaTokenATA), - Config: changeset_solana.CreateSolanaTokenATAConfig{ + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + // deployer creates ATA for itself and testUser + deployment.CreateLegacyChangeSet(changeset_solana.CreateSolanaTokenATA), + changeset_solana.CreateSolanaTokenATAConfig{ ChainSelector: solChain1, TokenPubkey: tokenAddress, TokenProgram: deployment.SPL2022Tokens, ATAList: []string{deployerKey.String(), testUserPubKey.String()}, }, - }, - { // deployer mints token to itself and testUser - Changeset: commonchangeset.WrapChangeSet(changeset_solana.MintSolanaToken), - Config: changeset_solana.MintSolanaTokenConfig{ + ), + commonchangeset.Configure( + // deployer mints token to itself and testUser + deployment.CreateLegacyChangeSet(changeset_solana.MintSolanaToken), + changeset_solana.MintSolanaTokenConfig{ ChainSelector: solChain1, TokenPubkey: tokenAddress, TokenProgram: deployment.SPL2022Tokens, @@ -68,8 +70,8 @@ func TestSolanaTokenOps(t *testing.T) { testUserPubKey.String(): uint64(1000), }, }, - }, - }) + ), + ) require.NoError(t, err) testUserATA, _, err := solTokenUtil.FindAssociatedTokenAddress(solana.Token2022ProgramID, tokenAddress, testUserPubKey) diff --git a/deployment/ccip/changeset/testhelpers/test_environment.go b/deployment/ccip/changeset/testhelpers/test_environment.go index d474f28f937..0b77d1b5c6b 100644 --- a/deployment/ccip/changeset/testhelpers/test_environment.go +++ b/deployment/ccip/changeset/testhelpers/test_environment.go @@ -435,29 +435,29 @@ func NewEnvironmentWithPrerequisitesContracts(t *testing.T, tEnv TestEnvironment Opts: opts, }) } - deployLinkApp := commonchangeset.ChangesetApplication{ - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), - Config: allChains, - } + deployLinkApp := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployLinkToken), + allChains, + ) if tc.IsStaticLink { - deployLinkApp = commonchangeset.ChangesetApplication{ - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployStaticLinkToken), - Config: allChains, - } + deployLinkApp = commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployStaticLinkToken), + allChains, + ) } - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{ + e.Env, err = commonchangeset.Apply(t, e.Env, nil, deployLinkApp, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployPrerequisitesChangeset), - Config: changeset.DeployPrerequisiteConfig{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployPrerequisitesChangeset), + changeset.DeployPrerequisiteConfig{ Configs: prereqCfg, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), - Config: mcmsCfg, - }, - }) + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + mcmsCfg, + ), + ) require.NoError(t, err) tEnv.UpdateDeployedEnvironment(e) return e @@ -496,14 +496,14 @@ func NewEnvironmentWithJobsAndContracts(t *testing.T, tEnv TestEnvironment) Depl e = AddCCIPContractsToEnvironment(t, allChains, tEnv, false) // now we update RMNProxy to point to RMNRemote - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), - Config: changeset.SetRMNRemoteOnRMNProxyConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), + changeset.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: evmChains, }, - }, - }) + ), + ) require.NoError(t, err) return e } @@ -516,7 +516,7 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn // Need to deploy prerequisites first so that we can form the USDC config // no proposals to be made, timelock can be passed as nil here - var apps []commonchangeset.ChangesetApplication + var apps []commonchangeset.ConfiguredChangeSet evmContractParams := make(map[uint64]changeset.ChainContractParams) solContractParams := make(map[uint64]changeset.ChainContractParams) evmChains := []uint64{} @@ -547,10 +547,10 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn } } - apps = append(apps, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChainChangeset), - Config: changeset.DeployHomeChainConfig{ + apps = append(apps, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), + changeset.DeployHomeChainConfig{ HomeChainSel: e.HomeChainSel, RMNDynamicConfig: NewTestRMNDynamicConfig(), RMNStaticConfig: NewTestRMNStaticConfig(), @@ -559,21 +559,21 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn TestNodeOperator: envNodes.NonBootstraps().PeerIDs(), }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployChainContractsChangeset), - Config: changeset.DeployChainContractsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), + changeset.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, ContractParamsPerChain: evmContractParams, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(solana.DeployChainContractsChangesetSolana), - Config: changeset.DeployChainContractsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(solana.DeployChainContractsChangesetSolana), + changeset.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, ContractParamsPerChain: solContractParams, }, - }, + ), }...) e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, apps) require.NoError(t, err) @@ -689,20 +689,20 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn MinDelay: 0, } } - apps = []commonchangeset.ChangesetApplication{ - { + apps = []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( // Add the chain configs for the new chains. - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateChainConfigChangeset), - Config: changeset.UpdateChainConfigConfig{ + deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), + changeset.UpdateChainConfigConfig{ HomeChainSelector: e.HomeChainSel, RemoteChainAdds: chainConfigs, MCMS: mcmsConfig, }, - }, - { + ), + commonchangeset.Configure( // Add the DONs and candidate commit OCR instances for the chain. - Changeset: commonchangeset.WrapChangeSet(changeset.AddDonAndSetCandidateChangeset), - Config: changeset.AddDonAndSetCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(changeset.AddDonAndSetCandidateChangeset), + changeset.AddDonAndSetCandidateChangesetConfig{ SetCandidateConfigBase: changeset.SetCandidateConfigBase{ HomeChainSelector: e.HomeChainSel, // TODO: we dont know what this means for solana @@ -714,11 +714,11 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn PluginType: types.PluginTypeCCIPCommit, }, }, - }, - { + ), + commonchangeset.Configure( // Add the exec OCR instances for the new chains. - Changeset: commonchangeset.WrapChangeSet(changeset.SetCandidateChangeset), - Config: changeset.SetCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), + changeset.SetCandidateChangesetConfig{ SetCandidateConfigBase: changeset.SetCandidateConfigBase{ HomeChainSelector: e.HomeChainSel, // TODO: we dont know what this means for solana @@ -732,11 +732,11 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn }, }, }, - }, - { + ), + commonchangeset.Configure( // Promote everything - Changeset: commonchangeset.WrapChangeSet(changeset.PromoteCandidateChangeset), - Config: changeset.PromoteCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(changeset.PromoteCandidateChangeset), + changeset.PromoteCandidateChangesetConfig{ HomeChainSelector: e.HomeChainSel, PluginInfo: []changeset.PromoteCandidatePluginInfo{ { @@ -750,28 +750,29 @@ func AddCCIPContractsToEnvironment(t *testing.T, allChains []uint64, tEnv TestEn }, MCMS: mcmsConfig, }, - }, - { + ), + commonchangeset.Configure( // Enable the OCR config on the remote chains. - Changeset: commonchangeset.WrapChangeSet(changeset.SetOCR3OffRampChangeset), - Config: changeset.SetOCR3OffRampConfig{ + deployment.CreateLegacyChangeSet(changeset.SetOCR3OffRampChangeset), + changeset.SetOCR3OffRampConfig{ HomeChainSel: e.HomeChainSel, RemoteChainSels: evmChains, CCIPHomeConfigType: globals.ConfigTypeActive, }, - }, - { + ), + commonchangeset.Configure( // Enable the OCR config on the remote chains. - Changeset: commonchangeset.WrapChangeSet(changeset_solana.SetOCR3ConfigSolana), - Config: changeset.SetOCR3OffRampConfig{ + deployment.CreateLegacyChangeSet(changeset_solana.SetOCR3ConfigSolana), + changeset.SetOCR3OffRampConfig{ HomeChainSel: e.HomeChainSel, RemoteChainSels: solChains, CCIPHomeConfigType: globals.ConfigTypeActive, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.CCIPCapabilityJobspecChangeset), - }, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.CCIPCapabilityJobspecChangeset), + nil, // Changeset ignores any config + ), } e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, timelockContractsPerChain, apps) require.NoError(t, err) diff --git a/deployment/ccip/changeset/testhelpers/test_helpers.go b/deployment/ccip/changeset/testhelpers/test_helpers.go index 6245d10fbb2..17934465b0a 100644 --- a/deployment/ccip/changeset/testhelpers/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_helpers.go @@ -432,10 +432,10 @@ func AddLane( t.Fatalf("from family is not evm, %s", fromFamily) } - changesets := []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), - Config: changeset.UpdateOnRampDestsConfig{ + changesets := []commoncs.ConfiguredChangeSet{ + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), + changeset.UpdateOnRampDestsConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ from: { to: { @@ -446,10 +446,10 @@ func AddLane( }, }, }, - }, - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - Config: changeset.UpdateFeeQuoterPricesConfig{ + ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), + changeset.UpdateFeeQuoterPricesConfig{ PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ from: { TokenPrices: tokenPrices, @@ -457,20 +457,20 @@ func AddLane( }, }, }, - }, - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - Config: changeset.UpdateFeeQuoterDestsConfig{ + ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), + changeset.UpdateFeeQuoterDestsConfig{ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ from: { to: fqCfg, }, }, }, - }, - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateRouterRampsChangeset), - Config: changeset.UpdateRouterRampsConfig{ + ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), + changeset.UpdateRouterRampsConfig{ TestRouter: isTestRouter, UpdatesByChain: map[uint64]changeset.RouterUpdates{ // onRamp update on source chain @@ -481,17 +481,17 @@ func AddLane( }, }, }, - }, + ), } require.NoError(t, err) switch toFamily { case chainsel.FamilyEVM: - evmChangesets := []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateOffRampSourcesChangeset), - Config: changeset.UpdateOffRampSourcesConfig{ + evmChangesets := []commoncs.ConfiguredChangeSet{ + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), + changeset.UpdateOffRampSourcesConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ to: { from: { @@ -502,10 +502,10 @@ func AddLane( }, }, }, - }, - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateRouterRampsChangeset), - Config: changeset.UpdateRouterRampsConfig{ + ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), + changeset.UpdateRouterRampsConfig{ TestRouter: isTestRouter, UpdatesByChain: map[uint64]changeset.RouterUpdates{ // offramp update on dest chain @@ -516,7 +516,7 @@ func AddLane( }, }, }, - }, + ), } changesets = append(changesets, evmChangesets...) case chainsel.FamilySolana: @@ -524,10 +524,10 @@ func AddLane( bigNum, ok := new(big.Int).SetString("19816680000000000000", 10) require.True(t, ok) bigNum.FillBytes(value[:]) - solanaChangesets := []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset_solana.AddRemoteChainToSolana), - Config: changeset_solana.AddRemoteChainToSolanaConfig{ + solanaChangesets := []commoncs.ConfiguredChangeSet{ + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.AddRemoteChainToSolana), + changeset_solana.AddRemoteChainToSolanaConfig{ ChainSelector: to, UpdatesByChain: map[uint64]changeset_solana.RemoteChainConfigSolana{ from: { @@ -547,7 +547,7 @@ func AddLane( }, }, }, - }, + ), } changesets = append(changesets, solanaChangesets...) } @@ -559,10 +559,10 @@ func AddLane( // RemoveLane removes a lane between the source and destination chains in the deployed environment. func RemoveLane(t *testing.T, e *DeployedEnv, src, dest uint64, isTestRouter bool) { var err error - apps := []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateRouterRampsChangeset), - Config: changeset.UpdateRouterRampsConfig{ + apps := []commoncs.ConfiguredChangeSet{ + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), + changeset.UpdateRouterRampsConfig{ UpdatesByChain: map[uint64]changeset.RouterUpdates{ // onRamp update on source chain src: { @@ -572,20 +572,20 @@ func RemoveLane(t *testing.T, e *DeployedEnv, src, dest uint64, isTestRouter boo }, }, }, - }, - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - Config: changeset.UpdateFeeQuoterDestsConfig{ + ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), + changeset.UpdateFeeQuoterDestsConfig{ UpdatesByChain: map[uint64]map[uint64]fee_quoter.FeeQuoterDestChainConfig{ src: { dest: changeset.DefaultFeeQuoterDestChainConfig(false), }, }, }, - }, - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), - Config: changeset.UpdateOnRampDestsConfig{ + ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), + changeset.UpdateOnRampDestsConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ src: { dest: { @@ -596,7 +596,7 @@ func RemoveLane(t *testing.T, e *DeployedEnv, src, dest uint64, isTestRouter boo }, }, }, - }, + ), } e.Env, err = commoncs.ApplyChangesets(t, e.Env, e.TimelockContracts(t), apps) require.NoError(t, err) @@ -825,35 +825,38 @@ func DeployTransferableTokenSolana( require.NoError(t, err) // deploy solana token - e, err = commoncs.ApplyChangesets(t, e, nil, []commoncs.ChangesetApplication{ - { // this makes the deployer the mint authority by default - Changeset: commoncs.WrapChangeSet(changeset_solana.DeploySolanaToken), - Config: changeset_solana.DeploySolanaTokenConfig{ + e, err = commoncs.Apply(t, e, nil, + commoncs.Configure( + // this makes the deployer the mint authority by default + deployment.CreateLegacyChangeSet(changeset_solana.DeploySolanaToken), + changeset_solana.DeploySolanaTokenConfig{ ChainSelector: solChainSel, TokenProgramName: deployment.SPL2022Tokens, TokenDecimals: 9, }, - }, - }) + ), + ) require.NoError(t, err) state, err = changeset.LoadOnchainState(e) require.NoError(t, err) solTokenAddress := state.SolChains[solChainSel].SPL2022Tokens[0] solDeployerKey := e.SolChains[solChainSel].DeployerKey.PublicKey() - e, err = commoncs.ApplyChangesets(t, e, nil, []commoncs.ChangesetApplication{ - { // create the ata for the deployerKey - Changeset: commoncs.WrapChangeSet(changeset_solana.CreateSolanaTokenATA), - Config: changeset_solana.CreateSolanaTokenATAConfig{ + e, err = commoncs.Apply(t, e, nil, + commoncs.Configure( + // create the ata for the deployerKey + deployment.CreateLegacyChangeSet(changeset_solana.CreateSolanaTokenATA), + changeset_solana.CreateSolanaTokenATAConfig{ ChainSelector: solChainSel, TokenPubkey: solTokenAddress, TokenProgram: deployment.SPL2022Tokens, ATAList: []string{solDeployerKey.String()}, }, - }, - { // mint the token to the deployerKey - Changeset: commoncs.WrapChangeSet(changeset_solana.MintSolanaToken), - Config: changeset_solana.MintSolanaTokenConfig{ + ), + commoncs.Configure( + // mint the token to the deployerKey + deployment.CreateLegacyChangeSet(changeset_solana.MintSolanaToken), + changeset_solana.MintSolanaTokenConfig{ ChainSelector: solChainSel, TokenPubkey: solTokenAddress, TokenProgram: deployment.SPL2022Tokens, @@ -861,18 +864,19 @@ func DeployTransferableTokenSolana( solDeployerKey.String(): uint64(1000), }, }, - }, - { // deploy token pool and set the burn/mint authority to the tokenPool - Changeset: commoncs.WrapChangeSet(changeset_solana.AddTokenPool), - Config: changeset_solana.TokenPoolConfig{ + ), + commoncs.Configure( + // deploy token pool and set the burn/mint authority to the tokenPool + deployment.CreateLegacyChangeSet(changeset_solana.AddTokenPool), + changeset_solana.TokenPoolConfig{ ChainSelector: solChainSel, TokenPubKey: solTokenAddress.String(), TokenProgramName: deployment.SPL2022Tokens, PoolType: solTestTokenPool.BurnAndMint_PoolType, Authority: solDeployerKey.String(), }, - }, - }) + ), + ) require.NoError(t, err) // configure evm @@ -885,10 +889,10 @@ func DeployTransferableTokenSolana( require.NoError(t, err) // configure solana - e, err = commoncs.ApplyChangesets(t, e, nil, []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset_solana.SetupTokenPoolForRemoteChain), - Config: changeset_solana.RemoteChainTokenPoolConfig{ + e, err = commoncs.Apply(t, e, nil, + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset_solana.SetupTokenPoolForRemoteChain), + changeset_solana.RemoteChainTokenPoolConfig{ SolChainSelector: solChainSel, RemoteChainSelector: evmChainSel, SolTokenPubKey: solTokenAddress.String(), @@ -915,8 +919,8 @@ func DeployTransferableTokenSolana( Rate: 1, }, }, - }, - }) + ), + ) require.NoError(t, err) return evmToken, evmPool, solTokenAddress, nil @@ -1632,12 +1636,9 @@ func DeployLinkTokenTest(t *testing.T, solChains int) { config = append(config, solChain1) } - e, err := commoncs.ApplyChangesets(t, e, nil, []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(commoncs.DeployLinkToken), - Config: config, - }, - }) + e, err := commoncs.Apply(t, e, nil, + commoncs.Configure(deployment.CreateLegacyChangeSet(commoncs.DeployLinkToken), config), + ) require.NoError(t, err) addrs, err := e.ExistingAddresses.AddressesForChain(chain1) require.NoError(t, err) diff --git a/deployment/ccip/changeset/testhelpers/test_token_helpers.go b/deployment/ccip/changeset/testhelpers/test_token_helpers.go index cc7fde2c01c..c3645794863 100644 --- a/deployment/ccip/changeset/testhelpers/test_token_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_token_helpers.go @@ -76,18 +76,16 @@ func SetupTwoChainEnvironmentWithTokens( } // Deploy MCMS setup & prerequisite contracts - e, err := commoncs.ApplyChangesets(t, e, nil, []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset.DeployPrerequisitesChangeset), - Config: changeset.DeployPrerequisiteConfig{ - Configs: prereqCfg, - }, - }, - { - Changeset: commoncs.WrapChangeSet(commoncs.DeployMCMSWithTimelock), - Config: mcmsCfg, - }, - }) + e, err := commoncs.Apply(t, e, nil, + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployPrerequisitesChangeset), + changeset.DeployPrerequisiteConfig{Configs: prereqCfg}, + ), + commoncs.Configure( + deployment.CreateLegacyChangeSet(commoncs.DeployMCMSWithTimelock), + mcmsCfg, + ), + ) require.NoError(t, err) state, err := changeset.LoadOnchainState(e) @@ -110,15 +108,15 @@ func SetupTwoChainEnvironmentWithTokens( if transferToTimelock { // Transfer ownership of token admin registry to the Timelock - e, err = commoncs.ApplyChangesets(t, e, timelockContracts, []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(commoncs.TransferToMCMSWithTimelock), - Config: commoncs.TransferToMCMSWithTimelockConfig{ + e, err = commoncs.Apply(t, e, timelockContracts, + commoncs.Configure( + deployment.CreateLegacyChangeSet(commoncs.TransferToMCMSWithTimelock), + commoncs.TransferToMCMSWithTimelockConfig{ ContractsByChain: timelockOwnedContractsByChain, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) } @@ -147,15 +145,15 @@ func DeployTestTokenPools( ) deployment.Environment { selectors := e.AllChainSelectors() - e, err := commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployTokenPoolContractsChangeset), - Config: changeset.DeployTokenPoolContractsConfig{ + e, err := commonchangeset.Apply(t, e, nil, + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployTokenPoolContractsChangeset), + changeset.DeployTokenPoolContractsConfig{ TokenSymbol: TestTokenSymbol, NewPools: newPools, }, - }, - }) + ), + ) require.NoError(t, err) state, err := changeset.LoadOnchainState(e) @@ -188,15 +186,15 @@ func DeployTestTokenPools( } // Transfer ownership of token admin registry to the Timelock - e, err = commoncs.ApplyChangesets(t, e, timelockContracts, []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(commoncs.TransferToMCMSWithTimelock), - Config: commoncs.TransferToMCMSWithTimelockConfig{ + e, err = commoncs.Apply(t, e, timelockContracts, + commoncs.Configure( + deployment.CreateLegacyChangeSet(commoncs.TransferToMCMSWithTimelock), + commoncs.TransferToMCMSWithTimelockConfig{ ContractsByChain: timelockOwnedContractsByChain, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) } diff --git a/deployment/ccip/changeset/testhelpers/v1_5/test_helpers.go b/deployment/ccip/changeset/testhelpers/v1_5/test_helpers.go index c2793f400ae..dbbc0105675 100644 --- a/deployment/ccip/changeset/testhelpers/v1_5/test_helpers.go +++ b/deployment/ccip/changeset/testhelpers/v1_5/test_helpers.go @@ -34,27 +34,20 @@ import ( func AddLanes(t *testing.T, e deployment.Environment, state changeset.CCIPOnChainState, pairs []testhelpers.SourceDestPair) deployment.Environment { addLanesCfg, commitOCR2Configs, execOCR2Configs, jobspecs := LaneConfigsForChains(t, e, state, pairs) var err error - e, err = commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(v1_5changeset.DeployLanesChangeset), - Config: v1_5changeset.DeployLanesConfig{ - Configs: addLanesCfg, - }, - }, - { - Changeset: commonchangeset.WrapChangeSet(v1_5changeset.SetOCR2ConfigForTestChangeset), - Config: v1_5changeset.OCR2Config{ - CommitConfigs: commitOCR2Configs, - ExecConfigs: execOCR2Configs, - }, - }, - { - Changeset: commonchangeset.WrapChangeSet(v1_5changeset.JobSpecsForLanesChangeset), - Config: v1_5changeset.JobSpecsForLanesConfig{ - Configs: jobspecs, - }, - }, - }) + e, err = commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(v1_5changeset.DeployLanesChangeset), + v1_5changeset.DeployLanesConfig{Configs: addLanesCfg}, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(v1_5changeset.SetOCR2ConfigForTestChangeset), + v1_5changeset.OCR2Config{CommitConfigs: commitOCR2Configs, ExecConfigs: execOCR2Configs}, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(v1_5changeset.JobSpecsForLanesChangeset), + v1_5changeset.JobSpecsForLanesConfig{Configs: jobspecs}, + ), + ) require.NoError(t, err) return e } diff --git a/deployment/ccip/changeset/v1_5/e2e_test.go b/deployment/ccip/changeset/v1_5/e2e_test.go index d763e194bfc..b82b585ee68 100644 --- a/deployment/ccip/changeset/v1_5/e2e_test.go +++ b/deployment/ccip/changeset/v1_5/e2e_test.go @@ -10,6 +10,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/v1_5" @@ -56,10 +57,10 @@ func TestE2ELegacy(t *testing.T) { } e.Env = v1_5.AddLanes(t, e.Env, state, pairs) // permabless the commit stores - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(v1_5changeset.PermaBlessCommitStoreChangeset), - Config: v1_5changeset.PermaBlessCommitStoreConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(v1_5changeset.PermaBlessCommitStoreChangeset), + v1_5changeset.PermaBlessCommitStoreConfig{ Configs: map[uint64]v1_5changeset.PermaBlessCommitStoreConfigPerDest{ dest: { Sources: []v1_5changeset.PermaBlessConfigPerSourceChain{ @@ -71,8 +72,8 @@ func TestE2ELegacy(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // reload state after adding lanes state, err = changeset.LoadOnchainState(e.Env) diff --git a/deployment/changeset.go b/deployment/changeset.go index 2d9bb6d59ca..ca25d4251b3 100644 --- a/deployment/changeset.go +++ b/deployment/changeset.go @@ -9,18 +9,84 @@ import ( ) var ( - ErrInvalidConfig = errors.New("invalid changeset config") + ErrInvalidConfig = errors.New("invalid changeset config") + ErrInvalidEnvironment = errors.New("invalid environment") ) -// ChangeSet represents a set of changes to be made to an environment. -// The configuration contains environment specific inputs for a specific changeset. -// The configuration might contain for example the chainSelectors to apply the change to -// or existing environment specific contract addresses. -// Its recommended that changesets operate on a small number of chains (e.g. 1-3) -// to reduce the risk of partial failures. -// If the configuration is unexpected type or format, the changeset should return ErrInvalidConfig. +// ChangeSet is equivalent to ChangeLogic +// Deprecated: use the ChangeLogic type, or an instance of a ChangeSetV2 in infrastructure or validation code. type ChangeSet[C any] func(e Environment, config C) (ChangesetOutput, error) +// ChangeLogic encapsulates the active behavior of a ChangeSetV2. +// The config struct contains environment-specific inputs for this logical change. For example, it might contain +// the chainSelectors against which this change logic should be applied, or certain contract addresses or configuration +// values to be used in this change. +// The function should perform any deployment or configuration tasks, compose and propose job-specs, and generate any +// MCMS proposals necessary. +// This is the standalone version of ChangeSetV2.Apply for use with CreateChangeSet +// +// ChangeLogic functions should operate on a modest number of chains to reduce the risk of partial failures. +type ChangeLogic[C any] func(e Environment, config C) (ChangesetOutput, error) + +// PreconditionVerifier functions should evaluate the supplied config, in the context of an environment, to ensure that +// the config struct is correct, and that the environmental preconditions are as expected. This is the standalone +// version of ChangeSetV2.VerifyPreconditions for use with CreateChangeSet +// +// If the configuration is unexpected type or format, the changeset should return ErrInvalidConfig. If there are +// surprising aspects in the environment (a contract expected to be present cannot be located, etc.), then +// ErrInvalidEnvironment should be returned. +type PreconditionVerifier[C any] func(e Environment, config C) error + +// ChangeSetV2 is a type which encapsulates the logic to perform a set of changes to be made to an environment, in the +// context of deploying Chainlink's product operations - namely deploying and configuring contracts, generating and +// proposing TOML job-specs and interacting with the Job Distributor, and creating MCMS proposals. +// +// ChangeSetV2 has a pre-validation function which is optional (can be implemented as a no-op), which execution +// environments (such as the migrations infrastructure in chainlink-deployments) should execute before invoking the +// Apply method. +// +// > Note: ChangeSetV2 replaces ChangeSet, though its Apply method is identical in signature to a ChangeSet function. +type ChangeSetV2[C any] interface { + // Apply performs the logic of the changeset, including any side effects, such as on-chain (non-MCMS) writes or + // contract deployments, job-spec creation and Job-Distributor interaction, MCMS proposal creation, etc. It should + // return the ingredients of the side effects in a ChangesetOutput. + Apply(e Environment, config C) (ChangesetOutput, error) + + // VerifyPreconditions function verifies the preconditions of the config. It should have no side effects, instead + // returning an error if the ChangeSetV2 should not be applied, or nil if the ChangeSetV2 is safe to apply. + VerifyPreconditions(e Environment, config C) error +} + +type simpleChangeSet[C any] struct { + apply ChangeLogic[C] + verify PreconditionVerifier[C] +} + +func (scs simpleChangeSet[C]) Apply(e Environment, config C) (ChangesetOutput, error) { + return scs.apply(e, config) +} + +func (scs simpleChangeSet[C]) VerifyPreconditions(e Environment, config C) error { + return scs.verify(e, config) +} + +// CreateChangeSet creates a ChangeSetV2 from an existing execution function (or an older ChangeSet) and a +// precondition verification function. +func CreateChangeSet[C any](applyFunc ChangeLogic[C], verifyFunc func(e Environment, config C) error) ChangeSetV2[C] { + return simpleChangeSet[C]{ + apply: applyFunc, + verify: verifyFunc, + } +} + +func CreateLegacyChangeSet[C any](changeset ChangeSet[C]) ChangeSetV2[C] { + var cs ChangeLogic[C] = func(e Environment, config C) (ChangesetOutput, error) { return changeset(e, config) } + return simpleChangeSet[C]{ + apply: cs, + verify: func(e Environment, config C) error { return nil }, + } +} + // ProposedJob represents a job spec which has been proposed to a node, with the JobID returned by the // Job Distributor. type ProposedJob struct { diff --git a/deployment/changeset_test.go b/deployment/changeset_test.go new file mode 100644 index 00000000000..23ae7b658d4 --- /dev/null +++ b/deployment/changeset_test.go @@ -0,0 +1,108 @@ +package deployment + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +type MyChangeSet struct{} + +func (m MyChangeSet) Apply(e Environment, config uint64) (ChangesetOutput, error) { + return ChangesetOutput{AddressBook: NewMemoryAddressBook()}, nil +} +func (m MyChangeSet) VerifyPreconditions(e Environment, config uint64) error { + return nil +} + +func TestChangeSetNormalType(t *testing.T) { + t.Parallel() + e := NewNoopEnvironment(t) + + var cs ChangeSetV2[uint64] = MyChangeSet{} + verify := cs.VerifyPreconditions(e, 5) + require.NoError(t, verify) + out, _ := cs.Apply(e, 5) + require.Equal(t, NewMemoryAddressBook(), out.AddressBook) +} + +func TestChangeSetConstructionComposedFromLambdas(t *testing.T) { + t.Parallel() + e := NewNoopEnvironment(t) + + var cs = CreateChangeSet( + // Don't do this in real life, this is for a test. Make nice tested functions. + func(e Environment, config string) (ChangesetOutput, error) { + return ChangesetOutput{AddressBook: NewMemoryAddressBook()}, nil + }, + func(e Environment, config string) error { + return nil + }, + ) + verify := cs.VerifyPreconditions(e, "foo") + require.NoError(t, verify) + out, _ := cs.Apply(e, "foo") + require.Equal(t, NewMemoryAddressBook(), out.AddressBook) +} + +var fakeChangeSet = CreateChangeSet(oldSchool, oldSchoolVerify) + +func oldSchool(e Environment, config uint32) (ChangesetOutput, error) { + return ChangesetOutput{AddressBook: NewMemoryAddressBook()}, nil +} +func oldSchoolVerify(e Environment, _ uint32) error { + return nil +} + +// This is likely the best example of how to use this API. +func TestChangeSetComposedType(t *testing.T) { + t.Parallel() + e := NewNoopEnvironment(t) + + verify := fakeChangeSet.VerifyPreconditions(e, 5) + require.NoError(t, verify) + out, _ := fakeChangeSet.Apply(e, 5) + require.Equal(t, NewMemoryAddressBook(), out.AddressBook) +} + +// TestChangeSetLegacyFunction tests using legacy ChangeSet functions (but just naturally conforming to the type, +// via duck-typing, in the new wrapper. +func TestChangeSetLegacyFunctionWithStandardChangeSetFunction(t *testing.T) { + t.Parallel() + e := NewNoopEnvironment(t) + var cs = CreateLegacyChangeSet(oldSchool) + verify := cs.VerifyPreconditions(e, 5) + require.NoError(t, verify) + out, _ := cs.Apply(e, 5) + require.Equal(t, NewMemoryAddressBook(), out.AddressBook) +} + +// TestChangeSetLegacyFunction tests using legacy ChangeSet (strongly declared as a ChangeSet[C]) in the wrapper. +func TestChangeSetLegacyFunction(t *testing.T) { + t.Parallel() + e := NewNoopEnvironment(t) + var csFunc ChangeSet[uint32] = oldSchool // Cast to a ChangeSet and use in CreateLegacyChangeSet + var cs = CreateLegacyChangeSet(csFunc) + verify := cs.VerifyPreconditions(e, 5) + require.NoError(t, verify) + out, _ := cs.Apply(e, 5) + require.Equal(t, NewMemoryAddressBook(), out.AddressBook) +} + +func NewNoopEnvironment(t *testing.T) Environment { + return *NewEnvironment( + "noop", + logger.TestLogger(t), + NewMemoryAddressBook(), + map[uint64]Chain{}, + map[uint64]SolChain{}, + []string{}, + nil, + func() context.Context { return tests.Context(t) }, + XXXGenerateTestOCRSecrets(), + ) +} diff --git a/deployment/common/changeset/example/link_transfer_test.go b/deployment/common/changeset/example/link_transfer_test.go index f439f78ca5c..7281c5858b0 100644 --- a/deployment/common/changeset/example/link_transfer_test.go +++ b/deployment/common/changeset/example/link_transfer_test.go @@ -35,14 +35,14 @@ func setupLinkTransferTestEnv(t *testing.T) deployment.Environment { config := proposalutils.SingleGroupMCMS(t) // Deploy MCMS and Timelock - env, err := changeset.ApplyChangesets(t, env, nil, []changeset.ChangesetApplication{ - { - Changeset: changeset.WrapChangeSet(changeset.DeployLinkToken), - Config: []uint64{chainSelector}, - }, - { - Changeset: changeset.WrapChangeSet(changeset.DeployMCMSWithTimelock), - Config: map[uint64]types.MCMSWithTimelockConfig{ + env, err := changeset.Apply(t, env, nil, + changeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployLinkToken), + []uint64{chainSelector}, + ), + changeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployMCMSWithTimelock), + map[uint64]types.MCMSWithTimelockConfig{ chainSelector: { Canceller: config, Bypasser: config, @@ -50,8 +50,8 @@ func setupLinkTransferTestEnv(t *testing.T) deployment.Environment { TimelockMinDelay: big.NewInt(0), }, }, - }, - }) + ), + ) require.NoError(t, err) return env } @@ -94,12 +94,12 @@ func TestLinkTransferMCMS(t *testing.T) { }, } // Apply the changeset - _, err = changeset.ApplyChangesets(t, env, timelocks, []changeset.ChangesetApplication{ + _, err = changeset.Apply(t, env, timelocks, // the changeset produces proposals, ApplyChangesets will sign & execute them. // in practice, signing and executing are separated processes. - { - Changeset: changeset.WrapChangeSet(example.LinkTransfer), - Config: &example.LinkTransferConfig{ + changeset.Configure( + deployment.CreateLegacyChangeSet(example.LinkTransfer), + &example.LinkTransferConfig{ From: timelockAddress, Transfers: map[uint64][]example.TransferConfig{ chainSelector: { @@ -114,8 +114,8 @@ func TestLinkTransferMCMS(t *testing.T) { OverrideRoot: true, }, }, - }, - }) + ), + ) require.NoError(t, err) // Check new balances @@ -169,12 +169,12 @@ func TestLinkTransfer(t *testing.T) { } // Apply the changeset - _, err = changeset.ApplyChangesets(t, env, timelocks, []changeset.ChangesetApplication{ + _, err = changeset.Apply(t, env, timelocks, // the changeset produces proposals, ApplyChangesets will sign & execute them. // in practice, signing and executing are separated processes. - { - Changeset: changeset.WrapChangeSet(example.LinkTransfer), - Config: &example.LinkTransferConfig{ + changeset.Configure( + deployment.CreateLegacyChangeSet(example.LinkTransfer), + &example.LinkTransferConfig{ From: chain.DeployerKey.From, Transfers: map[uint64][]example.TransferConfig{ chainSelector: { @@ -186,8 +186,8 @@ func TestLinkTransfer(t *testing.T) { }, // No MCMSConfig here means we'll execute the txs directly. }, - }, - }) + ), + ) require.NoError(t, err) // Check new balances @@ -407,12 +407,12 @@ func TestLinkTransferMCMSV2(t *testing.T) { }, } // Apply the changeset - _, err = changeset.ApplyChangesets(t, env, timelocks, []changeset.ChangesetApplication{ + _, err = changeset.Apply(t, env, timelocks, // the changeset produces proposals, ApplyChangesets will sign & execute them. // in practice, signing and executing are separated processes. - { - Changeset: changeset.WrapChangeSet(example.LinkTransferV2), - Config: &example.LinkTransferConfig{ + changeset.Configure( + deployment.CreateLegacyChangeSet(example.LinkTransferV2), + &example.LinkTransferConfig{ From: timelockAddress, Transfers: map[uint64][]example.TransferConfig{ chainSelector: { @@ -427,8 +427,8 @@ func TestLinkTransferMCMSV2(t *testing.T) { OverrideRoot: true, }, }, - }, - }) + ), + ) require.NoError(t, err) // Check new balances diff --git a/deployment/common/changeset/example/mint_link_test.go b/deployment/common/changeset/example/mint_link_test.go index 1c60c3221de..9d51d6808a9 100644 --- a/deployment/common/changeset/example/mint_link_test.go +++ b/deployment/common/changeset/example/mint_link_test.go @@ -8,6 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/changeset/example" ) @@ -29,15 +30,15 @@ func TestMintLink(t *testing.T) { linkState, err := changeset.MaybeLoadLinkTokenChainState(chain, addrs) require.NoError(t, err) - _, err = changeset.ApplyChangesets(t, env, nil, []changeset.ChangesetApplication{ - { - Changeset: changeset.WrapChangeSet(example.AddMintersBurnersLink), - Config: &example.AddMintersBurnersLinkConfig{ + _, err = changeset.Apply(t, env, nil, + changeset.Configure( + deployment.CreateLegacyChangeSet(example.AddMintersBurnersLink), + &example.AddMintersBurnersLinkConfig{ ChainSelector: chainSelector, Minters: []common.Address{chain.DeployerKey.From}, }, - }, - }) + ), + ) require.NoError(t, err) timelockAddress := mcmsState.Timelock.Address() diff --git a/deployment/common/changeset/set_config_mcms_test.go b/deployment/common/changeset/set_config_mcms_test.go index e86ccc3d48c..aa9bf37579b 100644 --- a/deployment/common/changeset/set_config_mcms_test.go +++ b/deployment/common/changeset/set_config_mcms_test.go @@ -35,18 +35,18 @@ func setupSetConfigTestEnv(t *testing.T) deployment.Environment { config := proposalutils.SingleGroupTimelockConfig(t) // Deploy MCMS and Timelock - env, err := commonchangeset.ApplyChangesets(t, env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), - Config: []uint64{chainSelector}, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), - Config: map[uint64]types.MCMSWithTimelockConfig{ + env, err := commonchangeset.Apply(t, env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployLinkToken), + []uint64{chainSelector}, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + map[uint64]types.MCMSWithTimelockConfig{ chainSelector: config, }, - }, - }) + ), + ) require.NoError(t, err) return env } @@ -56,15 +56,15 @@ func TestSetConfigMCMSVariants(t *testing.T) { // Add the timelock as a signer to check state changes for _, tc := range []struct { name string - changeSets func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication + changeSets func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ConfiguredChangeSet }{ { name: "MCMS disabled", - changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication { - return []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.SetConfigMCMS), - Config: commonchangeset.MCMSConfig{ + changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ConfiguredChangeSet { + return []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.SetConfigMCMS), + commonchangeset.MCMSConfig{ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{ chainSel: { Proposer: cfgProp, @@ -73,25 +73,25 @@ func TestSetConfigMCMSVariants(t *testing.T) { }, }, }, - }, + ), } }, }, { name: "MCMS enabled", - changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication { - return []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ConfiguredChangeSet { + return []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: map[uint64][]common.Address{ chainSel: {mcmsState.ProposerMcm.Address(), mcmsState.BypasserMcm.Address(), mcmsState.CancellerMcm.Address()}, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.SetConfigMCMS), - Config: commonchangeset.MCMSConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.SetConfigMCMS), + commonchangeset.MCMSConfig{ ProposalConfig: &commonchangeset.TimelockConfig{ MinDelay: 0, }, @@ -103,7 +103,7 @@ func TestSetConfigMCMSVariants(t *testing.T) { }, }, }, - }, + ), } }, }, @@ -165,15 +165,15 @@ func TestSetConfigMCMSV2Variants(t *testing.T) { // Add the timelock as a signer to check state changes for _, tc := range []struct { name string - changeSets func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication + changeSets func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ConfiguredChangeSet }{ { name: "MCMS disabled", - changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication { - return []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.SetConfigMCMSV2), - Config: commonchangeset.MCMSConfig{ + changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ConfiguredChangeSet { + return []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.SetConfigMCMSV2), + commonchangeset.MCMSConfig{ ConfigsPerChain: map[uint64]commonchangeset.ConfigPerRole{ chainSel: { Proposer: cfgProp, @@ -182,25 +182,25 @@ func TestSetConfigMCMSV2Variants(t *testing.T) { }, }, }, - }, + ), } }, }, { name: "MCMS enabled", - changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ChangesetApplication { - return []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelockV2), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + changeSets: func(mcmsState *commonchangeset.MCMSWithTimelockState, chainSel uint64, cfgProp, cfgCancel, cfgBypass config.Config) []commonchangeset.ConfiguredChangeSet { + return []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelockV2), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: map[uint64][]common.Address{ chainSel: {mcmsState.ProposerMcm.Address(), mcmsState.BypasserMcm.Address(), mcmsState.CancellerMcm.Address()}, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.SetConfigMCMSV2), - Config: commonchangeset.MCMSConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.SetConfigMCMSV2), + commonchangeset.MCMSConfig{ ProposalConfig: &commonchangeset.TimelockConfig{ MinDelay: 0, }, @@ -212,7 +212,7 @@ func TestSetConfigMCMSV2Variants(t *testing.T) { }, }, }, - }, + ), } }, }, diff --git a/deployment/common/changeset/test_helpers.go b/deployment/common/changeset/test_helpers.go index 03aa7731371..f9876f50e4c 100644 --- a/deployment/common/changeset/test_helpers.go +++ b/deployment/common/changeset/test_helpers.go @@ -10,31 +10,46 @@ import ( "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" ) -type ChangesetApplication struct { - Changeset deployment.ChangeSet[any] - Config any +type ConfiguredChangeSet interface { + Apply(e deployment.Environment) (deployment.ChangesetOutput, error) } -func WrapChangeSet[C any](fn deployment.ChangeSet[C]) func(e deployment.Environment, config any) (deployment.ChangesetOutput, error) { - return func(e deployment.Environment, config any) (deployment.ChangesetOutput, error) { - var zeroC C - if config != nil { - c, ok := config.(C) - if !ok { - return deployment.ChangesetOutput{}, fmt.Errorf("invalid config type, expected %T", c) - } - return fn(e, config.(C)) - } +func Configure[C any]( + changeset deployment.ChangeSetV2[C], + config C, +) ConfiguredChangeSet { + return configuredChangeSetImpl[C]{ + changeset: changeset, + config: config, + } +} - return fn(e, zeroC) +type configuredChangeSetImpl[C any] struct { + changeset deployment.ChangeSetV2[C] + config C +} + +func (ca configuredChangeSetImpl[C]) Apply(e deployment.Environment) (deployment.ChangesetOutput, error) { + err := ca.changeset.VerifyPreconditions(e, ca.config) + if err != nil { + return deployment.ChangesetOutput{}, err } + return ca.changeset.Apply(e, ca.config) +} + +// Apply applies the changeset applications to the environment and returns the updated environment. This is the +// variadic function equivalent of ApplyChangesets, but allowing you to simply pass in one or more changesets as +// parameters at the end of the function. e.g. `changeset.Apply(t, e, nil, configuredCS1, configuredCS2)` etc. +func Apply(t *testing.T, e deployment.Environment, timelockContractsPerChain map[uint64]*proposalutils.TimelockExecutionContracts, first ConfiguredChangeSet, rest ...ConfiguredChangeSet) (deployment.Environment, error) { + return ApplyChangesets(t, e, timelockContractsPerChain, append([]ConfiguredChangeSet{first}, rest...)) } // ApplyChangesets applies the changeset applications to the environment and returns the updated environment. -func ApplyChangesets(t *testing.T, e deployment.Environment, timelockContractsPerChain map[uint64]*proposalutils.TimelockExecutionContracts, changesetApplications []ChangesetApplication) (deployment.Environment, error) { +func ApplyChangesets(t *testing.T, e deployment.Environment, timelockContractsPerChain map[uint64]*proposalutils.TimelockExecutionContracts, changesetApplications []ConfiguredChangeSet) (deployment.Environment, error) { currentEnv := e for i, csa := range changesetApplications { - out, err := csa.Changeset(currentEnv, csa.Config) + + out, err := csa.Apply(currentEnv) if err != nil { return e, fmt.Errorf("failed to apply changeset at index %d: %w", i, err) } diff --git a/deployment/common/changeset/test_helpers_test.go b/deployment/common/changeset/test_helpers_test.go new file mode 100644 index 00000000000..d3fcda4adad --- /dev/null +++ b/deployment/common/changeset/test_helpers_test.go @@ -0,0 +1,77 @@ +package changeset + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +func TestChangeSetLegacyFunction_PassingCase(t *testing.T) { + t.Parallel() + e := NewNoopEnvironment(t) + + executedCs := false + executedValidator := false + + csv2 := deployment.CreateChangeSet( + func(e deployment.Environment, config uint32) (deployment.ChangesetOutput, error) { + executedCs = true + return deployment.ChangesetOutput{AddressBook: deployment.NewMemoryAddressBook()}, nil + }, + func(e deployment.Environment, config uint32) error { + executedValidator = true + return nil + }, + ) + assert.False(t, executedCs, "Not expected to have executed the changeset yet") + assert.False(t, executedValidator, "Not expected to have executed the validator yet") + _, err := Apply(t, e, nil, Configure(csv2, 1)) + assert.True(t, executedCs, "Validator should have returned nil, allowing changeset execution") + assert.True(t, executedValidator, "Not expected to have executed the validator yet") + assert.NoError(t, err) +} + +func TestChangeSetLegacyFunction_ErrorCase(t *testing.T) { + t.Parallel() + e := NewNoopEnvironment(t) + + executedCs := false + executedValidator := false + + csv2 := deployment.CreateChangeSet( + func(e deployment.Environment, config uint32) (deployment.ChangesetOutput, error) { + executedCs = true + return deployment.ChangesetOutput{AddressBook: deployment.NewMemoryAddressBook()}, nil + }, + func(e deployment.Environment, config uint32) error { + executedValidator = true + return errors.New("you shall not pass") + }, + ) + assert.False(t, executedCs, "Not expected to have executed the changeset yet") + assert.False(t, executedValidator, "Not expected to have executed the validator yet") + _, err := Apply(t, e, nil, Configure(csv2, 1)) + assert.False(t, executedCs, "Validator should have fired, preventing changeset execution") + assert.True(t, executedValidator, "Not expected to have executed the validator yet") + assert.Equal(t, "failed to apply changeset at index 0: you shall not pass", err.Error()) +} + +func NewNoopEnvironment(t *testing.T) deployment.Environment { + return *deployment.NewEnvironment( + "noop", + logger.TestLogger(t), + deployment.NewMemoryAddressBook(), + map[uint64]deployment.Chain{}, + map[uint64]deployment.SolChain{}, + []string{}, + nil, + func() context.Context { return tests.Context(t) }, + deployment.XXXGenerateTestOCRSecrets(), + ) +} diff --git a/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go b/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go index aa0b9aca596..ba43de3bef7 100644 --- a/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go +++ b/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go @@ -23,18 +23,18 @@ func TestTransferToMCMSWithTimelock(t *testing.T) { Nodes: 1, }) chain1 := e.AllChainSelectors()[0] - e, err := ApplyChangesets(t, e, nil, []ChangesetApplication{ - { - Changeset: WrapChangeSet(DeployLinkToken), - Config: []uint64{chain1}, - }, - { - Changeset: WrapChangeSet(DeployMCMSWithTimelock), - Config: map[uint64]types.MCMSWithTimelockConfig{ + e, err := Apply(t, e, nil, + Configure( + deployment.CreateLegacyChangeSet(DeployLinkToken), + []uint64{chain1}, + ), + Configure( + deployment.CreateLegacyChangeSet(DeployMCMSWithTimelock), + map[uint64]types.MCMSWithTimelockConfig{ chain1: proposalutils.SingleGroupTimelockConfig(t), }, - }, - }) + ), + ) require.NoError(t, err) addrs, err := e.ExistingAddresses.AddressesForChain(chain1) require.NoError(t, err) @@ -42,22 +42,20 @@ func TestTransferToMCMSWithTimelock(t *testing.T) { require.NoError(t, err) link, err := MaybeLoadLinkTokenChainState(e.Chains[chain1], addrs) require.NoError(t, err) - e, err = ApplyChangesets(t, e, map[uint64]*proposalutils.TimelockExecutionContracts{ - chain1: { - Timelock: state.Timelock, - CallProxy: state.CallProxy, + e, err = Apply(t, e, + map[uint64]*proposalutils.TimelockExecutionContracts{ + chain1: {Timelock: state.Timelock, CallProxy: state.CallProxy}, }, - }, []ChangesetApplication{ - { - Changeset: WrapChangeSet(TransferToMCMSWithTimelock), - Config: TransferToMCMSWithTimelockConfig{ + Configure( + deployment.CreateLegacyChangeSet(TransferToMCMSWithTimelock), + TransferToMCMSWithTimelockConfig{ ContractsByChain: map[uint64][]common.Address{ chain1: {link.LinkToken.Address()}, }, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) // We expect now that the link token is owned by the MCMS timelock. link, err = MaybeLoadLinkTokenChainState(e.Chains[chain1], addrs) @@ -67,15 +65,15 @@ func TestTransferToMCMSWithTimelock(t *testing.T) { require.Equal(t, state.Timelock.Address(), o) // Try a rollback to the deployer. - e, err = ApplyChangesets(t, e, nil, []ChangesetApplication{ - { - Changeset: WrapChangeSet(TransferToDeployer), - Config: TransferToDeployerConfig{ + e, err = Apply(t, e, nil, + Configure( + deployment.CreateLegacyChangeSet(TransferToDeployer), + TransferToDeployerConfig{ ContractAddress: link.LinkToken.Address(), ChainSel: chain1, }, - }, - }) + ), + ) require.NoError(t, err) o, err = link.LinkToken.Owner(nil) @@ -90,18 +88,18 @@ func TestTransferToMCMSWithTimelockV2(t *testing.T) { Nodes: 1, }) chain1 := e.AllChainSelectors()[0] - e, err := ApplyChangesets(t, e, nil, []ChangesetApplication{ - { - Changeset: WrapChangeSet(DeployLinkToken), - Config: []uint64{chain1}, - }, - { - Changeset: WrapChangeSet(DeployMCMSWithTimelock), - Config: map[uint64]types.MCMSWithTimelockConfig{ + e, err := Apply(t, e, nil, + Configure( + deployment.CreateLegacyChangeSet(DeployLinkToken), + []uint64{chain1}, + ), + Configure( + deployment.CreateLegacyChangeSet(DeployMCMSWithTimelock), + map[uint64]types.MCMSWithTimelockConfig{ chain1: proposalutils.SingleGroupTimelockConfig(t), }, - }, - }) + ), + ) require.NoError(t, err) addrs, err := e.ExistingAddresses.AddressesForChain(chain1) require.NoError(t, err) @@ -109,22 +107,20 @@ func TestTransferToMCMSWithTimelockV2(t *testing.T) { require.NoError(t, err) link, err := MaybeLoadLinkTokenChainState(e.Chains[chain1], addrs) require.NoError(t, err) - e, err = ApplyChangesets(t, e, map[uint64]*proposalutils.TimelockExecutionContracts{ - chain1: { - Timelock: state.Timelock, - CallProxy: state.CallProxy, + e, err = Apply(t, e, + map[uint64]*proposalutils.TimelockExecutionContracts{ + chain1: {Timelock: state.Timelock, CallProxy: state.CallProxy}, }, - }, []ChangesetApplication{ - { - Changeset: WrapChangeSet(TransferToMCMSWithTimelockV2), - Config: TransferToMCMSWithTimelockConfig{ + Configure( + deployment.CreateLegacyChangeSet(TransferToMCMSWithTimelockV2), + TransferToMCMSWithTimelockConfig{ ContractsByChain: map[uint64][]common.Address{ chain1: {link.LinkToken.Address()}, }, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) // We expect now that the link token is owned by the MCMS timelock. link, err = MaybeLoadLinkTokenChainState(e.Chains[chain1], addrs) @@ -134,15 +130,15 @@ func TestTransferToMCMSWithTimelockV2(t *testing.T) { require.Equal(t, state.Timelock.Address(), o) // Try a rollback to the deployer. - e, err = ApplyChangesets(t, e, nil, []ChangesetApplication{ - { - Changeset: WrapChangeSet(TransferToDeployer), - Config: TransferToDeployerConfig{ + e, err = Apply(t, e, nil, + Configure( + deployment.CreateLegacyChangeSet(TransferToDeployer), + TransferToDeployerConfig{ ContractAddress: link.LinkToken.Address(), ChainSel: chain1, }, - }, - }) + ), + ) require.NoError(t, err) o, err = link.LinkToken.Owner(nil) @@ -158,14 +154,14 @@ func TestRenounceTimelockDeployerConfigValidate(t *testing.T) { Nodes: 1, }) chain1 := e.AllChainSelectors()[0] - e, err := ApplyChangesets(t, e, nil, []ChangesetApplication{ - { - Changeset: WrapChangeSet(DeployMCMSWithTimelock), - Config: map[uint64]types.MCMSWithTimelockConfig{ + e, err := Apply(t, e, nil, + Configure( + deployment.CreateLegacyChangeSet(DeployMCMSWithTimelock), + map[uint64]types.MCMSWithTimelockConfig{ chain1: proposalutils.SingleGroupTimelockConfig(t), }, - }, - }) + ), + ) require.NoError(t, err) envWithNoMCMS := memory.NewMemoryEnvironment(t, lggr, 0, memory.MemoryEnvironmentConfig{ @@ -232,14 +228,14 @@ func TestRenounceTimelockDeployer(t *testing.T) { Nodes: 1, }) chain1 := e.AllChainSelectors()[0] - e, err := ApplyChangesets(t, e, nil, []ChangesetApplication{ - { - Changeset: WrapChangeSet(DeployMCMSWithTimelock), - Config: map[uint64]types.MCMSWithTimelockConfig{ + e, err := Apply(t, e, nil, + Configure( + deployment.CreateLegacyChangeSet(DeployMCMSWithTimelock), + map[uint64]types.MCMSWithTimelockConfig{ chain1: proposalutils.SingleGroupTimelockConfig(t), }, - }, - }) + ), + ) require.NoError(t, err) addrs, err := e.ExistingAddresses.AddressesForChain(chain1) require.NoError(t, err) @@ -258,14 +254,14 @@ func TestRenounceTimelockDeployer(t *testing.T) { require.Equal(t, int64(2), r.Int64()) // Revoke Deployer - e, err = ApplyChangesets(t, e, nil, []ChangesetApplication{ - { - Changeset: WrapChangeSet(RenounceTimelockDeployer), - Config: RenounceTimelockDeployerConfig{ + e, err = Apply(t, e, nil, + Configure( + deployment.CreateLegacyChangeSet(RenounceTimelockDeployer), + RenounceTimelockDeployerConfig{ ChainSel: chain1, }, - }, - }) + ), + ) require.NoError(t, err) // Check that the deployer is no longer an admin diff --git a/deployment/common/proposalutils/propose_test.go b/deployment/common/proposalutils/propose_test.go index 0eb84075c2e..f106f7d4406 100644 --- a/deployment/common/proposalutils/propose_test.go +++ b/deployment/common/proposalutils/propose_test.go @@ -14,6 +14,7 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" types2 "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -31,10 +32,10 @@ func TestBuildProposalFromBatchesV2(t *testing.T) { chainSelector := env.AllChainSelectors()[0] config := proposalutils.SingleGroupMCMS(t) - env, err := changeset.ApplyChangesets(t, env, nil, []changeset.ChangesetApplication{ - { - Changeset: changeset.WrapChangeSet(changeset.DeployMCMSWithTimelock), - Config: map[uint64]types2.MCMSWithTimelockConfig{ + env, err := changeset.Apply(t, env, nil, + changeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployMCMSWithTimelock), + map[uint64]types2.MCMSWithTimelockConfig{ chainSelector: { Canceller: config, Bypasser: config, @@ -42,8 +43,8 @@ func TestBuildProposalFromBatchesV2(t *testing.T) { TimelockMinDelay: big.NewInt(0), }, }, - }, - }) + ), + ) require.NoError(t, err) chain := env.Chains[chainSelector] diff --git a/deployment/data-streams/changeset/jd_register_nodes_test.go b/deployment/data-streams/changeset/jd_register_nodes_test.go index 9667e6c352a..f95e07b19cb 100644 --- a/deployment/data-streams/changeset/jd_register_nodes_test.go +++ b/deployment/data-streams/changeset/jd_register_nodes_test.go @@ -7,6 +7,7 @@ import ( "go.uber.org/zap/zapcore" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -27,10 +28,10 @@ func TestRegisterNodesWithJD(t *testing.T) { csaKey := jobClient.Nodes[nodeP2pKey].Keys.CSA.PublicKeyString() - e, err := changeset.ApplyChangesets(t, e, nil, []changeset.ChangesetApplication{ - { - Changeset: changeset.WrapChangeSet(RegisterNodesWithJD), - Config: RegisterNodesInput{ + e, err := changeset.Apply(t, e, nil, + changeset.Configure( + deployment.CreateLegacyChangeSet(RegisterNodesWithJD), + RegisterNodesInput{ EnvLabel: "test-env", ProductName: "test-product", DONs: DONConfigMap{ @@ -42,8 +43,8 @@ func TestRegisterNodesWithJD(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) require.Lenf(t, jobClient.RegisteredNodes, 1, "1 registered node expected") require.NotNilf(t, jobClient.RegisteredNodes[csaKey], "expected node with csa key %s to be registered", csaKey) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 9503aa3583f..399ec8219d4 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -59,25 +59,25 @@ func DeployHomeChainContracts(ctx context.Context, lggr logger.Logger, envConfig TimelockMinDelay: big.NewInt(0), } } - *e, err = commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), - Config: cfg, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChainChangeset), - Config: changeset.DeployHomeChainConfig{ - HomeChainSel: homeChainSel, - RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), - RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), - NodeOperators: testhelpers.NewTestNodeOperator(e.Chains[homeChainSel].DeployerKey.From), - NodeP2PIDsPerNodeOpAdmin: map[string][][32]byte{ - "NodeOperator": p2pIds, - }, + *e, err = commonchangeset.Apply(nil, *e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + cfg, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), + changeset.DeployHomeChainConfig{ + HomeChainSel: homeChainSel, + RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), + RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), + NodeOperators: testhelpers.NewTestNodeOperator(e.Chains[homeChainSel].DeployerKey.From), + NodeP2PIDsPerNodeOpAdmin: map[string][][32]byte{"NodeOperator": p2pIds}, }, - }, - }) - + ), + ) + if err != nil { + return deployment.CapabilityRegistryConfig{}, e.ExistingAddresses, fmt.Errorf("changeset sequence execution failed with error: %w", err) + } state, err := changeset.LoadOnchainState(*e) if err != nil { return deployment.CapabilityRegistryConfig{}, e.ExistingAddresses, fmt.Errorf("failed to load on chain state: %w", err) @@ -286,42 +286,42 @@ func setupChains(lggr logger.Logger, e *deployment.Environment, homeChainSel uin OffRampParams: changeset.DefaultOffRampParams(), } } - env, err := commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateChainConfigChangeset), - Config: changeset.UpdateChainConfigConfig{ + env, err := commonchangeset.Apply(nil, *e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), + changeset.UpdateChainConfigConfig{ HomeChainSelector: homeChainSel, RemoteChainAdds: chainConfigs, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), - Config: chainSelectors, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployPrerequisitesChangeset), - Config: changeset.DeployPrerequisiteConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployLinkToken), + chainSelectors, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployPrerequisitesChangeset), + changeset.DeployPrerequisiteConfig{ Configs: prereqCfgs, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployChainContractsChangeset), - Config: changeset.DeployChainContractsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), + changeset.DeployChainContractsConfig{ HomeChainSelector: homeChainSel, ContractParamsPerChain: contractParams, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), - Config: changeset.SetRMNRemoteOnRMNProxyConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), + changeset.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: chainSelectors, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.CCIPCapabilityJobspecChangeset), - Config: struct{}{}, - }, - }) + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.CCIPCapabilityJobspecChangeset), + nil, // ChangeSet does not use a config. + ), + ) if err != nil { return *e, fmt.Errorf("failed to apply changesets: %w", err) } @@ -352,33 +352,33 @@ func setupLinkPools(e *deployment.Environment) (deployment.Environment, error) { }, } } - env, err := commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployTokenPoolContractsChangeset), - Config: changeset.DeployTokenPoolContractsConfig{ + env, err := commonchangeset.Apply(nil, *e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployTokenPoolContractsChangeset), + changeset.DeployTokenPoolContractsConfig{ TokenSymbol: changeset.LinkSymbol, NewPools: poolInput, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.ProposeAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ProposeAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ Pools: pools, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAdminRoleChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AcceptAdminRoleChangeset), + changeset.TokenAdminRegistryChangesetConfig{ Pools: pools, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetPoolChangeset), - Config: changeset.TokenAdminRegistryChangesetConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetPoolChangeset), + changeset.TokenAdminRegistryChangesetConfig{ Pools: pools, }, - }, - }) + ), + ) if err != nil { return *e, fmt.Errorf("failed to apply changesets: %w", err) @@ -463,45 +463,45 @@ func setupLanes(e *deployment.Environment, state changeset.CCIPOnChainState) (de } } - return commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ConfigureTokenPoolContractsChangeset), - Config: changeset.ConfigureTokenPoolContractsConfig{ + return commonchangeset.Apply(nil, *e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ConfigureTokenPoolContractsChangeset), + changeset.ConfigureTokenPoolContractsConfig{ TokenSymbol: changeset.LinkSymbol, PoolUpdates: poolUpdates, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), - Config: changeset.UpdateOnRampDestsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), + changeset.UpdateOnRampDestsConfig{ UpdatesByChain: onRampUpdatesByChain, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - Config: changeset.UpdateFeeQuoterPricesConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), + changeset.UpdateFeeQuoterPricesConfig{ PricesByChain: pricesByChain, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateFeeQuoterDestsChangeset), - Config: changeset.UpdateFeeQuoterDestsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterDestsChangeset), + changeset.UpdateFeeQuoterDestsConfig{ UpdatesByChain: feeQuoterDestsUpdatesByChain, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOffRampSourcesChangeset), - Config: changeset.UpdateOffRampSourcesConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), + changeset.UpdateOffRampSourcesConfig{ UpdatesByChain: updateOffRampSources, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateRouterRampsChangeset), - Config: changeset.UpdateRouterRampsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), + changeset.UpdateRouterRampsConfig{ UpdatesByChain: updateRouterChanges, }, - }, - }) + ), + ) } func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint64) (deployment.Environment, error) { @@ -512,11 +512,11 @@ func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint6 changeset.WithDefaultExecuteOffChainConfig(nil), ) } - return commonchangeset.ApplyChangesets(nil, *e, nil, []commonchangeset.ChangesetApplication{ - { - // Add the DONs and candidate commit OCR instances for the chain. - Changeset: commonchangeset.WrapChangeSet(changeset.AddDonAndSetCandidateChangeset), - Config: changeset.AddDonAndSetCandidateChangesetConfig{ + return commonchangeset.Apply(nil, *e, nil, + commonchangeset.Configure( + // Add the DONs and candidate commit OCR instances for the chain + deployment.CreateLegacyChangeSet(changeset.AddDonAndSetCandidateChangeset), + changeset.AddDonAndSetCandidateChangesetConfig{ SetCandidateConfigBase: changeset.SetCandidateConfigBase{ HomeChainSelector: homeChainSel, FeedChainSelector: feedChainSel, @@ -526,11 +526,11 @@ func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint6 PluginType: types.PluginTypeCCIPCommit, }, }, - }, - { - // Add the exec OCR instances for the new chains. - Changeset: commonchangeset.WrapChangeSet(changeset.SetCandidateChangeset), - Config: changeset.SetCandidateChangesetConfig{ + ), + commonchangeset.Configure( + // Add the exec OCR instances for the new chains + deployment.CreateLegacyChangeSet(changeset.SetCandidateChangeset), + changeset.SetCandidateChangesetConfig{ SetCandidateConfigBase: changeset.SetCandidateConfigBase{ HomeChainSelector: homeChainSel, FeedChainSelector: feedChainSel, @@ -542,11 +542,11 @@ func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint6 }, }, }, - }, - { + ), + commonchangeset.Configure( // Promote everything - Changeset: commonchangeset.WrapChangeSet(changeset.PromoteCandidateChangeset), - Config: changeset.PromoteCandidateChangesetConfig{ + deployment.CreateLegacyChangeSet(changeset.PromoteCandidateChangeset), + changeset.PromoteCandidateChangesetConfig{ HomeChainSelector: homeChainSel, PluginInfo: []changeset.PromoteCandidatePluginInfo{ { @@ -559,15 +559,15 @@ func setupOCR(e *deployment.Environment, homeChainSel uint64, feedChainSel uint6 }, }, }, - }, - { - // Enable the OCR config on the remote chains. - Changeset: commonchangeset.WrapChangeSet(changeset.SetOCR3OffRampChangeset), - Config: changeset.SetOCR3OffRampConfig{ + ), + commonchangeset.Configure( + // Enable the OCR config on the remote chains + deployment.CreateLegacyChangeSet(changeset.SetOCR3OffRampChangeset), + changeset.SetOCR3OffRampConfig{ HomeChainSel: homeChainSel, RemoteChainSels: chainSelectors, CCIPHomeConfigType: globals.ConfigTypeActive, }, - }, - }) + ), + ) } diff --git a/deployment/keystone/changeset/accept_ownership_test.go b/deployment/keystone/changeset/accept_ownership_test.go index 4007fde4f79..4156be6854f 100644 --- a/deployment/keystone/changeset/accept_ownership_test.go +++ b/deployment/keystone/changeset/accept_ownership_test.go @@ -7,6 +7,7 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -24,49 +25,47 @@ func TestAcceptAllOwnership(t *testing.T) { } env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) registrySel := env.AllChainSelectors()[0] - env, err := commonchangeset.ApplyChangesets(t, env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployCapabilityRegistry), - Config: registrySel, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployOCR3), - Config: registrySel, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployForwarder), - Config: changeset.DeployForwarderRequest{}, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployFeedsConsumer), - Config: &changeset.DeployFeedsConsumerRequest{ChainSelector: registrySel}, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), - Config: map[uint64]types.MCMSWithTimelockConfig{ + env, err := commonchangeset.Apply(t, env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployCapabilityRegistry), + registrySel, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployOCR3), + registrySel, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployForwarder), + changeset.DeployForwarderRequest{}, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployFeedsConsumer), + &changeset.DeployFeedsConsumerRequest{ChainSelector: registrySel}, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + map[uint64]types.MCMSWithTimelockConfig{ registrySel: proposalutils.SingleGroupTimelockConfig(t), }, - }, - }) + ), + ) require.NoError(t, err) addrs, err := env.ExistingAddresses.AddressesForChain(registrySel) require.NoError(t, err) timelock, err := commonchangeset.MaybeLoadMCMSWithTimelockChainState(env.Chains[registrySel], addrs) require.NoError(t, err) - _, err = commonchangeset.ApplyChangesets(t, env, map[uint64]*proposalutils.TimelockExecutionContracts{ - registrySel: &proposalutils.TimelockExecutionContracts{ - Timelock: timelock.Timelock, - CallProxy: timelock.CallProxy, + _, err = commonchangeset.Apply(t, env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + registrySel: {Timelock: timelock.Timelock, CallProxy: timelock.CallProxy}, }, - }, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.AcceptAllOwnershipsProposal), - Config: &changeset.AcceptAllOwnershipRequest{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AcceptAllOwnershipsProposal), + &changeset.AcceptAllOwnershipRequest{ ChainSelector: registrySel, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) } diff --git a/deployment/keystone/changeset/add_capabilities_test.go b/deployment/keystone/changeset/add_capabilities_test.go index a995ef2e1c6..3c517212e2b 100644 --- a/deployment/keystone/changeset/add_capabilities_test.go +++ b/deployment/keystone/changeset/add_capabilities_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" @@ -73,12 +74,9 @@ func TestAddCapabilities(t *testing.T) { CallProxy: contracts.CallProxy, }, } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.AddCapabilities), - Config: req, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure(deployment.CreateLegacyChangeSet(changeset.AddCapabilities), req), + ) require.NoError(t, err) assertCapabilitiesExist(t, te.CapabilitiesRegistry(), capabilitiesToAdd...) diff --git a/deployment/keystone/changeset/add_nodes_test.go b/deployment/keystone/changeset/add_nodes_test.go index 9cec1333eac..1cefd1b07ab 100644 --- a/deployment/keystone/changeset/add_nodes_test.go +++ b/deployment/keystone/changeset/add_nodes_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" @@ -258,12 +259,14 @@ func TestAddNodes(t *testing.T) { } require.NotNil(t, r.Proposals) //nolint:staticcheck //SA1019 ignoring deprecated field for compatibility; we don't have tools to generate the new field require.Len(t, r.Proposals, 1) //nolint:staticcheck //SA1019 ignoring deprecated field for compatibility; we don't have tools to generate the new field - applyErr := applyProposal(t, tc.input.te, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.AddNodes), - Config: req, - }, - }) + applyErr := applyProposal( + t, + tc.input.te, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AddNodes), + req, + ), + ) if tc.checkErr != nil { tc.checkErr(t, useMCMS, applyErr) return @@ -299,7 +302,7 @@ func assertNodesExist(t *testing.T, registry *kcr.CapabilitiesRegistry, nodes .. } } -func applyProposal(t *testing.T, te test.TestEnv, applicable []commonchangeset.ChangesetApplication) error { +func applyProposal(t *testing.T, te test.TestEnv, applicable ...commonchangeset.ConfiguredChangeSet) error { // now apply the changeset such that the proposal is signed and execed contracts := te.ContractSets()[te.RegistrySelector] timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{ diff --git a/deployment/keystone/changeset/add_nops_test.go b/deployment/keystone/changeset/add_nops_test.go index f344f16e1fb..1b0128a1fef 100644 --- a/deployment/keystone/changeset/add_nops_test.go +++ b/deployment/keystone/changeset/add_nops_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" @@ -84,12 +85,9 @@ func TestAddNops(t *testing.T) { CallProxy: contracts.CallProxy, }, } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.AddNops), - Config: req, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure(deployment.CreateLegacyChangeSet(changeset.AddNops), req), + ) require.NoError(t, err) assertNopsExist(t, te.CapabilitiesRegistry(), nops...) diff --git a/deployment/keystone/changeset/append_node_capabilities_test.go b/deployment/keystone/changeset/append_node_capabilities_test.go index 3cf6081e966..a2a5f685da2 100644 --- a/deployment/keystone/changeset/append_node_capabilities_test.go +++ b/deployment/keystone/changeset/append_node_capabilities_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/exp/maps" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" @@ -96,12 +97,12 @@ func TestAppendNodeCapabilities(t *testing.T) { }, } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.AppendNodeCapabilities), - Config: &cfg, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.AppendNodeCapabilities), + &cfg, + ), + ) require.NoError(t, err) validateCapabilityAppends(t, te, newCapabilities) }) diff --git a/deployment/keystone/changeset/deploy_forwarder_test.go b/deployment/keystone/changeset/deploy_forwarder_test.go index 40ef0c02aeb..f60141d26f0 100644 --- a/deployment/keystone/changeset/deploy_forwarder_test.go +++ b/deployment/keystone/changeset/deploy_forwarder_test.go @@ -126,12 +126,12 @@ func TestConfigureForwarders(t *testing.T) { CallProxy: contractSet.CallProxy, } } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ConfigureForwardContracts), - Config: cfg, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ConfigureForwardContracts), + cfg, + ), + ) require.NoError(t, err) }) } diff --git a/deployment/keystone/changeset/deploy_ocr3_test.go b/deployment/keystone/changeset/deploy_ocr3_test.go index e8c8608c624..e5e0c05aa1a 100644 --- a/deployment/keystone/changeset/deploy_ocr3_test.go +++ b/deployment/keystone/changeset/deploy_ocr3_test.go @@ -11,6 +11,7 @@ import ( "go.uber.org/zap/zapcore" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" @@ -287,12 +288,12 @@ func TestConfigureOCR3(t *testing.T) { // now apply the changeset such that the proposal is signed and execed w2 := &bytes.Buffer{} cfg.WriteGeneratedConfig = w2 - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.ConfigureOCR3Contract), - Config: cfg, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.ConfigureOCR3Contract), + cfg, + ), + ) require.NoError(t, err) }) } diff --git a/deployment/keystone/changeset/test/helpers.go b/deployment/keystone/changeset/test/helpers.go index 5c8fed7f948..3c90fd4a661 100644 --- a/deployment/keystone/changeset/test/helpers.go +++ b/deployment/keystone/changeset/test/helpers.go @@ -139,24 +139,24 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { Chains: chains, ExistingAddresses: deployment.NewMemoryAddressBook(), } - e, err := commonchangeset.ApplyChangesets(t, e, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(kschangeset.DeployCapabilityRegistry), - Config: registryChainSel, - }, - { - Changeset: commonchangeset.WrapChangeSet(kschangeset.DeployOCR3), - Config: registryChainSel, - }, - { - Changeset: commonchangeset.WrapChangeSet(kschangeset.DeployForwarder), - Config: kschangeset.DeployForwarderRequest{}, - }, - { - Changeset: commonchangeset.WrapChangeSet(workflowregistry.Deploy), - Config: registryChainSel, - }, - }) + e, err := commonchangeset.Apply(t, e, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(kschangeset.DeployCapabilityRegistry), + registryChainSel, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(kschangeset.DeployOCR3), + registryChainSel, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(kschangeset.DeployForwarder), + kschangeset.DeployForwarderRequest{}, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(workflowregistry.Deploy), + registryChainSel, + ), + ) require.NoError(t, err) require.NotNil(t, e) require.Len(t, e.Chains, c.NumChains) @@ -284,12 +284,12 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { t.Logf("Enabling MCMS on chain %d", sel) timelockCfgs[sel] = proposalutils.SingleGroupTimelockConfig(t) } - env, err = commonchangeset.ApplyChangesets(t, env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), - Config: timelockCfgs, - }, - }) + env, err = commonchangeset.Apply(t, env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + timelockCfgs, + ), + ) require.NoError(t, err) // extract the MCMS address r, err := internal.GetContractSets(lggr, &internal.GetContractSetsRequest{ @@ -303,15 +303,18 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { require.NoError(t, mcms.Validate()) // transfer ownership of all contracts to the MCMS - env, err = commonchangeset.ApplyChangesets(t, env, map[uint64]*proposalutils.TimelockExecutionContracts{sel: {Timelock: mcms.Timelock, CallProxy: mcms.CallProxy}}, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(kschangeset.AcceptAllOwnershipsProposal), - Config: &kschangeset.AcceptAllOwnershipRequest{ + env, err = commonchangeset.Apply(t, env, + map[uint64]*proposalutils.TimelockExecutionContracts{ + sel: {Timelock: mcms.Timelock, CallProxy: mcms.CallProxy}, + }, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(kschangeset.AcceptAllOwnershipsProposal), + &kschangeset.AcceptAllOwnershipRequest{ ChainSelector: sel, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) } } diff --git a/deployment/keystone/changeset/update_don_test.go b/deployment/keystone/changeset/update_don_test.go index 501afb77e21..2e8c2ce1262 100644 --- a/deployment/keystone/changeset/update_don_test.go +++ b/deployment/keystone/changeset/update_don_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" @@ -129,12 +130,12 @@ func TestUpdateDon(t *testing.T) { CallProxy: contracts.CallProxy, }, } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateDon), - Config: &cfg, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateDon), + &cfg, + ), + ) require.NoError(t, err) assertDonContainsCapabilities(t, te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry, caps, p2pIDs) }) diff --git a/deployment/keystone/changeset/update_node_capabilities_test.go b/deployment/keystone/changeset/update_node_capabilities_test.go index 8962dfc389d..fc51399910c 100644 --- a/deployment/keystone/changeset/update_node_capabilities_test.go +++ b/deployment/keystone/changeset/update_node_capabilities_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/exp/maps" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" @@ -126,12 +127,12 @@ func TestUpdateNodeCapabilities(t *testing.T) { }, } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateNodeCapabilities), - Config: &cfg, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateNodeCapabilities), + &cfg, + ), + ) require.NoError(t, err) validateCapabilityUpdates(t, te, capabiltiesToSet) }) diff --git a/deployment/keystone/changeset/update_nodes_test.go b/deployment/keystone/changeset/update_nodes_test.go index 5709482ddb3..498fd6d33f7 100644 --- a/deployment/keystone/changeset/update_nodes_test.go +++ b/deployment/keystone/changeset/update_nodes_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/exp/maps" + "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" @@ -97,16 +98,16 @@ func TestUpdateNodes(t *testing.T) { CallProxy: contracts.CallProxy, }, } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateNodes), - Config: &changeset.UpdateNodesRequest{ + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateNodes), + &changeset.UpdateNodesRequest{ RegistryChainSel: te.RegistrySelector, P2pToUpdates: updates, MCMSConfig: &changeset.MCMSConfig{MinDuration: 0}, }, - }, - }) + ), + ) require.NoError(t, err) validateUpdate(t, te, updates) diff --git a/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go b/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go index aa869ce1517..172205dab1d 100644 --- a/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go +++ b/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go @@ -100,11 +100,11 @@ func Test_UpdateAllowedDons_WithMCMS(t *testing.T) { }, } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(workflowregistry.UpdateAllowedDons), - Config: req, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(workflowregistry.UpdateAllowedDons), + req, + ), + ) require.NoError(t, err) } diff --git a/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go b/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go index 20dbf9895d4..1f937ce30dd 100644 --- a/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go +++ b/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go @@ -103,11 +103,11 @@ func Test_UpdateAuthorizedAddresses_WithMCMS(t *testing.T) { }, } - _, err = commonchangeset.ApplyChangesets(t, te.Env, timelockContracts, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(workflowregistry.UpdateAuthorizedAddresses), - Config: req, - }, - }) + _, err = commonchangeset.Apply(t, te.Env, timelockContracts, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(workflowregistry.UpdateAuthorizedAddresses), + req, + ), + ) require.NoError(t, err) } diff --git a/integration-tests/smoke/ccip/ccip_add_chain_test.go b/integration-tests/smoke/ccip/ccip_add_chain_test.go index d26c8bfb258..fda84a94551 100644 --- a/integration-tests/smoke/ccip/ccip_add_chain_test.go +++ b/integration-tests/smoke/ccip/ccip_add_chain_test.go @@ -10,6 +10,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment" ccipcs "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" @@ -432,23 +433,23 @@ func setupInboundWiring( } var err error - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(ccipcs.UpdateOffRampSourcesChangeset), - Config: ccipcs.UpdateOffRampSourcesConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipcs.UpdateOffRampSourcesChangeset), + ccipcs.UpdateOffRampSourcesConfig{ UpdatesByChain: offRampSourceUpdates(t, newChains, sources, testRouterEnabled), MCMS: mcmsConfig, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(ccipcs.UpdateRouterRampsChangeset), - Config: ccipcs.UpdateRouterRampsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipcs.UpdateRouterRampsChangeset), + ccipcs.UpdateRouterRampsConfig{ TestRouter: testRouterEnabled, UpdatesByChain: routerOffRampUpdates(t, newChains, sources), MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) return e @@ -473,37 +474,37 @@ func setupOutboundWiring( } var err error - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(ccipcs.UpdateOnRampsDestsChangeset), - Config: ccipcs.UpdateOnRampDestsConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipcs.UpdateOnRampsDestsChangeset), + ccipcs.UpdateOnRampDestsConfig{ UpdatesByChain: onRampDestUpdates(t, newChains, sources, testRouterEnabled), MCMS: mcmsConfig, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(ccipcs.UpdateFeeQuoterPricesChangeset), - Config: ccipcs.UpdateFeeQuoterPricesConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipcs.UpdateFeeQuoterPricesChangeset), + ccipcs.UpdateFeeQuoterPricesConfig{ PricesByChain: feeQuoterPricesByChain(t, newChains, sources), MCMS: mcmsConfig, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(ccipcs.UpdateFeeQuoterDestsChangeset), - Config: ccipcs.UpdateFeeQuoterDestsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipcs.UpdateFeeQuoterDestsChangeset), + ccipcs.UpdateFeeQuoterDestsConfig{ UpdatesByChain: feeQuoterDestUpdates(t, newChains, sources), MCMS: mcmsConfig, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(ccipcs.UpdateRouterRampsChangeset), - Config: ccipcs.UpdateRouterRampsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipcs.UpdateRouterRampsChangeset), + ccipcs.UpdateRouterRampsConfig{ TestRouter: testRouterEnabled, UpdatesByChain: routerOnRampUpdates(t, newChains, sources), MCMS: mcmsConfig, }, - }, - }) + ), + ) require.NoError(t, err) return e @@ -517,14 +518,14 @@ func setupChain(t *testing.T, e testhelpers.DeployedEnv, tEnv testhelpers.TestEn // Need to update what the RMNProxy is pointing to, otherwise plugin will not work. var err error - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(ccipcs.SetRMNRemoteOnRMNProxyChangeset), - Config: ccipcs.SetRMNRemoteOnRMNProxyConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(ccipcs.SetRMNRemoteOnRMNProxyChangeset), + ccipcs.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: chains, }, - }, - }) + ), + ) require.NoError(t, err) return e @@ -758,7 +759,7 @@ func transferToMCMSAndRenounceTimelockDeployer( state ccipcs.CCIPOnChainState, onlyChainContracts bool, ) { - apps := make([]commonchangeset.ChangesetApplication, 0, len(chains)+1) + apps := make([]commonchangeset.ConfiguredChangeSet, 0, len(chains)+1) cfg := testhelpers.GenTestTransferOwnershipConfig(e, chains, state) if onlyChainContracts { // filter out the home chain contracts from e.HomeChainSel @@ -775,17 +776,17 @@ func transferToMCMSAndRenounceTimelockDeployer( } cfg.ContractsByChain[e.HomeChainSel] = chainContracts } - apps = append(apps, commonchangeset.ChangesetApplication{ - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: cfg, - }) + apps = append(apps, commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + cfg, + )) for _, chain := range chains { - apps = append(apps, commonchangeset.ChangesetApplication{ - Changeset: commonchangeset.WrapChangeSet(commonchangeset.RenounceTimelockDeployer), - Config: commonchangeset.RenounceTimelockDeployerConfig{ + apps = append(apps, commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.RenounceTimelockDeployer), + commonchangeset.RenounceTimelockDeployerConfig{ ChainSel: chain, }, - }) + )) } var err error e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), apps) diff --git a/integration-tests/smoke/ccip/ccip_cs_rmn_curse_uncurse_test.go b/integration-tests/smoke/ccip/ccip_cs_rmn_curse_uncurse_test.go index 2fb9333a14a..5cc5540cd64 100644 --- a/integration-tests/smoke/ccip/ccip_cs_rmn_curse_uncurse_test.go +++ b/integration-tests/smoke/ccip/ccip_cs_rmn_curse_uncurse_test.go @@ -6,6 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -187,15 +188,15 @@ func transferRMNContractToMCMS(t *testing.T, e *testhelpers.DeployedEnv, state c contractsByChain[e.HomeChainSel] = append(contractsByChain[e.HomeChainSel], state.Chains[e.HomeChainSel].RMNHome.Address()) // This is required because RMN Contracts is initially owned by the deployer - _, err := commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + _, err := commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: contractsByChain, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) } @@ -221,22 +222,22 @@ func runRmnUncurseMCMSTest(t *testing.T, tc CurseTestCase) { transferRMNContractToMCMS(t, &e, state, timelocksPerChain) - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.RMNCurseChangeset), - Config: config, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.RMNCurseChangeset), + config, + ), + ) require.NoError(t, err) verifyTestCaseAssertions(t, &e, tc, mapIDToSelector) - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.RMNUncurseChangeset), - Config: config, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.RMNUncurseChangeset), + config, + ), + ) require.NoError(t, err) verifyNoActiveCurseOnAllChains(t, &e) @@ -351,12 +352,12 @@ func runRmnCurseMCMSTest(t *testing.T, tc CurseTestCase) { transferRMNContractToMCMS(t, &e, state, timelocksPerChain) - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.RMNCurseChangeset), - Config: config, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.RMNCurseChangeset), + config, + ), + ) require.NoError(t, err) verifyTestCaseAssertions(t, &e, tc, mapIDToSelector) diff --git a/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go b/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go index c7d17974449..aa2e5477d8c 100644 --- a/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go +++ b/integration-tests/smoke/ccip/ccip_cs_update_rmn_config_test.go @@ -192,15 +192,15 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { timelocksPerChain := changeset.BuildTimelockPerChain(e.Env, state) if tc.useMCMS { // This is required because RMNHome is initially owned by the deployer - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: contractsByChain, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) } @@ -237,12 +237,12 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { MCMSConfig: mcmsConfig, } - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetRMNHomeCandidateConfigChangeset), - Config: setRMNHomeCandidateConfig, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetRMNHomeCandidateConfigChangeset), + setRMNHomeCandidateConfig, + ), + ) require.NoError(t, err) @@ -263,12 +263,12 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { MCMSConfig: mcmsConfig, } - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.PromoteRMNHomeCandidateConfigChangeset), - Config: promoteConfig, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.PromoteRMNHomeCandidateConfigChangeset), + promoteConfig, + ), + ) require.NoError(t, err) currentActiveDigest, err = rmnHome.GetActiveDigest(nil) @@ -297,12 +297,12 @@ func updateRMNConfig(t *testing.T, tc updateRMNConfigTestCase) { MCMSConfig: mcmsConfig, } - _, err = commonchangeset.ApplyChangesets(t, e.Env, timelocksPerChain, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetRMNRemoteConfigChangeset), - Config: setRemoteConfig, - }, - }) + _, err = commonchangeset.Apply(t, e.Env, timelocksPerChain, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteConfigChangeset), + setRemoteConfig, + ), + ) require.NoError(t, err) rmnRemotePerChain := changeset.BuildRMNRemotePerChain(e.Env, state) @@ -345,22 +345,22 @@ func TestSetRMNRemoteOnRMNProxy(t *testing.T) { } // Need to deploy prerequisites first so that we can form the USDC config // no proposals to be made, timelock can be passed as nil here - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployLinkToken), - Config: allChains, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployPrerequisitesChangeset), - Config: changeset.DeployPrerequisiteConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, nil, + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployLinkToken), + allChains, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployPrerequisitesChangeset), + changeset.DeployPrerequisiteConfig{ Configs: prereqCfgs, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.DeployMCMSWithTimelock), - Config: mcmsCfg, - }, - }) + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + mcmsCfg, + ), + ) require.NoError(t, err) contractsByChain := make(map[uint64][]common.Address) state, err := changeset.LoadOnchainState(e.Env) @@ -384,19 +384,18 @@ func TestSetRMNRemoteOnRMNProxy(t *testing.T) { } envNodes, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain) require.NoError(t, err) - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, timelockContractsPerChain, []commonchangeset.ChangesetApplication{ + e.Env, err = commonchangeset.Apply(t, e.Env, timelockContractsPerChain, // transfer ownership of RMNProxy to timelock - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: contractsByChain, MinDelay: 0, }, - }, - - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployHomeChainChangeset), - Config: changeset.DeployHomeChainConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), + changeset.DeployHomeChainConfig{ HomeChainSel: e.HomeChainSel, RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), @@ -405,24 +404,24 @@ func TestSetRMNRemoteOnRMNProxy(t *testing.T) { "NodeOperator": envNodes.NonBootstraps().PeerIDs(), }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.DeployChainContractsChangeset), - Config: changeset.DeployChainContractsConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), + changeset.DeployChainContractsConfig{ HomeChainSelector: e.HomeChainSel, ContractParamsPerChain: allContractParams, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), - Config: changeset.SetRMNRemoteOnRMNProxyConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), + changeset.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: allChains, MCMSConfig: &changeset.MCMSConfig{ MinDelay: 0, }, }, - }, - }) + ), + ) require.NoError(t, err) state, err = changeset.LoadOnchainState(e.Env) require.NoError(t, err) diff --git a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go index 2ac95f0af43..dfce2739306 100644 --- a/integration-tests/smoke/ccip/ccip_fee_boosting_test.go +++ b/integration-tests/smoke/ccip/ccip_fee_boosting_test.go @@ -96,10 +96,10 @@ func Test_CCIPFeeBoosting(t *testing.T) { feeQuoterCfg) // Update token prices in destination chain FeeQuoter - e.Env, err = commoncs.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - Config: changeset.UpdateFeeQuoterPricesConfig{ + e.Env, err = commoncs.Apply(t, e.Env, e.TimelockContracts(t), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), + changeset.UpdateFeeQuoterPricesConfig{ PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ destChain: { TokenPrices: map[common.Address]*big.Int{ @@ -109,8 +109,8 @@ func Test_CCIPFeeBoosting(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) startBlocks := make(map[uint64]*uint64) @@ -137,10 +137,10 @@ func Test_CCIPFeeBoosting(t *testing.T) { DestChainSelector: destChain, }] = []uint64{msgSentEvent.SequenceNumber} - e.Env, err = commoncs.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commoncs.ChangesetApplication{ - { - Changeset: commoncs.WrapChangeSet(changeset.UpdateFeeQuoterPricesChangeset), - Config: changeset.UpdateFeeQuoterPricesConfig{ + e.Env, err = commoncs.Apply(t, e.Env, e.TimelockContracts(t), + commoncs.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateFeeQuoterPricesChangeset), + changeset.UpdateFeeQuoterPricesConfig{ PricesByChain: map[uint64]changeset.FeeQuoterPriceUpdatePerSource{ sourceChain: { GasPrices: map[uint64]*big.Int{ @@ -149,8 +149,8 @@ func Test_CCIPFeeBoosting(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // Confirm gas prices are updated diff --git a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go index 1520621c0b2..1f5f5b850a2 100644 --- a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go +++ b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go @@ -17,6 +17,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" v1_5testhelpers "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/v1_5" @@ -83,10 +84,10 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { e.Env = v1_5testhelpers.AddLanes(t, e.Env, state, pairs) // permabless the commit stores - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(v1_5.PermaBlessCommitStoreChangeset), - Config: v1_5.PermaBlessCommitStoreConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(v1_5.PermaBlessCommitStoreChangeset), + v1_5.PermaBlessCommitStoreConfig{ Configs: map[uint64]v1_5.PermaBlessCommitStoreConfigPerDest{ dest: { Sources: []v1_5.PermaBlessConfigPerSourceChain{ @@ -102,8 +103,8 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // reload state after adding lanes state, err = changeset.LoadOnchainState(e.Env) @@ -169,15 +170,15 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { } } - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(commonchangeset.TransferToMCMSWithTimelock), - Config: commonchangeset.TransferToMCMSWithTimelockConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.TransferToMCMSWithTimelock), + commonchangeset.TransferToMCMSWithTimelockConfig{ ContractsByChain: contractsByChain, MinDelay: 0, }, - }, - }) + ), + ) require.NoError(t, err) // add 1.6 contracts to the environment and send 1.6 jobs // First we need to deploy Homechain contracts and restart the nodes with updated cap registry @@ -185,20 +186,20 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { e = testhelpers.AddCCIPContractsToEnvironment(t, e.Env.AllChainSelectors(), tEnv, false) // Set RMNProxy to point to RMNRemote. // nonce manager should point to 1.5 ramps - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { + e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( // as we have already transferred ownership for RMNProxy to MCMS, it needs to be done via MCMS proposal - Changeset: commonchangeset.WrapChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), - Config: changeset.SetRMNRemoteOnRMNProxyConfig{ + deployment.CreateLegacyChangeSet(changeset.SetRMNRemoteOnRMNProxyChangeset), + changeset.SetRMNRemoteOnRMNProxyConfig{ ChainSelectors: e.Env.AllChainSelectors(), MCMSConfig: &changeset.MCMSConfig{ MinDelay: 0, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateNonceManagersChangeset), - Config: changeset.UpdateNonceManagerConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), + changeset.UpdateNonceManagerConfig{ // we only have lanes between src1 --> dest UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ src1: { @@ -231,8 +232,8 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) state, err = changeset.LoadOnchainState(e.Env) require.NoError(t, err) @@ -284,10 +285,10 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { testhelpers.ConfirmExecWithSeqNrsForAll(t, e.Env, state, expectedSeqNumExec, startBlocks) // now that the 1.6 lane is working, we can enable the real router - e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, e.TimelockContracts(t), []commonchangeset.ChangesetApplication{ - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOnRampsDestsChangeset), - Config: changeset.UpdateOnRampDestsConfig{ + e.Env, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOnRampsDestsChangeset), + changeset.UpdateOnRampDestsConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OnRampDestinationUpdate{ src1: { dest: { @@ -298,10 +299,10 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, }, }, - }, - { - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateOffRampSourcesChangeset), - Config: changeset.UpdateOffRampSourcesConfig{ + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateOffRampSourcesChangeset), + changeset.UpdateOffRampSourcesConfig{ UpdatesByChain: map[uint64]map[uint64]changeset.OffRampSourceUpdate{ dest: { src1: { @@ -312,11 +313,11 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, }, }, - }, - { + ), + commonchangeset.Configure( // this needs to be MCMS proposal as the router contract is owned by MCMS - Changeset: commonchangeset.WrapChangeSet(changeset.UpdateRouterRampsChangeset), - Config: changeset.UpdateRouterRampsConfig{ + deployment.CreateLegacyChangeSet(changeset.UpdateRouterRampsChangeset), + changeset.UpdateRouterRampsConfig{ TestRouter: false, MCMS: &changeset.MCMSConfig{ MinDelay: 0, @@ -336,8 +337,8 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { }, }, }, - }, - }) + ), + ) require.NoError(t, err) // confirm that the other lane src2->dest is still working with v1.5 sentEventOnOtherLane, err := v1_5testhelpers.SendRequest(t, e.Env, state, From 41a6cb0c0fd298bff69be934d5914964da53357c Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Wed, 12 Feb 2025 17:56:11 -0800 Subject: [PATCH 46/83] fix: more restrictive build cache keys (#16371) --- .github/actions/setup-go/action.yml | 8 ++------ .github/workflows/ci-core.yml | 5 +---- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/actions/setup-go/action.yml b/.github/actions/setup-go/action.yml index 9d395795764..d2b5a64af82 100644 --- a/.github/actions/setup-go/action.yml +++ b/.github/actions/setup-go/action.yml @@ -4,7 +4,7 @@ inputs: only-modules: description: Set to 'true' to only cache modules default: "false" - cache-version: + cache-version: description: Set this to cache bust default: "1" build-cache-version: @@ -97,7 +97,7 @@ runs: - uses: actions/cache/restore@v4 name: Cache Go Build Outputs (restore) - # For certain events, we don't necessarily want to create a build cache, but we will benefit from restoring from one. + # For certain events, we don't necessarily want to create a build cache, but we will benefit from restoring from one. if: ${{ inputs.only-modules == 'false' && (github.event_name == 'merge_group' || inputs.restore-build-cache-only == 'true') }} with: path: | @@ -106,8 +106,6 @@ runs: restore-keys: | ${{ runner.os }}-gobuild-${{ inputs.build-cache-version || inputs.cache-version }}-${{ hashFiles(steps.go-module-path.outputs.path) }}-develop ${{ runner.os }}-gobuild-${{ inputs.build-cache-version || inputs.cache-version }}-${{ hashFiles(steps.go-module-path.outputs.path) }}- - ${{ runner.os }}-gobuild-${{ inputs.build-cache-version || inputs.cache-version }}- - ${{ runner.os }}-gobuild-${{ inputs.cache-version }}- - uses: actions/cache@v4 # don't save cache on merge queue events @@ -121,5 +119,3 @@ runs: restore-keys: | ${{ runner.os }}-gobuild-${{ inputs.build-cache-version || inputs.cache-version }}-${{ hashFiles(steps.go-module-path.outputs.path) }}-develop ${{ runner.os }}-gobuild-${{ inputs.build-cache-version || inputs.cache-version }}-${{ hashFiles(steps.go-module-path.outputs.path) }}- - ${{ runner.os }}-gobuild-${{ inputs.build-cache-version || inputs.cache-version }}- - ${{ runner.os }}-gobuild-${{ inputs.cache-version }}- diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index 6ac8d243c7b..d99689be147 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -281,10 +281,7 @@ jobs: env: OUTPUT_FILE: ./output.txt CL_DATABASE_URL: ${{ env.DB_URL }} - run: | - # See: https://github.com/golang/go/issues/69179 - GODEBUG=goindex=0 - ./tools/bin/${{ matrix.type.cmd }} ./... + run: ./tools/bin/${{ matrix.type.cmd }} ./... - name: Print Races id: print-races From fb20ee8ba04dbf1132f447b127417a81ec002300 Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Wed, 12 Feb 2025 20:12:20 -0600 Subject: [PATCH 47/83] bump integrations/evm; use evm/heads; convert preparetest to independent command (#16311) --- .../actions/setup-ci-core-tests/action.yml | 6 +- .github/actions/setup-postgres/.env | 5 - .github/actions/setup-postgres/action.yml | 18 - .github/actions/setup-postgres/bin/pg_dump | 23 - .../actions/setup-postgres/docker-compose.yml | 15 - .../wait-for-healthy-postgres.sh | 25 - .github/workflows/ci-core-partial.yml | 21 +- .github/workflows/ci-core.yml | 13 +- .github/workflows/flakeguard.yml | 7 +- .golangci.yml | 1 + .mockery.yaml | 8 - GNUmakefile | 6 +- common/headtracker/mocks/broadcaster.go | 361 ----- common/headtracker/mocks/trackable.go | 72 - common/headtracker/mocks/tracker.go | 427 ----- .../integrationhelpers/integration_helpers.go | 5 +- .../usdcreader/usdcreader_test.go | 5 +- .../ocrimpls/contract_transmitter_test.go | 10 +- .../evm/forwarders/forwarder_manager_test.go | 9 +- .../evm/headtracker/head_broadcaster.go | 17 - .../evm/headtracker/head_broadcaster_test.go | 191 --- .../evm/headtracker/head_listener_test.go | 229 --- core/chains/evm/headtracker/head_saver.go | 104 -- .../chains/evm/headtracker/head_saver_test.go | 160 -- core/chains/evm/headtracker/head_tracker.go | 53 - .../evm/headtracker/head_tracker_test.go | 1433 ----------------- core/chains/evm/headtracker/heads.go | 184 --- core/chains/evm/headtracker/heads_test.go | 233 --- core/chains/evm/headtracker/heap.go | 37 - .../evm/headtracker/mocks/head_trackable.go | 23 - core/chains/evm/headtracker/orm.go | 111 -- core/chains/evm/headtracker/orm_test.go | 111 -- .../evm/headtracker/simulated_head_tracker.go | 82 - core/chains/evm/headtracker/types/types.go | 28 - core/chains/evm/log/orm_test.go | 48 +- core/chains/evm/logpoller/helper_test.go | 5 +- .../evm/logpoller/log_poller_internal_test.go | 18 +- core/chains/evm/logpoller/log_poller_test.go | 7 +- core/chains/evm/txmgr/confirmer_test.go | 15 +- core/chains/evm/txmgr/finalizer_test.go | 15 +- core/chains/evm/txmgr/txmgr_test.go | 5 +- core/chains/legacyevm/chain.go | 53 +- core/chains/legacyevm/evm_txm.go | 6 +- core/cmd/shell.go | 2 +- core/cmd/shell_local.go | 313 +--- core/internal/cltest/cltest.go | 4 +- core/internal/cltest/factories.go | 25 +- core/internal/testutils/evmtest/evmtest.go | 7 +- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- core/services/chainlink/config_general.go | 7 +- core/services/feeds/service_test.go | 5 +- core/services/headreporter/head_reporter.go | 15 +- .../headreporter/prometheus_reporter_test.go | 5 +- core/services/keeper/upkeep_executer.go | 11 +- core/services/ocr/contract_tracker.go | 9 +- core/services/ocr/contract_tracker_test.go | 7 +- .../ccipdata/commit_store_reader_test.go | 5 +- .../internal/ccipdata/offramp_reader_test.go | 10 +- .../internal/ccipdata/onramp_reader_test.go | 4 +- .../ccipdata/price_registry_reader_test.go | 5 +- .../ccipdata/usdc_reader_internal_test.go | 5 +- ...annel_definition_cache_integration_test.go | 5 +- .../ocr2keeper/evmregistry/v20/head.go | 11 +- .../evmregistry/v20/registry_test.go | 5 +- .../autotelemetry21/custom_telemetry_test.go | 5 +- .../evmregistry/v21/block_subscriber.go | 19 +- .../evmregistry/v21/block_subscriber_test.go | 21 +- .../v21/logprovider/integration_test.go | 4 +- .../evmregistry/v21/registry_test.go | 5 +- core/services/registrysyncer/syncer_test.go | 7 +- .../evm/capabilities/testutils/backend.go | 6 +- .../relay/evm/chain_components_test.go | 8 +- core/services/relay/evm/config_poller_test.go | 4 +- .../relay/evm/functions/config_poller_test.go | 5 +- .../relay/evm/mercury/helpers_test.go | 5 +- .../relay/evm/mercury/v1/data_source_test.go | 17 +- core/services/relay/evm/mercury_provider.go | 9 +- .../relay/evm/request_round_tracker_test.go | 8 +- core/services/relay/evm/write_target_test.go | 5 +- core/services/vrf/delegate_test.go | 10 +- .../vrf/v2/listener_v2_log_listener_test.go | 6 +- core/store/cmd/preparetest/main.go | 77 + core/store/migrate/migrate.go | 8 +- core/store/migrate/migrate_test.go | 4 +- core/store/store.go | 308 +++- deployment/go.mod | 5 +- deployment/go.sum | 24 +- go.mod | 2 +- go.sum | 4 +- integration-tests/go.mod | 4 +- integration-tests/go.sum | 24 +- integration-tests/load/go.mod | 4 +- integration-tests/load/go.sum | 24 +- .../smoke/ccip/ccip_reader_test.go | 20 +- 95 files changed, 788 insertions(+), 4535 deletions(-) delete mode 100644 .github/actions/setup-postgres/.env delete mode 100644 .github/actions/setup-postgres/action.yml delete mode 100755 .github/actions/setup-postgres/bin/pg_dump delete mode 100644 .github/actions/setup-postgres/docker-compose.yml delete mode 100755 .github/actions/setup-postgres/wait-for-healthy-postgres.sh delete mode 100644 common/headtracker/mocks/broadcaster.go delete mode 100644 common/headtracker/mocks/trackable.go delete mode 100644 common/headtracker/mocks/tracker.go delete mode 100644 core/chains/evm/headtracker/head_broadcaster.go delete mode 100644 core/chains/evm/headtracker/head_broadcaster_test.go delete mode 100644 core/chains/evm/headtracker/head_listener_test.go delete mode 100644 core/chains/evm/headtracker/head_saver.go delete mode 100644 core/chains/evm/headtracker/head_saver_test.go delete mode 100644 core/chains/evm/headtracker/head_tracker.go delete mode 100644 core/chains/evm/headtracker/head_tracker_test.go delete mode 100644 core/chains/evm/headtracker/heads.go delete mode 100644 core/chains/evm/headtracker/heads_test.go delete mode 100644 core/chains/evm/headtracker/heap.go delete mode 100644 core/chains/evm/headtracker/mocks/head_trackable.go delete mode 100644 core/chains/evm/headtracker/orm.go delete mode 100644 core/chains/evm/headtracker/orm_test.go delete mode 100644 core/chains/evm/headtracker/simulated_head_tracker.go delete mode 100644 core/chains/evm/headtracker/types/types.go create mode 100644 core/store/cmd/preparetest/main.go diff --git a/.github/actions/setup-ci-core-tests/action.yml b/.github/actions/setup-ci-core-tests/action.yml index 13c2a086de3..423b55d5403 100644 --- a/.github/actions/setup-ci-core-tests/action.yml +++ b/.github/actions/setup-ci-core-tests/action.yml @@ -33,13 +33,9 @@ runs: working-directory: ${{ inputs.go-mod-download-directory }} run: go mod download - - name: Build binary - shell: bash - run: go build -o chainlink.test . - - name: Setup DB shell: bash - run: ./chainlink.test local db preparetest + run: go run ./core/store/cmd/preparetest env: CL_DATABASE_URL: ${{ inputs.db-url }} diff --git a/.github/actions/setup-postgres/.env b/.github/actions/setup-postgres/.env deleted file mode 100644 index 47ed8d9bcd5..00000000000 --- a/.github/actions/setup-postgres/.env +++ /dev/null @@ -1,5 +0,0 @@ -POSTGRES_USER=postgres -POSTGRES_OPTIONS="-c max_connections=1000 -c shared_buffers=2GB -c log_lock_waits=true" -POSTGRES_PASSWORD=postgres -POSTGRES_DB=chainlink_test -POSTGRES_HOST_AUTH_METHOD=trust diff --git a/.github/actions/setup-postgres/action.yml b/.github/actions/setup-postgres/action.yml deleted file mode 100644 index 45bfba5965f..00000000000 --- a/.github/actions/setup-postgres/action.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Setup Postgresql -description: Setup postgres docker container via docker-compose, allowing usage of a custom command, see https://github.com/orgs/community/discussions/26688 -inputs: - base-path: - description: Path to the base of the repo - required: false - default: . -runs: - using: composite - steps: - - name: Start postgres service - run: docker compose up -d - shell: bash - working-directory: ${{ inputs.base-path }}/.github/actions/setup-postgres - - name: Wait for postgres service to be healthy - run: ./wait-for-healthy-postgres.sh - shell: bash - working-directory: ${{ inputs.base-path }}/.github/actions/setup-postgres diff --git a/.github/actions/setup-postgres/bin/pg_dump b/.github/actions/setup-postgres/bin/pg_dump deleted file mode 100755 index d8135ad824c..00000000000 --- a/.github/actions/setup-postgres/bin/pg_dump +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env bash -# -# This script acts as a docker replacement around pg_dump so that developers can -# run DB involved tests locally without having postgres installed. -# -# Installation: -# - Make sure that your PATH doesn't already contain a postgres installation -# - Add this script to your PATH -# -# Usage: -# You should be able to setup your test db via: -# - go build -o chainlink.test . # Build the chainlink binary to run test db prep commands from -# - export CL_DATABASE_URL="postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable" -# - pushd .github/actions/setup-postgres/ # Navigate to the setup-postgres action so we can spin up a docker postgres -# instance -# - docker compose up # Spin up postgres -# - ./chainlink.test local db preparetest # Run the db migration, which will shell out to our pg_dump wrapper too. -# - popd -# - go test -timeout 30s ./core/services/workflows/... -v # Run tests that use the database - -cd "$(dirname "$0")" || exit - -docker compose exec -T postgres pg_dump "$@" diff --git a/.github/actions/setup-postgres/docker-compose.yml b/.github/actions/setup-postgres/docker-compose.yml deleted file mode 100644 index 23f8d82b917..00000000000 --- a/.github/actions/setup-postgres/docker-compose.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: gha_postgres -services: - postgres: - ports: - - "5432:5432" - container_name: cl_pg - image: postgres:14-alpine - command: postgres ${POSTGRES_OPTIONS} - env_file: - - .env - healthcheck: - test: "pg_isready -d ${POSTGRES_DB} -U ${POSTGRES_USER}" - interval: 2s - timeout: 5s - retries: 5 diff --git a/.github/actions/setup-postgres/wait-for-healthy-postgres.sh b/.github/actions/setup-postgres/wait-for-healthy-postgres.sh deleted file mode 100755 index 438cfbaff3d..00000000000 --- a/.github/actions/setup-postgres/wait-for-healthy-postgres.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -RETRIES=10 - -until [ $RETRIES -eq 0 ]; do - DOCKER_OUTPUT=$(docker compose ps postgres --status running --format json) - JSON_TYPE=$(echo "$DOCKER_OUTPUT" | jq -r 'type') - - if [ "$JSON_TYPE" == "array" ]; then - HEALTH_STATUS=$(echo "$DOCKER_OUTPUT" | jq -r '.[0].Health') - elif [ "$JSON_TYPE" == "object" ]; then - HEALTH_STATUS=$(echo "$DOCKER_OUTPUT" | jq -r '.Health') - else - HEALTH_STATUS="Unknown JSON type: $JSON_TYPE" - fi - - echo "postgres health status: $HEALTH_STATUS" - if [ "$HEALTH_STATUS" == "healthy" ]; then - exit 0 - fi - - echo "Waiting for postgres server, $((RETRIES--)) remaining attempts..." - sleep 2 -done - -exit 1 diff --git a/.github/workflows/ci-core-partial.yml b/.github/workflows/ci-core-partial.yml index e64db9cb2f5..38c252bad7e 100644 --- a/.github/workflows/ci-core-partial.yml +++ b/.github/workflows/ci-core-partial.yml @@ -91,7 +91,7 @@ jobs: uses: ./.github/actions/setup-wasmd - name: Setup Postgres - uses: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 - name: Setup CI Core Environment uses: ./.github/actions/setup-ci-core-tests @@ -135,8 +135,9 @@ jobs: - name: Print postgres logs if: ${{ always() }} - run: docker compose logs postgres | tee ../../../postgres_logs.txt - working-directory: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 + with: + print-logs: 'true' scan: name: SonarQube Scan @@ -226,7 +227,7 @@ jobs: uses: ./.github/actions/setup-wasmd - name: Setup Postgres - uses: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 - name: Setup CI Core Environment uses: ./.github/actions/setup-ci-core-tests @@ -246,8 +247,9 @@ jobs: - name: Print postgres logs if: ${{ always() }} - run: docker compose logs postgres | tee ../../../postgres_logs.txt - working-directory: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 + with: + print-logs: 'true' run-race-tests: name: Tests (race) @@ -277,7 +279,7 @@ jobs: uses: ./.github/actions/setup-wasmd - name: Setup Postgres - uses: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 - name: Setup CI Core Environment uses: ./.github/actions/setup-ci-core-tests @@ -312,5 +314,6 @@ jobs: - name: Print postgres logs if: ${{ always() }} - run: docker compose logs postgres | tee ../../../postgres_logs.txt - working-directory: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 + with: + print-logs: 'true' diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index d99689be147..8c164840535 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -243,7 +243,7 @@ jobs: - name: Setup Postgres if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }} - uses: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 - name: Touching core/web/assets/index.html if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }} @@ -253,13 +253,9 @@ jobs: if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }} run: go mod download - - name: Build binary - if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }} - run: go build -o chainlink.test . - - name: Setup DB if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }} - run: ./chainlink.test local db preparetest + run: go run ./core/store/cmd/preparetest env: CL_DATABASE_URL: ${{ env.DB_URL }} @@ -306,8 +302,9 @@ jobs: - name: Print postgres logs if: ${{ always() && needs.filter.outputs.should-run-ci-core == 'true' }} - run: docker compose logs postgres | tee ../../../postgres_logs.txt - working-directory: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 + with: + print-logs: 'true' - name: Store logs artifacts if: ${{ always() && needs.filter.outputs.should-run-ci-core == 'true' }} diff --git a/.github/workflows/flakeguard.yml b/.github/workflows/flakeguard.yml index 3b956b9128b..6b672985845 100644 --- a/.github/workflows/flakeguard.yml +++ b/.github/workflows/flakeguard.yml @@ -303,7 +303,7 @@ jobs: uses: ./.github/actions/setup-wasmd - name: Setup Postgres - uses: ./.github/actions/setup-postgres + uses: smartcontractkit/.github/actions/setup-postgres@7aa7ce23687ba493e9ba9c6ad47a063e60ae3433 # setup-postgres@0.1.0 - name: Touching core/web/assets/index.html run: mkdir -p core/web/assets && touch core/web/assets/index.html @@ -311,11 +311,8 @@ jobs: - name: Download Go vendor packages run: go mod download - - name: Build binary - run: go build -o chainlink.test . - - name: Setup DB - run: ./chainlink.test local db preparetest + run: go run ./core/store/cmd/preparetest env: CL_DATABASE_URL: ${{ env.DB_URL }} diff --git a/.golangci.yml b/.golangci.yml index 5f01b8c0eb9..9756e8acb21 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -170,6 +170,7 @@ linters-settings: require-specific: true require-explanation: true issues: + max-same-issues: 0 exclude-rules: - path: test text: "^G404:" diff --git a/.mockery.yaml b/.mockery.yaml index 3db053d4d7a..96a0276b2ca 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -3,14 +3,6 @@ mockname: "{{ .InterfaceName }}" outpkg: mocks filename: "{{ .InterfaceName | snakecase }}.go" packages: - github.com/smartcontractkit/chainlink-framework/chains/heads: - config: - dir: common/headtracker/mocks - outpkg: mocks - interfaces: - Trackable: - Tracker: - Broadcaster: github.com/smartcontractkit/chainlink-framework/chains/txmgr: config: dir: common/txmgr/mocks diff --git a/GNUmakefile b/GNUmakefile index 5dd5642a0a6..552b263ec15 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -138,15 +138,15 @@ setup-testdb: ## Setup the test database. .PHONY: testdb testdb: ## Prepares the test database. - go run . local db preparetest + go run ./core/store/cmd/preparetest .PHONY: testdb-force testdb-force: ## Prepares the test database, drops any pesky user connections that stand in the the way. - go run . local db preparetest --force + go run ./core/store/cmd/preparetest --force .PHONY: testdb-user-only testdb-user-only: ## Prepares the test database with user only. - go run . local db preparetest --user-only + go run ./core/store/cmd/preparetest --user-only .PHONY: gomods gomods: ## Install gomods diff --git a/common/headtracker/mocks/broadcaster.go b/common/headtracker/mocks/broadcaster.go deleted file mode 100644 index d4c59a709dc..00000000000 --- a/common/headtracker/mocks/broadcaster.go +++ /dev/null @@ -1,361 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - chains "github.com/smartcontractkit/chainlink-framework/chains" - - heads "github.com/smartcontractkit/chainlink-framework/chains/heads" - - mock "github.com/stretchr/testify/mock" -) - -// Broadcaster is an autogenerated mock type for the Broadcaster type -type Broadcaster[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock.Mock -} - -type Broadcaster_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock *mock.Mock -} - -func (_m *Broadcaster[H, BLOCK_HASH]) EXPECT() *Broadcaster_Expecter[H, BLOCK_HASH] { - return &Broadcaster_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} -} - -// BroadcastNewLongestChain provides a mock function with given fields: _a0 -func (_m *Broadcaster[H, BLOCK_HASH]) BroadcastNewLongestChain(_a0 H) { - _m.Called(_a0) -} - -// Broadcaster_BroadcastNewLongestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'BroadcastNewLongestChain' -type Broadcaster_BroadcastNewLongestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// BroadcastNewLongestChain is a helper method to define mock.On call -// - _a0 H -func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) BroadcastNewLongestChain(_a0 interface{}) *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { - return &Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("BroadcastNewLongestChain", _a0)} -} - -func (_c *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) Run(run func(_a0 H)) *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(H)) - }) - return _c -} - -func (_c *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) Return() *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { - _c.Call.Return() - return _c -} - -func (_c *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func(H)) *Broadcaster_BroadcastNewLongestChain_Call[H, BLOCK_HASH] { - _c.Run(run) - return _c -} - -// Close provides a mock function with no fields -func (_m *Broadcaster[H, BLOCK_HASH]) Close() error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Close") - } - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Broadcaster_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' -type Broadcaster_Close_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Close is a helper method to define mock.On call -func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Close() *Broadcaster_Close_Call[H, BLOCK_HASH] { - return &Broadcaster_Close_Call[H, BLOCK_HASH]{Call: _e.mock.On("Close")} -} - -func (_c *Broadcaster_Close_Call[H, BLOCK_HASH]) Run(run func()) *Broadcaster_Close_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Broadcaster_Close_Call[H, BLOCK_HASH]) Return(_a0 error) *Broadcaster_Close_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Broadcaster_Close_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *Broadcaster_Close_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// HealthReport provides a mock function with no fields -func (_m *Broadcaster[H, BLOCK_HASH]) HealthReport() map[string]error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for HealthReport") - } - - var r0 map[string]error - if rf, ok := ret.Get(0).(func() map[string]error); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[string]error) - } - } - - return r0 -} - -// Broadcaster_HealthReport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HealthReport' -type Broadcaster_HealthReport_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// HealthReport is a helper method to define mock.On call -func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) HealthReport() *Broadcaster_HealthReport_Call[H, BLOCK_HASH] { - return &Broadcaster_HealthReport_Call[H, BLOCK_HASH]{Call: _e.mock.On("HealthReport")} -} - -func (_c *Broadcaster_HealthReport_Call[H, BLOCK_HASH]) Run(run func()) *Broadcaster_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Broadcaster_HealthReport_Call[H, BLOCK_HASH]) Return(_a0 map[string]error) *Broadcaster_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Broadcaster_HealthReport_Call[H, BLOCK_HASH]) RunAndReturn(run func() map[string]error) *Broadcaster_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Name provides a mock function with no fields -func (_m *Broadcaster[H, BLOCK_HASH]) Name() string { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Name") - } - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// Broadcaster_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name' -type Broadcaster_Name_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Name is a helper method to define mock.On call -func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Name() *Broadcaster_Name_Call[H, BLOCK_HASH] { - return &Broadcaster_Name_Call[H, BLOCK_HASH]{Call: _e.mock.On("Name")} -} - -func (_c *Broadcaster_Name_Call[H, BLOCK_HASH]) Run(run func()) *Broadcaster_Name_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Broadcaster_Name_Call[H, BLOCK_HASH]) Return(_a0 string) *Broadcaster_Name_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Broadcaster_Name_Call[H, BLOCK_HASH]) RunAndReturn(run func() string) *Broadcaster_Name_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Ready provides a mock function with no fields -func (_m *Broadcaster[H, BLOCK_HASH]) Ready() error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Ready") - } - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Broadcaster_Ready_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ready' -type Broadcaster_Ready_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Ready is a helper method to define mock.On call -func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Ready() *Broadcaster_Ready_Call[H, BLOCK_HASH] { - return &Broadcaster_Ready_Call[H, BLOCK_HASH]{Call: _e.mock.On("Ready")} -} - -func (_c *Broadcaster_Ready_Call[H, BLOCK_HASH]) Run(run func()) *Broadcaster_Ready_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Broadcaster_Ready_Call[H, BLOCK_HASH]) Return(_a0 error) *Broadcaster_Ready_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Broadcaster_Ready_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *Broadcaster_Ready_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Start provides a mock function with given fields: _a0 -func (_m *Broadcaster[H, BLOCK_HASH]) Start(_a0 context.Context) error { - ret := _m.Called(_a0) - - if len(ret) == 0 { - panic("no return value specified for Start") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context) error); ok { - r0 = rf(_a0) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Broadcaster_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' -type Broadcaster_Start_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Start is a helper method to define mock.On call -// - _a0 context.Context -func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Start(_a0 interface{}) *Broadcaster_Start_Call[H, BLOCK_HASH] { - return &Broadcaster_Start_Call[H, BLOCK_HASH]{Call: _e.mock.On("Start", _a0)} -} - -func (_c *Broadcaster_Start_Call[H, BLOCK_HASH]) Run(run func(_a0 context.Context)) *Broadcaster_Start_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *Broadcaster_Start_Call[H, BLOCK_HASH]) Return(_a0 error) *Broadcaster_Start_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Broadcaster_Start_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) error) *Broadcaster_Start_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Subscribe provides a mock function with given fields: callback -func (_m *Broadcaster[H, BLOCK_HASH]) Subscribe(callback heads.Trackable[H, BLOCK_HASH]) (H, func()) { - ret := _m.Called(callback) - - if len(ret) == 0 { - panic("no return value specified for Subscribe") - } - - var r0 H - var r1 func() - if rf, ok := ret.Get(0).(func(heads.Trackable[H, BLOCK_HASH]) (H, func())); ok { - return rf(callback) - } - if rf, ok := ret.Get(0).(func(heads.Trackable[H, BLOCK_HASH]) H); ok { - r0 = rf(callback) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(H) - } - } - - if rf, ok := ret.Get(1).(func(heads.Trackable[H, BLOCK_HASH]) func()); ok { - r1 = rf(callback) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(func()) - } - } - - return r0, r1 -} - -// Broadcaster_Subscribe_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Subscribe' -type Broadcaster_Subscribe_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Subscribe is a helper method to define mock.On call -// - callback heads.Trackable[H,BLOCK_HASH] -func (_e *Broadcaster_Expecter[H, BLOCK_HASH]) Subscribe(callback interface{}) *Broadcaster_Subscribe_Call[H, BLOCK_HASH] { - return &Broadcaster_Subscribe_Call[H, BLOCK_HASH]{Call: _e.mock.On("Subscribe", callback)} -} - -func (_c *Broadcaster_Subscribe_Call[H, BLOCK_HASH]) Run(run func(callback heads.Trackable[H, BLOCK_HASH])) *Broadcaster_Subscribe_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(heads.Trackable[H, BLOCK_HASH])) - }) - return _c -} - -func (_c *Broadcaster_Subscribe_Call[H, BLOCK_HASH]) Return(currentLongestChain H, unsubscribe func()) *Broadcaster_Subscribe_Call[H, BLOCK_HASH] { - _c.Call.Return(currentLongestChain, unsubscribe) - return _c -} - -func (_c *Broadcaster_Subscribe_Call[H, BLOCK_HASH]) RunAndReturn(run func(heads.Trackable[H, BLOCK_HASH]) (H, func())) *Broadcaster_Subscribe_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// NewBroadcaster creates a new instance of Broadcaster. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewBroadcaster[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { - mock.TestingT - Cleanup(func()) -}) *Broadcaster[H, BLOCK_HASH] { - mock := &Broadcaster[H, BLOCK_HASH]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/common/headtracker/mocks/trackable.go b/common/headtracker/mocks/trackable.go deleted file mode 100644 index e3d35dc3a8e..00000000000 --- a/common/headtracker/mocks/trackable.go +++ /dev/null @@ -1,72 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - chains "github.com/smartcontractkit/chainlink-framework/chains" - - mock "github.com/stretchr/testify/mock" -) - -// Trackable is an autogenerated mock type for the Trackable type -type Trackable[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock.Mock -} - -type Trackable_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock *mock.Mock -} - -func (_m *Trackable[H, BLOCK_HASH]) EXPECT() *Trackable_Expecter[H, BLOCK_HASH] { - return &Trackable_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} -} - -// OnNewLongestChain provides a mock function with given fields: ctx, head -func (_m *Trackable[H, BLOCK_HASH]) OnNewLongestChain(ctx context.Context, head H) { - _m.Called(ctx, head) -} - -// Trackable_OnNewLongestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'OnNewLongestChain' -type Trackable_OnNewLongestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// OnNewLongestChain is a helper method to define mock.On call -// - ctx context.Context -// - head H -func (_e *Trackable_Expecter[H, BLOCK_HASH]) OnNewLongestChain(ctx interface{}, head interface{}) *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH] { - return &Trackable_OnNewLongestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("OnNewLongestChain", ctx, head)} -} - -func (_c *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context, head H)) *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(H)) - }) - return _c -} - -func (_c *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH]) Return() *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH] { - _c.Call.Return() - return _c -} - -func (_c *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context, H)) *Trackable_OnNewLongestChain_Call[H, BLOCK_HASH] { - _c.Run(run) - return _c -} - -// NewTrackable creates a new instance of Trackable. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewTrackable[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { - mock.TestingT - Cleanup(func()) -}) *Trackable[H, BLOCK_HASH] { - mock := &Trackable[H, BLOCK_HASH]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/common/headtracker/mocks/tracker.go b/common/headtracker/mocks/tracker.go deleted file mode 100644 index a8a9d538168..00000000000 --- a/common/headtracker/mocks/tracker.go +++ /dev/null @@ -1,427 +0,0 @@ -// Code generated by mockery v2.50.0. DO NOT EDIT. - -package mocks - -import ( - context "context" - - chains "github.com/smartcontractkit/chainlink-framework/chains" - - mock "github.com/stretchr/testify/mock" -) - -// Tracker is an autogenerated mock type for the Tracker type -type Tracker[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock.Mock -} - -type Tracker_Expecter[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - mock *mock.Mock -} - -func (_m *Tracker[H, BLOCK_HASH]) EXPECT() *Tracker_Expecter[H, BLOCK_HASH] { - return &Tracker_Expecter[H, BLOCK_HASH]{mock: &_m.Mock} -} - -// Backfill provides a mock function with given fields: ctx, headWithChain -func (_m *Tracker[H, BLOCK_HASH]) Backfill(ctx context.Context, headWithChain H) error { - ret := _m.Called(ctx, headWithChain) - - if len(ret) == 0 { - panic("no return value specified for Backfill") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, H) error); ok { - r0 = rf(ctx, headWithChain) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Tracker_Backfill_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Backfill' -type Tracker_Backfill_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Backfill is a helper method to define mock.On call -// - ctx context.Context -// - headWithChain H -func (_e *Tracker_Expecter[H, BLOCK_HASH]) Backfill(ctx interface{}, headWithChain interface{}) *Tracker_Backfill_Call[H, BLOCK_HASH] { - return &Tracker_Backfill_Call[H, BLOCK_HASH]{Call: _e.mock.On("Backfill", ctx, headWithChain)} -} - -func (_c *Tracker_Backfill_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context, headWithChain H)) *Tracker_Backfill_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context), args[1].(H)) - }) - return _c -} - -func (_c *Tracker_Backfill_Call[H, BLOCK_HASH]) Return(err error) *Tracker_Backfill_Call[H, BLOCK_HASH] { - _c.Call.Return(err) - return _c -} - -func (_c *Tracker_Backfill_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context, H) error) *Tracker_Backfill_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Close provides a mock function with no fields -func (_m *Tracker[H, BLOCK_HASH]) Close() error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Close") - } - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Tracker_Close_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Close' -type Tracker_Close_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Close is a helper method to define mock.On call -func (_e *Tracker_Expecter[H, BLOCK_HASH]) Close() *Tracker_Close_Call[H, BLOCK_HASH] { - return &Tracker_Close_Call[H, BLOCK_HASH]{Call: _e.mock.On("Close")} -} - -func (_c *Tracker_Close_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_Close_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Tracker_Close_Call[H, BLOCK_HASH]) Return(_a0 error) *Tracker_Close_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Tracker_Close_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *Tracker_Close_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// HealthReport provides a mock function with no fields -func (_m *Tracker[H, BLOCK_HASH]) HealthReport() map[string]error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for HealthReport") - } - - var r0 map[string]error - if rf, ok := ret.Get(0).(func() map[string]error); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(map[string]error) - } - } - - return r0 -} - -// Tracker_HealthReport_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'HealthReport' -type Tracker_HealthReport_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// HealthReport is a helper method to define mock.On call -func (_e *Tracker_Expecter[H, BLOCK_HASH]) HealthReport() *Tracker_HealthReport_Call[H, BLOCK_HASH] { - return &Tracker_HealthReport_Call[H, BLOCK_HASH]{Call: _e.mock.On("HealthReport")} -} - -func (_c *Tracker_HealthReport_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Tracker_HealthReport_Call[H, BLOCK_HASH]) Return(_a0 map[string]error) *Tracker_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Tracker_HealthReport_Call[H, BLOCK_HASH]) RunAndReturn(run func() map[string]error) *Tracker_HealthReport_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// LatestAndFinalizedBlock provides a mock function with given fields: ctx -func (_m *Tracker[H, BLOCK_HASH]) LatestAndFinalizedBlock(ctx context.Context) (H, H, error) { - ret := _m.Called(ctx) - - if len(ret) == 0 { - panic("no return value specified for LatestAndFinalizedBlock") - } - - var r0 H - var r1 H - var r2 error - if rf, ok := ret.Get(0).(func(context.Context) (H, H, error)); ok { - return rf(ctx) - } - if rf, ok := ret.Get(0).(func(context.Context) H); ok { - r0 = rf(ctx) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(H) - } - } - - if rf, ok := ret.Get(1).(func(context.Context) H); ok { - r1 = rf(ctx) - } else { - if ret.Get(1) != nil { - r1 = ret.Get(1).(H) - } - } - - if rf, ok := ret.Get(2).(func(context.Context) error); ok { - r2 = rf(ctx) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// Tracker_LatestAndFinalizedBlock_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LatestAndFinalizedBlock' -type Tracker_LatestAndFinalizedBlock_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// LatestAndFinalizedBlock is a helper method to define mock.On call -// - ctx context.Context -func (_e *Tracker_Expecter[H, BLOCK_HASH]) LatestAndFinalizedBlock(ctx interface{}) *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { - return &Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]{Call: _e.mock.On("LatestAndFinalizedBlock", ctx)} -} - -func (_c *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) Run(run func(ctx context.Context)) *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) Return(latest H, finalized H, err error) *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { - _c.Call.Return(latest, finalized, err) - return _c -} - -func (_c *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) (H, H, error)) *Tracker_LatestAndFinalizedBlock_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// LatestChain provides a mock function with no fields -func (_m *Tracker[H, BLOCK_HASH]) LatestChain() H { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for LatestChain") - } - - var r0 H - if rf, ok := ret.Get(0).(func() H); ok { - r0 = rf() - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(H) - } - } - - return r0 -} - -// Tracker_LatestChain_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LatestChain' -type Tracker_LatestChain_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// LatestChain is a helper method to define mock.On call -func (_e *Tracker_Expecter[H, BLOCK_HASH]) LatestChain() *Tracker_LatestChain_Call[H, BLOCK_HASH] { - return &Tracker_LatestChain_Call[H, BLOCK_HASH]{Call: _e.mock.On("LatestChain")} -} - -func (_c *Tracker_LatestChain_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_LatestChain_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Tracker_LatestChain_Call[H, BLOCK_HASH]) Return(_a0 H) *Tracker_LatestChain_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Tracker_LatestChain_Call[H, BLOCK_HASH]) RunAndReturn(run func() H) *Tracker_LatestChain_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Name provides a mock function with no fields -func (_m *Tracker[H, BLOCK_HASH]) Name() string { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Name") - } - - var r0 string - if rf, ok := ret.Get(0).(func() string); ok { - r0 = rf() - } else { - r0 = ret.Get(0).(string) - } - - return r0 -} - -// Tracker_Name_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Name' -type Tracker_Name_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Name is a helper method to define mock.On call -func (_e *Tracker_Expecter[H, BLOCK_HASH]) Name() *Tracker_Name_Call[H, BLOCK_HASH] { - return &Tracker_Name_Call[H, BLOCK_HASH]{Call: _e.mock.On("Name")} -} - -func (_c *Tracker_Name_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_Name_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Tracker_Name_Call[H, BLOCK_HASH]) Return(_a0 string) *Tracker_Name_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Tracker_Name_Call[H, BLOCK_HASH]) RunAndReturn(run func() string) *Tracker_Name_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Ready provides a mock function with no fields -func (_m *Tracker[H, BLOCK_HASH]) Ready() error { - ret := _m.Called() - - if len(ret) == 0 { - panic("no return value specified for Ready") - } - - var r0 error - if rf, ok := ret.Get(0).(func() error); ok { - r0 = rf() - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Tracker_Ready_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Ready' -type Tracker_Ready_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Ready is a helper method to define mock.On call -func (_e *Tracker_Expecter[H, BLOCK_HASH]) Ready() *Tracker_Ready_Call[H, BLOCK_HASH] { - return &Tracker_Ready_Call[H, BLOCK_HASH]{Call: _e.mock.On("Ready")} -} - -func (_c *Tracker_Ready_Call[H, BLOCK_HASH]) Run(run func()) *Tracker_Ready_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run() - }) - return _c -} - -func (_c *Tracker_Ready_Call[H, BLOCK_HASH]) Return(_a0 error) *Tracker_Ready_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Tracker_Ready_Call[H, BLOCK_HASH]) RunAndReturn(run func() error) *Tracker_Ready_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// Start provides a mock function with given fields: _a0 -func (_m *Tracker[H, BLOCK_HASH]) Start(_a0 context.Context) error { - ret := _m.Called(_a0) - - if len(ret) == 0 { - panic("no return value specified for Start") - } - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context) error); ok { - r0 = rf(_a0) - } else { - r0 = ret.Error(0) - } - - return r0 -} - -// Tracker_Start_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Start' -type Tracker_Start_Call[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable] struct { - *mock.Call -} - -// Start is a helper method to define mock.On call -// - _a0 context.Context -func (_e *Tracker_Expecter[H, BLOCK_HASH]) Start(_a0 interface{}) *Tracker_Start_Call[H, BLOCK_HASH] { - return &Tracker_Start_Call[H, BLOCK_HASH]{Call: _e.mock.On("Start", _a0)} -} - -func (_c *Tracker_Start_Call[H, BLOCK_HASH]) Run(run func(_a0 context.Context)) *Tracker_Start_Call[H, BLOCK_HASH] { - _c.Call.Run(func(args mock.Arguments) { - run(args[0].(context.Context)) - }) - return _c -} - -func (_c *Tracker_Start_Call[H, BLOCK_HASH]) Return(_a0 error) *Tracker_Start_Call[H, BLOCK_HASH] { - _c.Call.Return(_a0) - return _c -} - -func (_c *Tracker_Start_Call[H, BLOCK_HASH]) RunAndReturn(run func(context.Context) error) *Tracker_Start_Call[H, BLOCK_HASH] { - _c.Call.Return(run) - return _c -} - -// NewTracker creates a new instance of Tracker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func NewTracker[H chains.Head[BLOCK_HASH], BLOCK_HASH chains.Hashable](t interface { - mock.TestingT - Cleanup(func()) -}) *Tracker[H, BLOCK_HASH] { - mock := &Tracker[H, BLOCK_HASH]{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go index ecd2f3b4a12..279d838b47b 100644 --- a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go +++ b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go @@ -27,9 +27,10 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + configsevm "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" @@ -129,7 +130,7 @@ func NewTestUniverse(ctx context.Context, t *testing.T, lggr logger.Logger) Test KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, backend, big.NewInt(chainID)) - headTracker := headtracker.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) if lpOpts.PollPeriod == 0 { lpOpts.PollPeriod = 1 * time.Hour } diff --git a/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go b/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go index f3d5f1a75d6..da81dae42aa 100644 --- a/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go +++ b/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go @@ -27,10 +27,11 @@ import ( "github.com/smartcontractkit/chainlink-ccip/pluginconfig" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + evmconfig "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/usdc_reader_tester" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -416,7 +417,7 @@ func testSetup(ctx context.Context, t testing.TB, readerChain cciptypes.ChainSel KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, simulatedBackend, big.NewInt(0).SetUint64(uint64(readerChain))) - headTracker := headtracker.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) orm := logpoller.NewORM(big.NewInt(0).SetUint64(uint64(readerChain)), db, lggr) lp := logpoller.NewLogPoller( diff --git a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go index 4c504137835..f1fdc01dad6 100644 --- a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go +++ b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go @@ -21,6 +21,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" @@ -33,7 +34,6 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ocrimpls" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/config" @@ -426,18 +426,18 @@ func makeTestEvmTxm( } chainID := big.NewInt(1337) - headSaver := headtracker.NewHeadSaver( + headSaver := heads.NewSaver( logger.NullLogger, - headtracker.NewORM(*chainID, db), + heads.NewORM(*chainID, db), evmConfig, evmConfig.HeadTrackerConfig, ) - broadcaster := headtracker.NewHeadBroadcaster(logger.NullLogger) + broadcaster := heads.NewBroadcaster(logger.NullLogger) require.NoError(t, broadcaster.Start(testutils.Context(t)), "failed to start head broadcaster") t.Cleanup(func() { require.NoError(t, broadcaster.Close()) }) - ht := headtracker.NewHeadTracker( + ht := heads.NewTracker( logger.NullLogger, ethClient, evmConfig, diff --git a/core/chains/evm/forwarders/forwarder_manager_test.go b/core/chains/evm/forwarders/forwarder_manager_test.go index 589967d393b..97ec51d9062 100644 --- a/core/chains/evm/forwarders/forwarder_manager_test.go +++ b/core/chains/evm/forwarders/forwarder_manager_test.go @@ -22,10 +22,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/config/configtest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/authorized_forwarder" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/operator_wrapper" @@ -66,7 +67,7 @@ func TestFwdMgr_MaybeForwardTransaction(t *testing.T) { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), evmClient, lggr, ht, lpOpts) fwdMgr := forwarders.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM()) fwdMgr.ORM = forwarders.NewORM(db) @@ -127,7 +128,7 @@ func TestFwdMgr_AccountUnauthorizedToForward_SkipsForwarding(t *testing.T) { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), evmClient, lggr, ht, lpOpts) fwdMgr := forwarders.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM()) fwdMgr.ORM = forwarders.NewORM(db) @@ -192,7 +193,7 @@ func TestFwdMgr_InvalidForwarderForOCR2FeedsStates(t *testing.T) { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), evmClient, lggr, ht, lpOpts) fwdMgr := forwarders.NewFwdMgr(db, evmClient, lp, lggr, evmcfg.EVM()) fwdMgr.ORM = forwarders.NewORM(db) diff --git a/core/chains/evm/headtracker/head_broadcaster.go b/core/chains/evm/headtracker/head_broadcaster.go deleted file mode 100644 index 9f75275488c..00000000000 --- a/core/chains/evm/headtracker/head_broadcaster.go +++ /dev/null @@ -1,17 +0,0 @@ -package headtracker - -import ( - "github.com/ethereum/go-ethereum/common" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-framework/chains/heads" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -type headBroadcaster = heads.Broadcaster[*evmtypes.Head, common.Hash] - -func NewHeadBroadcaster( - lggr logger.Logger, -) headBroadcaster { - return heads.NewBroadcaster[*evmtypes.Head, common.Hash](lggr) -} diff --git a/core/chains/evm/headtracker/head_broadcaster_test.go b/core/chains/evm/headtracker/head_broadcaster_test.go deleted file mode 100644 index f34636c2649..00000000000 --- a/core/chains/evm/headtracker/head_broadcaster_test.go +++ /dev/null @@ -1,191 +0,0 @@ -package headtracker_test - -import ( - "context" - "testing" - "time" - - "github.com/onsi/gomega" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - - commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" - "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox/mailboxtest" - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - - "github.com/smartcontractkit/chainlink-framework/chains/heads" - - "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/mocks" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" -) - -func waitHeadBroadcasterToStart(t *testing.T, hb types.HeadBroadcaster) { - t.Helper() - - subscriber := &mocks.MockHeadTrackable{} - _, unsubscribe := hb.Subscribe(subscriber) - defer unsubscribe() - - hb.BroadcastNewLongestChain(testutils.Head(1)) - g := gomega.NewWithT(t) - g.Eventually(subscriber.OnNewLongestChainCount).Should(gomega.Equal(int32(1))) -} - -func TestHeadBroadcaster_Subscribe(t *testing.T) { - t.Parallel() - g := gomega.NewWithT(t) - - evmCfg := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - c.HeadTracker.SamplingInterval = &commonconfig.Duration{} - }) - db := testutils.NewSqlxDB(t) - logger := logger.Test(t) - - sub := clienttest.NewSubscription(t) - ethClient := clienttest.NewClientWithDefaultChainID(t) - - chchHeaders := make(chan chan<- *evmtypes.Head, 1) - chHead := make(chan *evmtypes.Head) - ethClient.On("SubscribeToHeads", mock.Anything). - Run(func(args mock.Arguments) { - chchHeaders <- chHead - }). - Return((<-chan *evmtypes.Head)(chHead), sub, nil) - ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(1), nil) - - sub.On("Unsubscribe").Return() - sub.On("Err").Return(nil) - - checker1 := &mocks.MockHeadTrackable{} - checker2 := &mocks.MockHeadTrackable{} - - orm := headtracker.NewORM(*ethClient.ConfiguredChainID(), db) - hs := headtracker.NewHeadSaver(logger, orm, evmCfg.EVM(), evmCfg.EVM().HeadTracker()) - mailMon := mailboxtest.NewMonitor(t) - servicetest.Run(t, mailMon) - hb := headtracker.NewHeadBroadcaster(logger) - servicetest.Run(t, hb) - ht := headtracker.NewHeadTracker(logger, ethClient, evmCfg.EVM(), evmCfg.EVM().HeadTracker(), hb, hs, mailMon) - servicetest.Run(t, ht) - - latest1, unsubscribe1 := hb.Subscribe(checker1) - // "latest head" is nil here because we didn't receive any yet - assert.Equal(t, (*evmtypes.Head)(nil), latest1) - - headers := <-chchHeaders - h := evmtypes.Head{Number: 1, Hash: utils.NewHash(), ParentHash: utils.NewHash(), EVMChainID: big.New(testutils.FixtureChainID)} - headers <- &h - g.Eventually(checker1.OnNewLongestChainCount).Should(gomega.Equal(int32(1))) - - latest2, _ := hb.Subscribe(checker2) - // "latest head" is set here to the most recent head received - assert.NotNil(t, latest2) - assert.Equal(t, h.Number, latest2.Number) - - unsubscribe1() - - headers <- &evmtypes.Head{Number: 2, Hash: utils.NewHash(), ParentHash: h.Hash, EVMChainID: big.New(testutils.FixtureChainID)} - g.Eventually(checker2.OnNewLongestChainCount).Should(gomega.Equal(int32(1))) -} - -func TestHeadBroadcaster_BroadcastNewLongestChain(t *testing.T) { - t.Parallel() - g := gomega.NewWithT(t) - - lggr := logger.Test(t) - broadcaster := headtracker.NewHeadBroadcaster(lggr) - - err := broadcaster.Start(tests.Context(t)) - require.NoError(t, err) - - waitHeadBroadcasterToStart(t, broadcaster) - - subscriber1 := &mocks.MockHeadTrackable{} - subscriber2 := &mocks.MockHeadTrackable{} - _, unsubscribe1 := broadcaster.Subscribe(subscriber1) - _, unsubscribe2 := broadcaster.Subscribe(subscriber2) - - broadcaster.BroadcastNewLongestChain(testutils.Head(1)) - g.Eventually(subscriber1.OnNewLongestChainCount).Should(gomega.Equal(int32(1))) - - unsubscribe1() - - broadcaster.BroadcastNewLongestChain(testutils.Head(2)) - g.Eventually(subscriber2.OnNewLongestChainCount).Should(gomega.Equal(int32(2))) - - unsubscribe2() - - subscriber3 := &mocks.MockHeadTrackable{} - _, unsubscribe3 := broadcaster.Subscribe(subscriber3) - broadcaster.BroadcastNewLongestChain(testutils.Head(1)) - g.Eventually(subscriber3.OnNewLongestChainCount).Should(gomega.Equal(int32(1))) - - unsubscribe3() - - // no subscribers - shall do nothing - broadcaster.BroadcastNewLongestChain(testutils.Head(0)) - - err = broadcaster.Close() - require.NoError(t, err) - - require.Equal(t, int32(1), subscriber3.OnNewLongestChainCount()) -} - -func TestHeadBroadcaster_TrackableCallbackTimeout(t *testing.T) { - t.Parallel() - - lggr := logger.Test(t) - broadcaster := headtracker.NewHeadBroadcaster(lggr) - - err := broadcaster.Start(tests.Context(t)) - require.NoError(t, err) - - waitHeadBroadcasterToStart(t, broadcaster) - - slowAwaiter := testutils.NewAwaiter() - fastAwaiter := testutils.NewAwaiter() - slow := &sleepySubscriber{awaiter: slowAwaiter, delay: heads.TrackableCallbackTimeout * 2} - fast := &sleepySubscriber{awaiter: fastAwaiter, delay: heads.TrackableCallbackTimeout / 2} - _, unsubscribe1 := broadcaster.Subscribe(slow) - _, unsubscribe2 := broadcaster.Subscribe(fast) - - broadcaster.BroadcastNewLongestChain(testutils.Head(1)) - slowAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) - fastAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) - - require.True(t, slow.contextDone) - require.False(t, fast.contextDone) - - unsubscribe1() - unsubscribe2() - - err = broadcaster.Close() - require.NoError(t, err) -} - -type sleepySubscriber struct { - awaiter testutils.Awaiter - delay time.Duration - contextDone bool -} - -func (ss *sleepySubscriber) OnNewLongestChain(ctx context.Context, head *evmtypes.Head) { - time.Sleep(ss.delay) - select { - case <-ctx.Done(): - ss.contextDone = true - default: - } - ss.awaiter.ItHappened() -} diff --git a/core/chains/evm/headtracker/head_listener_test.go b/core/chains/evm/headtracker/head_listener_test.go deleted file mode 100644 index 027dc8cbf3f..00000000000 --- a/core/chains/evm/headtracker/head_listener_test.go +++ /dev/null @@ -1,229 +0,0 @@ -package headtracker_test - -import ( - "context" - "sync/atomic" - "testing" - "time" - - "github.com/stretchr/testify/require" - - pkgerrors "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - - commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - "github.com/smartcontractkit/chainlink-framework/chains/heads" - - "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -func Test_HeadListener_HappyPath(t *testing.T) { - t.Parallel() - // Logic: - // - spawn a listener instance - // - mock SubscribeToHeads/Err/Unsubscribe to track these calls - // - send 3 heads - // - ask listener to stop - // Asserts: - // - check Connected()/ReceivingHeads() are updated - // - 3 heads is passed to callback - // - ethClient methods are invoked - - lggr := logger.Test(t) - ethClient := clienttest.NewClientWithDefaultChainID(t) - evmcfg := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - c.NoNewHeadsThreshold = &commonconfig.Duration{} - }) - - var headCount atomic.Int32 - unsubscribeAwaiter := testutils.NewAwaiter() - chHeads := make(chan *evmtypes.Head) - subscribeAwaiter := testutils.NewAwaiter() - var chErr = make(chan error) - var chSubErr <-chan error = chErr - sub := clienttest.NewSubscription(t) - ethClient.On("SubscribeToHeads", mock.Anything).Return((<-chan *evmtypes.Head)(chHeads), sub, nil).Once().Run(func(args mock.Arguments) { - subscribeAwaiter.ItHappened() - }) - sub.On("Err").Return(chSubErr) - sub.On("Unsubscribe").Return().Once().Run(func(mock.Arguments) { - unsubscribeAwaiter.ItHappened() - close(chHeads) - close(chErr) - }) - - func() { - hl := heads.NewListener(lggr, ethClient, evmcfg.EVM(), nil, func(context.Context, *evmtypes.Head) error { - headCount.Add(1) - return nil - }) - require.NoError(t, hl.Start(tests.Context(t))) - defer func() { assert.NoError(t, hl.Close()) }() - - subscribeAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) - require.Eventually(t, hl.Connected, tests.WaitTimeout(t), tests.TestInterval) - - chHeads <- testutils.Head(0) - chHeads <- testutils.Head(1) - chHeads <- testutils.Head(2) - - require.True(t, hl.ReceivingHeads()) - }() - - unsubscribeAwaiter.AwaitOrFail(t) - require.Equal(t, int32(3), headCount.Load()) -} - -func Test_HeadListener_NotReceivingHeads(t *testing.T) { - t.Parallel() - // Logic: - // - same as Test_HeadListener_HappyPath, but - // - send one head, make sure ReceivingHeads() is true - // - do not send any heads within BlockEmissionIdleWarningThreshold and check ReceivingHeads() is false - - lggr := logger.Test(t) - ethClient := clienttest.NewClientWithDefaultChainID(t) - - evmcfg := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - c.NoNewHeadsThreshold = commonconfig.MustNewDuration(time.Second) - }) - - firstHeadAwaiter := testutils.NewAwaiter() - - chHeads := make(chan *evmtypes.Head) - subscribeAwaiter := testutils.NewAwaiter() - var chErr = make(chan error) - var chSubErr <-chan error = chErr - sub := clienttest.NewSubscription(t) - ethClient.On("SubscribeToHeads", mock.Anything).Return((<-chan *evmtypes.Head)(chHeads), sub, nil).Once().Run(func(args mock.Arguments) { - subscribeAwaiter.ItHappened() - }) - sub.On("Err").Return(chSubErr) - sub.On("Unsubscribe").Return().Once().Run(func(_ mock.Arguments) { - close(chHeads) - close(chErr) - }) - - func() { - hl := heads.NewListener(lggr, ethClient, evmcfg.EVM(), nil, func(context.Context, *evmtypes.Head) error { - firstHeadAwaiter.ItHappened() - return nil - }) - require.NoError(t, hl.Start(tests.Context(t))) - defer func() { assert.NoError(t, hl.Close()) }() - - subscribeAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) - - chHeads <- testutils.Head(0) - firstHeadAwaiter.AwaitOrFail(t) - - require.True(t, hl.ReceivingHeads()) - - time.Sleep(time.Second * 2) - - require.False(t, hl.ReceivingHeads()) - }() -} - -func Test_HeadListener_SubscriptionErr(t *testing.T) { - t.Parallel() - cases := []struct { - name string - err error - closeErr bool - }{ - {"nil error", nil, false}, - {"socket error", pkgerrors.New("close 1006 (abnormal closure): unexpected EOF"), false}, - {"close Err channel", nil, true}, - } - - for _, test := range cases { - test := test - t.Run(test.name, func(t *testing.T) { - lggr := logger.Test(t) - ethClient := clienttest.NewClientWithDefaultChainID(t) - evmcfg := testutils.NewTestChainScopedConfig(t, nil) - - hnhCalled := make(chan *evmtypes.Head) - - chSubErrTest := make(chan error) - var chSubErr <-chan error = chSubErrTest - sub := clienttest.NewSubscription(t) - // sub.Err is called twice because we enter the select loop two times: once - // initially and once again after exactly one head has been received - sub.On("Err").Return(chSubErr).Twice() - - headsCh := make(chan *evmtypes.Head) - subscribeAwaiter := testutils.NewAwaiter() - // Initial subscribe - ethClient.On("SubscribeToHeads", mock.Anything).Return((<-chan *evmtypes.Head)(headsCh), sub, nil).Once().Run(func(args mock.Arguments) { - subscribeAwaiter.ItHappened() - }) - func() { - hl := heads.NewListener(lggr, ethClient, evmcfg.EVM(), nil, func(_ context.Context, header *evmtypes.Head) error { - hnhCalled <- header - return nil - }) - require.NoError(t, hl.Start(tests.Context(t))) - defer func() { assert.NoError(t, hl.Close()) }() - - // Put a head on the channel to ensure we test all code paths - subscribeAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) - head := testutils.Head(0) - headsCh <- head - - h := <-hnhCalled - assert.Equal(t, head, h) - - // Expect a call to unsubscribe on error - sub.On("Unsubscribe").Once().Run(func(_ mock.Arguments) { - close(headsCh) - // geth guarantees that Unsubscribe closes the errors channel - if !test.closeErr { - close(chSubErrTest) - } - }) - // Expect a resubscribe - chSubErrTest2 := make(chan error) - var chSubErr2 <-chan error = chSubErrTest2 - sub2 := clienttest.NewSubscription(t) - sub2.On("Err").Return(chSubErr2) - subscribeAwaiter2 := testutils.NewAwaiter() - - headsCh2 := make(chan *evmtypes.Head) - ethClient.On("SubscribeToHeads", mock.Anything).Return((<-chan *evmtypes.Head)(headsCh2), sub2, nil).Once().Run(func(args mock.Arguments) { - subscribeAwaiter2.ItHappened() - }) - - // Sending test error - if test.closeErr { - close(chSubErrTest) - } else { - chSubErrTest <- test.err - } - - // Wait for it to resubscribe - subscribeAwaiter2.AwaitOrFail(t, tests.WaitTimeout(t)) - - head2 := testutils.Head(1) - headsCh2 <- head2 - - h2 := <-hnhCalled - assert.Equal(t, head2, h2) - - // Second call to unsubscribe on close - sub2.On("Unsubscribe").Once().Run(func(_ mock.Arguments) { - close(headsCh2) - // geth guarantees that Unsubscribe closes the errors channel - close(chSubErrTest2) - }) - }() - }) - } -} diff --git a/core/chains/evm/headtracker/head_saver.go b/core/chains/evm/headtracker/head_saver.go deleted file mode 100644 index 4927c038a73..00000000000 --- a/core/chains/evm/headtracker/head_saver.go +++ /dev/null @@ -1,104 +0,0 @@ -package headtracker - -import ( - "context" - "fmt" - - "github.com/ethereum/go-ethereum/common" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-framework/chains/heads" - - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" -) - -type headSaver struct { - orm ORM - config heads.ChainConfig - htConfig heads.TrackerConfig - logger logger.Logger - heads Heads -} - -var _ heads.Saver[*evmtypes.Head, common.Hash] = (*headSaver)(nil) - -func NewHeadSaver(lggr logger.Logger, orm ORM, config heads.ChainConfig, htConfig heads.TrackerConfig) httypes.HeadSaver { - return &headSaver{ - orm: orm, - config: config, - htConfig: htConfig, - logger: logger.Named(lggr, "HeadSaver"), - heads: NewHeads(), - } -} - -func (hs *headSaver) Save(ctx context.Context, head *evmtypes.Head) error { - // adding new head might form a cycle, so it's better to validate cached chain before persisting it - if err := hs.heads.AddHeads(head); err != nil { - return err - } - - return hs.orm.IdempotentInsertHead(ctx, head) -} - -func (hs *headSaver) Load(ctx context.Context, latestFinalized int64) (chain *evmtypes.Head, err error) { - minBlockNumber := hs.calculateMinBlockToKeep(latestFinalized) - heads, err := hs.orm.LatestHeads(ctx, minBlockNumber) - if err != nil { - return nil, err - } - - err = hs.heads.AddHeads(heads...) - if err != nil { - return nil, fmt.Errorf("failed to populate cache with loaded heads: %w", err) - } - return hs.heads.LatestHead(), nil -} - -func (hs *headSaver) calculateMinBlockToKeep(latestFinalized int64) int64 { - return max(latestFinalized-int64(hs.htConfig.HistoryDepth()), 0) -} - -func (hs *headSaver) LatestHeadFromDB(ctx context.Context) (head *evmtypes.Head, err error) { - return hs.orm.LatestHead(ctx) -} - -func (hs *headSaver) LatestChain() *evmtypes.Head { - head := hs.heads.LatestHead() - if head == nil { - return nil - } - if head.ChainLength() < hs.config.FinalityDepth() { - hs.logger.Debugw("chain shorter than FinalityDepth", "chainLen", head.ChainLength(), "evmFinalityDepth", hs.config.FinalityDepth()) - } - return head -} - -func (hs *headSaver) Chain(hash common.Hash) *evmtypes.Head { - return hs.heads.HeadByHash(hash) -} - -func (hs *headSaver) MarkFinalized(ctx context.Context, finalized *evmtypes.Head) error { - minBlockToKeep := hs.calculateMinBlockToKeep(finalized.BlockNumber()) - if !hs.heads.MarkFinalized(finalized.BlockHash(), minBlockToKeep) { - return fmt.Errorf("failed to find %s block in the canonical chain to mark it as finalized", finalized) - } - - return hs.orm.TrimOldHeads(ctx, minBlockToKeep) -} - -var NullSaver httypes.HeadSaver = &nullSaver{} - -type nullSaver struct{} - -func (*nullSaver) Save(ctx context.Context, head *evmtypes.Head) error { return nil } -func (*nullSaver) Load(ctx context.Context, latestFinalized int64) (*evmtypes.Head, error) { - return nil, nil -} -func (*nullSaver) LatestHeadFromDB(ctx context.Context) (*evmtypes.Head, error) { return nil, nil } -func (*nullSaver) LatestChain() *evmtypes.Head { return nil } -func (*nullSaver) Chain(hash common.Hash) *evmtypes.Head { return nil } -func (*nullSaver) MarkFinalized(ctx context.Context, latestFinalized *evmtypes.Head) error { - return nil -} diff --git a/core/chains/evm/headtracker/head_saver_test.go b/core/chains/evm/headtracker/head_saver_test.go deleted file mode 100644 index 382364179c3..00000000000 --- a/core/chains/evm/headtracker/head_saver_test.go +++ /dev/null @@ -1,160 +0,0 @@ -package headtracker_test - -import ( - "math/big" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" -) - -type headTrackerConfig struct { - historyDepth uint32 -} - -func (h *headTrackerConfig) HistoryDepth() uint32 { - return h.historyDepth -} - -func (h *headTrackerConfig) SamplingInterval() time.Duration { - return time.Duration(0) -} - -func (h *headTrackerConfig) MaxBufferSize() uint32 { - return uint32(0) -} - -func (h *headTrackerConfig) FinalityTagBypass() bool { - return false -} -func (h *headTrackerConfig) MaxAllowedFinalityDepth() uint32 { - return 10000 -} -func (h *headTrackerConfig) PersistenceEnabled() bool { - return true -} - -type config struct { - finalityDepth uint32 - blockEmissionIdleWarningThreshold time.Duration - finalityTagEnabled bool - finalizedBlockOffset uint32 -} - -func (c *config) FinalityDepth() uint32 { return c.finalityDepth } -func (c *config) BlockEmissionIdleWarningThreshold() time.Duration { - return c.blockEmissionIdleWarningThreshold -} - -func (c *config) FinalityTagEnabled() bool { - return c.finalityTagEnabled -} - -func (c *config) FinalizedBlockOffset() uint32 { - return c.finalizedBlockOffset -} - -type saverOpts struct { - headTrackerConfig *headTrackerConfig -} - -func configureSaver(t *testing.T, opts saverOpts) (httypes.HeadSaver, headtracker.ORM) { - if opts.headTrackerConfig == nil { - opts.headTrackerConfig = &headTrackerConfig{historyDepth: 6} - } - db := testutils.NewSqlxDB(t) - lggr := logger.Test(t) - htCfg := &config{finalityDepth: uint32(1)} - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - saver := headtracker.NewHeadSaver(lggr, orm, htCfg, opts.headTrackerConfig) - return saver, orm -} - -func TestHeadSaver_Save(t *testing.T) { - t.Parallel() - - saver, _ := configureSaver(t, saverOpts{}) - - head := testutils.Head(1) - err := saver.Save(tests.Context(t), head) - require.NoError(t, err) - - latest, err := saver.LatestHeadFromDB(tests.Context(t)) - require.NoError(t, err) - require.Equal(t, int64(1), latest.Number) - - latest = saver.LatestChain() - require.NotNil(t, latest) - require.Equal(t, int64(1), latest.Number) - - latest = saver.Chain(head.Hash) - require.NotNil(t, latest) - require.Equal(t, int64(1), latest.Number) -} - -func TestHeadSaver_Load(t *testing.T) { - t.Parallel() - - saver, orm := configureSaver(t, saverOpts{ - headTrackerConfig: &headTrackerConfig{historyDepth: 4}, - }) - - // create chain - // H0 <- H1 <- H2 <- H3 <- H4 <- H5 - // \ - // H2Uncle - // - newHead := func(num int, parent common.Hash) *evmtypes.Head { - h := evmtypes.NewHead(big.NewInt(int64(num)), utils.NewHash(), parent, ubig.NewI(0)) - return &h - } - h0 := newHead(0, utils.NewHash()) - h1 := newHead(1, h0.Hash) - h2 := newHead(2, h1.Hash) - h3 := newHead(3, h2.Hash) - h4 := newHead(4, h3.Hash) - h5 := newHead(5, h4.Hash) - h2Uncle := newHead(2, h1.Hash) - - allHeads := []*evmtypes.Head{h0, h1, h2, h2Uncle, h3, h4, h5} - - for _, h := range allHeads { - err := orm.IdempotentInsertHead(tests.Context(t), h) - require.NoError(t, err) - } - - verifyLatestHead := func(latestHead *evmtypes.Head) { - // latest head matches h5 and chain does not include h0 - require.NotNil(t, latestHead) - require.Equal(t, int64(5), latestHead.Number) - require.Equal(t, uint32(5), latestHead.ChainLength()) - require.Greater(t, latestHead.EarliestHeadInChain().BlockNumber(), int64(0)) - } - - // load all from [h5-historyDepth, h5] - latestHead, err := saver.Load(tests.Context(t), h5.BlockNumber()) - require.NoError(t, err) - // verify latest head loaded from db - verifyLatestHead(latestHead) - - // verify latest head loaded from memory store - latestHead = saver.LatestChain() - require.NotNil(t, latestHead) - verifyLatestHead(latestHead) - - // h2Uncle was loaded and has chain up to h1 - uncleChain := saver.Chain(h2Uncle.Hash) - require.NotNil(t, uncleChain) - require.Equal(t, uint32(2), uncleChain.ChainLength()) // h2Uncle -> h1 -} diff --git a/core/chains/evm/headtracker/head_tracker.go b/core/chains/evm/headtracker/head_tracker.go deleted file mode 100644 index b90f2342ed9..00000000000 --- a/core/chains/evm/headtracker/head_tracker.go +++ /dev/null @@ -1,53 +0,0 @@ -package headtracker - -import ( - "context" - - "github.com/ethereum/go-ethereum" - "go.uber.org/zap/zapcore" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" - "github.com/smartcontractkit/chainlink-framework/chains/heads" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" -) - -func NewHeadTracker( - lggr logger.Logger, - ethClient httypes.Client, - config heads.ChainConfig, - htConfig heads.TrackerConfig, - headBroadcaster httypes.HeadBroadcaster, - headSaver httypes.HeadSaver, - mailMon *mailbox.Monitor, -) httypes.HeadTracker { - return heads.NewTracker[*evmtypes.Head, ethereum.Subscription]( - lggr, - ethClient, - config, - htConfig, - headBroadcaster, - headSaver, - mailMon, - func() *evmtypes.Head { return nil }, - ) -} - -var NullTracker httypes.HeadTracker = &nullTracker{} - -type nullTracker struct{} - -func (*nullTracker) Start(context.Context) error { return nil } -func (*nullTracker) Close() error { return nil } -func (*nullTracker) Ready() error { return nil } -func (*nullTracker) HealthReport() map[string]error { return map[string]error{} } -func (*nullTracker) Name() string { return "" } -func (*nullTracker) SetLogLevel(zapcore.Level) {} -func (*nullTracker) Backfill(ctx context.Context, headWithChain *evmtypes.Head) (err error) { - return nil -} -func (*nullTracker) LatestChain() *evmtypes.Head { return nil } -func (*nullTracker) LatestAndFinalizedBlock(ctx context.Context) (latest, finalized *evmtypes.Head, err error) { - return nil, nil, nil -} diff --git a/core/chains/evm/headtracker/head_tracker_test.go b/core/chains/evm/headtracker/head_tracker_test.go deleted file mode 100644 index d9a36a18595..00000000000 --- a/core/chains/evm/headtracker/head_tracker_test.go +++ /dev/null @@ -1,1433 +0,0 @@ -package headtracker_test - -import ( - "context" - "errors" - "fmt" - "math/big" - "slices" - "sync" - "testing" - "time" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/jmoiron/sqlx" - "github.com/onsi/gomega" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zaptest/observer" - "golang.org/x/exp/maps" - - commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/services" - "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" - "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox/mailboxtest" - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - - "github.com/smartcontractkit/chainlink-framework/chains/heads" - - "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - htmocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/mocks" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" -) - -func firstHead(t *testing.T, db *sqlx.DB) *evmtypes.Head { - h := new(evmtypes.Head) - if err := db.Get(h, `SELECT * FROM evm.heads ORDER BY number ASC LIMIT 1`); err != nil { - t.Fatal(err) - } - return h -} - -func TestHeadTracker_New(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - ethClient := clienttest.NewClientWithDefaultChainID(t) - ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), nil) - // finalized - ethClient.On("HeadByNumber", mock.Anything, big.NewInt(0)).Return(testutils.Head(0), nil) - mockEth := &clienttest.MockEth{ - EthClient: ethClient, - } - ethClient.On("SubscribeToHeads", mock.Anything, mock.Anything). - Maybe(). - Return(nil, mockEth.NewSub(t), nil) - - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - assert.Nil(t, orm.IdempotentInsertHead(tests.Context(t), testutils.Head(1))) - last := testutils.Head(16) - assert.Nil(t, orm.IdempotentInsertHead(tests.Context(t), last)) - assert.Nil(t, orm.IdempotentInsertHead(tests.Context(t), testutils.Head(10))) - - evmcfg := testutils.NewTestChainScopedConfig(t, nil) - ht := createHeadTracker(t, ethClient, evmcfg.EVM(), evmcfg.EVM().HeadTracker(), orm) - ht.Start(t) - - tests.AssertEventually(t, func() bool { - latest := ht.headSaver.LatestChain() - return latest != nil && last.Number == latest.Number - }) -} - -func TestHeadTracker_MarkFinalized_MarksAndTrimsTable(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - config := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - c.HeadTracker.HistoryDepth = ptr[uint32](100) - }) - - ethClient := clienttest.NewClientWithDefaultChainID(t) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - for idx := 0; idx < 200; idx++ { - assert.Nil(t, orm.IdempotentInsertHead(tests.Context(t), testutils.Head(idx))) - } - - latest := testutils.Head(201) - assert.Nil(t, orm.IdempotentInsertHead(tests.Context(t), latest)) - - ht := createHeadTracker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm) - _, err := ht.headSaver.Load(tests.Context(t), latest.Number) - require.NoError(t, err) - require.NoError(t, ht.headSaver.MarkFinalized(tests.Context(t), latest)) - assert.Equal(t, big.NewInt(201), ht.headSaver.LatestChain().ToInt()) - - firstHead := firstHead(t, db) - assert.Equal(t, big.NewInt(101), firstHead.ToInt()) - - lastHead, err := orm.LatestHead(tests.Context(t)) - require.NoError(t, err) - assert.Equal(t, int64(201), lastHead.Number) -} - -func TestHeadTracker_Get(t *testing.T) { - t.Parallel() - - start := testutils.Head(5) - - cases := []struct { - name string - initial *evmtypes.Head - toSave *evmtypes.Head - want *big.Int - }{ - {"greater", start, testutils.Head(6), big.NewInt(6)}, - {"less than", start, testutils.Head(1), big.NewInt(5)}, - {"zero", start, testutils.Head(0), big.NewInt(5)}, - {"nil", start, nil, big.NewInt(5)}, - {"nil no initial", nil, nil, big.NewInt(0)}, - } - - for i := range cases { - test := cases[i] - t.Run(test.name, func(t *testing.T) { - db := testutils.NewSqlxDB(t) - config := testutils.NewTestChainScopedConfig(t, nil) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - ethClient := clienttest.NewClientWithDefaultChainID(t) - chStarted := make(chan struct{}) - mockEth := &clienttest.MockEth{ - EthClient: ethClient, - } - ethClient.On("SubscribeToHeads", mock.Anything). - Maybe(). - Return( - func(ctx context.Context) (<-chan *evmtypes.Head, ethereum.Subscription, error) { - defer close(chStarted) - return make(<-chan *evmtypes.Head), mockEth.NewSub(t), nil - }, - ) - ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), nil).Maybe() - - fnCall := ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Maybe() - fnCall.RunFn = func(args mock.Arguments) { - num := args.Get(1).(*big.Int) - fnCall.ReturnArguments = mock.Arguments{testutils.Head(num.Int64()), nil} - } - - if test.initial != nil { - assert.Nil(t, orm.IdempotentInsertHead(tests.Context(t), test.initial)) - } - - ht := createHeadTracker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm) - ht.Start(t) - - if test.toSave != nil { - err := ht.headSaver.Save(tests.Context(t), test.toSave) - assert.NoError(t, err) - } - - tests.AssertEventually(t, func() bool { - latest := ht.headSaver.LatestChain().ToInt() - return latest != nil && test.want.Cmp(latest) == 0 - }) - }) - } -} - -func TestHeadTracker_Start_NewHeads(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - config := testutils.NewTestChainScopedConfig(t, nil) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - ethClient := clienttest.NewClientWithDefaultChainID(t) - chStarted := make(chan struct{}) - mockEth := &clienttest.MockEth{EthClient: ethClient} - sub := mockEth.NewSub(t) - // for initial load - ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), nil).Once() - ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil).Once() - // for backfill - ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil).Maybe() - ch := make(chan *evmtypes.Head) - ethClient.On("SubscribeToHeads", mock.Anything). - Run(func(mock.Arguments) { - close(chStarted) - }). - Return((<-chan *evmtypes.Head)(ch), sub, nil) - - ht := createHeadTracker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm) - ht.Start(t) - - <-chStarted -} - -func TestHeadTracker_Start(t *testing.T) { - t.Parallel() - - const historyDepth = 100 - const finalityDepth = 50 - type opts struct { - FinalityTagEnable *bool - MaxAllowedFinalityDepth *uint32 - FinalityTagBypass *bool - ORM headtracker.ORM - } - newHeadTracker := func(t *testing.T, opts opts) *headTrackerUniverse { - config := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - if opts.FinalityTagEnable != nil { - c.FinalityTagEnabled = opts.FinalityTagEnable - } - c.HeadTracker.HistoryDepth = ptr[uint32](historyDepth) - c.FinalityDepth = ptr[uint32](finalityDepth) - if opts.MaxAllowedFinalityDepth != nil { - c.HeadTracker.MaxAllowedFinalityDepth = opts.MaxAllowedFinalityDepth - } - - if opts.FinalityTagBypass != nil { - c.HeadTracker.FinalityTagBypass = opts.FinalityTagBypass - } - }) - if opts.ORM == nil { - db := testutils.NewSqlxDB(t) - opts.ORM = headtracker.NewORM(*testutils.FixtureChainID, db) - } - ethClient := clienttest.NewClientWithDefaultChainID(t) - mockEth := &clienttest.MockEth{EthClient: ethClient} - sub := mockEth.NewSub(t) - ethClient.On("SubscribeToHeads", mock.Anything, mock.Anything).Return(nil, sub, nil).Maybe() - return createHeadTracker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), opts.ORM) - } - t.Run("Starts even if failed to get initialHead", func(t *testing.T) { - ht := newHeadTracker(t, opts{}) - ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(testutils.Head(0), errors.New("failed to get init head")) - ht.Start(t) - tests.AssertLogEventually(t, ht.observer, "Error handling initial head") - }) - t.Run("Starts even if received invalid head", func(t *testing.T) { - ht := newHeadTracker(t, opts{}) - ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil) - ht.Start(t) - tests.AssertLogEventually(t, ht.observer, "Got nil initial head") - }) - t.Run("Starts even if fails to get finalizedHead", func(t *testing.T) { - ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) - head := testutils.Head(1000) - ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() - ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("failed to load latest finalized")).Once() - ht.Start(t) - tests.AssertLogEventually(t, ht.observer, "Error handling initial head") - }) - t.Run("Starts even if latest finalizedHead is nil", func(t *testing.T) { - ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) - head := testutils.Head(1000) - ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() - ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, nil).Once() - ht.ethClient.On("SubscribeToHeads", mock.Anything, mock.Anything).Return(nil, nil, errors.New("failed to connect")).Maybe() - ht.Start(t) - tests.AssertLogEventually(t, ht.observer, "Error handling initial head") - }) - happyPathFT := func(t *testing.T, opts opts) { - head := testutils.Head(1000) - ht := newHeadTracker(t, opts) - ctx := tests.Context(t) - require.NoError(t, ht.orm.IdempotentInsertHead(ctx, testutils.Head(799))) - ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() - finalizedHead := testutils.Head(800) - // on start - ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(finalizedHead, nil).Once() - // on backfill - ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("backfill call to finalized failed")).Maybe() - ht.ethClient.On("SubscribeToHeads", mock.Anything, mock.Anything).Return(nil, nil, errors.New("failed to connect")).Maybe() - ht.Start(t) - tests.AssertLogEventually(t, ht.observer, "Received new head") - tests.AssertEventually(t, func() bool { - latest := ht.headTracker.LatestChain() - return latest != nil && latest.Number == head.Number - }) - } - happyPathFD := func(t *testing.T, opts opts) { - head := testutils.Head(1000) - ht := newHeadTracker(t, opts) - ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() - finalizedHead := testutils.Head(head.Number - finalityDepth) - ht.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(finalizedHead.Number)).Return(finalizedHead, nil).Once() - ctx := tests.Context(t) - require.NoError(t, ht.orm.IdempotentInsertHead(ctx, testutils.Head(finalizedHead.Number-1))) - // on backfill - ht.ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(nil, errors.New("backfill call to finalized failed")).Maybe() - ht.ethClient.On("SubscribeToHeads", mock.Anything, mock.Anything).Return(nil, nil, errors.New("failed to connect")).Maybe() - ht.Start(t) - tests.AssertLogEventually(t, ht.observer, "Received new head") - tests.AssertEventually(t, func() bool { - latest := ht.headTracker.LatestChain() - return latest != nil && latest.Number == head.Number - }) - } - testCases := []struct { - Name string - Opts opts - Run func(t *testing.T, opts opts) - }{ - { - Name: "Happy path (Chain FT is disabled & HeadTracker's FT is disabled)", - Opts: opts{FinalityTagEnable: ptr(false), FinalityTagBypass: ptr(true)}, - Run: happyPathFD, - }, - { - Name: "Happy path (Chain FT is disabled & HeadTracker's FT is enabled, but ignored)", - Opts: opts{FinalityTagEnable: ptr(false), FinalityTagBypass: ptr(false)}, - Run: happyPathFD, - }, - { - Name: "Happy path (Chain FT is enabled & HeadTracker's FT is disabled)", - Opts: opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(true)}, - Run: happyPathFD, - }, - { - Name: "Happy path (Chain FT is enabled)", - Opts: opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}, - Run: happyPathFT, - }, - } - for _, tc := range testCases { - t.Run(tc.Name, func(t *testing.T) { - tc.Run(t, tc.Opts) - }) - t.Run("Disabled Persistence "+tc.Name, func(t *testing.T) { - opts := tc.Opts - opts.ORM = headtracker.NewNullORM() - tc.Run(t, opts) - }) - } -} - -func TestHeadTracker_CallsHeadTrackableCallbacks(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - config := testutils.NewTestChainScopedConfig(t, nil) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - ethClient := clienttest.NewClientWithDefaultChainID(t) - - chchHeaders := make(chan testutils.RawSub[*evmtypes.Head], 1) - mockEth := &clienttest.MockEth{EthClient: ethClient} - chHead := make(chan *evmtypes.Head) - ethClient.On("SubscribeToHeads", mock.Anything). - Return( - func(ctx context.Context) (<-chan *evmtypes.Head, ethereum.Subscription, error) { - sub := mockEth.NewSub(t) - chchHeaders <- testutils.NewRawSub(chHead, sub.Err()) - return chHead, sub, nil - }, - ) - ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil) - ethClient.On("HeadByHash", mock.Anything, mock.Anything).Return(testutils.Head(0), nil).Maybe() - - checker := &mocks.MockHeadTrackable{} - ht := createHeadTrackerWithChecker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm, checker) - - ht.Start(t) - assert.Equal(t, int32(0), checker.OnNewLongestChainCount()) - - headers := <-chchHeaders - headers.TrySend(&evmtypes.Head{Number: 1, Hash: utils.NewHash(), EVMChainID: ubig.New(testutils.FixtureChainID)}) - tests.AssertEventually(t, func() bool { return checker.OnNewLongestChainCount() == 1 }) - - ht.Stop(t) - assert.Equal(t, int32(1), checker.OnNewLongestChainCount()) -} - -func TestHeadTracker_ReconnectOnError(t *testing.T) { - t.Parallel() - g := gomega.NewWithT(t) - - db := testutils.NewSqlxDB(t) - config := testutils.NewTestChainScopedConfig(t, nil) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - ethClient := clienttest.NewClientWithDefaultChainID(t) - mockEth := &clienttest.MockEth{EthClient: ethClient} - chHead := make(chan *evmtypes.Head) - ethClient.On("SubscribeToHeads", mock.Anything). - Return( - func(ctx context.Context) (<-chan *evmtypes.Head, ethereum.Subscription, error) { - return chHead, mockEth.NewSub(t), nil - }, - ) - ethClient.On("SubscribeToHeads", mock.Anything).Return((<-chan *evmtypes.Head)(chHead), nil, errors.New("cannot reconnect")) - ethClient.On("SubscribeToHeads", mock.Anything). - Return( - func(ctx context.Context) (<-chan *evmtypes.Head, ethereum.Subscription, error) { - return chHead, mockEth.NewSub(t), nil - }, - ) - ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil) - checker := &mocks.MockHeadTrackable{} - ht := createHeadTrackerWithChecker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm, checker) - - // connect - ht.Start(t) - assert.Equal(t, int32(0), checker.OnNewLongestChainCount()) - - // trigger reconnect loop - mockEth.SubsErr(errors.New("test error to force reconnect")) - g.Eventually(checker.OnNewLongestChainCount, 5*time.Second, tests.TestInterval).Should(gomega.Equal(int32(1))) -} - -func TestHeadTracker_ResubscribeOnSubscriptionError(t *testing.T) { - t.Parallel() - g := gomega.NewWithT(t) - - db := testutils.NewSqlxDB(t) - config := testutils.NewTestChainScopedConfig(t, nil) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - ethClient := clienttest.NewClientWithDefaultChainID(t) - - ch := make(chan *evmtypes.Head) - chchHeaders := make(chan testutils.RawSub[*evmtypes.Head], 1) - mockEth := &clienttest.MockEth{EthClient: ethClient} - ethClient.On("SubscribeToHeads", mock.Anything). - Return( - func(ctx context.Context) (<-chan *evmtypes.Head, ethereum.Subscription, error) { - sub := mockEth.NewSub(t) - chchHeaders <- testutils.NewRawSub(ch, sub.Err()) - return ch, sub, nil - }, - ) - ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(testutils.Head(0), nil) - ethClient.On("HeadByHash", mock.Anything, mock.Anything).Return(testutils.Head(0), nil).Maybe() - - checker := &mocks.MockHeadTrackable{} - ht := createHeadTrackerWithChecker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm, checker) - - ht.Start(t) - assert.Equal(t, int32(0), checker.OnNewLongestChainCount()) - - headers := <-chchHeaders - go func() { - headers.TrySend(testutils.Head(1)) - }() - - g.Eventually(func() bool { - report := ht.headTracker.HealthReport() - return !slices.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil }) - }, 5*time.Second, tests.TestInterval).Should(gomega.Equal(true)) - - // trigger reconnect loop - headers.CloseCh() - - // wait for full disconnect and a new subscription - g.Eventually(checker.OnNewLongestChainCount, 5*time.Second, tests.TestInterval).Should(gomega.Equal(int32(1))) -} - -func TestHeadTracker_Start_LoadsLatestChain(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - config := testutils.NewTestChainScopedConfig(t, nil) - ethClient := clienttest.NewClientWithDefaultChainID(t) - - heads := []*evmtypes.Head{ - testutils.Head(0), - testutils.Head(1), - testutils.Head(2), - testutils.Head(3), - } - var parentHash common.Hash - for i := 0; i < len(heads); i++ { - if parentHash != (common.Hash{}) { - heads[i].ParentHash = parentHash - } - parentHash = heads[i].Hash - } - ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(heads[3], nil).Maybe() - ethClient.On("HeadByNumber", mock.Anything, big.NewInt(0)).Return(heads[0], nil).Maybe() - ethClient.On("HeadByHash", mock.Anything, heads[2].Hash).Return(heads[2], nil).Maybe() - ethClient.On("HeadByHash", mock.Anything, heads[1].Hash).Return(heads[1], nil).Maybe() - ethClient.On("HeadByHash", mock.Anything, heads[0].Hash).Return(heads[0], nil).Maybe() - - chchHeaders := make(chan testutils.RawSub[*evmtypes.Head], 1) - mockEth := &clienttest.MockEth{EthClient: ethClient} - ch := make(chan *evmtypes.Head) - ethClient.On("SubscribeToHeads", mock.Anything). - Return( - func(ctx context.Context) (<-chan *evmtypes.Head, ethereum.Subscription, error) { - sub := mockEth.NewSub(t) - chchHeaders <- testutils.NewRawSub(ch, sub.Err()) - return ch, sub, nil - }, - ) - - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - trackable := &mocks.MockHeadTrackable{} - ht := createHeadTrackerWithChecker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm, trackable) - - require.NoError(t, orm.IdempotentInsertHead(tests.Context(t), heads[2])) - - ht.Start(t) - - assert.Equal(t, int32(0), trackable.OnNewLongestChainCount()) - - headers := <-chchHeaders - go func() { - headers.TrySend(testutils.Head(1)) - }() - - require.Eventually(t, func() bool { - report := ht.headTracker.HealthReport() - services.CopyHealth(report, ht.headBroadcaster.HealthReport()) - return !slices.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil }) - }, 5*time.Second, tests.TestInterval) - - h, err := orm.LatestHead(tests.Context(t)) - require.NoError(t, err) - require.NotNil(t, h) - assert.Equal(t, h.Number, int64(3)) -} - -func TestHeadTracker_SwitchesToLongestChainWithHeadSamplingEnabled(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - - config := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - c.FinalityDepth = ptr[uint32](50) - // Need to set the buffer to something large since we inject a lot of heads at once and otherwise they will be dropped - c.HeadTracker.MaxBufferSize = ptr[uint32](100) - c.HeadTracker.SamplingInterval = commonconfig.MustNewDuration(2500 * time.Millisecond) - }) - - ethClient := clienttest.NewClientWithDefaultChainID(t) - - checker := htmocks.NewTrackable[*evmtypes.Head, common.Hash](t) - orm := headtracker.NewORM(*config.EVM().ChainID(), db) - ht := createHeadTrackerWithChecker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm, checker) - - chchHeaders := make(chan testutils.RawSub[*evmtypes.Head], 1) - mockEth := &clienttest.MockEth{EthClient: ethClient} - chHead := make(chan *evmtypes.Head) - ethClient.On("SubscribeToHeads", mock.Anything). - Return( - func(ctx context.Context) (<-chan *evmtypes.Head, ethereum.Subscription, error) { - sub := mockEth.NewSub(t) - chchHeaders <- testutils.NewRawSub(chHead, sub.Err()) - return chHead, sub, nil - }, - ) - - // --------------------- - blocks := NewBlocks(t, 10) - - head0 := blocks.Head(0) - // Initial query - ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head0, nil) - // backfill query - ethClient.On("HeadByNumber", mock.Anything, big.NewInt(0)).Return(head0, nil) - ht.Start(t) - - headSeq := NewHeadBuffer(t) - headSeq.Append(blocks.Head(0)) - headSeq.Append(blocks.Head(1)) - - // Blocks 2 and 3 are out of order - headSeq.Append(blocks.Head(3)) - headSeq.Append(blocks.Head(2)) - - // Block 4 comes in - headSeq.Append(blocks.Head(4)) - - // Another block at level 4 comes in, that will be uncled - headSeq.Append(blocks.NewHead(4)) - - // Reorg happened forking from block 2 - blocksForked := blocks.ForkAt(t, 2, 5) - headSeq.Append(blocksForked.Head(2)) - headSeq.Append(blocksForked.Head(3)) - headSeq.Append(blocksForked.Head(4)) - headSeq.Append(blocksForked.Head(5)) // Now the new chain is longer - - lastLongestChainAwaiter := testutils.NewAwaiter() - - // the callback is only called for head number 5 because of head sampling - checker.On("OnNewLongestChain", mock.Anything, mock.Anything). - Run(func(args mock.Arguments) { - h := args.Get(1).(*evmtypes.Head) - // This is the new longest chain [0, 5], check that it came with its parents - assert.Equal(t, uint32(6), h.ChainLength()) - assertChainWithParents(t, blocksForked, 5, 1, h) - - lastLongestChainAwaiter.ItHappened() - }).Return().Once() - - headers := <-chchHeaders - - // This grotesque construction is the only way to do dynamic return values using - // the mock package. We need dynamic returns because we're simulating reorgs. - latestHeadByHash := make(map[common.Hash]*evmtypes.Head) - latestHeadByHashMu := new(sync.Mutex) - - fnCall := ethClient.On("HeadByHash", mock.Anything, mock.Anything).Maybe() - fnCall.RunFn = func(args mock.Arguments) { - latestHeadByHashMu.Lock() - defer latestHeadByHashMu.Unlock() - hash := args.Get(1).(common.Hash) - head := latestHeadByHash[hash] - fnCall.ReturnArguments = mock.Arguments{head, nil} - } - - for _, h := range headSeq.Heads { - latestHeadByHashMu.Lock() - latestHeadByHash[h.Hash] = h - latestHeadByHashMu.Unlock() - headers.TrySend(h) - } - - // default 10s may not be sufficient, so using tests.WaitTimeout(t) - lastLongestChainAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) - ht.Stop(t) - assert.Equal(t, int64(5), ht.headSaver.LatestChain().Number) - - for _, h := range headSeq.Heads { - c := ht.headSaver.Chain(h.Hash) - require.NotNil(t, c) - assert.Equal(t, c.ParentHash, h.ParentHash) - assert.Equal(t, c.Timestamp.Unix(), h.Timestamp.Unix()) - assert.Equal(t, c.Number, h.Number) - } -} - -func assertChainWithParents(t testing.TB, blocks *blocks, startBN, endBN uint64, h *evmtypes.Head) { - for blockNumber := startBN; blockNumber >= endBN; blockNumber-- { - require.NotNil(t, h) - assert.Equal(t, blockNumber, uint64(h.Number)) - assert.Equal(t, blocks.Head(blockNumber).Hash, h.Hash) - // move to parent - h = h.Parent.Load() - } -} - -func TestHeadTracker_SwitchesToLongestChainWithHeadSamplingDisabled(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - - config := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - c.FinalityDepth = ptr[uint32](50) - // Need to set the buffer to something large since we inject a lot of heads at once and otherwise they will be dropped - c.HeadTracker.MaxBufferSize = ptr[uint32](100) - c.HeadTracker.SamplingInterval = commonconfig.MustNewDuration(0) - }) - - ethClient := clienttest.NewClientWithDefaultChainID(t) - - checker := htmocks.NewTrackable[*evmtypes.Head, common.Hash](t) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - ht := createHeadTrackerWithChecker(t, ethClient, config.EVM(), config.EVM().HeadTracker(), orm, checker) - - chchHeaders := make(chan testutils.RawSub[*evmtypes.Head], 1) - mockEth := &clienttest.MockEth{EthClient: ethClient} - chHead := make(chan *evmtypes.Head) - ethClient.On("SubscribeToHeads", mock.Anything). - Return( - func(ctx context.Context) (<-chan *evmtypes.Head, ethereum.Subscription, error) { - sub := mockEth.NewSub(t) - chchHeaders <- testutils.NewRawSub(chHead, sub.Err()) - return chHead, sub, nil - }, - ) - - // --------------------- - blocks := NewBlocks(t, 10) - - head0 := blocks.Head(0) // evmtypes.Head{Number: 0, Hash: utils.NewHash(), ParentHash: utils.NewHash(), Timestamp: time.Unix(0, 0)} - // Initial query - ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head0, nil) - // backfill - ethClient.On("HeadByNumber", mock.Anything, big.NewInt(0)).Return(head0, nil) - - headSeq := NewHeadBuffer(t) - headSeq.Append(blocks.Head(0)) - headSeq.Append(blocks.Head(1)) - - // Blocks 2 and 3 are out of order - headSeq.Append(blocks.Head(3)) - headSeq.Append(blocks.Head(2)) - - // Block 4 comes in - headSeq.Append(blocks.Head(4)) - - // Another block at level 4 comes in, that will be uncled - headSeq.Append(blocks.NewHead(4)) - - // Reorg happened forking from block 2 - blocksForked := blocks.ForkAt(t, 2, 5) - headSeq.Append(blocksForked.Head(2)) - headSeq.Append(blocksForked.Head(3)) - headSeq.Append(blocksForked.Head(4)) - headSeq.Append(blocksForked.Head(5)) // Now the new chain is longer - - lastLongestChainAwaiter := testutils.NewAwaiter() - - checker.On("OnNewLongestChain", mock.Anything, mock.Anything). - Run(func(args mock.Arguments) { - h := args.Get(1).(*evmtypes.Head) - require.Equal(t, int64(0), h.Number) - require.Equal(t, blocks.Head(0).Hash, h.Hash) - }).Return().Once() - - checker.On("OnNewLongestChain", mock.Anything, mock.Anything). - Run(func(args mock.Arguments) { - h := args.Get(1).(*evmtypes.Head) - require.Equal(t, int64(1), h.Number) - require.Equal(t, blocks.Head(1).Hash, h.Hash) - }).Return().Once() - - checker.On("OnNewLongestChain", mock.Anything, mock.Anything). - Run(func(args mock.Arguments) { - h := args.Get(1).(*evmtypes.Head) - require.Equal(t, int64(3), h.Number) - require.Equal(t, blocks.Head(3).Hash, h.Hash) - }).Return().Once() - - checker.On("OnNewLongestChain", mock.Anything, mock.Anything). - Run(func(args mock.Arguments) { - h := args.Get(1).(*evmtypes.Head) - assertChainWithParents(t, blocks, 4, 1, h) - }).Return().Once() - - checker.On("OnNewLongestChain", mock.Anything, mock.Anything). - Run(func(args mock.Arguments) { - h := args.Get(1).(*evmtypes.Head) - assertChainWithParents(t, blocksForked, 5, 1, h) - lastLongestChainAwaiter.ItHappened() - }).Return().Once() - - ht.Start(t) - - headers := <-chchHeaders - - // This grotesque construction is the only way to do dynamic return values using - // the mock package. We need dynamic returns because we're simulating reorgs. - latestHeadByHash := make(map[common.Hash]*evmtypes.Head) - latestHeadByHashMu := new(sync.Mutex) - - fnCall := ethClient.On("HeadByHash", mock.Anything, mock.Anything).Maybe() - fnCall.RunFn = func(args mock.Arguments) { - latestHeadByHashMu.Lock() - defer latestHeadByHashMu.Unlock() - hash := args.Get(1).(common.Hash) - head := latestHeadByHash[hash] - fnCall.ReturnArguments = mock.Arguments{head, nil} - } - - for _, h := range headSeq.Heads { - latestHeadByHashMu.Lock() - latestHeadByHash[h.Hash] = h - latestHeadByHashMu.Unlock() - headers.TrySend(h) - time.Sleep(tests.TestInterval) - } - - // default 10s may not be sufficient, so using tests.WaitTimeout(t) - lastLongestChainAwaiter.AwaitOrFail(t, tests.WaitTimeout(t)) - ht.Stop(t) - assert.Equal(t, int64(5), ht.headSaver.LatestChain().Number) - - for _, h := range headSeq.Heads { - c := ht.headSaver.Chain(h.Hash) - require.NotNil(t, c) - assert.Equal(t, c.ParentHash, h.ParentHash) - assert.Equal(t, c.Timestamp.Unix(), h.Timestamp.Unix()) - assert.Equal(t, c.Number, h.Number) - } -} - -func TestHeadTracker_Backfill(t *testing.T) { - t.Parallel() - t.Run("Enabled Persistence", func(t *testing.T) { - testHeadTrackerBackfill(t, func(t *testing.T) headtracker.ORM { - db := testutils.NewSqlxDB(t) - return headtracker.NewORM(*testutils.FixtureChainID, db) - }) - }) - t.Run("Disabled Persistence", func(t *testing.T) { - testHeadTrackerBackfill(t, func(t *testing.T) headtracker.ORM { - return headtracker.NewNullORM() - }) - }) -} - -func testHeadTrackerBackfill(t *testing.T, newORM func(t *testing.T) headtracker.ORM) { - // Heads are arranged as follows: - // headN indicates an unpersisted ethereum header - // hN indicates a persisted head record - // - // (1)->(H0) - // - // (14Orphaned)-+ - // +->(13)->(12)->(11)->(H10)->(9)->(H8) - // (15)->(14)---------+ - - head0 := evmtypes.NewHead(big.NewInt(0), utils.NewHash(), common.BigToHash(big.NewInt(0)), ubig.New(testutils.FixtureChainID)) - - h1 := testutils.Head(1) - h1.ParentHash = head0.Hash - - head8 := evmtypes.NewHead(big.NewInt(8), utils.NewHash(), utils.NewHash(), ubig.New(testutils.FixtureChainID)) - - h9 := testutils.Head(9) - h9.ParentHash = head8.Hash - - head10 := evmtypes.NewHead(big.NewInt(10), utils.NewHash(), h9.Hash, ubig.New(testutils.FixtureChainID)) - - h11 := testutils.Head(11) - h11.ParentHash = head10.Hash - - h12 := testutils.Head(12) - h12.ParentHash = h11.Hash - - h13 := testutils.Head(13) - h13.ParentHash = h12.Hash - - h14Orphaned := testutils.Head(14) - h14Orphaned.ParentHash = h13.Hash - - h14 := testutils.Head(14) - h14.ParentHash = h13.Hash - - h15 := testutils.Head(15) - h15.ParentHash = h14.Hash - - hs := []*evmtypes.Head{ - h9, - h11, - h12, - h13, - h14Orphaned, - h14, - h15, - } - - ctx := tests.Context(t) - - type opts struct { - Heads []*evmtypes.Head - FinalityTagEnabled bool - FinalizedBlockOffset uint32 - FinalityDepth uint32 - MaxAllowedFinalityDepth uint32 - } - newHeadTrackerUniverse := func(t *testing.T, opts opts) *headTrackerUniverse { - evmcfg := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - c.FinalityTagEnabled = ptr(opts.FinalityTagEnabled) - c.FinalizedBlockOffset = ptr(opts.FinalizedBlockOffset) - c.FinalityDepth = ptr(opts.FinalityDepth) - c.HeadTracker.FinalityTagBypass = ptr(false) - if opts.MaxAllowedFinalityDepth > 0 { - c.HeadTracker.MaxAllowedFinalityDepth = ptr(opts.MaxAllowedFinalityDepth) - } - }) - - ethClient := clienttest.NewClient(t) - ethClient.On("ConfiguredChainID", mock.Anything).Return(evmcfg.EVM().ChainID(), nil) - ht := createHeadTracker(t, ethClient, evmcfg.EVM(), evmcfg.EVM().HeadTracker(), newORM(t)) - for i := range opts.Heads { - require.NoError(t, ht.headSaver.Save(tests.Context(t), opts.Heads[i])) - } - _, err := ht.headSaver.Load(tests.Context(t), 0) - require.NoError(t, err) - return ht - } - - t.Run("returns error if failed to get latestFinalized block", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - const expectedError = "failed to fetch latest finalized block" - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New(expectedError)).Once() - - err := htu.headTracker.Backfill(ctx, h12) - require.ErrorContains(t, err, expectedError) - }) - t.Run("returns error if latestFinalized is not valid", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, nil).Once() - - err := htu.headTracker.Backfill(ctx, h12) - require.EqualError(t, err, "failed to calculate finalized block: failed to get valid latest finalized block") - }) - t.Run("Returns error if finality gap is too big", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true, MaxAllowedFinalityDepth: 2}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h9, nil).Once() - - err := htu.headTracker.Backfill(ctx, h12) - require.EqualError(t, err, "gap between latest finalized block (9) and current head (12) is too large (> 2)") - }) - t.Run("Returns error if finalized head is ahead of canonical", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h14Orphaned, nil).Once() - - err := htu.headTracker.Backfill(ctx, h12) - require.EqualError(t, err, "invariant violation: expected head of canonical chain to be ahead of the latestFinalized") - }) - t.Run("Returns error if finalizedHead is not present in the canonical chain", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h14Orphaned, nil).Once() - - err := htu.headTracker.Backfill(ctx, h15) - require.ErrorAs(t, err, &heads.FinalizedMissingError[common.Hash]{}) - }) - t.Run("Marks all blocks in chain that are older than finalized", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) - - assertFinalized := func(expectedFinalized bool, msg string, heads ...*evmtypes.Head) { - for _, h := range heads { - storedHead := htu.headSaver.Chain(h.Hash) - assert.Equal(t, expectedFinalized, storedHead != nil && storedHead.IsFinalized.Load(), msg, "block_number", h.Number) - } - } - - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h14, nil).Once() - err := htu.headTracker.Backfill(ctx, h15) - require.NoError(t, err) - assertFinalized(true, "expected heads to be marked as finalized after backfill", h14, h13, h12, h11) - assertFinalized(false, "expected heads to remain unfinalized", h15, &head10) - }) - - t.Run("fetches a missing head", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h9, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). - Return(&head10, nil) - - err := htu.headTracker.Backfill(ctx, h12) - require.NoError(t, err) - - h := htu.headSaver.Chain(h12.Hash) - - for expectedBlockNumber := int64(12); expectedBlockNumber >= 9; expectedBlockNumber-- { - require.NotNil(t, h) - assert.Equal(t, expectedBlockNumber, h.Number) - h = h.Parent.Load() - } - - writtenHead := htu.headSaver.Chain(head10.Hash) - require.NoError(t, err) - assert.Equal(t, int64(10), writtenHead.Number) - }) - t.Run("fetches only heads that are missing", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(&head8, nil).Once() - - htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). - Return(&head10, nil) - htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). - Return(&head8, nil) - - err := htu.headTracker.Backfill(ctx, h15) - require.NoError(t, err) - - h := htu.headSaver.Chain(h15.Hash) - - require.Equal(t, uint32(8), h.ChainLength()) - earliestInChain := h.EarliestInChain() - assert.Equal(t, head8.Number, earliestInChain.BlockNumber()) - assert.Equal(t, head8.Hash, earliestInChain.BlockHash()) - }) - - t.Run("abandons backfill and returns error if the eth node returns not found", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(&head8, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). - Return(&head10, nil). - Once() - htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). - Return(nil, ethereum.NotFound). - Once() - - err := htu.headTracker.Backfill(ctx, h12) - require.Error(t, err) - require.ErrorContains(t, err, "fetchAndSaveHead failed: not found") - - h := htu.headSaver.Chain(h12.Hash) - - // Should contain 12, 11, 10, 9 - assert.Equal(t, 4, int(h.ChainLength())) - assert.Equal(t, int64(9), h.EarliestInChain().BlockNumber()) - }) - - t.Run("abandons backfill and returns error if the context time budget is exceeded", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: hs, FinalityTagEnabled: true}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(&head8, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, head10.Hash). - Return(&head10, nil) - lctx, cancel := context.WithCancel(ctx) - htu.ethClient.On("HeadByHash", mock.Anything, head8.Hash). - Return(nil, context.DeadlineExceeded).Run(func(args mock.Arguments) { - cancel() - }) - - err := htu.headTracker.Backfill(lctx, h12) - require.Error(t, err) - require.ErrorContains(t, err, "fetchAndSaveHead failed: context canceled") - - h := htu.headSaver.Chain(h12.Hash) - - // Should contain 12, 11, 10, 9 - assert.Equal(t, 4, int(h.ChainLength())) - assert.Equal(t, int64(9), h.EarliestInChain().BlockNumber()) - }) - t.Run("abandons backfill and returns error when fetching a block by hash fails, indicating a reorg", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h11, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, h14.Hash).Return(h14, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, h13.Hash).Return(h13, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, h12.Hash).Return(nil, errors.New("not found")).Once() - - err := htu.headTracker.Backfill(ctx, h15) - - require.Error(t, err) - require.ErrorContains(t, err, "fetchAndSaveHead failed: not found") - - h := htu.headSaver.Chain(h14.Hash) - - // Should contain 14, 13 (15 was never added). When trying to get the parent of h13 by hash, a reorg happened and backfill exited. - assert.Equal(t, 2, int(h.ChainLength())) - assert.Equal(t, int64(13), h.EarliestInChain().BlockNumber()) - }) - t.Run("marks head as finalized, if latestHead = finalizedHead (0 finality depth)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: []*evmtypes.Head{h15}, FinalityTagEnabled: true}) - finalizedH15 := h15 // copy h15 to have different addresses - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(finalizedH15, nil).Once() - err := htu.headTracker.Backfill(ctx, h15) - require.NoError(t, err) - - h := htu.headSaver.LatestChain() - - // Should contain 14, 13 (15 was never added). When trying to get the parent of h13 by hash, a reorg happened and backfill exited. - assert.Equal(t, 1, int(h.ChainLength())) - assert.True(t, h.IsFinalized.Load()) - assert.Equal(t, h15.BlockNumber(), h.BlockNumber()) - assert.Equal(t, h15.Hash, h.Hash) - }) - t.Run("marks block as finalized according to FinalizedBlockOffset (finality tag)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: []*evmtypes.Head{h15}, FinalityTagEnabled: true, FinalizedBlockOffset: 2}) - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h14, nil).Once() - // calculateLatestFinalizedBlock fetches blocks at LatestFinalized - FinalizedBlockOffset - htu.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(h12.Number)).Return(h12, nil).Once() - // backfill from 15 to 12 - htu.ethClient.On("HeadByHash", mock.Anything, h12.Hash).Return(h12, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, h13.Hash).Return(h13, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, h14.Hash).Return(h14, nil).Once() - err := htu.headTracker.Backfill(ctx, h15) - require.NoError(t, err) - - h := htu.headSaver.LatestChain() - // h - must contain 15, 14, 13, 12 and only 12 is finalized - assert.Equal(t, 4, int(h.ChainLength())) - for ; h.Hash != h12.Hash; h = h.Parent.Load() { - assert.False(t, h.IsFinalized.Load()) - } - - assert.True(t, h.IsFinalized.Load()) - assert.Equal(t, h12.BlockNumber(), h.BlockNumber()) - assert.Equal(t, h12.Hash, h.Hash) - }) - t.Run("marks block as finalized according to FinalizedBlockOffset (finality depth)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: []*evmtypes.Head{h15}, FinalityDepth: 1, FinalizedBlockOffset: 2}) - htu.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(12)).Return(h12, nil).Once() - - // backfill from 15 to 12 - htu.ethClient.On("HeadByHash", mock.Anything, h14.Hash).Return(h14, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, h13.Hash).Return(h13, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, h12.Hash).Return(h12, nil).Once() - err := htu.headTracker.Backfill(ctx, h15) - require.NoError(t, err) - - h := htu.headSaver.LatestChain() - // h - must contain 15, 14, 13, 12 and only 12 is finalized - assert.Equal(t, 4, int(h.ChainLength())) - for ; h.Hash != h12.Hash; h = h.Parent.Load() { - assert.False(t, h.IsFinalized.Load()) - } - - assert.True(t, h.IsFinalized.Load()) - assert.Equal(t, h12.BlockNumber(), h.BlockNumber()) - assert.Equal(t, h12.Hash, h.Hash) - }) - t.Run("marks block as finalized according to FinalizedBlockOffset even with instant finality", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{Heads: []*evmtypes.Head{h15}, FinalityDepth: 0, FinalizedBlockOffset: 2}) - htu.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(13)).Return(h13, nil).Once() - - // backfill from 15 to 13 - htu.ethClient.On("HeadByHash", mock.Anything, h14.Hash).Return(h14, nil).Once() - htu.ethClient.On("HeadByHash", mock.Anything, h13.Hash).Return(h13, nil).Once() - err := htu.headTracker.Backfill(ctx, h15) - require.NoError(t, err) - - h := htu.headSaver.LatestChain() - // h - must contain 15, 14, 13, only 13 is finalized - assert.Equal(t, 3, int(h.ChainLength())) - for ; h.Hash != h13.Hash; h = h.Parent.Load() { - assert.False(t, h.IsFinalized.Load()) - } - - assert.True(t, h.IsFinalized.Load()) - assert.Equal(t, h13.BlockNumber(), h.BlockNumber()) - assert.Equal(t, h13.Hash, h.Hash) - }) -} - -func TestHeadTracker_LatestAndFinalizedBlock(t *testing.T) { - t.Parallel() - - ctx := tests.Context(t) - - h11 := testutils.Head(11) - h11.ParentHash = utils.NewHash() - - h12 := testutils.Head(12) - h12.ParentHash = h11.Hash - - h13 := testutils.Head(13) - h13.ParentHash = h12.Hash - - type opts struct { - Heads []*evmtypes.Head - FinalityTagEnabled bool - FinalizedBlockOffset uint32 - FinalityDepth uint32 - } - - newHeadTrackerUniverse := func(t *testing.T, opts opts) *headTrackerUniverse { - evmcfg := testutils.NewTestChainScopedConfig(t, func(c *toml.EVMConfig) { - c.FinalityTagEnabled = ptr(opts.FinalityTagEnabled) - c.FinalizedBlockOffset = ptr(opts.FinalizedBlockOffset) - c.FinalityDepth = ptr(opts.FinalityDepth) - }) - - db := testutils.NewSqlxDB(t) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - for i := range opts.Heads { - require.NoError(t, orm.IdempotentInsertHead(tests.Context(t), opts.Heads[i])) - } - ethClient := clienttest.NewClient(t) - ethClient.On("ConfiguredChainID", mock.Anything).Return(testutils.FixtureChainID, nil) - ht := createHeadTracker(t, ethClient, evmcfg.EVM(), evmcfg.EVM().HeadTracker(), orm) - _, err := ht.headSaver.Load(tests.Context(t), 0) - require.NoError(t, err) - return ht - } - t.Run("returns error if failed to get latest block", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - const expectedError = "failed to fetch latest block" - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, errors.New(expectedError)).Once() - - _, _, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.ErrorContains(t, err, expectedError) - }) - t.Run("returns error if latest block is invalid", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil).Once() - - _, _, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.ErrorContains(t, err, "expected latest block to be valid") - }) - t.Run("returns error if failed to get latest finalized (finality tag)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h13, nil).Once() - const expectedError = "failed to get latest finalized block" - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, fmt.Errorf(expectedError)).Once() - - _, _, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.ErrorContains(t, err, expectedError) - }) - t.Run("returns error if latest finalized block is not valid (finality tag)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h13, nil).Once() - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, nil).Once() - - _, _, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.ErrorContains(t, err, "failed to get valid latest finalized block") - }) - t.Run("returns latest finalized block as is if FinalizedBlockOffset is 0 (finality tag)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h13, nil).Once() - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h11, nil).Once() - - actualL, actualLF, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.NoError(t, err) - assert.Equal(t, actualL, h13) - assert.Equal(t, actualLF, h11) - }) - t.Run("returns latest finalized block with offset from cache (finality tag)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true, FinalizedBlockOffset: 1, Heads: []*evmtypes.Head{h13, h12, h11}}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h13, nil).Once() - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h12, nil).Once() - - actualL, actualLF, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.NoError(t, err) - assert.Equal(t, actualL.Number, h13.Number) - assert.Equal(t, actualLF.Number, h11.Number) - }) - t.Run("returns latest finalized block with offset from RPC (finality tag)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityTagEnabled: true, FinalizedBlockOffset: 2, Heads: []*evmtypes.Head{h13, h12, h11}}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h13, nil).Once() - htu.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(h12, nil).Once() - h10 := testutils.Head(10) - htu.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(10)).Return(h10, nil).Once() - - actualL, actualLF, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.NoError(t, err) - assert.Equal(t, actualL.Number, h13.Number) - assert.Equal(t, actualLF.Number, h10.Number) - }) - t.Run("returns current head for both latest and finalized for FD = 0 (finality depth)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h13, nil).Once() - - actualL, actualLF, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.NoError(t, err) - assert.Equal(t, actualL.Number, h13.Number) - assert.Equal(t, actualLF.Number, h13.Number) - }) - t.Run("returns latest finalized block with offset from cache (finality depth)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityDepth: 1, FinalizedBlockOffset: 1, Heads: []*evmtypes.Head{h13, h12, h11}}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h13, nil).Once() - - actualL, actualLF, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.NoError(t, err) - assert.Equal(t, actualL.Number, h13.Number) - assert.Equal(t, actualLF.Number, h11.Number) - }) - t.Run("returns latest finalized block with offset from RPC (finality depth)", func(t *testing.T) { - htu := newHeadTrackerUniverse(t, opts{FinalityDepth: 1, FinalizedBlockOffset: 2, Heads: []*evmtypes.Head{h13, h12, h11}}) - htu.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(h13, nil).Once() - h10 := testutils.Head(10) - htu.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(10)).Return(h10, nil).Once() - - actualL, actualLF, err := htu.headTracker.LatestAndFinalizedBlock(ctx) - require.NoError(t, err) - assert.Equal(t, actualL.Number, h13.Number) - assert.Equal(t, actualLF.Number, h10.Number) - }) -} - -func createHeadTracker(t testing.TB, ethClient *clienttest.Client, config heads.ChainConfig, htConfig heads.TrackerConfig, orm headtracker.ORM) *headTrackerUniverse { - lggr, ob := logger.TestObserved(t, zap.DebugLevel) - hb := headtracker.NewHeadBroadcaster(lggr) - hs := headtracker.NewHeadSaver(lggr, orm, config, htConfig) - mailMon := mailboxtest.NewMonitor(t) - return &headTrackerUniverse{ - mu: new(sync.Mutex), - headTracker: headtracker.NewHeadTracker(lggr, ethClient, config, htConfig, hb, hs, mailMon), - headBroadcaster: hb, - headSaver: hs, - mailMon: mailMon, - observer: ob, - orm: orm, - ethClient: ethClient, - } -} - -func createHeadTrackerWithChecker(t *testing.T, ethClient *clienttest.Client, config heads.ChainConfig, htConfig heads.TrackerConfig, orm headtracker.ORM, checker httypes.HeadTrackable) *headTrackerUniverse { - lggr, ob := logger.TestObserved(t, zap.DebugLevel) - hb := headtracker.NewHeadBroadcaster(lggr) - hs := headtracker.NewHeadSaver(lggr, orm, config, htConfig) - hb.Subscribe(checker) - mailMon := mailboxtest.NewMonitor(t) - ht := headtracker.NewHeadTracker(lggr, ethClient, config, htConfig, hb, hs, mailMon) - return &headTrackerUniverse{ - mu: new(sync.Mutex), - headTracker: ht, - headBroadcaster: hb, - headSaver: hs, - mailMon: mailMon, - observer: ob, - orm: orm, - ethClient: ethClient, - } -} - -type headTrackerUniverse struct { - mu *sync.Mutex - stopped bool - headTracker httypes.HeadTracker - headBroadcaster httypes.HeadBroadcaster - headSaver httypes.HeadSaver - mailMon *mailbox.Monitor - observer *observer.ObservedLogs - orm headtracker.ORM - ethClient *clienttest.Client -} - -func (u *headTrackerUniverse) Backfill(ctx context.Context, head *evmtypes.Head) error { - return u.headTracker.Backfill(ctx, head) -} - -func (u *headTrackerUniverse) Start(t *testing.T) { - u.mu.Lock() - defer u.mu.Unlock() - ctx := tests.Context(t) - require.NoError(t, u.headBroadcaster.Start(ctx)) - require.NoError(t, u.headTracker.Start(ctx)) - require.NoError(t, u.mailMon.Start(ctx)) - - g := gomega.NewWithT(t) - g.Eventually(func() bool { - report := u.headBroadcaster.HealthReport() - return !slices.ContainsFunc(maps.Values(report), func(e error) bool { return e != nil }) - }, 5*time.Second, tests.TestInterval).Should(gomega.Equal(true)) - - t.Cleanup(func() { - u.Stop(t) - }) -} - -func (u *headTrackerUniverse) Stop(t *testing.T) { - u.mu.Lock() - defer u.mu.Unlock() - if u.stopped { - return - } - u.stopped = true - require.NoError(t, u.headBroadcaster.Close()) - require.NoError(t, u.headTracker.Close()) - require.NoError(t, u.mailMon.Close()) -} - -func ptr[T any](t T) *T { return &t } - -// headBuffer - stores heads in sequence, with increasing timestamps -type headBuffer struct { - t *testing.T - Heads []*evmtypes.Head -} - -func NewHeadBuffer(t *testing.T) *headBuffer { - return &headBuffer{ - t: t, - Heads: make([]*evmtypes.Head, 0), - } -} - -func (hb *headBuffer) Append(head *evmtypes.Head) { - cloned := &evmtypes.Head{ - Number: head.Number, - Hash: head.Hash, - ParentHash: head.ParentHash, - Timestamp: head.Timestamp, - EVMChainID: head.EVMChainID, - } - cloned.Parent.Store(head.Parent.Load()) - hb.Heads = append(hb.Heads, cloned) -} - -type blocks struct { - t testing.TB - Heads map[int64]*evmtypes.Head -} - -func (b *blocks) Head(number uint64) *evmtypes.Head { - return b.Heads[int64(number)] -} - -func NewBlocks(t testing.TB, numHashes int) *blocks { - b := &blocks{ - t: t, - Heads: make(map[int64]*evmtypes.Head, numHashes), - } - - if numHashes == 0 { - return b - } - - now := time.Now() - b.Heads[0] = &evmtypes.Head{Hash: testutils.NewHash(), Number: 0, Timestamp: now, EVMChainID: ubig.New(testutils.FixtureChainID)} - for i := 1; i < numHashes; i++ { - //nolint:gosec // G115 - head := b.NewHead(uint64(i)) - b.Heads[head.Number] = head - } - - return b -} - -func (b *blocks) ForkAt(t *testing.T, blockNum int64, numHashes int) *blocks { - forked := NewBlocks(t, len(b.Heads)+numHashes) - if _, exists := forked.Heads[blockNum]; !exists { - t.Fatalf("Not enough length for block num: %v", blockNum) - } - - for i := int64(0); i < blockNum; i++ { - forked.Heads[i] = b.Heads[i] - } - - forked.Heads[blockNum].ParentHash = b.Heads[blockNum].ParentHash - forked.Heads[blockNum].Parent.Store(b.Heads[blockNum].Parent.Load()) - return forked -} - -func (b *blocks) NewHead(number uint64) *evmtypes.Head { - parentNumber := number - 1 - parent, ok := b.Heads[int64(parentNumber)] - if !ok { - b.t.Fatalf("Can't find parent block at index: %v", parentNumber) - } - head := &evmtypes.Head{ - Number: parent.Number + 1, - Hash: testutils.NewHash(), - ParentHash: parent.Hash, - Timestamp: parent.Timestamp.Add(time.Second), - EVMChainID: ubig.New(testutils.FixtureChainID), - } - head.Parent.Store(parent) - return head -} diff --git a/core/chains/evm/headtracker/heads.go b/core/chains/evm/headtracker/heads.go deleted file mode 100644 index 0f46910b0f5..00000000000 --- a/core/chains/evm/headtracker/heads.go +++ /dev/null @@ -1,184 +0,0 @@ -package headtracker - -import ( - "container/heap" - "fmt" - "sync" - - "github.com/ethereum/go-ethereum/common" - - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -// Heads is a collection of heads. All methods are thread-safe. -type Heads interface { - // LatestHead returns the block header with the highest number that has been seen, or nil. - LatestHead() *evmtypes.Head - // HeadByHash returns a head for the specified hash, or nil. - HeadByHash(hash common.Hash) *evmtypes.Head - // AddHeads adds newHeads to the collection, eliminates duplicates, - // sorts by head number, fixes parents and cuts off old heads (historyDepth). - AddHeads(newHeads ...*evmtypes.Head) error - // Count returns number of heads in the collection. - Count() int - // MarkFinalized - finds `finalized` in the LatestHead and marks it and all direct ancestors as finalized. - // Trims old blocks whose height is smaller than minBlockToKeep - MarkFinalized(finalized common.Hash, minBlockToKeep int64) bool -} - -type headSet struct { - highest *evmtypes.Head - headsAsc *headsHeap - headsByHash map[common.Hash]*evmtypes.Head - headsByParent map[common.Hash]map[common.Hash]*evmtypes.Head - mu sync.RWMutex -} - -func NewHeads() Heads { - return &headSet{ - headsAsc: &headsHeap{}, - headsByHash: make(map[common.Hash]*evmtypes.Head), - headsByParent: map[common.Hash]map[common.Hash]*evmtypes.Head{}, - } -} - -func (h *headSet) LatestHead() *evmtypes.Head { - h.mu.RLock() - defer h.mu.RUnlock() - - return h.highest -} - -func (h *headSet) HeadByHash(hash common.Hash) *evmtypes.Head { - h.mu.RLock() - defer h.mu.RUnlock() - - if h.headsByHash == nil { - return nil - } - - return h.headsByHash[hash] -} - -func (h *headSet) Count() int { - h.mu.RLock() - defer h.mu.RUnlock() - - return h.headsAsc.Len() -} - -// MarkFinalized - marks block with hash equal to finalized and all it's direct ancestors as finalized. -// Trims old blocks whose height is smaller than minBlockToKeep -func (h *headSet) MarkFinalized(finalized common.Hash, minBlockToKeep int64) bool { - h.mu.Lock() - defer h.mu.Unlock() - - if len(h.headsByHash) == 0 { - return false - } - - finalizedHead, ok := h.headsByHash[finalized] - if !ok { - return false - } - - markFinalized(finalizedHead) - - // remove all blocks that are older than minBlockToKeep - for h.headsAsc.Len() > 0 && h.headsAsc.Peek().Number < minBlockToKeep { - oldBlock := heap.Pop(h.headsAsc).(*evmtypes.Head) - delete(h.headsByHash, oldBlock.Hash) - // clear .Parent in oldBlock's children - for _, oldBlockChildren := range h.headsByParent[oldBlock.Hash] { - oldBlockChildren.Parent.Store(nil) - } - // headsByParent are expected to be of the same height, so we can remove them all at once - delete(h.headsByParent, oldBlock.ParentHash) - } - - if h.highest.Number < minBlockToKeep { - h.highest = nil - } - - return true -} - -func markFinalized(head *evmtypes.Head) { - // we can assume that if a head was previously marked as finalized all its ancestors were marked as finalized - for head != nil && !head.IsFinalized.Load() { - head.IsFinalized.Store(true) - head = head.Parent.Load() - } -} - -func (h *headSet) ensureNoCycles(newHead *evmtypes.Head) error { - if newHead.ParentHash == newHead.Hash { - return fmt.Errorf("cycle detected: newHeads reference itself newHead(%s)", newHead.String()) - } - if parent, ok := h.headsByHash[newHead.ParentHash]; ok { - if parent.Number >= newHead.Number { - return fmt.Errorf("potential cycle detected while adding newHead as child: %w", newPotentialCycleError(parent, newHead)) - } - } - - for _, child := range h.headsByParent[newHead.Hash] { - if newHead.Number >= child.Number { - return fmt.Errorf("potential cycle detected while adding newHead as parent: %w", newPotentialCycleError(newHead, child)) - } - } - - return nil -} - -func (h *headSet) AddHeads(newHeads ...*evmtypes.Head) error { - h.mu.Lock() - defer h.mu.Unlock() - - for _, newHead := range newHeads { - // skip blocks that were previously added - if _, ok := h.headsByHash[newHead.Hash]; ok { - continue - } - - if err := h.ensureNoCycles(newHead); err != nil { - return err - } - - // heads now owns the newHead - reset values that are populated by heads - newHead.IsFinalized.Store(false) - newHead.Parent.Store(nil) - - // prefer newer head to set as highest - if h.highest == nil || h.highest.Number <= newHead.Number { - h.highest = newHead - } - - heap.Push(h.headsAsc, newHead) - h.headsByHash[newHead.Hash] = newHead - siblings, ok := h.headsByParent[newHead.ParentHash] - if !ok { - siblings = make(map[common.Hash]*evmtypes.Head) - h.headsByParent[newHead.ParentHash] = siblings - } - siblings[newHead.Hash] = newHead - // populate reference to parent - if parent, ok := h.headsByHash[newHead.ParentHash]; ok { - newHead.Parent.Store(parent) - } - for _, child := range h.headsByParent[newHead.Hash] { - // ensure all children have reference to newHead - child.Parent.Store(newHead) - if child.IsFinalized.Load() { - // mark newHead as finalized if any of its children is finalized - markFinalized(newHead) - } - } - } - - return nil -} - -func newPotentialCycleError(parent, child *evmtypes.Head) error { - return fmt.Errorf("expected head number to strictly decrease in 'child -> parent' relation: "+ - "child(%s), parent(%s)", child.String(), parent.String()) -} diff --git a/core/chains/evm/headtracker/heads_test.go b/core/chains/evm/headtracker/heads_test.go deleted file mode 100644 index 7df967d26fc..00000000000 --- a/core/chains/evm/headtracker/heads_test.go +++ /dev/null @@ -1,233 +0,0 @@ -package headtracker_test - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" -) - -func TestHeads_LatestHead(t *testing.T) { - t.Parallel() - - heads := headtracker.NewHeads() - assert.NoError(t, heads.AddHeads(testutils.Head(100), testutils.Head(200), testutils.Head(300))) - - latest := heads.LatestHead() - require.NotNil(t, latest) - require.Equal(t, int64(300), latest.Number) - - assert.NoError(t, heads.AddHeads(testutils.Head(250))) - latest = heads.LatestHead() - require.NotNil(t, latest) - require.Equal(t, int64(300), latest.Number) - - assert.NoError(t, heads.AddHeads(testutils.Head(400))) - latest = heads.LatestHead() - require.NotNil(t, latest) - require.Equal(t, int64(400), latest.Number) - - // if heads have the same height, LatestHead prefers most recent - newerH400 := testutils.Head(400) - assert.NoError(t, heads.AddHeads(newerH400)) - latest = heads.LatestHead() - require.NotNil(t, latest) - require.Equal(t, int64(400), latest.Number) - require.Equal(t, newerH400.Hash, latest.Hash) -} - -func TestHeads_HeadByHash(t *testing.T) { - t.Parallel() - - var testHeads = []*evmtypes.Head{ - testutils.Head(100), - testutils.Head(200), - testutils.Head(300), - } - heads := headtracker.NewHeads() - assert.NoError(t, heads.AddHeads(testHeads...)) - - head := heads.HeadByHash(testHeads[1].Hash) - require.NotNil(t, head) - require.Equal(t, int64(200), head.Number) - - head = heads.HeadByHash(utils.NewHash()) - require.Nil(t, head) -} - -func TestHeads_Count(t *testing.T) { - t.Parallel() - - heads := headtracker.NewHeads() - require.Zero(t, heads.Count()) - - assert.NoError(t, heads.AddHeads(testutils.Head(100), testutils.Head(200), testutils.Head(300))) - require.Equal(t, 3, heads.Count()) - - assert.NoError(t, heads.AddHeads(testutils.Head(400))) - require.Equal(t, 4, heads.Count()) -} - -func TestHeads_AddHeads(t *testing.T) { - t.Parallel() - - uncleHash := utils.NewHash() - heads := headtracker.NewHeads() - - var testHeads []*evmtypes.Head - var parentHash common.Hash - for i := 1; i < 6; i++ { - hash := common.BigToHash(big.NewInt(int64(i))) - h := evmtypes.NewHead(big.NewInt(int64(i)), hash, parentHash, ubig.NewI(0)) - testHeads = append(testHeads, &h) - if i == 3 { - // uncled block - h := evmtypes.NewHead(big.NewInt(int64(i)), uncleHash, parentHash, ubig.NewI(0)) - testHeads = append(testHeads, &h) - } - parentHash = hash - } - - assert.NoError(t, heads.AddHeads(testHeads...)) - require.Equal(t, 6, heads.Count()) - // Add duplicates (should be ignored) - assert.NoError(t, heads.AddHeads(testHeads[2:5]...)) - require.Equal(t, 6, heads.Count()) - - head := heads.LatestHead() - require.NotNil(t, head) - require.Equal(t, 5, int(head.ChainLength())) - - head = heads.HeadByHash(uncleHash) - require.NotNil(t, head) - require.Equal(t, 3, int(head.ChainLength())) - // returns an error, if newHead creates cycle - t.Run("Returns an error, if newHead create cycle", func(t *testing.T) { - cycleHead := &evmtypes.Head{ - Hash: heads.LatestHead().EarliestInChain().ParentHash, - ParentHash: heads.LatestHead().Hash, - } - // 1. try adding in front - cycleHead.Number = heads.LatestHead().Number + 1 - assert.EqualError(t, heads.AddHeads(cycleHead), "potential cycle detected while adding newHead as parent: expected head number to strictly decrease in 'child -> parent' relation: child(Head{Number: 1, Hash: 0x0000000000000000000000000000000000000000000000000000000000000001, ParentHash: 0x0000000000000000000000000000000000000000000000000000000000000000}), parent(Head{Number: 6, Hash: 0x0000000000000000000000000000000000000000000000000000000000000000, ParentHash: 0x0000000000000000000000000000000000000000000000000000000000000005})") - // 2. try adding to back - cycleHead.Number = heads.LatestHead().EarliestInChain().Number - 1 - assert.EqualError(t, heads.AddHeads(cycleHead), "potential cycle detected while adding newHead as child: expected head number to strictly decrease in 'child -> parent' relation: child(Head{Number: 0, Hash: 0x0000000000000000000000000000000000000000000000000000000000000000, ParentHash: 0x0000000000000000000000000000000000000000000000000000000000000005}), parent(Head{Number: 5, Hash: 0x0000000000000000000000000000000000000000000000000000000000000005, ParentHash: 0x0000000000000000000000000000000000000000000000000000000000000004})") - // 3. try adding to back with reference to self - cycleHead = &evmtypes.Head{ - Number: 1000, - Hash: common.BigToHash(big.NewInt(1000)), - ParentHash: common.BigToHash(big.NewInt(1000)), - } - assert.EqualError(t, heads.AddHeads(cycleHead), "cycle detected: newHeads reference itself newHead(Head{Number: 1000, Hash: 0x00000000000000000000000000000000000000000000000000000000000003e8, ParentHash: 0x00000000000000000000000000000000000000000000000000000000000003e8})") - }) -} - -func TestHeads_MarkFinalized(t *testing.T) { - t.Parallel() - - heads := headtracker.NewHeads() - - // create chain - // H0 <- H1 <- H2 <- H3 <- H4 <- H5 - Canonical - // \ \ - // H1Uncle H2Uncle - // - newHead := func(num int, parent common.Hash) *evmtypes.Head { - h := evmtypes.NewHead(big.NewInt(int64(num)), utils.NewHash(), parent, ubig.NewI(0)) - return &h - } - h0 := newHead(0, utils.NewHash()) - h1 := newHead(1, h0.Hash) - h1Uncle := newHead(1, h0.Hash) - h2 := newHead(2, h1.Hash) - h3 := newHead(3, h2.Hash) - h4 := newHead(4, h3.Hash) - h5 := newHead(5, h4.Hash) - h2Uncle := newHead(2, h1.Hash) - - assert.NoError(t, heads.AddHeads(h0, h1, h1Uncle, h2, h2Uncle, h3, h4, h5)) - // mark h3 and all ancestors as finalized - require.True(t, heads.MarkFinalized(h3.Hash, h1.BlockNumber()), "expected MarkFinalized succeed") - - // h0 is too old. It should not be available directly or through its children - assert.Nil(t, heads.HeadByHash(h0.Hash)) - assert.Nil(t, heads.HeadByHash(h1.Hash).Parent.Load()) - assert.Nil(t, heads.HeadByHash(h1Uncle.Hash).Parent.Load()) - assert.Nil(t, heads.HeadByHash(h2Uncle.Hash).Parent.Load().Parent.Load()) - - require.False(t, heads.MarkFinalized(utils.NewHash(), 0), "expected false if finalized hash was not found in existing LatestHead chain") - - ensureProperFinalization := func(t *testing.T) { - t.Helper() - for _, head := range []*evmtypes.Head{h5, h4} { - require.False(t, heads.HeadByHash(head.Hash).IsFinalized.Load(), "expected h4-h5 not to be finalized", head.BlockNumber()) - } - for _, head := range []*evmtypes.Head{h3, h2, h1} { - require.True(t, heads.HeadByHash(head.Hash).IsFinalized.Load(), "expected h3 and all ancestors to be finalized", head.BlockNumber()) - } - require.False(t, heads.HeadByHash(h2Uncle.Hash).IsFinalized.Load(), "expected uncle block not to be marked as finalized") - } - t.Run("blocks were correctly marked as finalized", ensureProperFinalization) - assert.NoError(t, heads.AddHeads(h0, h1, h2, h2Uncle, h3, h4, h5)) - t.Run("blocks remain finalized after re adding them to the Heads", ensureProperFinalization) - - // ensure that IsFinalized is propagated, when older blocks are added - // 1. remove all blocks older than 3 - heads.MarkFinalized(h3.Hash, 3) - // 2. ensure that h2 and h1 are no longer present - assert.Nil(t, heads.HeadByHash(h2.Hash)) - assert.Nil(t, heads.HeadByHash(h1.Hash)) - // 3. add blocks back, starting from older - assert.NoError(t, heads.AddHeads(h1)) - assert.False(t, heads.HeadByHash(h1.Hash).IsFinalized.Load(), "expected h1 to not be finalized as it was not explicitly marked and there no path to h3") - assert.NoError(t, heads.AddHeads(h2)) - // 4. now h2 and h1 must be marked as finalized - assert.True(t, heads.HeadByHash(h1.Hash).IsFinalized.Load()) - assert.True(t, heads.HeadByHash(h2.Hash).IsFinalized.Load()) -} - -func BenchmarkEarliestHeadInChain(b *testing.B) { - const latestBlockNum = 200_000 - blocks := NewBlocks(b, latestBlockNum+1) - b.ResetTimer() - for i := 0; i < b.N; i++ { - latest := blocks.Head(latestBlockNum) - earliest := latest.EarliestHeadInChain() - // perform sanity check - assert.NotEqual(b, latest.BlockNumber(), earliest.BlockNumber()) - assert.NotEqual(b, latest.BlockHash(), earliest.BlockHash()) - } -} - -// BenchmarkSimulated_Backfill - benchmarks AddHeads & MarkFinalized as if it was performed by HeadTracker's backfill -func BenchmarkHeads_SimulatedBackfill(b *testing.B) { - makeHash := func(n int64) common.Hash { - return common.BigToHash(big.NewInt(n)) - } - makeHead := func(n int64) *evmtypes.Head { - return &evmtypes.Head{Number: n, Hash: makeHash(n), ParentHash: makeHash(n - 1)} - } - - const finalityDepth = 16_000 // observed value on Arbitrum - // populate with initial values - heads := headtracker.NewHeads() - for i := int64(1); i <= finalityDepth; i++ { - assert.NoError(b, heads.AddHeads(makeHead(i))) - } - heads.MarkFinalized(makeHash(1), 1) - // focus benchmark on processing of a new latest block - b.ResetTimer() - for i := int64(1); i <= int64(b.N); i++ { - assert.NoError(b, heads.AddHeads(makeHead(finalityDepth+i))) - heads.MarkFinalized(makeHash(i), i) - } -} diff --git a/core/chains/evm/headtracker/heap.go b/core/chains/evm/headtracker/heap.go deleted file mode 100644 index da1b1fb78a7..00000000000 --- a/core/chains/evm/headtracker/heap.go +++ /dev/null @@ -1,37 +0,0 @@ -package headtracker - -import ( - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -type headsHeap struct { - values []*evmtypes.Head -} - -func (h *headsHeap) Len() int { - return len(h.values) -} - -func (h *headsHeap) Swap(i, j int) { - h.values[i], h.values[j] = h.values[j], h.values[i] -} - -func (h *headsHeap) Less(i, j int) bool { - return h.values[i].Number < h.values[j].Number -} - -func (h *headsHeap) Pop() any { - n := len(h.values) - 1 - old := h.values[n] - h.values[n] = nil - h.values = h.values[:n] - return old -} - -func (h *headsHeap) Push(v any) { - h.values = append(h.values, v.(*evmtypes.Head)) -} - -func (h *headsHeap) Peek() *evmtypes.Head { - return h.values[0] -} diff --git a/core/chains/evm/headtracker/mocks/head_trackable.go b/core/chains/evm/headtracker/mocks/head_trackable.go deleted file mode 100644 index 7425c69a995..00000000000 --- a/core/chains/evm/headtracker/mocks/head_trackable.go +++ /dev/null @@ -1,23 +0,0 @@ -package mocks - -import ( - "context" - "sync/atomic" - - "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -// MockHeadTrackable allows you to mock HeadTrackable -type MockHeadTrackable struct { - onNewHeadCount atomic.Int32 -} - -// OnNewLongestChain increases the OnNewLongestChainCount count by one -func (m *MockHeadTrackable) OnNewLongestChain(context.Context, *types.Head) { - m.onNewHeadCount.Add(1) -} - -// OnNewLongestChainCount returns the count of new heads, safely. -func (m *MockHeadTrackable) OnNewLongestChainCount() int32 { - return m.onNewHeadCount.Load() -} diff --git a/core/chains/evm/headtracker/orm.go b/core/chains/evm/headtracker/orm.go deleted file mode 100644 index 1b59c5b9f7d..00000000000 --- a/core/chains/evm/headtracker/orm.go +++ /dev/null @@ -1,111 +0,0 @@ -package headtracker - -import ( - "context" - "database/sql" - "math/big" - - "github.com/ethereum/go-ethereum/common" - pkgerrors "github.com/pkg/errors" - - "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" -) - -type ORM interface { - // IdempotentInsertHead inserts a head only if the hash is new. Will do nothing if hash exists already. - // No advisory lock required because this is thread safe. - IdempotentInsertHead(ctx context.Context, head *evmtypes.Head) error - // TrimOldHeads deletes heads such that only blocks >= minBlockNumber remain - TrimOldHeads(ctx context.Context, minBlockNumber int64) (err error) - // LatestHead returns the highest seen head - LatestHead(ctx context.Context) (head *evmtypes.Head, err error) - // LatestHeads returns the latest heads with blockNumbers >= minBlockNumber - LatestHeads(ctx context.Context, minBlockNumber int64) (heads []*evmtypes.Head, err error) - // HeadByHash fetches the head with the given hash from the db, returns nil if none exists - HeadByHash(ctx context.Context, hash common.Hash) (head *evmtypes.Head, err error) -} - -var _ ORM = &DbORM{} - -type DbORM struct { - chainID ubig.Big - ds sqlutil.DataSource -} - -// NewORM creates an ORM scoped to chainID. -func NewORM(chainID big.Int, ds sqlutil.DataSource) *DbORM { - return &DbORM{ - chainID: ubig.Big(chainID), - ds: ds, - } -} - -func (orm *DbORM) IdempotentInsertHead(ctx context.Context, head *evmtypes.Head) error { - // listener guarantees head.EVMChainID to be equal to DbORM.chainID - query := ` - INSERT INTO evm.heads (hash, number, parent_hash, created_at, timestamp, l1_block_number, evm_chain_id, base_fee_per_gas) VALUES ( - $1, $2, $3, now(), $4, $5, $6, $7) - ON CONFLICT (evm_chain_id, hash) DO NOTHING` - _, err := orm.ds.ExecContext(ctx, query, head.Hash, head.Number, head.ParentHash, head.Timestamp, head.L1BlockNumber, orm.chainID, head.BaseFeePerGas) - return pkgerrors.Wrap(err, "IdempotentInsertHead failed to insert head") -} - -func (orm *DbORM) TrimOldHeads(ctx context.Context, minBlockNumber int64) (err error) { - query := `DELETE FROM evm.heads WHERE evm_chain_id = $1 AND number < $2` - _, err = orm.ds.ExecContext(ctx, query, orm.chainID, minBlockNumber) - return err -} - -func (orm *DbORM) LatestHead(ctx context.Context) (head *evmtypes.Head, err error) { - head = new(evmtypes.Head) - err = orm.ds.GetContext(ctx, head, `SELECT * FROM evm.heads WHERE evm_chain_id = $1 ORDER BY number DESC, created_at DESC, id DESC LIMIT 1`, orm.chainID) - if pkgerrors.Is(err, sql.ErrNoRows) { - return nil, nil - } - err = pkgerrors.Wrap(err, "LatestHead failed") - return -} - -func (orm *DbORM) LatestHeads(ctx context.Context, minBlockNumer int64) (heads []*evmtypes.Head, err error) { - err = orm.ds.SelectContext(ctx, &heads, `SELECT * FROM evm.heads WHERE evm_chain_id = $1 AND number >= $2 ORDER BY number DESC, created_at DESC, id DESC`, orm.chainID, minBlockNumer) - err = pkgerrors.Wrap(err, "LatestHeads failed") - return -} - -func (orm *DbORM) HeadByHash(ctx context.Context, hash common.Hash) (head *evmtypes.Head, err error) { - head = new(evmtypes.Head) - err = orm.ds.GetContext(ctx, head, `SELECT * FROM evm.heads WHERE evm_chain_id = $1 AND hash = $2`, orm.chainID, hash) - if pkgerrors.Is(err, sql.ErrNoRows) { - return nil, nil - } - return head, err -} - -type nullORM struct{} - -func NewNullORM() ORM { - return &nullORM{} -} - -func (orm *nullORM) IdempotentInsertHead(ctx context.Context, head *evmtypes.Head) error { - return nil -} - -func (orm *nullORM) TrimOldHeads(ctx context.Context, minBlockNumber int64) (err error) { - return nil -} - -func (orm *nullORM) LatestHead(ctx context.Context) (head *evmtypes.Head, err error) { - return nil, nil -} - -func (orm *nullORM) LatestHeads(ctx context.Context, minBlockNumer int64) (heads []*evmtypes.Head, err error) { - return nil, nil -} - -func (orm *nullORM) HeadByHash(ctx context.Context, hash common.Hash) (head *evmtypes.Head, err error) { - return nil, nil -} diff --git a/core/chains/evm/headtracker/orm_test.go b/core/chains/evm/headtracker/orm_test.go deleted file mode 100644 index 4a2c02fcc7f..00000000000 --- a/core/chains/evm/headtracker/orm_test.go +++ /dev/null @@ -1,111 +0,0 @@ -package headtracker_test - -import ( - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" -) - -func TestORM_IdempotentInsertHead(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - // Returns nil when inserting first head - head := testutils.Head(0) - require.NoError(t, orm.IdempotentInsertHead(tests.Context(t), head)) - - // Head is inserted - foundHead, err := orm.LatestHead(tests.Context(t)) - require.NoError(t, err) - assert.Equal(t, head.Hash, foundHead.Hash) - - // Returns nil when inserting same head again - require.NoError(t, orm.IdempotentInsertHead(tests.Context(t), head)) - - // Head is still inserted - foundHead, err = orm.LatestHead(tests.Context(t)) - require.NoError(t, err) - assert.Equal(t, head.Hash, foundHead.Hash) -} - -func TestORM_TrimOldHeads(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - for i := 0; i < 10; i++ { - head := testutils.Head(i) - require.NoError(t, orm.IdempotentInsertHead(tests.Context(t), head)) - } - - uncleHead := testutils.Head(5) - require.NoError(t, orm.IdempotentInsertHead(tests.Context(t), uncleHead)) - - err := orm.TrimOldHeads(tests.Context(t), 5) - require.NoError(t, err) - - heads, err := orm.LatestHeads(tests.Context(t), 0) - require.NoError(t, err) - - // uncle block was loaded too - require.Equal(t, 6, len(heads)) - for i := 0; i < 5; i++ { - require.LessOrEqual(t, int64(5), heads[i].Number) - } -} - -func TestORM_HeadByHash(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - var hash common.Hash - for i := 0; i < 10; i++ { - head := testutils.Head(i) - if i == 5 { - hash = head.Hash - } - require.NoError(t, orm.IdempotentInsertHead(tests.Context(t), head)) - } - - head, err := orm.HeadByHash(tests.Context(t), hash) - require.NoError(t, err) - require.Equal(t, hash, head.Hash) - require.Equal(t, int64(5), head.Number) -} - -func TestORM_HeadByHash_NotFound(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - hash := testutils.Head(123).Hash - head, err := orm.HeadByHash(tests.Context(t), hash) - - require.Nil(t, head) - require.NoError(t, err) -} - -func TestORM_LatestHeads_NoRows(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) - - heads, err := orm.LatestHeads(tests.Context(t), 100) - - require.Zero(t, len(heads)) - require.NoError(t, err) -} diff --git a/core/chains/evm/headtracker/simulated_head_tracker.go b/core/chains/evm/headtracker/simulated_head_tracker.go deleted file mode 100644 index 6d69725b01f..00000000000 --- a/core/chains/evm/headtracker/simulated_head_tracker.go +++ /dev/null @@ -1,82 +0,0 @@ -package headtracker - -import ( - "context" - "errors" - "fmt" - "math/big" - - evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -// simulatedHeadTracker - simplified version of HeadTracker that works with simulated backed -type simulatedHeadTracker struct { - ec evmclient.Client - useFinalityTag bool - finalityDepth int64 -} - -func NewSimulatedHeadTracker(ec evmclient.Client, useFinalityTag bool, finalityDepth int64) *simulatedHeadTracker { - return &simulatedHeadTracker{ - ec: ec, - useFinalityTag: useFinalityTag, - finalityDepth: finalityDepth, - } -} - -func (ht *simulatedHeadTracker) LatestAndFinalizedBlock(ctx context.Context) (*evmtypes.Head, *evmtypes.Head, error) { - latest, err := ht.ec.HeadByNumber(ctx, nil) - if err != nil { - return nil, nil, err - } - - if latest == nil { - return nil, nil, fmt.Errorf("expected latest block to be valid") - } - - var finalizedBlock *evmtypes.Head - if ht.useFinalityTag { - finalizedBlock, err = ht.ec.LatestFinalizedBlock(ctx) - } else { - finalizedBlock, err = ht.ec.HeadByNumber(ctx, big.NewInt(max(latest.Number-ht.finalityDepth, 0))) - } - - if err != nil { - return nil, nil, fmt.Errorf("simulatedHeadTracker failed to get finalized block") - } - - if finalizedBlock == nil { - return nil, nil, fmt.Errorf("expected finalized block to be valid") - } - - return latest, finalizedBlock, nil -} - -func (ht *simulatedHeadTracker) LatestChain() *evmtypes.Head { - return nil -} - -func (ht *simulatedHeadTracker) HealthReport() map[string]error { - return nil -} - -func (ht *simulatedHeadTracker) Start(_ context.Context) error { - return nil -} - -func (ht *simulatedHeadTracker) Close() error { - return nil -} - -func (ht *simulatedHeadTracker) Backfill(_ context.Context, _ *evmtypes.Head) error { - return errors.New("unimplemented") -} - -func (ht *simulatedHeadTracker) Name() string { - return "SimulatedHeadTracker" -} - -func (ht *simulatedHeadTracker) Ready() error { - return nil -} diff --git a/core/chains/evm/headtracker/types/types.go b/core/chains/evm/headtracker/types/types.go deleted file mode 100644 index 77e3cb84cfa..00000000000 --- a/core/chains/evm/headtracker/types/types.go +++ /dev/null @@ -1,28 +0,0 @@ -package types - -import ( - "context" - "math/big" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - - "github.com/smartcontractkit/chainlink-framework/chains/heads" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -// HeadSaver maintains chains persisted in DB. All methods are thread-safe. -type HeadSaver interface { - heads.Saver[*evmtypes.Head, common.Hash] - // LatestHeadFromDB returns the highest seen head from DB. - LatestHeadFromDB(ctx context.Context) (*evmtypes.Head, error) -} - -// Type Alias for EVM Head Tracker Components -type ( - HeadTracker = heads.Tracker[*evmtypes.Head, common.Hash] - HeadTrackable = heads.Trackable[*evmtypes.Head, common.Hash] - HeadListener = heads.Listener[*evmtypes.Head, common.Hash] - HeadBroadcaster = heads.Broadcaster[*evmtypes.Head, common.Hash] - Client = heads.Client[*evmtypes.Head, ethereum.Subscription, *big.Int, common.Hash] -) diff --git a/core/chains/evm/log/orm_test.go b/core/chains/evm/log/orm_test.go index 95492fe9960..032f6829911 100644 --- a/core/chains/evm/log/orm_test.go +++ b/core/chains/evm/log/orm_test.go @@ -2,16 +2,19 @@ package log_test import ( "context" + crand "crypto/rand" "math/big" "math/rand" "testing" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/guregu/null.v4" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" + evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" ) @@ -20,7 +23,7 @@ func TestORM_broadcasts(t *testing.T) { db := testutils.NewSqlxDB(t) ethKeyStore := cltest.NewKeyStore(t, db).Eth() - orm := log.NewORM(db, cltest.FixtureChainID) + orm := log.NewORM(db, *testutils.FixtureChainID) _, addr := cltest.MustInsertRandomKey(t, ethKeyStore) specV2 := cltest.MustInsertV2JobSpec(t, db, addr) @@ -30,8 +33,8 @@ func TestORM_broadcasts(t *testing.T) { listener := &mockListener{specV2.ID} - rawLog := cltest.RandomLog(t) - queryArgs := []interface{}{rawLog.BlockHash, rawLog.BlockNumber, rawLog.Index, listener.JobID(), cltest.FixtureChainID.String()} + rawLog := randomLog(t) + queryArgs := []interface{}{rawLog.BlockHash, rawLog.BlockNumber, rawLog.Index, listener.JobID(), testutils.FixtureChainID.String()} // No rows res, err := db.Exec(selectQuery, queryArgs...) @@ -81,7 +84,7 @@ func TestORM_broadcasts(t *testing.T) { func TestORM_pending(t *testing.T) { ctx := testutils.Context(t) db := testutils.NewSqlxDB(t) - orm := log.NewORM(db, cltest.FixtureChainID) + orm := log.NewORM(db, *testutils.FixtureChainID) num, err := orm.GetPendingMinBlock(ctx) require.NoError(t, err) @@ -108,7 +111,7 @@ func TestORM_MarkUnconsumed(t *testing.T) { db := testutils.NewSqlxDB(t) ethKeyStore := cltest.NewKeyStore(t, db).Eth() - orm := log.NewORM(db, cltest.FixtureChainID) + orm := log.NewORM(db, *testutils.FixtureChainID) _, addr1 := cltest.MustInsertRandomKey(t, ethKeyStore) job1 := cltest.MustInsertV2JobSpec(t, db, addr1) @@ -116,21 +119,21 @@ func TestORM_MarkUnconsumed(t *testing.T) { _, addr2 := cltest.MustInsertRandomKey(t, ethKeyStore) job2 := cltest.MustInsertV2JobSpec(t, db, addr2) - logBefore := cltest.RandomLog(t) + logBefore := randomLog(t) logBefore.BlockNumber = 34 require.NoError(t, orm.CreateBroadcast(ctx, logBefore.BlockHash, logBefore.BlockNumber, logBefore.Index, job1.ID)) require.NoError(t, orm.MarkBroadcastConsumed(ctx, logBefore.BlockHash, logBefore.BlockNumber, logBefore.Index, job1.ID)) - logAt := cltest.RandomLog(t) + logAt := randomLog(t) logAt.BlockNumber = 38 require.NoError(t, orm.CreateBroadcast(ctx, logAt.BlockHash, logAt.BlockNumber, logAt.Index, job1.ID)) require.NoError(t, orm.MarkBroadcastConsumed(ctx, logAt.BlockHash, logAt.BlockNumber, logAt.Index, job1.ID)) - logAfter := cltest.RandomLog(t) + logAfter := randomLog(t) logAfter.BlockNumber = 40 require.NoError(t, orm.CreateBroadcast(ctx, logAfter.BlockHash, logAfter.BlockNumber, logAfter.Index, job2.ID)) @@ -204,7 +207,7 @@ func TestORM_Reinitialize(t *testing.T) { t.Run(tt.name, func(t *testing.T) { db := testutils.NewSqlxDB(t) ctx := testutils.Context(t) - orm := log.NewORM(db, cltest.FixtureChainID) + orm := log.NewORM(db, *testutils.FixtureChainID) jobID := cltest.MustInsertV2JobSpec(t, db, common.BigToAddress(big.NewInt(rand.Int63()))).ID @@ -246,3 +249,30 @@ type mockListener struct { func (l *mockListener) JobID() int32 { return l.jobID } func (l *mockListener) HandleLog(context.Context, log.Broadcast) {} + +func randomLog(t *testing.T) types.Log { + t.Helper() + + topics := make([]common.Hash, 4) + for i := range topics { + topics[i] = evmutils.NewHash() + } + + return types.Log{ + Address: testutils.NewAddress(), + BlockHash: evmutils.NewHash(), + BlockNumber: uint64(rand.Intn(9999999)), + Index: uint(rand.Intn(9999999)), + Data: randomBytes(t, 512), + Topics: []common.Hash{evmutils.NewHash(), evmutils.NewHash(), evmutils.NewHash(), evmutils.NewHash()}, + } +} + +func randomBytes(t *testing.T, n int) []byte { + b := make([]byte, n) + _, err := crand.Read(b) + if err != nil { + t.Fatal(err) + } + return b +} diff --git a/core/chains/evm/logpoller/helper_test.go b/core/chains/evm/logpoller/helper_test.go index 57ac09a2d7c..985e86ff707 100644 --- a/core/chains/evm/logpoller/helper_test.go +++ b/core/chains/evm/logpoller/helper_test.go @@ -22,9 +22,10 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/config/chaintype" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/log_emitter" ) @@ -112,7 +113,7 @@ func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { esc := client.NewSimulatedBackendClient(t, backend, chainID) - headTracker := headtracker.NewSimulatedHeadTracker(esc, opts.UseFinalityTag, opts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(esc, opts.UseFinalityTag, opts.FinalityDepth) if opts.PollPeriod == 0 { opts.PollPeriod = 1 * time.Hour } diff --git a/core/chains/evm/logpoller/log_poller_internal_test.go b/core/chains/evm/logpoller/log_poller_internal_test.go index 2eec0a87414..6fbea360b05 100644 --- a/core/chains/evm/logpoller/log_poller_internal_test.go +++ b/core/chains/evm/logpoller/log_poller_internal_test.go @@ -27,12 +27,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - htMocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/log_emitter" ) @@ -229,7 +229,7 @@ func TestLogPoller_BackupPollerStartup(t *testing.T) { ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) ec.On("ConfiguredChainID").Return(chainID, nil) - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(head, finalizedHead, nil) ctx := testutils.Context(t) @@ -336,7 +336,7 @@ func TestLogPoller_Replay(t *testing.T) { KeepFinalizedBlocksDepth: 20, BackupPollerBlockDelay: 0, } - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(func(ctx context.Context) (*evmtypes.Head, *evmtypes.Head, error) { h := head.Load() @@ -578,7 +578,7 @@ func Test_latestBlockAndFinalityDepth(t *testing.T) { } t.Run("headTracker returns an error", func(t *testing.T) { - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) const expectedError = "finalized block is not available yet" headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(&evmtypes.Head{}, &evmtypes.Head{}, fmt.Errorf(expectedError)) @@ -587,7 +587,7 @@ func Test_latestBlockAndFinalityDepth(t *testing.T) { require.ErrorContains(t, err, expectedError) }) t.Run("headTracker returns valid chain", func(t *testing.T) { - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) finalizedBlock := &evmtypes.Head{Number: 2} finalizedBlock.IsFinalized.Store(true) head := &evmtypes.Head{Number: 10} @@ -689,7 +689,7 @@ func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { t.Run("Finalized DB block is not present in RPC's chain", func(t *testing.T) { lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) finalized := newHead(5) latest := newHead(16) headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).RunAndReturn(func(ctx context.Context) (*evmtypes.Head, *evmtypes.Head, error) { @@ -710,7 +710,7 @@ func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { t.Run("RPCs contradict each other and return different finalized blocks", func(t *testing.T) { lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) finalized := newHead(5) latest := newHead(16) headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() @@ -730,7 +730,7 @@ func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { t.Run("Log's hash does not match block's", func(t *testing.T) { lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) finalized := newHead(5) latest := newHead(16) headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() @@ -748,7 +748,7 @@ func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) chainID := testutils.NewRandomEVMChainID() orm := NewORM(chainID, db, lggr) - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) finalized := newHead(5) latest := newHead(16) headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go index c285c5b6ea6..d73e2f3b98e 100644 --- a/core/chains/evm/logpoller/log_poller_test.go +++ b/core/chains/evm/logpoller/log_poller_test.go @@ -27,6 +27,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" commonutils "github.com/smartcontractkit/chainlink-common/pkg/utils" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" @@ -35,8 +36,6 @@ import ( evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - htMocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/log_emitter" ) @@ -712,7 +711,7 @@ func TestLogPoller_SynchronizedWithGeth(t *testing.T) { KeepFinalizedBlocksDepth: 1000, } simulatedClient := client.NewSimulatedBackendClient(t, backend, chainID) - ht := headtracker.NewSimulatedHeadTracker(simulatedClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(simulatedClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(orm, simulatedClient, lggr, ht, lpOpts) for i := 0; i < finalityDepth; i++ { // Have enough blocks that we could reorg the full finalityDepth-1. backend.Commit() @@ -1544,7 +1543,7 @@ func TestTooManyLogResults(t *testing.T) { RpcBatchSize: 10, KeepFinalizedBlocksDepth: 1000, } - headTracker := htMocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) lp := logpoller.NewLogPoller(o, ec, lggr, headTracker, lpOpts) expected := []int64{10, 5, 2, 1} diff --git a/core/chains/evm/txmgr/confirmer_test.go b/core/chains/evm/txmgr/confirmer_test.go index 215c6c3c94d..07eb85bf312 100644 --- a/core/chains/evm/txmgr/confirmer_test.go +++ b/core/chains/evm/txmgr/confirmer_test.go @@ -20,7 +20,6 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-framework/chains/fees" txmgrcommon "github.com/smartcontractkit/chainlink-framework/chains/txmgr" @@ -32,14 +31,16 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" evmconfig "github.com/smartcontractkit/chainlink-integrations/evm/config" "github.com/smartcontractkit/chainlink-integrations/evm/config/configtest" + "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-integrations/evm/gas" gasmocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/mocks" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/keystore" ksmocks "github.com/smartcontractkit/chainlink-integrations/evm/keystore/mocks" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" ) @@ -117,7 +118,7 @@ func TestEthConfirmer_Lifecycle(t *testing.T) { feeEstimator := gas.NewEvmFeeEstimator(lggr, newEst, ge.EIP1559DynamicFees(), ge, ethClient) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, ethKeyStore, feeEstimator) stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), config.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) ec := txmgr.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTxmFeeConfig(ge), config.EVM().Transactions(), confirmerConfig{}, ethKeyStore, txBuilder, lggr, stuckTxDetector, ht) ctx := tests.Context(t) @@ -726,7 +727,7 @@ func TestEthConfirmer_RebroadcastWhereNecessary_WithConnectivityCheck(t *testing addresses := []gethCommon.Address{fromAddress} kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe() stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), ccfg.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) // Create confirmer with necessary state ec := txmgr.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator()), ccfg.EVM().Transactions(), confirmerConfig{}, kst, txBuilder, lggr, stuckTxDetector, ht) servicetest.Run(t, ec) @@ -775,7 +776,7 @@ func TestEthConfirmer_RebroadcastWhereNecessary_WithConnectivityCheck(t *testing addresses := []gethCommon.Address{fromAddress} kst.On("EnabledAddressesForChain", mock.Anything, &cltest.FixtureChainID).Return(addresses, nil).Maybe() stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), ccfg.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) ec := txmgr.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTxmFeeConfig(ccfg.EVM().GasEstimator()), ccfg.EVM().Transactions(), confirmerConfig{}, kst, txBuilder, lggr, stuckTxDetector, ht) servicetest.Run(t, ec) currentHead := int64(30) @@ -1705,7 +1706,7 @@ func TestEthConfirmer_ProcessStuckTransactions(t *testing.T) { ge := evmcfg.EVM().GasEstimator() txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, ethKeyStore, feeEstimator) stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), evmcfg.EVM().Transactions().AutoPurge(), feeEstimator, txStore, ethClient) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) ec := txmgr.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTxmFeeConfig(ge), evmcfg.EVM().Transactions(), confirmerConfig{}, ethKeyStore, txBuilder, lggr, stuckTxDetector, ht) fn := func(ctx context.Context, id uuid.UUID, result interface{}, err error) error { require.ErrorContains(t, err, client.TerminallyStuckMsg) @@ -1782,7 +1783,7 @@ func newEthConfirmer(t testing.TB, txStore txmgr.EvmTxStore, ethClient client.Cl }, ge.EIP1559DynamicFees(), ge, ethClient) txBuilder := txmgr.NewEvmTxAttemptBuilder(*ethClient.ConfiguredChainID(), ge, ks, estimator) stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), config.EVM().Transactions().AutoPurge(), estimator, txStore, ethClient) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) ec := txmgr.NewEvmConfirmer(txStore, txmgr.NewEvmTxmClient(ethClient, nil), txmgr.NewEvmTxmFeeConfig(ge), config.EVM().Transactions(), confirmerConfig{}, ks, txBuilder, lggr, stuckTxDetector, ht) ec.SetResumeCallback(fn) servicetest.Run(t, ec) diff --git a/core/chains/evm/txmgr/finalizer_test.go b/core/chains/evm/txmgr/finalizer_test.go index 6657d3c2128..9bb4a47ce36 100644 --- a/core/chains/evm/txmgr/finalizer_test.go +++ b/core/chains/evm/txmgr/finalizer_test.go @@ -27,10 +27,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/config/configtest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -46,7 +47,7 @@ func TestFinalizer_MarkTxFinalized(t *testing.T) { ethClient := clienttest.NewClientWithDefaultChainID(t) txmClient := txmgr.NewEvmTxmClient(ethClient, nil) rpcBatchSize := uint32(1) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) h99 := &types.Head{ Hash: utils.NewHash(), @@ -260,7 +261,7 @@ func TestFinalizer_ResumePendingRuns(t *testing.T) { ethClient := clienttest.NewClientWithDefaultChainID(t) txmClient := txmgr.NewEvmTxmClient(ethClient, nil) rpcBatchSize := uint32(1) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) grandParentHead := &types.Head{ Number: 8, @@ -463,7 +464,7 @@ func TestFinalizer_FetchAndStoreReceipts(t *testing.T) { ethClient := clienttest.NewClientWithDefaultChainID(t) txmClient := txmgr.NewEvmTxmClient(ethClient, nil) rpcBatchSize := config.EVM().RPCDefaultBatchSize() - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) latestFinalizedHead := &types.Head{ Hash: utils.NewHash(), @@ -901,7 +902,7 @@ func TestFinalizer_FetchAndStoreReceipts_batching(t *testing.T) { ctx := tests.Context(t) ethClient := clienttest.NewClientWithDefaultChainID(t) txmClient := txmgr.NewEvmTxmClient(ethClient, nil) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) latestFinalizedHead := &types.Head{ Hash: utils.NewHash(), @@ -1013,7 +1014,7 @@ func TestFinalizer_FetchAndStoreReceipts_HandlesNonFwdTxsWithForwardingEnabled(t ctx := tests.Context(t) ethClient := clienttest.NewClientWithDefaultChainID(t) txmClient := txmgr.NewEvmTxmClient(ethClient, nil) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) latestFinalizedHead := &types.Head{ Hash: utils.NewHash(), @@ -1070,7 +1071,7 @@ func TestFinalizer_ProcessOldTxsWithoutReceipts(t *testing.T) { ctx := tests.Context(t) ethClient := clienttest.NewClientWithDefaultChainID(t) txmClient := txmgr.NewEvmTxmClient(ethClient, nil) - ht := headtracker.NewSimulatedHeadTracker(ethClient, true, 0) + ht := headstest.NewSimulatedHeadTracker(ethClient, true, 0) latestFinalizedHead := &types.Head{ Hash: utils.NewHash(), diff --git a/core/chains/evm/txmgr/txmgr_test.go b/core/chains/evm/txmgr/txmgr_test.go index 4156e1be842..2142d654c05 100644 --- a/core/chains/evm/txmgr/txmgr_test.go +++ b/core/chains/evm/txmgr/txmgr_test.go @@ -34,15 +34,16 @@ import ( evmconfig "github.com/smartcontractkit/chainlink-integrations/evm/config" "github.com/smartcontractkit/chainlink-integrations/evm/gas" gasmocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/mocks" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/keystore" ksmocks "github.com/smartcontractkit/chainlink-integrations/evm/keystore/mocks" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + commontxmmocks "github.com/smartcontractkit/chainlink/v2/common/txmgr/types/mocks" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -59,7 +60,7 @@ func makeTestEvmTxm( KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), ethClient, lggr, ht, lpOpts) // logic for building components (from evm/evm_txm.go) ------- diff --git a/core/chains/legacyevm/chain.go b/core/chains/legacyevm/chain.go index 3ff2e4fb462..a4cc0326341 100644 --- a/core/chains/legacyevm/chain.go +++ b/core/chains/legacyevm/chain.go @@ -21,13 +21,12 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink-integrations/evm/gas/rollups" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" "github.com/smartcontractkit/chainlink-integrations/evm/keystore" "github.com/smartcontractkit/chainlink-integrations/evm/monitor" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/chains" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" @@ -41,9 +40,9 @@ type Chain interface { Client() client.Client Config() config.ChainScopedConfig LogBroadcaster() log.Broadcaster - HeadBroadcaster() httypes.HeadBroadcaster + HeadBroadcaster() heads.Broadcaster TxManager() txmgr.TxManager - HeadTracker() httypes.HeadTracker + HeadTracker() heads.Tracker Logger() logger.Logger BalanceMonitor() monitor.BalanceMonitor LogPoller() logpoller.LogPoller @@ -108,8 +107,8 @@ type chain struct { client client.Client txm txmgr.TxManager logger logger.Logger - headBroadcaster httypes.HeadBroadcaster - headTracker httypes.HeadTracker + headBroadcaster heads.Broadcaster + headTracker heads.Tracker logBroadcaster log.Broadcaster logPoller logpoller.LogPoller balanceMonitor monitor.BalanceMonitor @@ -151,7 +150,7 @@ type ChainOpts struct { GenEthClient func(*big.Int) client.Client GenLogBroadcaster func(*big.Int) log.Broadcaster GenLogPoller func(*big.Int) logpoller.LogPoller - GenHeadTracker func(*big.Int, httypes.HeadBroadcaster) httypes.HeadTracker + GenHeadTracker func(*big.Int, heads.Broadcaster) heads.Tracker GenTxManager func(*big.Int) txmgr.TxManager GenGasEstimator func(*big.Int) gas.EvmFeeEstimator } @@ -213,20 +212,20 @@ func newChain(ctx context.Context, cfg *config.ChainScoped, nodes []*toml.Node, cl = opts.GenEthClient(chainID) } - headBroadcaster := headtracker.NewHeadBroadcaster(l) - headSaver := headtracker.NullSaver - var headTracker httypes.HeadTracker + headBroadcaster := heads.NewBroadcaster(l) + headSaver := heads.NullSaver + var headTracker heads.Tracker if !opts.ChainConfigs.RPCEnabled() { - headTracker = headtracker.NullTracker + headTracker = heads.NullTracker } else if opts.GenHeadTracker == nil { - var orm headtracker.ORM + var orm heads.ORM if cfg.EVM().HeadTracker().PersistenceEnabled() { - orm = headtracker.NewORM(*chainID, opts.DS) + orm = heads.NewORM(*chainID, opts.DS) } else { - orm = headtracker.NewNullORM() + orm = heads.NewNullORM() } - headSaver = headtracker.NewHeadSaver(l, orm, cfg.EVM(), cfg.EVM().HeadTracker()) - headTracker = headtracker.NewHeadTracker(l, cl, cfg.EVM(), cfg.EVM().HeadTracker(), headBroadcaster, headSaver, opts.MailMon) + headSaver = heads.NewSaver(l, orm, cfg.EVM(), cfg.EVM().HeadTracker()) + headTracker = heads.NewTracker(l, cl, cfg.EVM(), cfg.EVM().HeadTracker(), headBroadcaster, headSaver, opts.MailMon) } else { headTracker = opts.GenHeadTracker(chainID, headBroadcaster) } @@ -481,14 +480,14 @@ func (c *chain) ListNodeStatuses(ctx context.Context, pageSize int32, pageToken return common.ListNodeStatuses(int(pageSize), pageToken, c.listNodeStatuses) } -func (c *chain) ID() *big.Int { return c.id } -func (c *chain) Client() client.Client { return c.client } -func (c *chain) Config() config.ChainScopedConfig { return c.cfg } -func (c *chain) LogBroadcaster() log.Broadcaster { return c.logBroadcaster } -func (c *chain) LogPoller() logpoller.LogPoller { return c.logPoller } -func (c *chain) HeadBroadcaster() httypes.HeadBroadcaster { return c.headBroadcaster } -func (c *chain) TxManager() txmgr.TxManager { return c.txm } -func (c *chain) HeadTracker() httypes.HeadTracker { return c.headTracker } -func (c *chain) Logger() logger.Logger { return c.logger } -func (c *chain) BalanceMonitor() monitor.BalanceMonitor { return c.balanceMonitor } -func (c *chain) GasEstimator() gas.EvmFeeEstimator { return c.gasEstimator } +func (c *chain) ID() *big.Int { return c.id } +func (c *chain) Client() client.Client { return c.client } +func (c *chain) Config() config.ChainScopedConfig { return c.cfg } +func (c *chain) LogBroadcaster() log.Broadcaster { return c.logBroadcaster } +func (c *chain) LogPoller() logpoller.LogPoller { return c.logPoller } +func (c *chain) HeadBroadcaster() heads.Broadcaster { return c.headBroadcaster } +func (c *chain) TxManager() txmgr.TxManager { return c.txm } +func (c *chain) HeadTracker() heads.Tracker { return c.headTracker } +func (c *chain) Logger() logger.Logger { return c.logger } +func (c *chain) BalanceMonitor() monitor.BalanceMonitor { return c.balanceMonitor } +func (c *chain) GasEstimator() gas.EvmFeeEstimator { return c.gasEstimator } diff --git a/core/chains/legacyevm/evm_txm.go b/core/chains/legacyevm/evm_txm.go index 92bc06b4350..8002c0252ba 100644 --- a/core/chains/legacyevm/evm_txm.go +++ b/core/chains/legacyevm/evm_txm.go @@ -4,11 +4,13 @@ import ( "fmt" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" + evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" evmconfig "github.com/smartcontractkit/chainlink-integrations/evm/config" "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink-integrations/evm/gas/rollups" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + evmheads "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -23,7 +25,7 @@ func newEvmTxm( lggr logger.Logger, logPoller logpoller.LogPoller, opts ChainRelayOpts, - headTracker httypes.HeadTracker, + headTracker evmheads.Tracker, estimator gas.EvmFeeEstimator, ) (txm txmgr.TxManager, err error, diff --git a/core/cmd/shell.go b/core/cmd/shell.go index 10ec29083f8..6f99f885c9e 100644 --- a/core/cmd/shell.go +++ b/core/cmd/shell.go @@ -194,7 +194,7 @@ type ChainlinkAppFactory struct{} // NewApplication returns a new instance of the node with the given config. func (n ChainlinkAppFactory) NewApplication(ctx context.Context, cfg chainlink.GeneralConfig, appLggr logger.Logger, appRegisterer prometheus.Registerer, db *sqlx.DB, keyStoreAuthenticator TerminalKeyStoreAuthenticator) (app chainlink.Application, err error) { - err = migrate.SetMigrationENVVars(cfg) + err = migrate.SetMigrationENVVars(cfg.EVMConfigs()) if err != nil { return nil, err } diff --git a/core/cmd/shell_local.go b/core/cmd/shell_local.go index 25730fb1227..478f3ccacd4 100644 --- a/core/cmd/shell_local.go +++ b/core/cmd/shell_local.go @@ -2,43 +2,28 @@ package cmd import ( "context" - crand "crypto/rand" - "database/sql" "fmt" "log" "math" "math/big" "net/http" - "net/url" "os" - "os/exec" - "path" "path/filepath" - "runtime" "strconv" "strings" - "sync" "time" gethCommon "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/fatih/color" - "github.com/jmoiron/sqlx" - "github.com/kylelemons/godebug/diff" - "github.com/lib/pq" "github.com/pkg/errors" "github.com/urfave/cli" - "go.uber.org/multierr" "golang.org/x/sync/errgroup" "gopkg.in/guregu/null.v4" - pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg" - cutils "github.com/smartcontractkit/chainlink-common/pkg/utils" - "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/gas" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/build" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -47,11 +32,11 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/sessions" "github.com/smartcontractkit/chainlink/v2/core/shutdown" "github.com/smartcontractkit/chainlink/v2/core/static" + "github.com/smartcontractkit/chainlink/v2/core/store" "github.com/smartcontractkit/chainlink/v2/core/store/migrate" "github.com/smartcontractkit/chainlink/v2/core/utils" "github.com/smartcontractkit/chainlink/v2/core/web" webPresenters "github.com/smartcontractkit/chainlink/v2/core/web/presenters" - "github.com/smartcontractkit/chainlink/v2/internal/testdb" ) var ErrProfileTooLong = errors.New("requested profile duration too large") @@ -769,37 +754,19 @@ func (s *Shell) ctx() context.Context { func (s *Shell) ResetDatabase(c *cli.Context) error { ctx := s.ctx() cfg := s.Config.Database() - parsed := cfg.URL() - if parsed.String() == "" { + u := cfg.URL() + if u.String() == "" { return s.errorOut(errDBURLMissing) } - dangerMode := c.Bool("dangerWillRobinson") - force := c.Bool("force") - dbname := parsed.Path[1:] + dbname := u.Path[1:] if !dangerMode && !strings.HasSuffix(dbname, "_test") { return s.errorOut(fmt.Errorf("cannot reset database named `%s`. This command can only be run against databases with a name that ends in `_test`, to prevent accidental data loss. If you REALLY want to reset this database, pass in the -dangerWillRobinson option", dbname)) } - lggr := s.Logger - lggr.Infof("Resetting database: %#v", parsed.String()) - lggr.Debugf("Dropping and recreating database: %#v", parsed.String()) - if err := dropAndCreateDB(parsed, force); err != nil { - return s.errorOut(err) - } - lggr.Debugf("Migrating database: %#v", parsed.String()) - if err := migrateDB(ctx, cfg); err != nil { - return s.errorOut(err) - } - schema, err := dumpSchema(parsed) - if err != nil { - return s.errorOut(err) - } - lggr.Debugf("Testing rollback and re-migrate for database: %#v", parsed.String()) - var baseVersionID int64 = 54 - if err := downAndUpDB(ctx, cfg, baseVersionID); err != nil { - return s.errorOut(err) - } - if err := checkSchema(parsed, schema); err != nil { + + force := c.Bool("force") + + if err := store.ResetDatabase(ctx, s.Logger, cfg, force); err != nil { return s.errorOut(err) } return nil @@ -814,122 +781,8 @@ func (s *Shell) PrepareTestDatabase(c *cli.Context) error { // Creating pristine DB copy to speed up FullTestDB dbUrl := cfg.Database().URL() - db, err := sqlx.Open(pgcommon.DriverPostgres, dbUrl.String()) - if err != nil { - return s.errorOut(err) - } - defer db.Close() - templateDB := strings.Trim(dbUrl.Path, "/") - if err = dropAndCreatePristineDB(db, templateDB); err != nil { - return s.errorOut(err) - } - userOnly := c.Bool("user-only") - fixturePath := "../store/fixtures/fixtures.sql" - if userOnly { - fixturePath = "../store/fixtures/users_only_fixture.sql" - } - if err = insertFixtures(dbUrl, fixturePath); err != nil { - return s.errorOut(err) - } - if err = dropDanglingTestDBs(s.Logger, db); err != nil { - return s.errorOut(err) - } - return s.errorOut(randomizeTestDBSequences(db)) -} - -func dropDanglingTestDBs(lggr logger.Logger, db *sqlx.DB) (err error) { - // Drop all old dangling databases - var dbs []string - if err = db.Select(&dbs, `SELECT datname FROM pg_database WHERE datistemplate = false;`); err != nil { - return err - } - - // dropping database is very slow in postgres so we parallelise it here - nWorkers := 25 - ch := make(chan string) - var wg sync.WaitGroup - wg.Add(nWorkers) - errCh := make(chan error, len(dbs)) - for i := 0; i < nWorkers; i++ { - go func() { - defer wg.Done() - for dbname := range ch { - lggr.Infof("Dropping old, dangling test database: %q", dbname) - gerr := cutils.JustError(db.Exec(fmt.Sprintf(`DROP DATABASE IF EXISTS %s`, dbname))) - errCh <- gerr - } - }() - } - for _, dbname := range dbs { - if strings.HasPrefix(dbname, testdb.TestDBNamePrefix) && !strings.HasSuffix(dbname, "_pristine") { - ch <- dbname - } - } - close(ch) - wg.Wait() - close(errCh) - for gerr := range errCh { - err = multierr.Append(err, gerr) - } - return -} - -type failedToRandomizeTestDBSequencesError struct{} - -func (m *failedToRandomizeTestDBSequencesError) Error() string { - return "failed to randomize test db sequences" -} - -// randomizeTestDBSequences randomizes sequenced table columns sequence -// This is necessary as to avoid false positives in some test cases. -func randomizeTestDBSequences(db *sqlx.DB) error { - // not ideal to hard code this, but also not safe to do it programmatically :( - schemas := pq.Array([]string{"public", "evm"}) - seqRows, err := db.Query(`SELECT sequence_schema, sequence_name, minimum_value FROM information_schema.sequences WHERE sequence_schema IN ($1)`, schemas) - if err != nil { - return fmt.Errorf("%s: error fetching sequences: %s", failedToRandomizeTestDBSequencesError{}, err) - } - - defer seqRows.Close() - for seqRows.Next() { - var sequenceSchema, sequenceName string - var minimumSequenceValue int64 - if err = seqRows.Scan(&sequenceSchema, &sequenceName, &minimumSequenceValue); err != nil { - return fmt.Errorf("%s: failed scanning sequence rows: %s", failedToRandomizeTestDBSequencesError{}, err) - } - - if sequenceName == "goose_migrations_id_seq" || sequenceName == "configurations_id_seq" { - continue - } - - var randNum *big.Int - randNum, err = crand.Int(crand.Reader, ubig.NewI(10000).ToInt()) - if err != nil { - return fmt.Errorf("%s: failed to generate random number", failedToRandomizeTestDBSequencesError{}) - } - randNum.Add(randNum, big.NewInt(minimumSequenceValue)) - - if _, err = db.Exec(fmt.Sprintf("ALTER SEQUENCE %s.%s RESTART WITH %d", sequenceSchema, sequenceName, randNum)); err != nil { - return fmt.Errorf("%s: failed to alter and restart %s sequence: %w", failedToRandomizeTestDBSequencesError{}, sequenceName, err) - } - } - - if err = seqRows.Err(); err != nil { - return fmt.Errorf("%s: failed to iterate through sequences: %w", failedToRandomizeTestDBSequencesError{}, err) - } - - return nil -} - -// PrepareTestDatabaseUserOnly calls ResetDatabase then loads only user fixtures required for local -// testing against testnets. Does not include fake chain fixtures. -func (s *Shell) PrepareTestDatabaseUserOnly(c *cli.Context) error { - if err := s.ResetDatabase(c); err != nil { - return s.errorOut(err) - } - cfg := s.Config - if err := insertFixtures(cfg.Database().URL(), "../store/fixtures/users_only_fixtures.sql"); err != nil { + if err := store.PrepareTestDB(s.Logger, dbUrl, userOnly); err != nil { return s.errorOut(err) } return nil @@ -944,7 +797,7 @@ func (s *Shell) MigrateDatabase(_ *cli.Context) error { return s.errorOut(errDBURLMissing) } - err := migrate.SetMigrationENVVars(s.Config) + err := migrate.SetMigrationENVVars(s.Config.EVMConfigs()) if err != nil { return err } @@ -969,7 +822,7 @@ func (s *Shell) RollbackDatabase(c *cli.Context) error { version = null.IntFrom(numVersion) } - db, err := newConnection(ctx, s.Config.Database()) + db, err := store.NewConnection(ctx, s.Config.Database()) if err != nil { return fmt.Errorf("failed to initialize orm: %v", err) } @@ -984,7 +837,7 @@ func (s *Shell) RollbackDatabase(c *cli.Context) error { // VersionDatabase displays the current database version. func (s *Shell) VersionDatabase(_ *cli.Context) error { ctx := s.ctx() - db, err := newConnection(ctx, s.Config.Database()) + db, err := store.NewConnection(ctx, s.Config.Database()) if err != nil { return fmt.Errorf("failed to initialize orm: %v", err) } @@ -1001,7 +854,7 @@ func (s *Shell) VersionDatabase(_ *cli.Context) error { // StatusDatabase displays the database migration status func (s *Shell) StatusDatabase(_ *cli.Context) error { ctx := s.ctx() - db, err := newConnection(ctx, s.Config.Database()) + db, err := store.NewConnection(ctx, s.Config.Database()) if err != nil { return fmt.Errorf("failed to initialize orm: %v", err) } @@ -1018,7 +871,7 @@ func (s *Shell) CreateMigration(c *cli.Context) error { if !c.Args().Present() { return s.errorOut(errors.New("You must specify a migration name")) } - db, err := newConnection(ctx, s.Config.Database()) + db, err := store.NewConnection(ctx, s.Config.Database()) if err != nil { return fmt.Errorf("failed to initialize orm: %v", err) } @@ -1048,7 +901,7 @@ func (s *Shell) CleanupChainTables(c *cli.Context) error { return s.errorOut(fmt.Errorf("cannot reset database named `%s`. This command can only be run against databases with a name that ends in `_test`, to prevent accidental data loss. If you really want to delete chain specific data from this database, pass in the --danger option", dbname)) } - db, err := newConnection(ctx, cfg) + db, err := store.NewConnection(ctx, cfg) if err != nil { return s.errorOut(errors.Wrap(err, "error connecting to the database")) } @@ -1091,69 +944,8 @@ func (s *Shell) CleanupChainTables(c *cli.Context) error { return nil } -type dbConfig interface { - DefaultIdleInTxSessionTimeout() time.Duration - DefaultLockTimeout() time.Duration - MaxOpenConns() int - MaxIdleConns() int - URL() url.URL - DriverName() string -} - -func newConnection(ctx context.Context, cfg dbConfig) (*sqlx.DB, error) { - parsed := cfg.URL() - if parsed.String() == "" { - return nil, errDBURLMissing - } - return pg.NewConnection(ctx, parsed.String(), cfg.DriverName(), cfg) -} - -func dropAndCreateDB(parsed url.URL, force bool) (err error) { - // Cannot drop the database if we are connected to it, so we must connect - // to a different one. template1 should be present on all postgres installations - dbname := parsed.Path[1:] - parsed.Path = "/template1" - db, err := sql.Open(pgcommon.DriverPostgres, parsed.String()) - if err != nil { - return fmt.Errorf("unable to open postgres database for creating test db: %+v", err) - } - defer func() { - if cerr := db.Close(); cerr != nil { - err = multierr.Append(err, cerr) - } - }() - if force { - // supports pg < 13. https://stackoverflow.com/questions/17449420/postgresql-unable-to-drop-database-because-of-some-auto-connections-to-db - _, err = db.Exec(fmt.Sprintf("SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '%s';", dbname)) - if err != nil { - return fmt.Errorf("unable to terminate connections to postgres database: %v", err) - } - } - _, err = db.Exec(fmt.Sprintf(`DROP DATABASE IF EXISTS "%s"`, dbname)) - if err != nil { - return fmt.Errorf("unable to drop postgres database: %v", err) - } - _, err = db.Exec(fmt.Sprintf(`CREATE DATABASE "%s"`, dbname)) - if err != nil { - return fmt.Errorf("unable to create postgres database: %v", err) - } - return nil -} - -func dropAndCreatePristineDB(db *sqlx.DB, template string) (err error) { - _, err = db.Exec(fmt.Sprintf(`DROP DATABASE IF EXISTS "%s"`, testdb.PristineDBName)) - if err != nil { - return fmt.Errorf("unable to drop postgres database: %v", err) - } - _, err = db.Exec(fmt.Sprintf(`CREATE DATABASE "%s" WITH TEMPLATE "%s"`, testdb.PristineDBName, template)) - if err != nil { - return fmt.Errorf("unable to create postgres database: %v", err) - } - return nil -} - -func migrateDB(ctx context.Context, config dbConfig) error { - db, err := newConnection(ctx, config) +func migrateDB(ctx context.Context, config store.Config) error { + db, err := store.NewConnection(ctx, config) if err != nil { return fmt.Errorf("failed to initialize orm: %v", err) } @@ -1164,77 +956,6 @@ func migrateDB(ctx context.Context, config dbConfig) error { return db.Close() } -func downAndUpDB(ctx context.Context, cfg dbConfig, baseVersionID int64) error { - db, err := newConnection(ctx, cfg) - if err != nil { - return fmt.Errorf("failed to initialize orm: %v", err) - } - if err = migrate.Rollback(ctx, db.DB, null.IntFrom(baseVersionID)); err != nil { - return fmt.Errorf("test rollback failed: %v", err) - } - if err = migrate.Migrate(ctx, db.DB); err != nil { - return fmt.Errorf("second migrateDB failed: %v", err) - } - return db.Close() -} - -func dumpSchema(dbURL url.URL) (string, error) { - args := []string{ - dbURL.String(), - "--schema-only", - } - cmd := exec.Command( - "pg_dump", args..., - ) - - schema, err := cmd.Output() - if err != nil { - var ee *exec.ExitError - if errors.As(err, &ee) { - return "", fmt.Errorf("failed to dump schema: %v\n%s", err, string(ee.Stderr)) - } - return "", fmt.Errorf("failed to dump schema: %v", err) - } - return string(schema), nil -} - -func checkSchema(dbURL url.URL, prevSchema string) error { - newSchema, err := dumpSchema(dbURL) - if err != nil { - return err - } - df := diff.Diff(prevSchema, newSchema) - if len(df) > 0 { - fmt.Println(df) - return errors.New("schema pre- and post- rollback does not match (ctrl+f for '+' or '-' to find the changed lines)") - } - return nil -} - -func insertFixtures(dbURL url.URL, pathToFixtures string) (err error) { - db, err := sql.Open(pgcommon.DriverPostgres, dbURL.String()) - if err != nil { - return fmt.Errorf("unable to open postgres database for creating test db: %+v", err) - } - defer func() { - if cerr := db.Close(); cerr != nil { - err = multierr.Append(err, cerr) - } - }() - - _, filename, _, ok := runtime.Caller(1) - if !ok { - return errors.New("could not get runtime.Caller(1)") - } - filepath := path.Join(path.Dir(filename), pathToFixtures) - fixturesSQL, err := os.ReadFile(filepath) - if err != nil { - return err - } - _, err = db.Exec(string(fixturesSQL)) - return err -} - // RemoveBlocks - removes blocks after the specified blocks number func (s *Shell) RemoveBlocks(c *cli.Context) error { start := c.Int64("start") diff --git a/core/internal/cltest/cltest.go b/core/internal/cltest/cltest.go index 28570a73f4f..0ead557ea86 100644 --- a/core/internal/cltest/cltest.go +++ b/core/internal/cltest/cltest.go @@ -49,6 +49,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + evmheads "github.com/smartcontractkit/chainlink-integrations/evm/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" @@ -57,7 +58,6 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/bridges" "github.com/smartcontractkit/chainlink/v2/core/capabilities" remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" "github.com/smartcontractkit/chainlink/v2/core/cmd" @@ -1341,7 +1341,7 @@ func BatchElemMustMatchParams(t *testing.T, req rpc.BatchElem, hash common.Hash, } // SimulateIncomingHeads spawns a goroutine which sends a stream of heads and closes the returned channel when finished. -func SimulateIncomingHeads(t *testing.T, heads []*evmtypes.Head, headTrackables ...httypes.HeadTrackable) (done chan struct{}) { +func SimulateIncomingHeads(t *testing.T, heads []*evmtypes.Head, headTrackables ...evmheads.Trackable) (done chan struct{}) { // Build the full chain of heads ctx := testutils.Context(t) done = make(chan struct{}) diff --git a/core/internal/cltest/factories.go b/core/internal/cltest/factories.go index d2a6b59bc60..37d91f1a69d 100644 --- a/core/internal/cltest/factories.go +++ b/core/internal/cltest/factories.go @@ -24,18 +24,19 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/utils/jsonserializable" + "github.com/smartcontractkit/chainlink/v2/core/bridges" txmgrcommon "github.com/smartcontractkit/chainlink-framework/chains/txmgr" txmgrtypes "github.com/smartcontractkit/chainlink-framework/chains/txmgr/types" "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + "github.com/smartcontractkit/chainlink/v2/core/auth" - "github.com/smartcontractkit/chainlink/v2/core/bridges" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/flux_aggregator_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -320,7 +321,7 @@ func MustGenerateRandomKeyState(_ testing.TB) ethkey.State { func MustInsertHead(t *testing.T, ds sqlutil.DataSource, number int64) *evmtypes.Head { h := evmtypes.NewHead(big.NewInt(number), evmutils.NewHash(), evmutils.NewHash(), ubig.New(&FixtureChainID)) - horm := headtracker.NewORM(FixtureChainID, ds) + horm := heads.NewORM(FixtureChainID, ds) err := horm.IdempotentInsertHead(testutils.Context(t), &h) require.NoError(t, err) @@ -498,24 +499,6 @@ func MustInsertUnfinishedPipelineTaskRun(t *testing.T, db *sqlx.DB, pipelineRunI return tr } -func RandomLog(t *testing.T) types.Log { - t.Helper() - - topics := make([]common.Hash, 4) - for i := range topics { - topics[i] = evmutils.NewHash() - } - - return types.Log{ - Address: testutils.NewAddress(), - BlockHash: evmutils.NewHash(), - BlockNumber: uint64(mathrand.Intn(9999999)), - Index: uint(mathrand.Intn(9999999)), - Data: MustRandomBytes(t, 512), - Topics: []common.Hash{evmutils.NewHash(), evmutils.NewHash(), evmutils.NewHash(), evmutils.NewHash()}, - } -} - func RawNewRoundLog(t *testing.T, contractAddr common.Address, blockHash common.Hash, blockNumber uint64, logIndex uint, removed bool) types.Log { t.Helper() topic := (flux_aggregator_wrapper.FluxAggregatorNewRound{}).Topic() diff --git a/core/internal/testutils/evmtest/evmtest.go b/core/internal/testutils/evmtest/evmtest.go index 799ec07f6de..bb9e4b3a890 100644 --- a/core/internal/testutils/evmtest/evmtest.go +++ b/core/internal/testutils/evmtest/evmtest.go @@ -22,10 +22,11 @@ import ( evmconfig "github.com/smartcontractkit/chainlink-integrations/evm/config" configtoml "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + evmheads "github.com/smartcontractkit/chainlink-integrations/evm/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + "github.com/smartcontractkit/chainlink/v2/core/chains" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" @@ -59,7 +60,7 @@ type TestChainOpts struct { DatabaseConfig txmgr.DatabaseConfig FeatureConfig legacyevm.FeatureConfig ListenerConfig txmgr.ListenerConfig - HeadTracker httypes.HeadTracker + HeadTracker evmheads.Tracker DB sqlutil.DataSource TxManager txmgr.TxManager KeyStore keystore.Eth @@ -116,7 +117,7 @@ func NewChainOpts(t testing.TB, testopts TestChainOpts) legacyevm.ChainRelayOpts } } if testopts.HeadTracker != nil { - opts.GenHeadTracker = func(*big.Int, httypes.HeadBroadcaster) httypes.HeadTracker { + opts.GenHeadTracker = func(*big.Int, evmheads.Broadcaster) evmheads.Tracker { return testopts.HeadTracker } } diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 8dca24aa093..e2f5e54dea8 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -36,7 +36,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 github.com/spf13/cobra v1.8.1 diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 4c74aa982d2..85d9cd2144b 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1123,8 +1123,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/core/services/chainlink/config_general.go b/core/services/chainlink/config_general.go index e54053d03e3..0f6fea7518e 100644 --- a/core/services/chainlink/config_general.go +++ b/core/services/chainlink/config_general.go @@ -308,12 +308,7 @@ func (g *generalConfig) AutoPprof() config.AutoPprof { } func (g *generalConfig) EVMEnabled() bool { - for _, c := range g.c.EVM { - if c.IsEnabled() { - return true - } - } - return false + return g.c.EVM.Enabled() } func (g *generalConfig) SolanaEnabled() bool { diff --git a/core/services/feeds/service_test.go b/core/services/feeds/service_test.go index 7ff04602f57..ce0e933df49 100644 --- a/core/services/feeds/service_test.go +++ b/core/services/feeds/service_test.go @@ -22,9 +22,10 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" proto "github.com/smartcontractkit/chainlink-protos/orchestrator/feedsmanager" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" "github.com/smartcontractkit/chainlink-integrations/evm/types" evmbig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -231,7 +232,7 @@ func setupTestServiceCfg(t *testing.T, overrideCfg func(c *chainlink.Config, s * FeatureConfig: gcfg.Feature(), ListenerConfig: gcfg.Database().Listener(), DB: db, - HeadTracker: headtracker.NullTracker, + HeadTracker: heads.NullTracker, KeyStore: ethKeyStore, }) keyStore.On("Eth").Return(ethKeyStore) diff --git a/core/services/headreporter/head_reporter.go b/core/services/headreporter/head_reporter.go index 1e1e17c0263..8bf1fec3aae 100644 --- a/core/services/headreporter/head_reporter.go +++ b/core/services/headreporter/head_reporter.go @@ -9,14 +9,15 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink-integrations/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/logger" ) type ( HeadReporter interface { - ReportNewHead(ctx context.Context, head *evmtypes.Head) error + ReportNewHead(ctx context.Context, head *types.Head) error ReportPeriodic(ctx context.Context) error } @@ -24,7 +25,7 @@ type ( services.StateMachine ds sqlutil.DataSource lggr logger.Logger - newHeads *mailbox.Mailbox[*evmtypes.Head] + newHeads *mailbox.Mailbox[*types.Head] chStop services.StopChan wgDone sync.WaitGroup reportPeriod time.Duration @@ -37,14 +38,14 @@ func NewHeadReporterService(ds sqlutil.DataSource, lggr logger.Logger, reporters return &HeadReporterService{ ds: ds, lggr: lggr.Named("HeadReporter"), - newHeads: mailbox.NewSingle[*evmtypes.Head](), + newHeads: mailbox.NewSingle[*types.Head](), chStop: make(chan struct{}), reporters: reporters, reportPeriod: 15 * time.Second, } } -func (hrd *HeadReporterService) Subscribe(subFn func(types.HeadTrackable) (evmtypes.Head, func())) { +func (hrd *HeadReporterService) Subscribe(subFn func(heads.Trackable) (types.Head, func())) { _, unsubscribe := subFn(hrd) hrd.unsubscribeFns = append(hrd.unsubscribeFns, unsubscribe) } @@ -73,7 +74,7 @@ func (hrd *HeadReporterService) HealthReport() map[string]error { return map[string]error{hrd.Name(): hrd.Healthy()} } -func (hrd *HeadReporterService) OnNewLongestChain(ctx context.Context, head *evmtypes.Head) { +func (hrd *HeadReporterService) OnNewLongestChain(ctx context.Context, head *types.Head) { hrd.newHeads.Deliver(head) } diff --git a/core/services/headreporter/prometheus_reporter_test.go b/core/services/headreporter/prometheus_reporter_test.go index 31f6f77ddaf..c091af807a5 100644 --- a/core/services/headreporter/prometheus_reporter_test.go +++ b/core/services/headreporter/prometheus_reporter_test.go @@ -12,7 +12,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/gas" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" @@ -132,7 +133,7 @@ func newLegacyChainContainer(t *testing.T, db *sqlx.DB) legacyevm.LegacyChainCon RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(logpoller.NewORM(testutils.FixtureChainID, db, lggr), ethClient, lggr, ht, lpOpts) txm, err := txmgr.NewTxm( diff --git a/core/services/keeper/upkeep_executer.go b/core/services/keeper/upkeep_executer.go index b9de3585638..eb27e138f91 100644 --- a/core/services/keeper/upkeep_executer.go +++ b/core/services/keeper/upkeep_executer.go @@ -18,8 +18,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink/v2/core/config" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" @@ -33,8 +34,8 @@ const ( // UpkeepExecuter fulfills Service and HeadTrackable interfaces var ( - _ job.ServiceCtx = (*UpkeepExecuter)(nil) - _ httypes.HeadTrackable = (*UpkeepExecuter)(nil) + _ job.ServiceCtx = (*UpkeepExecuter)(nil) + _ heads.Trackable = (*UpkeepExecuter)(nil) ) var ( @@ -59,7 +60,7 @@ type UpkeepExecuter struct { ethClient evmclient.Client config UpkeepExecuterConfig executionQueue chan struct{} - headBroadcaster httypes.HeadBroadcaster + headBroadcaster heads.Broadcaster gasEstimator gas.EvmFeeEstimator job job.Job mailbox *mailbox.Mailbox[*evmtypes.Head] @@ -76,7 +77,7 @@ func NewUpkeepExecuter( orm *ORM, pr pipeline.Runner, ethClient evmclient.Client, - headBroadcaster httypes.HeadBroadcaster, + headBroadcaster heads.Broadcaster, gasEstimator gas.EvmFeeEstimator, logger logger.Logger, config UpkeepExecuterConfig, diff --git a/core/services/ocr/contract_tracker.go b/core/services/ocr/contract_tracker.go index d70fca8d559..00c02f90425 100644 --- a/core/services/ocr/contract_tracker.go +++ b/core/services/ocr/contract_tracker.go @@ -24,8 +24,9 @@ import ( evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/config/chaintype" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/offchain_aggregator_wrapper" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -41,7 +42,7 @@ const configMailboxSanityLimit = 100 var ( _ ocrtypes.ContractConfigTracker = &OCRContractTracker{} _ log.Listener = &OCRContractTracker{} - _ httypes.HeadTrackable = &OCRContractTracker{} + _ heads.Trackable = &OCRContractTracker{} OCRContractConfigSet = getEventTopic("ConfigSet") OCRContractLatestRoundRequested = getEventTopic("RoundRequested") @@ -67,7 +68,7 @@ type ( mailMon *mailbox.Monitor // HeadBroadcaster - headBroadcaster httypes.HeadBroadcaster + headBroadcaster heads.Broadcaster unsubscribeHeads func() // Start/Stop lifecycle @@ -113,7 +114,7 @@ func NewOCRContractTracker( ds sqlutil.DataSource, ocrDB OCRContractTrackerDB, cfg ocrcommon.Config, - headBroadcaster httypes.HeadBroadcaster, + headBroadcaster heads.Broadcaster, mailMon *mailbox.Monitor, ) (o *OCRContractTracker) { logger = logger.Named("OCRContractTracker") diff --git a/core/services/ocr/contract_tracker_test.go b/core/services/ocr/contract_tracker_test.go index 9b6d70d1f60..361a0ed496e 100644 --- a/core/services/ocr/contract_tracker_test.go +++ b/core/services/ocr/contract_tracker_test.go @@ -19,8 +19,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox/mailboxtest" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - htmocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" + logmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/offchain_aggregator_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -48,7 +49,7 @@ func mustNewFilterer(t *testing.T) *offchainaggregator.OffchainAggregatorFiltere type contractTrackerUni struct { db *ocrmocks.OCRContractTrackerDB lb *logmocks.Broadcaster - hb *htmocks.Broadcaster[*evmtypes.Head, common.Hash] + hb *headstest.Broadcaster[*evmtypes.Head, common.Hash] ec *clienttest.Client tracker *ocr.OCRContractTracker } @@ -76,7 +77,7 @@ func newContractTrackerUni(t *testing.T, opts ...interface{}) (uni contractTrack } uni.db = ocrmocks.NewOCRContractTrackerDB(t) uni.lb = logmocks.NewBroadcaster(t) - uni.hb = htmocks.NewBroadcaster[*evmtypes.Head, common.Hash](t) + uni.hb = headstest.NewBroadcaster[*evmtypes.Head, common.Hash](t) uni.ec = evmtest.NewEthClientMock(t) mailMon := servicetest.Run(t, mailboxtest.NewMonitor(t)) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go index 61215f60ca9..08e5227b458 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go @@ -22,8 +22,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/gas" gasmocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/mocks" rollupMocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/rollups/mocks" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" commit_store_helper_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store_helper" @@ -148,7 +149,7 @@ func TestCommitStoreReaders(t *testing.T) { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - headTracker := headtracker.NewSimulatedHeadTracker(ec, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(ec, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) if lpOpts.PollPeriod == 0 { lpOpts.PollPeriod = 1 * time.Hour } diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go index e04c9c82738..8ff3f43b5d1 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go @@ -14,18 +14,16 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - - evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" - "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" + evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store_helper" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -120,7 +118,7 @@ func setupOffRampReaderTH(t *testing.T, version string) offRampReaderTH { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - headTracker := headtracker.NewSimulatedHeadTracker(bc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(bc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) if lpOpts.PollPeriod == 0 { lpOpts.PollPeriod = 1 * time.Hour } diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go index ce7534b580d..41560b7e19b 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go @@ -18,9 +18,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" @@ -80,7 +80,7 @@ func setupOnRampReaderTH(t *testing.T, version string) onRampReaderTH { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - headTracker := headtracker.NewSimulatedHeadTracker(bc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(bc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) if lpOpts.PollPeriod == 0 { lpOpts.PollPeriod = 1 * time.Hour } diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go index 52fb3579885..628829627de 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go @@ -21,8 +21,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" @@ -78,7 +79,7 @@ func setupPriceRegistryReaderTH(t *testing.T) priceRegReaderTH { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - headTracker := headtracker.NewSimulatedHeadTracker(ec, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(ec, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) if lpOpts.PollPeriod == 0 { lpOpts.PollPeriod = 1 * time.Hour } diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader_internal_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader_internal_test.go index 0dd4c4b35f6..ab261407c6e 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader_internal_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader_internal_test.go @@ -17,8 +17,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -155,7 +156,7 @@ func TestFilters(t *testing.T) { RpcBatchSize: 1, KeepFinalizedBlocksDepth: 100, } - headTracker := headtracker.NewSimulatedHeadTracker(esc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(esc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) if lpOpts.PollPeriod == 0 { lpOpts.PollPeriod = 1 * time.Hour } diff --git a/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go b/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go index 109d40b0ebb..7773334253c 100644 --- a/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go +++ b/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go @@ -25,7 +25,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/channel_config_store" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -150,7 +151,7 @@ func Test_ChannelDefinitionCache_Integration(t *testing.T) { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller( logpoller.NewORM(testutils.SimulatedChainID, db, lggr), ethClient, lggr, ht, lpOpts) servicetest.Run(t, lp) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/head.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/head.go index 946e544a3be..0cd9c64e242 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/head.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/head.go @@ -6,13 +6,14 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-automation/pkg/v2" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" + + "github.com/smartcontractkit/chainlink-integrations/evm/types" ) type HeadProvider struct { - ht httypes.HeadTracker - hb httypes.HeadBroadcaster + ht heads.Tracker + hb heads.Broadcaster chHead chan ocr2keepers.BlockKey subscribed bool } @@ -46,7 +47,7 @@ type headWrapper struct { c chan ocr2keepers.BlockKey } -func (w *headWrapper) OnNewLongestChain(ctx context.Context, head *evmtypes.Head) { +func (w *headWrapper) OnNewLongestChain(ctx context.Context, head *types.Head) { var bl int64 if head != nil { bl = head.Number diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go index 6eb7c06beac..8073e448517 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go @@ -12,9 +12,10 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-automation/pkg/v2" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - htmocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -46,7 +47,7 @@ func TestGetActiveUpkeepKeys(t *testing.T) { actives[id] = activeUpkeep{ID: idNum} } - mht := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) + mht := headstest.NewTracker[*evmtypes.Head, common.Hash](t) rg := &EvmRegistry{ HeadProvider: HeadProvider{ diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go index 5fce8718cba..7c1bcd4292e 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go @@ -7,7 +7,8 @@ import ( "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/stretchr/testify/assert" - headtracker "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/logger" evm "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21" @@ -20,7 +21,7 @@ const finality = uint32(4) func TestNewAutomationCustomTelemetryService(t *testing.T) { me := &MockMonitoringEndpoint{} lggr := logger.TestLogger(t) - var hb headtracker.HeadBroadcaster + var hb heads.Broadcaster var lp logpoller.LogPoller bs := evm.NewBlockSubscriber(hb, lp, finality, lggr) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber.go index 848d4631f0c..76cb48e8816 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber.go @@ -13,8 +13,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink-integrations/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/utils" ) @@ -39,9 +40,9 @@ type BlockSubscriber struct { threadCtrl utils.ThreadControl mu sync.RWMutex - hb httypes.HeadBroadcaster + hb heads.Broadcaster lp logpoller.LogPoller - headC chan *evmtypes.Head + headC chan *types.Head unsubscribe func() subscribers map[int]chan ocr2keepers.BlockHistory blocks map[int64]string @@ -61,12 +62,12 @@ func (bs *BlockSubscriber) LatestBlock() *ocr2keepers.BlockKey { var _ ocr2keepers.BlockSubscriber = &BlockSubscriber{} -func NewBlockSubscriber(hb httypes.HeadBroadcaster, lp logpoller.LogPoller, finalityDepth uint32, lggr logger.Logger) *BlockSubscriber { +func NewBlockSubscriber(hb heads.Broadcaster, lp logpoller.LogPoller, finalityDepth uint32, lggr logger.Logger) *BlockSubscriber { return &BlockSubscriber{ threadCtrl: utils.NewThreadControl(), hb: hb, lp: lp, - headC: make(chan *evmtypes.Head, channelSize), + headC: make(chan *types.Head, channelSize), subscribers: map[int]chan ocr2keepers.BlockHistory{}, blocks: map[int64]string{}, blockHistorySize: blockHistorySize, @@ -228,7 +229,7 @@ func (bs *BlockSubscriber) Unsubscribe(subId int) error { return nil } -func (bs *BlockSubscriber) processHead(h *evmtypes.Head) { +func (bs *BlockSubscriber) processHead(h *types.Head) { bs.mu.Lock() defer bs.mu.Unlock() // head parent is a linked list with EVM finality depth @@ -283,11 +284,11 @@ func (bs *BlockSubscriber) queryBlocksMap(bn int64) (string, bool) { } type headWrapper struct { - headC chan *evmtypes.Head + headC chan *types.Head lggr logger.Logger } -func (w *headWrapper) OnNewLongestChain(_ context.Context, head *evmtypes.Head) { +func (w *headWrapper) OnNewLongestChain(_ context.Context, head *types.Head) { if head != nil { select { case w.headC <- head: diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go index 19951ba12fd..35194c77962 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go @@ -11,9 +11,10 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - htmocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -26,7 +27,7 @@ const finality = uint32(4) func TestBlockSubscriber_Subscribe(t *testing.T) { lggr := logger.TestLogger(t) - var hb types.HeadBroadcaster + var hb heads.Broadcaster var lp logpoller.LogPoller bs := NewBlockSubscriber(hb, lp, finality, lggr) @@ -45,7 +46,7 @@ func TestBlockSubscriber_Subscribe(t *testing.T) { func TestBlockSubscriber_Unsubscribe(t *testing.T) { lggr := logger.TestLogger(t) - var hb types.HeadBroadcaster + var hb heads.Broadcaster var lp logpoller.LogPoller bs := NewBlockSubscriber(hb, lp, finality, lggr) @@ -63,7 +64,7 @@ func TestBlockSubscriber_Unsubscribe(t *testing.T) { func TestBlockSubscriber_Unsubscribe_Failure(t *testing.T) { lggr := logger.TestLogger(t) - var hb types.HeadBroadcaster + var hb heads.Broadcaster var lp logpoller.LogPoller bs := NewBlockSubscriber(hb, lp, finality, lggr) @@ -75,7 +76,7 @@ func TestBlockSubscriber_Unsubscribe_Failure(t *testing.T) { func TestBlockSubscriber_GetBlockRange(t *testing.T) { lggr := logger.TestLogger(t) - var hb types.HeadBroadcaster + var hb heads.Broadcaster tests := []struct { Name string @@ -114,7 +115,7 @@ func TestBlockSubscriber_GetBlockRange(t *testing.T) { func TestBlockSubscriber_InitializeBlocks(t *testing.T) { lggr := logger.TestLogger(t) - var hb types.HeadBroadcaster + var hb heads.Broadcaster tests := []struct { Name string @@ -177,7 +178,7 @@ func TestBlockSubscriber_InitializeBlocks(t *testing.T) { func TestBlockSubscriber_BuildHistory(t *testing.T) { lggr := logger.TestLogger(t) - var hb types.HeadBroadcaster + var hb heads.Broadcaster lp := new(mocks.LogPoller) tests := []struct { @@ -227,7 +228,7 @@ func TestBlockSubscriber_BuildHistory(t *testing.T) { func TestBlockSubscriber_Cleanup(t *testing.T) { lggr := logger.TestLogger(t) - var hb types.HeadBroadcaster + var hb heads.Broadcaster lp := new(mocks.LogPoller) tests := []struct { @@ -275,7 +276,7 @@ func TestBlockSubscriber_Cleanup(t *testing.T) { func TestBlockSubscriber_Start(t *testing.T) { lggr := logger.TestLogger(t) - hb := htmocks.NewBroadcaster[*evmtypes.Head, common.Hash](t) + hb := headstest.NewBroadcaster[*evmtypes.Head, common.Hash](t) hb.On("Subscribe", mock.Anything).Return(&evmtypes.Head{Number: 42}, func() {}) lp := new(mocks.LogPoller) lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: 100}, nil) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go index 6f8df543ccf..315e30fd13f 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go @@ -17,11 +17,11 @@ import ( "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/assets" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/log_upkeep_counter_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -460,7 +460,7 @@ func setupDependencies(t *testing.T, db *sqlx.DB, backend evmtypes.Backend) (log RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(lorm, ethClient, pollerLggr, ht, lpOpts) servicetest.Run(t, lp) return lp, ethClient diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go index 46aca85f07b..15b41710fa6 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go @@ -19,9 +19,10 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + evmheads "github.com/smartcontractkit/chainlink-integrations/evm/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - evmhttypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" @@ -547,7 +548,7 @@ func TestRegistry_refreshLogTriggerUpkeeps(t *testing.T) { t.Run(tc.name, func(t *testing.T) { ctx := tests.Context(t) lggr := logger.Test(t) - var hb evmhttypes.HeadBroadcaster + var hb evmheads.Broadcaster var lp logpoller.LogPoller bs := NewBlockSubscriber(hb, lp, 1000, lggr) diff --git a/core/services/registrysyncer/syncer_test.go b/core/services/registrysyncer/syncer_test.go index 19a7cdfcf3e..f6d4445dc8f 100644 --- a/core/services/registrysyncer/syncer_test.go +++ b/core/services/registrysyncer/syncer_test.go @@ -22,14 +22,13 @@ import ( "google.golang.org/protobuf/types/known/durationpb" "github.com/smartcontractkit/chainlink-common/pkg/capabilities" + capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-common/pkg/values" - capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" - evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -99,7 +98,7 @@ func newContractReaderFactory(t *testing.T, simulatedBackend *simulated.Backend) ) db := pgtest.NewSqlxDB(t) const finalityDepth = 2 - ht := headtracker.NewSimulatedHeadTracker(client, false, finalityDepth) + ht := headstest.NewSimulatedHeadTracker(client, false, finalityDepth) lp := logpoller.NewLogPoller( logpoller.NewORM(testutils.SimulatedChainID, db, lggr), client, diff --git a/core/services/relay/evm/capabilities/testutils/backend.go b/core/services/relay/evm/capabilities/testutils/backend.go index c85d22b7706..d412087bfd9 100644 --- a/core/services/relay/evm/capabilities/testutils/backend.go +++ b/core/services/relay/evm/capabilities/testutils/backend.go @@ -14,10 +14,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/types" + "github.com/smartcontractkit/chainlink-integrations/evm/assets" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -86,7 +88,7 @@ func NewEVMBackendTH(t *testing.T) *EVMBackendTH { func (th *EVMBackendTH) SetupCoreServices(t *testing.T) (logpoller.HeadTracker, logpoller.LogPoller) { db := pgtest.NewSqlxDB(t) const finalityDepth = 2 - ht := headtracker.NewSimulatedHeadTracker(th.EVMClient, false, finalityDepth) + ht := headstest.NewSimulatedHeadTracker(th.EVMClient, false, finalityDepth) lp := logpoller.NewLogPoller( logpoller.NewORM(testutils.SimulatedChainID, db, th.Lggr), th.EVMClient, diff --git a/core/services/relay/evm/chain_components_test.go b/core/services/relay/evm/chain_components_test.go index c46f322162a..dc48edad132 100644 --- a/core/services/relay/evm/chain_components_test.go +++ b/core/services/relay/evm/chain_components_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/services" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -33,8 +34,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" clevmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - htMocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpMocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" evmtxmgr "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" @@ -219,7 +219,7 @@ func TestContractReaderEventsInitValidation(t *testing.T) { func TestChainReader_HealthReport(t *testing.T) { lp := lpMocks.NewLogPoller(t) lp.EXPECT().HealthReport().Return(map[string]error{"lp_name": clcommontypes.ErrFinalityViolated}).Once() - ht := htMocks.NewTracker[*clevmtypes.Head, common.Hash](t) + ht := headstest.NewTracker[*clevmtypes.Head, common.Hash](t) htError := errors.New("head tracker error") ht.EXPECT().HealthReport().Return(map[string]error{"ht_name": htError}).Once() cr, err := evm.NewChainReaderService(testutils.Context(t), logger.Nop(), lp, ht, nil, types.ChainReaderConfig{Contracts: nil}) @@ -317,7 +317,7 @@ func (h *helper) HeadTracker(t *testing.T) logpoller.HeadTracker { return h.ht } lpOpts := getLPOpts() - h.ht = headtracker.NewSimulatedHeadTracker(h.Client(t), lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + h.ht = headstest.NewSimulatedHeadTracker(h.Client(t), lpOpts.UseFinalityTag, lpOpts.FinalityDepth) return h.ht } diff --git a/core/services/relay/evm/config_poller_test.go b/core/services/relay/evm/config_poller_test.go index 0dccce6bc7c..3af5ef3c27c 100644 --- a/core/services/relay/evm/config_poller_test.go +++ b/core/services/relay/evm/config_poller_test.go @@ -33,8 +33,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" @@ -103,7 +103,7 @@ func TestConfigPoller(t *testing.T) { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp = logpoller.NewLogPoller(lorm, ethClient, lggr, ht, lpOpts) servicetest.Run(t, lp) } diff --git a/core/services/relay/evm/functions/config_poller_test.go b/core/services/relay/evm/functions/config_poller_test.go index 60be5287e0b..0c6dadce691 100644 --- a/core/services/relay/evm/functions/config_poller_test.go +++ b/core/services/relay/evm/functions/config_poller_test.go @@ -24,8 +24,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -89,7 +90,7 @@ func runTest(t *testing.T, pluginType functions.FunctionsPluginType, expectedDig RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(lorm, ethClient, lggr, ht, lpOpts) servicetest.Run(t, lp) configPoller, err := functions.NewFunctionsConfigPoller(pluginType, lp, lggr) diff --git a/core/services/relay/evm/mercury/helpers_test.go b/core/services/relay/evm/mercury/helpers_test.go index 646c5a57bfa..c2a8ae1b33f 100644 --- a/core/services/relay/evm/mercury/helpers_test.go +++ b/core/services/relay/evm/mercury/helpers_test.go @@ -22,8 +22,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/verifier" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/verifier_proxy" @@ -178,7 +179,7 @@ func SetupTH(t *testing.T, feedID common.Hash) TestHarness { RpcBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } - ht := headtracker.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(lorm, ethClient, lggr, ht, lpOpts) servicetest.Run(t, lp) diff --git a/core/services/relay/evm/mercury/v1/data_source_test.go b/core/services/relay/evm/mercury/v1/data_source_test.go index f95281231d0..9200d8e3abc 100644 --- a/core/services/relay/evm/mercury/v1/data_source_test.go +++ b/core/services/relay/evm/mercury/v1/data_source_test.go @@ -20,9 +20,10 @@ import ( v1 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v1" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - htmocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/services/job" "github.com/smartcontractkit/chainlink/v2/core/services/pipeline" @@ -116,7 +117,7 @@ func TestMercury_Observe(t *testing.T) { spec := pipeline.Spec{} ds.spec = spec - h := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) + h := headstest.NewTracker[*evmtypes.Head, common.Hash](t) ds.mercuryChainReader = evm.NewMercuryChainReader(h) head := &evmtypes.Head{ @@ -207,7 +208,7 @@ func TestMercury_Observe(t *testing.T) { assert.Equal(t, head.Number-1, obs.MaxFinalizedBlockNumber.Val) }) t.Run("if no current block available", func(t *testing.T) { - h2 := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) + h2 := headstest.NewTracker[*evmtypes.Head, common.Hash](t) h2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(h2) @@ -318,7 +319,7 @@ func TestMercury_Observe(t *testing.T) { t.Run("LatestBlocks is populated correctly", func(t *testing.T) { t.Run("when chain length is zero", func(t *testing.T) { - ht2 := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) + ht2 := headstest.NewTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) @@ -342,7 +343,7 @@ func TestMercury_Observe(t *testing.T) { } h6.Parent.Store(h5) - ht2 := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) + ht2 := headstest.NewTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return(h6) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) @@ -365,7 +366,7 @@ func TestMercury_Observe(t *testing.T) { } } - ht2 := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) + ht2 := headstest.NewTracker[*evmtypes.Head, common.Hash](t) ht2.On("LatestChain").Return(heads[len(heads)-1]) ds.mercuryChainReader = evm.NewMercuryChainReader(ht2) @@ -410,7 +411,7 @@ func TestMercury_SetLatestBlocks(t *testing.T) { } t.Run("returns head from headtracker if present", func(t *testing.T) { - headTracker := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) headTracker.On("LatestChain").Return(&h, nil) ds.mercuryChainReader = evm.NewMercuryChainReader(headTracker) @@ -427,7 +428,7 @@ func TestMercury_SetLatestBlocks(t *testing.T) { }) t.Run("if headtracker returns nil head", func(t *testing.T) { - headTracker := htmocks.NewTracker[*evmtypes.Head, common.Hash](t) + headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) // This can happen in some cases e.g. RPC node is offline headTracker.On("LatestChain").Return((*evmtypes.Head)(nil)) ds.mercuryChainReader = evm.NewChainReader(headTracker) diff --git a/core/services/relay/evm/mercury_provider.go b/core/services/relay/evm/mercury_provider.go index 85f633e063a..07e421c2136 100644 --- a/core/services/relay/evm/mercury_provider.go +++ b/core/services/relay/evm/mercury_provider.go @@ -17,7 +17,8 @@ import ( "github.com/smartcontractkit/chainlink-data-streams/mercury" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" + evmmercury "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury" ) @@ -135,14 +136,14 @@ func (p *mercuryProvider) ContractReader() commontypes.ContractReader { var _ mercurytypes.ChainReader = (*mercuryChainReader)(nil) type mercuryChainReader struct { - tracker httypes.HeadTracker + tracker heads.Tracker } -func NewChainReader(h httypes.HeadTracker) mercurytypes.ChainReader { +func NewChainReader(h heads.Tracker) mercurytypes.ChainReader { return &mercuryChainReader{h} } -func NewMercuryChainReader(h httypes.HeadTracker) mercurytypes.ChainReader { +func NewMercuryChainReader(h heads.Tracker) mercurytypes.ChainReader { return &mercuryChainReader{ tracker: h, } diff --git a/core/services/relay/evm/request_round_tracker_test.go b/core/services/relay/evm/request_round_tracker_test.go index df02ab360c5..71be449f542 100644 --- a/core/services/relay/evm/request_round_tracker_test.go +++ b/core/services/relay/evm/request_round_tracker_test.go @@ -16,9 +16,11 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - htmocks "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" + logmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" offchain_aggregator_wrapper "github.com/smartcontractkit/chainlink/v2/core/internal/gethwrappers2/generated/offchainaggregator" @@ -46,7 +48,7 @@ func mustNewFilterer(t *testing.T, address gethCommon.Address) *ocr2aggregator.O type contractTrackerUni struct { db *mocks.RequestRoundDB lb *logmocks.Broadcaster - hb *htmocks.Broadcaster[*evmtypes.Head, common.Hash] + hb *headstest.Broadcaster[*evmtypes.Head, common.Hash] ec *clienttest.Client requestRoundTracker *evm.RequestRoundTracker } @@ -74,7 +76,7 @@ func newContractTrackerUni(t *testing.T, opts ...interface{}) (uni contractTrack } uni.db = mocks.NewRequestRoundDB(t) uni.lb = logmocks.NewBroadcaster(t) - uni.hb = htmocks.NewBroadcaster[*evmtypes.Head, common.Hash](t) + uni.hb = headstest.NewBroadcaster[*evmtypes.Head, common.Hash](t) uni.ec = clienttest.NewClient(t) db := pgtest.NewSqlxDB(t) diff --git a/core/services/relay/evm/write_target_test.go b/core/services/relay/evm/write_target_test.go index bca79e5ca37..c4712d69970 100644 --- a/core/services/relay/evm/write_target_test.go +++ b/core/services/relay/evm/write_target_test.go @@ -16,11 +16,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/capabilities" commonTypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/values" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" gasmocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/mocks" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/common/headtracker/mocks" + evmcapabilities "github.com/smartcontractkit/chainlink/v2/core/capabilities" "github.com/smartcontractkit/chainlink/v2/core/capabilities/targets" pollermocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" @@ -117,7 +118,7 @@ func TestEvmWrite(t *testing.T) { chain.On("TxManager").Return(txManager) chain.On("LogPoller").Return(poller) - ht := mocks.NewTracker[*evmtypes.Head, common.Hash](t) + ht := headstest.NewTracker[*evmtypes.Head, common.Hash](t) ht.On("LatestAndFinalizedBlock", mock.Anything).Return(&evmtypes.Head{}, &evmtypes.Head{}, nil) chain.On("HeadTracker").Return(ht) diff --git a/core/services/vrf/delegate_test.go b/core/services/vrf/delegate_test.go index 21491ec6b54..8052e2e8742 100644 --- a/core/services/vrf/delegate_test.go +++ b/core/services/vrf/delegate_test.go @@ -19,11 +19,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/heads" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/v2/core/bridges" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" - httypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" log_mocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log/mocks" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" @@ -60,7 +60,7 @@ type vrfUniverse struct { vrfkey vrfkey.KeyV2 submitter common.Address txm *txmgr.TxManager - hb httypes.HeadBroadcaster + hb heads.Broadcaster legacyChains legacyevm.LegacyChainContainer cid big.Int } @@ -75,7 +75,7 @@ func buildVrfUni(t *testing.T, db *sqlx.DB, cfg chainlink.GeneralConfig) vrfUniv ec.On("ConfiguredChainID").Return(testutils.FixtureChainID) ec.On("LatestBlockHeight", mock.Anything).Return(big.NewInt(51), nil).Maybe() lggr := logger.TestLogger(t) - hb := headtracker.NewHeadBroadcaster(lggr) + hb := heads.NewBroadcaster(lggr) // Don't mock db interactions prm := pipeline.NewORM(db, lggr, cfg.JobPipeline().MaxSuccessfulRuns()) @@ -83,7 +83,7 @@ func buildVrfUni(t *testing.T, db *sqlx.DB, cfg chainlink.GeneralConfig) vrfUniv ks := keystore.NewInMemory(db, utils.FastScryptParams, lggr) _, dbConfig, evmConfig := txmgr.MakeTestConfigs(t) txm, err := txmgr.NewTxm(db, evmConfig, evmConfig.GasEstimator(), evmConfig.Transactions(), nil, dbConfig, dbConfig.Listener(), ec, logger.TestLogger(t), nil, ks.Eth(), nil, nil, nil) - orm := headtracker.NewORM(*testutils.FixtureChainID, db) + orm := heads.NewORM(*testutils.FixtureChainID, db) require.NoError(t, orm.IdempotentInsertHead(testutils.Context(t), cltest.Head(51))) jrm := job.NewORM(db, prm, btORM, ks, lggr) t.Cleanup(func() { assert.NoError(t, jrm.Close()) }) diff --git a/core/services/vrf/v2/listener_v2_log_listener_test.go b/core/services/vrf/v2/listener_v2_log_listener_test.go index 62594e42002..f7a1eb88e34 100644 --- a/core/services/vrf/v2/listener_v2_log_listener_test.go +++ b/core/services/vrf/v2/listener_v2_log_listener_test.go @@ -20,10 +20,12 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" + "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" evmmocks "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2" @@ -108,7 +110,7 @@ func setupVRFLogPollerListenerTH(t *testing.T) *vrfLogPollerListenerTH { RpcBatchSize: rpcBatchSize, KeepFinalizedBlocksDepth: keepFinalizedBlocksDepth, } - ht := headtracker.NewSimulatedHeadTracker(esc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + ht := headstest.NewSimulatedHeadTracker(esc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(o, esc, lggr, ht, lpOpts) emitterAddress1, _, emitter1, err := log_emitter.DeployLogEmitter(owner, ec) diff --git a/core/store/cmd/preparetest/main.go b/core/store/cmd/preparetest/main.go new file mode 100644 index 00000000000..6d42f363b9b --- /dev/null +++ b/core/store/cmd/preparetest/main.go @@ -0,0 +1,77 @@ +package main + +import ( + "context" + "flag" + "log" + "net/url" + "os" + "strings" + "time" + + "go.uber.org/zap" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg" + "github.com/smartcontractkit/chainlink/v2/core/store" +) + +var ( + urlStr = os.Getenv("CL_DATABASE_URL") + force = flag.Bool("force", false, "set to true to force the reset by dropping any existing connections to the database") + userOnly = flag.Bool("user-only", false, "only include test user fixture") +) + +func main() { + flag.Parse() + + ctx := context.Background() + lggr, err := logger.NewWith(func(z *zap.Config) { + z.OutputPaths = []string{"stdout"} + z.Encoding = "console" + z.EncoderConfig = zap.NewDevelopmentEncoderConfig() + z.EncoderConfig.TimeKey = "" + z.EncoderConfig.CallerKey = "" + }) + if err != nil { + log.Fatalln(err) + } + + if urlStr == "" { + lggr.Fatal("CL_DATABASE_URL is required") + } + dbURL, err := url.Parse(urlStr) + if err != nil { + lggr.Fatalf("Unable to parse URL %q: %v", urlStr, err) + } + + if dbname := dbURL.Path[1:]; !strings.HasSuffix(dbname, "_test") { + lggr.Fatal("Cannot reset database that does not end in _test:", dbURL) + } + + cfg := config{u: *dbURL} + + if err = store.ResetDatabase(ctx, lggr, cfg, *force); err != nil { + lggr.Fatal("Failed to reset database:", err) + } + + if err = store.PrepareTestDB(lggr, *dbURL, *userOnly); err != nil { + lggr.Fatal("Failed to prepare test database:", err) + } +} + +var _ store.Config = config{} + +type config struct{ u url.URL } + +func (c config) DefaultIdleInTxSessionTimeout() time.Duration { return time.Hour } + +func (c config) DefaultLockTimeout() time.Duration { return 15 * time.Second } + +func (c config) MaxOpenConns() int { return 100 } + +func (c config) MaxIdleConns() int { return 10 } + +func (c config) URL() url.URL { return c.u } + +func (c config) DriverName() string { return pg.DriverPostgres } diff --git a/core/store/migrate/migrate.go b/core/store/migrate/migrate.go index c8d4a0e9621..8f49d3a7ab8 100644 --- a/core/store/migrate/migrate.go +++ b/core/store/migrate/migrate.go @@ -16,8 +16,8 @@ import ( "gopkg.in/guregu/null.v4" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" + "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink/v2/core/config/env" - "github.com/smartcontractkit/chainlink/v2/core/services/chainlink" "github.com/smartcontractkit/chainlink/v2/core/services/pg" "github.com/smartcontractkit/chainlink/v2/core/store/migrate/migrations" // Invoke init() functions within migrations pkg. ) @@ -185,9 +185,9 @@ func Create(db *sql.DB, name, migrationType string) error { } // SetMigrationENVVars is used to inject values from config to goose migrations via env. -func SetMigrationENVVars(generalConfig chainlink.GeneralConfig) error { - if generalConfig.EVMEnabled() { - err := os.Setenv(env.EVMChainIDNotNullMigration0195, generalConfig.EVMConfigs()[0].ChainID.String()) +func SetMigrationENVVars(generalConfig toml.EVMConfigs) error { + if generalConfig.Enabled() { + err := os.Setenv(env.EVMChainIDNotNullMigration0195, generalConfig[0].ChainID.String()) if err != nil { panic(pkgerrors.Wrap(err, "failed to set migrations env variables")) } diff --git a/core/store/migrate/migrate_test.go b/core/store/migrate/migrate_test.go index 9540a5b077c..80ff3d45210 100644 --- a/core/store/migrate/migrate_test.go +++ b/core/store/migrate/migrate_test.go @@ -432,7 +432,7 @@ func TestSetMigrationENVVars(t *testing.T) { }} }) - require.NoError(t, migrate.SetMigrationENVVars(testConfig)) + require.NoError(t, migrate.SetMigrationENVVars(testConfig.EVMConfigs())) actualChainID := os.Getenv(env.EVMChainIDNotNullMigration0195) require.Equal(t, actualChainID, chainID.String()) @@ -442,7 +442,7 @@ func TestSetMigrationENVVars(t *testing.T) { chainID := ubig.New(big.NewInt(1337)) testConfig := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) { c.EVM = nil }) - require.NoError(t, migrate.SetMigrationENVVars(testConfig)) + require.NoError(t, migrate.SetMigrationENVVars(testConfig.EVMConfigs())) actualChainID := os.Getenv(env.EVMChainIDNotNullMigration0195) require.Equal(t, actualChainID, chainID.String()) diff --git a/core/store/store.go b/core/store/store.go index 76c74abc23b..cca805c1b59 100644 --- a/core/store/store.go +++ b/core/store/store.go @@ -1,8 +1,314 @@ package store -import _ "embed" +import ( + "context" + crand "crypto/rand" + "database/sql" + _ "embed" + "errors" + "fmt" + "math/big" + "net/url" + "os" + "os/exec" + "path" + "runtime" + "strings" + "sync" + "time" + + "github.com/jmoiron/sqlx" + "github.com/kylelemons/godebug/diff" + "github.com/lib/pq" + "go.uber.org/multierr" + "gopkg.in/guregu/null.v4" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + pgcommon "github.com/smartcontractkit/chainlink-common/pkg/sqlutil/pg" + cutils "github.com/smartcontractkit/chainlink-common/pkg/utils" + ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" + "github.com/smartcontractkit/chainlink/v2/core/services/pg" + "github.com/smartcontractkit/chainlink/v2/core/store/migrate" + "github.com/smartcontractkit/chainlink/v2/internal/testdb" +) //go:embed fixtures/fixtures.sql var fixturesSQL string func FixturesSQL() string { return fixturesSQL } + +func PrepareTestDB(lggr logger.Logger, dbURL url.URL, userOnly bool) error { + db, err := sqlx.Open(pgcommon.DriverPostgres, dbURL.String()) + if err != nil { + return err + } + defer db.Close() + templateDB := strings.Trim(dbURL.Path, "/") + if err = dropAndCreatePristineDB(db, templateDB); err != nil { + return err + } + + fixturePath := "../store/fixtures/fixtures.sql" + if userOnly { + fixturePath = "../store/fixtures/users_only_fixture.sql" + } + if err = insertFixtures(dbURL, fixturePath); err != nil { + return err + } + if err = dropDanglingTestDBs(lggr, db); err != nil { + return err + } + return randomizeTestDBSequences(db) +} + +func ResetDatabase(ctx context.Context, lggr logger.Logger, cfg Config, force bool) error { + u := cfg.URL() + lggr.Infof("Resetting database: %#v", u.String()) + lggr.Debugf("Dropping and recreating database: %#v", u.String()) + if err := dropAndCreateDB(u, force); err != nil { + return err + } + lggr.Debugf("Migrating database: %#v", u.String()) + if err := migrateDB(ctx, cfg); err != nil { + return err + } + schema, err := dumpSchema(u) + if err != nil { + return err + } + lggr.Debugf("Testing rollback and re-migrate for database: %#v", u.String()) + var baseVersionID int64 = 54 + if err := downAndUpDB(ctx, cfg, baseVersionID); err != nil { + return err + } + return checkSchema(u, schema) +} + +type Config interface { + DefaultIdleInTxSessionTimeout() time.Duration + DefaultLockTimeout() time.Duration + MaxOpenConns() int + MaxIdleConns() int + URL() url.URL + DriverName() string +} + +var errDBURLMissing = errors.New("You must set CL_DATABASE_URL env variable or provide a secrets TOML with Database.URL set. HINT: If you are running this to set up your local test database, try CL_DATABASE_URL=postgresql://postgres@localhost:5432/chainlink_test?sslmode=disable") + +func NewConnection(ctx context.Context, cfg Config) (*sqlx.DB, error) { + parsed := cfg.URL() + if parsed.String() == "" { + return nil, errDBURLMissing + } + return pg.NewConnection(ctx, parsed.String(), cfg.DriverName(), cfg) +} + +func migrateDB(ctx context.Context, config Config) error { + db, err := NewConnection(ctx, config) + if err != nil { + return fmt.Errorf("failed to initialize orm: %w", err) + } + + if err = migrate.Migrate(ctx, db.DB); err != nil { + return fmt.Errorf("migrateDB failed: %w", err) + } + return db.Close() +} + +func dropAndCreateDB(parsed url.URL, force bool) (err error) { + // Cannot drop the database if we are connected to it, so we must connect + // to a different one. template1 should be present on all postgres installations + dbname := parsed.Path[1:] + parsed.Path = "/template1" + db, err := sql.Open(pgcommon.DriverPostgres, parsed.String()) + if err != nil { + return fmt.Errorf("unable to open postgres database for creating test db: %w", err) + } + defer func() { + if cerr := db.Close(); cerr != nil { + err = multierr.Append(err, cerr) + } + }() + if force { + // supports pg < 13. https://stackoverflow.com/questions/17449420/postgresql-unable-to-drop-database-because-of-some-auto-connections-to-db + _, err = db.Exec(fmt.Sprintf("SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '%s';", dbname)) + if err != nil { + return fmt.Errorf("unable to terminate connections to postgres database: %w", err) + } + } + _, err = db.Exec(fmt.Sprintf(`DROP DATABASE IF EXISTS "%s"`, dbname)) + if err != nil { + return fmt.Errorf("unable to drop postgres database: %w", err) + } + _, err = db.Exec(fmt.Sprintf(`CREATE DATABASE "%s"`, dbname)) + if err != nil { + return fmt.Errorf("unable to create postgres database: %w", err) + } + return nil +} + +func dropAndCreatePristineDB(db *sqlx.DB, template string) (err error) { + _, err = db.Exec(fmt.Sprintf(`DROP DATABASE IF EXISTS "%s"`, testdb.PristineDBName)) + if err != nil { + return fmt.Errorf("unable to drop postgres database: %w", err) + } + _, err = db.Exec(fmt.Sprintf(`CREATE DATABASE "%s" WITH TEMPLATE "%s"`, testdb.PristineDBName, template)) + if err != nil { + return fmt.Errorf("unable to create postgres database: %w", err) + } + return nil +} + +func downAndUpDB(ctx context.Context, cfg Config, baseVersionID int64) error { + db, err := NewConnection(ctx, cfg) + if err != nil { + return fmt.Errorf("failed to initialize orm: %w", err) + } + if err = migrate.Rollback(ctx, db.DB, null.IntFrom(baseVersionID)); err != nil { + return fmt.Errorf("test rollback failed: %w", err) + } + if err = migrate.Migrate(ctx, db.DB); err != nil { + return fmt.Errorf("second migrateDB failed: %w", err) + } + return db.Close() +} + +func dumpSchema(dbURL url.URL) (string, error) { + args := []string{ + dbURL.String(), + "--schema-only", + } + cmd := exec.Command( + "pg_dump", args..., + ) + + schema, err := cmd.Output() + if err != nil { + var ee *exec.ExitError + if errors.As(err, &ee) { + return "", fmt.Errorf("failed to dump schema: %w\n%s", err, string(ee.Stderr)) + } + return "", fmt.Errorf("failed to dump schema: %w", err) + } + return string(schema), nil +} + +func checkSchema(dbURL url.URL, prevSchema string) error { + newSchema, err := dumpSchema(dbURL) + if err != nil { + return err + } + df := diff.Diff(prevSchema, newSchema) + if len(df) > 0 { + fmt.Println(df) + return errors.New("schema pre- and post- rollback does not match (ctrl+f for '+' or '-' to find the changed lines)") + } + return nil +} +func insertFixtures(dbURL url.URL, pathToFixtures string) (err error) { + db, err := sql.Open(pgcommon.DriverPostgres, dbURL.String()) + if err != nil { + return fmt.Errorf("unable to open postgres database for creating test db: %w", err) + } + defer func() { + if cerr := db.Close(); cerr != nil { + err = multierr.Append(err, cerr) + } + }() + + _, filename, _, ok := runtime.Caller(1) + if !ok { + return errors.New("could not get runtime.Caller(1)") + } + filepath := path.Join(path.Dir(filename), pathToFixtures) + fixturesSQL, err := os.ReadFile(filepath) + if err != nil { + return err + } + _, err = db.Exec(string(fixturesSQL)) + return err +} + +func dropDanglingTestDBs(lggr logger.Logger, db *sqlx.DB) (err error) { + // Drop all old dangling databases + var dbs []string + if err = db.Select(&dbs, `SELECT datname FROM pg_database WHERE datistemplate = false;`); err != nil { + return err + } + + // dropping database is very slow in postgres so we parallelise it here + nWorkers := 25 + ch := make(chan string) + var wg sync.WaitGroup + wg.Add(nWorkers) + errCh := make(chan error, len(dbs)) + for i := 0; i < nWorkers; i++ { + go func() { + defer wg.Done() + for dbname := range ch { + lggr.Infof("Dropping old, dangling test database: %q", dbname) + gerr := cutils.JustError(db.Exec(`DROP DATABASE IF EXISTS ` + dbname)) + errCh <- gerr + } + }() + } + for _, dbname := range dbs { + if strings.HasPrefix(dbname, testdb.TestDBNamePrefix) && !strings.HasSuffix(dbname, "_pristine") { + ch <- dbname + } + } + close(ch) + wg.Wait() + close(errCh) + for gerr := range errCh { + err = multierr.Append(err, gerr) + } + return +} + +type failedToRandomizeTestDBSequencesError struct{} + +func (m *failedToRandomizeTestDBSequencesError) Error() string { + return "failed to randomize test db sequences" +} + +// randomizeTestDBSequences randomizes sequenced table columns sequence +// This is necessary as to avoid false positives in some test cases. +func randomizeTestDBSequences(db *sqlx.DB) error { + // not ideal to hard code this, but also not safe to do it programmatically :( + schemas := pq.Array([]string{"public", "evm"}) + seqRows, err := db.Query(`SELECT sequence_schema, sequence_name, minimum_value FROM information_schema.sequences WHERE sequence_schema IN ($1)`, schemas) + if err != nil { + return fmt.Errorf("%s: error fetching sequences: %w", failedToRandomizeTestDBSequencesError{}, err) + } + + defer seqRows.Close() + for seqRows.Next() { + var sequenceSchema, sequenceName string + var minimumSequenceValue int64 + if err = seqRows.Scan(&sequenceSchema, &sequenceName, &minimumSequenceValue); err != nil { + return fmt.Errorf("%s: failed scanning sequence rows: %w", failedToRandomizeTestDBSequencesError{}, err) + } + + if sequenceName == "goose_migrations_id_seq" || sequenceName == "configurations_id_seq" { + continue + } + + var randNum *big.Int + randNum, err = crand.Int(crand.Reader, ubig.NewI(10000).ToInt()) + if err != nil { + return fmt.Errorf("%s: failed to generate random number", failedToRandomizeTestDBSequencesError{}) + } + randNum.Add(randNum, big.NewInt(minimumSequenceValue)) + + if _, err = db.Exec(fmt.Sprintf("ALTER SEQUENCE %s.%s RESTART WITH %d", sequenceSchema, sequenceName, randNum)); err != nil { + return fmt.Errorf("%s: failed to alter and restart %s sequence: %w", failedToRandomizeTestDBSequencesError{}, sequenceName, err) + } + } + + if err = seqRows.Err(); err != nil { + return fmt.Errorf("%s: failed to iterate through sequences: %w", failedToRandomizeTestDBSequencesError{}, err) + } + + return nil +} diff --git a/deployment/go.mod b/deployment/go.mod index f450e6e5b81..463251f4122 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -34,7 +34,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 @@ -272,6 +272,7 @@ require ( 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 github.com/leanovate/gopter v0.2.11 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/lib/pq v1.10.9 // indirect @@ -286,6 +287,7 @@ require ( 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.16 // indirect + github.com/mfridman/interpolate v0.0.2 // indirect github.com/miekg/dns v1.1.61 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect @@ -323,6 +325,7 @@ require ( github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/pressly/goose/v3 v3.21.1 // indirect github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.60.1 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index 3c68775a2b0..df57356f8a7 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -686,6 +686,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -953,6 +955,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -1033,6 +1037,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= 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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/riferrei/srclient v0.5.4 h1:dfwyR5u23QF7beuVl2WemUY2KXh5+Sc4DHKyPXBNYuc= github.com/riferrei/srclient v0.5.4/go.mod h1:vbkLmWcgYa7JgfPvuy/+K8fTS0p1bApqadxrxi/S1MI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1120,8 +1126,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= @@ -1899,6 +1905,20 @@ k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= +modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.29.6 h1:0lOXGrycJPptfHDuohfYgNqoe4hu+gYuN/pKgY5XjS4= +modernc.org/sqlite v1.29.6/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/go.mod b/go.mod index 10f96d37b72..638ab732587 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( github.com/smartcontractkit/chainlink-feeds v0.1.1 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 diff --git a/go.sum b/go.sum index 6741b1fd333..99563d56e28 100644 --- a/go.sum +++ b/go.sum @@ -1024,8 +1024,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 6473bcbd088..b085bb1f030 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -51,7 +51,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 @@ -352,6 +352,7 @@ require ( 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.16 // indirect + github.com/mfridman/interpolate v0.0.2 // 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 @@ -397,6 +398,7 @@ require ( github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/pressly/goose/v3 v3.21.1 // indirect github.com/prometheus/alertmanager v0.27.0 // indirect github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 65bf14cd417..c226e5b45e5 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -831,6 +831,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -1149,6 +1151,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -1276,6 +1280,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= 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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/riferrei/srclient v0.5.4 h1:dfwyR5u23QF7beuVl2WemUY2KXh5+Sc4DHKyPXBNYuc= github.com/riferrei/srclient v0.5.4/go.mod h1:vbkLmWcgYa7JgfPvuy/+K8fTS0p1bApqadxrxi/S1MI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1374,8 +1380,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= @@ -2220,6 +2226,20 @@ k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= +modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.29.6 h1:0lOXGrycJPptfHDuohfYgNqoe4hu+gYuN/pKgY5XjS4= +modernc.org/sqlite v1.29.6/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 7b155c6bce9..39b31b37dc3 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -30,7 +30,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 @@ -332,6 +332,7 @@ require ( 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.16 // indirect + github.com/mfridman/interpolate v0.0.2 // 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 @@ -378,6 +379,7 @@ require ( github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/pressly/goose/v3 v3.21.1 // indirect github.com/prometheus/alertmanager v0.27.0 // indirect github.com/prometheus/client_golang v1.20.5 // indirect github.com/prometheus/client_model v0.6.1 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index e2e677a7afc..7c900c4a6de 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -823,6 +823,8 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.6.0 h1:uL2shRDx7RTrOrTCUZEGP/wJUFiUI8QT6E7z5o8jga4= github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -1131,6 +1133,8 @@ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= +github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= @@ -1258,6 +1262,8 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= 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/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/riferrei/srclient v0.5.4 h1:dfwyR5u23QF7beuVl2WemUY2KXh5+Sc4DHKyPXBNYuc= github.com/riferrei/srclient v0.5.4/go.mod h1:vbkLmWcgYa7JgfPvuy/+K8fTS0p1bApqadxrxi/S1MI= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -1357,8 +1363,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4 h1:CKZiyp/5U9Y+PCBknwy1KmiqZwn6T3coJXGSHmEDgRc= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211163724-89a32c016ce4/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= @@ -2199,6 +2205,20 @@ k8s.io/kubectl v0.31.2 h1:gTxbvRkMBwvTSAlobiTVqsH6S8Aa1aGyBcu5xYLsn8M= k8s.io/kubectl v0.31.2/go.mod h1:EyASYVU6PY+032RrTh5ahtSOMgoDRIux9V1JLKtG5xM= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI= +modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4= +modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk= +modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/sqlite v1.29.6 h1:0lOXGrycJPptfHDuohfYgNqoe4hu+gYuN/pKgY5XjS4= +modernc.org/sqlite v1.29.6/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index 1c267e3c1e2..99f5af89312 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -19,14 +19,11 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" - ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" - - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" - "github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight" - "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/integration-tests/utils/pgtest" + ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" readermocks "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/contractreader" "github.com/smartcontractkit/chainlink-ccip/pkg/consts" @@ -40,12 +37,12 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" evmchaintypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" evmconfig "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/headtracker" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_reader_tester" @@ -56,6 +53,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm" evmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" + "github.com/smartcontractkit/chainlink/v2/core/utils/testutils/heavyweight" ) const ( @@ -260,7 +258,7 @@ func TestCCIPReader_GetRMNRemoteConfig(t *testing.T) { KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, sb, big.NewInt(1337)) - headTracker := headtracker.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) orm := logpoller.NewORM(big.NewInt(1337), db, lggr) lp := logpoller.NewLogPoller( orm, @@ -384,7 +382,7 @@ func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) { KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, sb, big.NewInt(1337)) - headTracker := headtracker.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) orm := logpoller.NewORM(big.NewInt(1337), db, lggr) lp := logpoller.NewLogPoller( orm, @@ -1577,7 +1575,7 @@ func testSetupRealContracts( for chain, bindings := range toBindContracts { be := env.Env.Chains[uint64(chain)].Client.(*memory.Backend) cl := client.NewSimulatedBackendClient(t, be.Sim, big.NewInt(0).SetUint64(uint64(chain))) - headTracker := headtracker.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp := logpoller.NewLogPoller(logpoller.NewORM(big.NewInt(0).SetUint64(uint64(chain)), db, lggr), cl, lggr, @@ -1663,7 +1661,7 @@ func testSetup( KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, params.SimulatedBackend, big.NewInt(0).SetUint64(uint64(params.ReaderChain))) - headTracker := headtracker.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker := headstest.NewSimulatedHeadTracker(cl, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) orm := logpoller.NewORM(big.NewInt(0).SetUint64(uint64(params.ReaderChain)), db, lggr) lp := logpoller.NewLogPoller( orm, @@ -1705,7 +1703,7 @@ func testSetup( var otherCrs = make(map[cciptypes.ChainSelector]contractreader.Extended) for chain, bindings := range params.ToBindContracts { cl2 := client.NewSimulatedBackendClient(t, params.SimulatedBackend, big.NewInt(0).SetUint64(uint64(chain))) - headTracker2 := headtracker.NewSimulatedHeadTracker(cl2, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) + headTracker2 := headstest.NewSimulatedHeadTracker(cl2, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) lp2 := logpoller.NewLogPoller(logpoller.NewORM(big.NewInt(0).SetUint64(uint64(chain)), db, lggr), cl2, lggr, From 399a3cdfe574e3e1f45fb340312c2e5a4c1599aa Mon Sep 17 00:00:00 2001 From: Cedric Date: Thu, 13 Feb 2025 10:31:14 +0000 Subject: [PATCH 48/83] [chore] Add labels to NopsView (#16358) --- deployment/common/view/nops.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/deployment/common/view/nops.go b/deployment/common/view/nops.go index 43053ec0508..200d8e744a6 100644 --- a/deployment/common/view/nops.go +++ b/deployment/common/view/nops.go @@ -22,6 +22,12 @@ type NopView struct { CSAKey string `json:"csaKey"` IsConnected bool `json:"isConnected"` IsEnabled bool `json:"isEnabled"` + Labels []LabelView `json:"labels"` +} + +type LabelView struct { + Key string `json:"key"` + Value *string `json:"value"` } type OCRKeyView struct { @@ -54,6 +60,13 @@ func GenerateNopsView(nodeIDs []string, oc deployment.OffchainClient) (map[strin if nodeName == "" { nodeName = node.NodeID } + labels := []LabelView{} + for _, l := range nodeDetails.Node.Labels { + labels = append(labels, LabelView{ + Key: l.Key, + Value: l.Value, + }) + } nop := NopView{ NodeID: node.NodeID, PeerID: node.PeerID.String(), @@ -63,6 +76,7 @@ func GenerateNopsView(nodeIDs []string, oc deployment.OffchainClient) (map[strin CSAKey: nodeDetails.Node.PublicKey, IsConnected: nodeDetails.Node.IsConnected, IsEnabled: nodeDetails.Node.IsEnabled, + Labels: labels, } for details, ocrConfig := range node.SelToOCRConfig { nop.OCRKeys[details.ChainName] = OCRKeyView{ From 073eac4da697cc9b50c571760ec92f2e38b2bd0a Mon Sep 17 00:00:00 2001 From: krehermann <16602512+krehermann@users.noreply.github.com> Date: Thu, 13 Feb 2025 04:07:31 -0700 Subject: [PATCH 49/83] chore(cre): refactor startup (#16287) * chore(cre): refactor startup * cleanup --- .changeset/mighty-schools-eat.md | 5 + core/cmd/shell.go | 6 +- core/internal/cltest/cltest.go | 13 +- core/services/chainlink/application.go | 378 +++++++++++++++---------- 4 files changed, 240 insertions(+), 162 deletions(-) create mode 100644 .changeset/mighty-schools-eat.md diff --git a/.changeset/mighty-schools-eat.md b/.changeset/mighty-schools-eat.md new file mode 100644 index 00000000000..f88f1c21433 --- /dev/null +++ b/.changeset/mighty-schools-eat.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal refactor app startup using cre services diff --git a/core/cmd/shell.go b/core/cmd/shell.go index 6f99f885c9e..8061cabc229 100644 --- a/core/cmd/shell.go +++ b/core/cmd/shell.go @@ -305,7 +305,12 @@ func (n ChainlinkAppFactory) NewApplication(ctx context.Context, cfg chainlink.G restrictedClient := clhttp.NewRestrictedHTTPClient(cfg.Database(), appLggr) externalInitiatorManager := webhook.NewExternalInitiatorManager(ds, unrestrictedClient) + creOpts := chainlink.CREOpts{ + CapabilitiesRegistry: capabilitiesRegistry, + } return chainlink.NewApplication(chainlink.ApplicationOpts{ + CREOpts: creOpts, + Config: cfg, DS: ds, KeyStore: keyStore, @@ -323,7 +328,6 @@ func (n ChainlinkAppFactory) NewApplication(ctx context.Context, cfg chainlink.G MercuryPool: mercuryPool, RetirementReportCache: retirementReportCache, LLOTransmissionReaper: lloReaper, - CapabilitiesRegistry: capabilitiesRegistry, }) } diff --git a/core/internal/cltest/cltest.go b/core/internal/cltest/cltest.go index 0ead557ea86..d81306153c4 100644 --- a/core/internal/cltest/cltest.go +++ b/core/internal/cltest/cltest.go @@ -488,7 +488,15 @@ func NewApplicationWithConfig(t testing.TB, cfg chainlink.GeneralConfig, flagsAn if err != nil { t.Fatal(err) } + creOpts := chainlink.CREOpts{ + CapabilitiesRegistry: capabilitiesRegistry, + CapabilitiesDispatcher: dispatcher, + CapabilitiesPeerWrapper: peerWrapper, + FetcherFunc: syncerFetcherFunc, + FetcherFactoryFn: computeFetcherFactory, + } appInstance, err := chainlink.NewApplication(chainlink.ApplicationOpts{ + CREOpts: creOpts, Config: cfg, MailMon: mailMon, DS: ds, @@ -503,12 +511,7 @@ func NewApplicationWithConfig(t testing.TB, cfg chainlink.GeneralConfig, flagsAn SecretGenerator: MockSecretGenerator{}, LoopRegistry: plugins.NewTestLoopRegistry(lggr), MercuryPool: mercuryPool, - CapabilitiesRegistry: capabilitiesRegistry, - CapabilitiesDispatcher: dispatcher, - CapabilitiesPeerWrapper: peerWrapper, NewOracleFactoryFn: newOracleFactoryFn, - FetcherFunc: syncerFetcherFunc, - FetcherFactoryFn: computeFetcherFactory, RetirementReportCache: retirementReportCache, LLOTransmissionReaper: llo.NewTransmissionReaper(ds, lggr, cfg.Mercury().Transmitter().ReaperFrequency().Duration(), cfg.Mercury().Transmitter().ReaperMaxAge().Duration()), }) diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go index b8b2178780b..5136b684483 100644 --- a/core/services/chainlink/application.go +++ b/core/services/chainlink/application.go @@ -176,6 +176,9 @@ type ChainlinkApplication struct { } type ApplicationOpts struct { + // CREOpts is the options for the CRE services + CREOpts + Config GeneralConfig Logger logger.Logger MailMon *mailbox.Monitor @@ -194,12 +197,7 @@ type ApplicationOpts struct { MercuryPool wsrpc.Pool RetirementReportCache llo.RetirementReportCache LLOTransmissionReaper services.ServiceCtx - CapabilitiesRegistry *capabilities.Registry - CapabilitiesDispatcher remotetypes.Dispatcher - CapabilitiesPeerWrapper p2ptypes.PeerWrapper NewOracleFactoryFn standardcapabilities.NewOracleFactoryFn - FetcherFunc syncer.FetcherFunc - FetcherFactoryFn compute.FetcherFactory } type Heartbeat struct { @@ -282,157 +280,19 @@ func NewApplication(opts ApplicationOpts) (Application, error) { opts.CapabilitiesRegistry = capabilities.NewRegistry(globalLogger) } - workflowRateLimiter, err := ratelimiter.NewRateLimiter(ratelimiter.Config{ - GlobalRPS: cfg.Capabilities().RateLimit().GlobalRPS(), - GlobalBurst: cfg.Capabilities().RateLimit().GlobalBurst(), - PerSenderRPS: cfg.Capabilities().RateLimit().PerSenderRPS(), - PerSenderBurst: cfg.Capabilities().RateLimit().PerSenderBurst(), - }) - if err != nil { - return nil, fmt.Errorf("could not instantiate workflow rate limiter: %w", err) - } - - var gatewayConnectorWrapper *gatewayconnector.ServiceWrapper - if cfg.Capabilities().GatewayConnector().DonID() != "" { - globalLogger.Debugw("Creating GatewayConnector wrapper", "donID", cfg.Capabilities().GatewayConnector().DonID()) - gatewayConnectorWrapper = gatewayconnector.NewGatewayConnectorServiceWrapper( - cfg.Capabilities().GatewayConnector(), - keyStore.Eth(), - clockwork.NewRealClock(), - globalLogger) - srvcs = append(srvcs, gatewayConnectorWrapper) + creCfg := creServiceConfig{ + DS: opts.DS, + CREOpts: opts.CREOpts, + capabilityCfg: cfg.Capabilities(), + logger: globalLogger, + relayerChainInterops: relayerChainInterops, + keystore: keyStore, } - - var externalPeerWrapper p2ptypes.PeerWrapper - if cfg.Capabilities().Peering().Enabled() { - var dispatcher remotetypes.Dispatcher - if opts.CapabilitiesDispatcher == nil { - externalPeer := externalp2p.NewExternalPeerWrapper(keyStore.P2P(), cfg.Capabilities().Peering(), opts.DS, globalLogger) - signer := externalPeer - externalPeerWrapper = externalPeer - remoteDispatcher, err := remote.NewDispatcher(cfg.Capabilities().Dispatcher(), externalPeerWrapper, signer, opts.CapabilitiesRegistry, globalLogger) - if err != nil { - return nil, fmt.Errorf("could not create dispatcher: %w", err) - } - dispatcher = remoteDispatcher - } else { - dispatcher = opts.CapabilitiesDispatcher - externalPeerWrapper = opts.CapabilitiesPeerWrapper - } - - srvcs = append(srvcs, externalPeerWrapper, dispatcher) - - if cfg.Capabilities().ExternalRegistry().Address() != "" { - rid := cfg.Capabilities().ExternalRegistry().RelayID() - registryAddress := cfg.Capabilities().ExternalRegistry().Address() - relayer, err := relayerChainInterops.Get(rid) - if err != nil { - return nil, fmt.Errorf("could not fetch relayer %s configured for capabilities registry: %w", rid, err) - } - registrySyncer, err := registrysyncer.New( - globalLogger, - func() (p2ptypes.PeerID, error) { - p := externalPeerWrapper.GetPeer() - if p == nil { - return p2ptypes.PeerID{}, errors.New("could not get peer") - } - - return p.ID(), nil - }, - relayer, - registryAddress, - registrysyncer.NewORM(opts.DS, globalLogger), - ) - if err != nil { - return nil, fmt.Errorf("could not configure syncer: %w", err) - } - - workflowDonNotifier := capabilities.NewDonNotifier() - - wfLauncher := capabilities.NewLauncher( - globalLogger, - externalPeerWrapper, - dispatcher, - opts.CapabilitiesRegistry, - workflowDonNotifier, - ) - registrySyncer.AddLauncher(wfLauncher) - - srvcs = append(srvcs, wfLauncher, registrySyncer) - - if cfg.Capabilities().WorkflowRegistry().Address() != "" { - lggr := globalLogger.Named("WorkflowRegistrySyncer") - var fetcherFunc syncer.FetcherFunc - if opts.FetcherFunc == nil { - if gatewayConnectorWrapper == nil { - return nil, errors.New("unable to create workflow registry syncer without gateway connector") - } - fetcher := syncer.NewFetcherService(lggr, gatewayConnectorWrapper) - fetcherFunc = fetcher.Fetch - srvcs = append(srvcs, fetcher) - } else { - fetcherFunc = opts.FetcherFunc - } - - err = keyStore.Workflow().EnsureKey(context.Background()) - if err != nil { - return nil, fmt.Errorf("failed to ensure workflow key: %w", err) - } - - keys, err := keyStore.Workflow().GetAll() - if err != nil { - return nil, fmt.Errorf("failed to get all workflow keys: %w", err) - } - if len(keys) != 1 { - return nil, fmt.Errorf("expected 1 key, got %d", len(keys)) - } - - eventHandler := syncer.NewEventHandler( - lggr, - syncer.NewWorkflowRegistryDS(opts.DS, globalLogger), - fetcherFunc, - workflowstore.NewDBStore(opts.DS, lggr, clockwork.NewRealClock()), - opts.CapabilitiesRegistry, - custmsg.NewLabeler(), - clockwork.NewRealClock(), - keys[0], - workflowRateLimiter, - syncer.WithMaxArtifactSize( - syncer.ArtifactConfig{ - MaxBinarySize: uint64(cfg.Capabilities().WorkflowRegistry().MaxBinarySize()), - MaxSecretsSize: uint64(cfg.Capabilities().WorkflowRegistry().MaxEncryptedSecretsSize()), - MaxConfigSize: uint64(cfg.Capabilities().WorkflowRegistry().MaxConfigSize()), - }, - ), - ) - - globalLogger.Debugw("Creating WorkflowRegistrySyncer") - wfRegRid := cfg.Capabilities().WorkflowRegistry().RelayID() - wfRegRelayer, err := relayerChainInterops.Get(wfRegRid) - if err != nil { - return nil, fmt.Errorf("could not fetch relayer %s configured for workflow registry: %w", rid, err) - } - wfSyncer := syncer.NewWorkflowRegistry( - lggr, - func(ctx context.Context, bytes []byte) (syncer.ContractReader, error) { - return wfRegRelayer.NewContractReader(ctx, bytes) - }, - cfg.Capabilities().WorkflowRegistry().Address(), - syncer.WorkflowEventPollerConfig{ - QueryCount: 100, - }, - eventHandler, - workflowDonNotifier, - ) - - srvcs = append(srvcs, wfSyncer) - } - } - } else { - globalLogger.Debug("External registry not configured, skipping registry syncer and starting with an empty registry") - opts.CapabilitiesRegistry.SetLocalRegistry(&capabilities.TestMetadataRegistry{}) + creServices, err := newCREServices(creCfg) + if err != nil { + return nil, fmt.Errorf("failed to initilize CRE: %w", err) } - + srvcs = append(srvcs, creServices.srvs...) // LOOPs can be created as options, in the case of LOOP relayers, or // as OCR2 job implementations, in the case of Median today. // We will have a non-nil registry here in LOOP relayers are being used, otherwise @@ -627,7 +487,7 @@ func NewApplication(opts ApplicationOpts) (Application, error) { globalLogger, opts.CapabilitiesRegistry, workflowORM, - workflowRateLimiter, + creServices.workflowRateLimiter, ) // Flux monitor requires ethereum just to boot, silence errors with a null delegate @@ -668,7 +528,7 @@ func NewApplication(opts ApplicationOpts) (Application, error) { telemetryManager, pipelineRunner, opts.RelayerChainInteroperators, - gatewayConnectorWrapper, + creServices.gatewayConnectorWrapper, keyStore, peerWrapper, opts.NewOracleFactoryFn, @@ -825,6 +685,212 @@ func NewApplication(opts ApplicationOpts) (Application, error) { }, nil } +// creKeystore is the minimal interface needed from keystore for CRE +type creKeystore interface { + Eth() keystore.Eth + P2P() keystore.P2P + Workflow() keystore.Workflow +} + +// CREOpts are the options for the CRE services that are exposed by the application +type CREOpts struct { + CapabilitiesRegistry *capabilities.Registry + CapabilitiesDispatcher remotetypes.Dispatcher + CapabilitiesPeerWrapper p2ptypes.PeerWrapper + + FetcherFunc syncer.FetcherFunc + FetcherFactoryFn compute.FetcherFactory +} + +// creServiceConfig contains the configuration required to create the CRE services +type creServiceConfig struct { + CREOpts + + capabilityCfg config.Capabilities + keystore creKeystore + logger logger.Logger + relayerChainInterops *CoreRelayerChainInteroperators + DS sqlutil.DataSource +} + +type CREServices struct { + // workflowRateLimiter is the rate limiter for workflows + // it is exposed because there are contingent services in the application + workflowRateLimiter *ratelimiter.RateLimiter + // gatewayConnectorWrapper is the wrapper for the gateway connector + // it is exposed because there are contingent services in the application + gatewayConnectorWrapper *gatewayconnector.ServiceWrapper + // srvs are all the services that are created, including those that are explicitly exposed + srvs []services.ServiceCtx +} + +func newCREServices(cscfg creServiceConfig) (*CREServices, error) { + var ( + capCfg = cscfg.capabilityCfg + globalLogger = cscfg.logger + keyStore = cscfg.keystore + relayerChainInterops = cscfg.relayerChainInterops + opts = cscfg.CREOpts + ds = cscfg.DS + ) + var srvcs []services.ServiceCtx + workflowRateLimiter, err := ratelimiter.NewRateLimiter(ratelimiter.Config{ + GlobalRPS: capCfg.RateLimit().GlobalRPS(), + GlobalBurst: capCfg.RateLimit().GlobalBurst(), + PerSenderRPS: capCfg.RateLimit().PerSenderRPS(), + PerSenderBurst: capCfg.RateLimit().PerSenderBurst(), + }) + if err != nil { + return nil, fmt.Errorf("could not instantiate workflow rate limiter: %w", err) + } + + var gatewayConnectorWrapper *gatewayconnector.ServiceWrapper + if capCfg.GatewayConnector().DonID() != "" { + globalLogger.Debugw("Creating GatewayConnector wrapper", "donID", capCfg.GatewayConnector().DonID()) + gatewayConnectorWrapper = gatewayconnector.NewGatewayConnectorServiceWrapper( + capCfg.GatewayConnector(), + keyStore.Eth(), + clockwork.NewRealClock(), + globalLogger) + srvcs = append(srvcs, gatewayConnectorWrapper) + } + + var externalPeerWrapper p2ptypes.PeerWrapper + if capCfg.Peering().Enabled() { + var dispatcher remotetypes.Dispatcher + if opts.CapabilitiesDispatcher == nil { + externalPeer := externalp2p.NewExternalPeerWrapper(keyStore.P2P(), capCfg.Peering(), ds, globalLogger) + signer := externalPeer + externalPeerWrapper = externalPeer + remoteDispatcher, err := remote.NewDispatcher(capCfg.Dispatcher(), externalPeerWrapper, signer, opts.CapabilitiesRegistry, globalLogger) + if err != nil { + return nil, fmt.Errorf("could not create dispatcher: %w", err) + } + dispatcher = remoteDispatcher + } else { + dispatcher = opts.CapabilitiesDispatcher + externalPeerWrapper = opts.CapabilitiesPeerWrapper + } + + srvcs = append(srvcs, externalPeerWrapper, dispatcher) + + if capCfg.ExternalRegistry().Address() != "" { + rid := capCfg.ExternalRegistry().RelayID() + registryAddress := capCfg.ExternalRegistry().Address() + relayer, err := relayerChainInterops.Get(rid) + if err != nil { + return nil, fmt.Errorf("could not fetch relayer %s configured for capabilities registry: %w", rid, err) + } + registrySyncer, err := registrysyncer.New( + globalLogger, + func() (p2ptypes.PeerID, error) { + p := externalPeerWrapper.GetPeer() + if p == nil { + return p2ptypes.PeerID{}, errors.New("could not get peer") + } + + return p.ID(), nil + }, + relayer, + registryAddress, + registrysyncer.NewORM(ds, globalLogger), + ) + if err != nil { + return nil, fmt.Errorf("could not configure syncer: %w", err) + } + + workflowDonNotifier := capabilities.NewDonNotifier() + + wfLauncher := capabilities.NewLauncher( + globalLogger, + externalPeerWrapper, + dispatcher, + opts.CapabilitiesRegistry, + workflowDonNotifier, + ) + registrySyncer.AddLauncher(wfLauncher) + + srvcs = append(srvcs, wfLauncher, registrySyncer) + + if capCfg.WorkflowRegistry().Address() != "" { + lggr := globalLogger.Named("WorkflowRegistrySyncer") + var fetcherFunc syncer.FetcherFunc + if opts.FetcherFunc == nil { + if gatewayConnectorWrapper == nil { + return nil, errors.New("unable to create workflow registry syncer without gateway connector") + } + fetcher := syncer.NewFetcherService(lggr, gatewayConnectorWrapper) + fetcherFunc = fetcher.Fetch + srvcs = append(srvcs, fetcher) + } else { + fetcherFunc = opts.FetcherFunc + } + + err = keyStore.Workflow().EnsureKey(context.Background()) + if err != nil { + return nil, fmt.Errorf("failed to ensure workflow key: %w", err) + } + + keys, err := keyStore.Workflow().GetAll() + if err != nil { + return nil, fmt.Errorf("failed to get all workflow keys: %w", err) + } + if len(keys) != 1 { + return nil, fmt.Errorf("expected 1 key, got %d", len(keys)) + } + + eventHandler := syncer.NewEventHandler( + lggr, + syncer.NewWorkflowRegistryDS(ds, globalLogger), + fetcherFunc, + workflowstore.NewDBStore(ds, lggr, clockwork.NewRealClock()), + opts.CapabilitiesRegistry, + custmsg.NewLabeler(), + clockwork.NewRealClock(), + keys[0], + workflowRateLimiter, + syncer.WithMaxArtifactSize( + syncer.ArtifactConfig{ + MaxBinarySize: uint64(capCfg.WorkflowRegistry().MaxBinarySize()), + MaxSecretsSize: uint64(capCfg.WorkflowRegistry().MaxEncryptedSecretsSize()), + MaxConfigSize: uint64(capCfg.WorkflowRegistry().MaxConfigSize()), + }, + ), + ) + + globalLogger.Debugw("Creating WorkflowRegistrySyncer") + wfRegRid := capCfg.WorkflowRegistry().RelayID() + wfRegRelayer, err := relayerChainInterops.Get(wfRegRid) + if err != nil { + return nil, fmt.Errorf("could not fetch relayer %s configured for workflow registry: %w", rid, err) + } + wfSyncer := syncer.NewWorkflowRegistry( + lggr, + func(ctx context.Context, bytes []byte) (syncer.ContractReader, error) { + return wfRegRelayer.NewContractReader(ctx, bytes) + }, + capCfg.WorkflowRegistry().Address(), + syncer.WorkflowEventPollerConfig{ + QueryCount: 100, + }, + eventHandler, + workflowDonNotifier, + ) + + srvcs = append(srvcs, wfSyncer) + } + } + } else { + globalLogger.Debug("External registry not configured, skipping registry syncer and starting with an empty registry") + opts.CapabilitiesRegistry.SetLocalRegistry(&capabilities.TestMetadataRegistry{}) + } + return &CREServices{ + workflowRateLimiter: workflowRateLimiter, + gatewayConnectorWrapper: gatewayConnectorWrapper, + srvs: srvcs, + }, nil +} + func (app *ChainlinkApplication) SetLogLevel(lvl zapcore.Level) error { if err := app.Config.SetLogLevel(lvl); err != nil { return err From 6c219dd8b20bce31ed97d3a34dbdf117aafe027e Mon Sep 17 00:00:00 2001 From: Austin <107539019+0xAustinWang@users.noreply.github.com> Date: Thu, 13 Feb 2025 19:13:57 +0800 Subject: [PATCH 50/83] load testing tweaks (#16379) * small fixes here and there * use event resubscriber to bypass websocket issues * use lggr instead of fmt.println * goimport --- deployment/environment/crib/ccip_deployer.go | 16 ++++---- deployment/environment/crib/helpers.go | 17 +-------- .../load/ccip/destination_gun.go | 2 +- integration-tests/load/ccip/helpers.go | 37 +++++++++---------- integration-tests/load/ccip/metrics.go | 2 +- integration-tests/testconfig/ccip/ccip.toml | 8 ++-- 6 files changed, 32 insertions(+), 50 deletions(-) diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index 399ec8219d4..a30edf80a4b 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -104,7 +104,7 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de // ------ Part 1 ----- // Setup because we only need to deploy the contracts and distribute job specs - fmt.Println("setting up chains...") + lggr.Infow("setting up chains...") *e, err = setupChains(lggr, e, homeChainSel) if err != nil { return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up chain: %w", err) @@ -115,7 +115,7 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de return DeployCCIPOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - fmt.Println("setting up lanes...") + lggr.Infow("setting up lanes...") // Add all lanes *e, err = setupLanes(e, state) if err != nil { @@ -124,7 +124,7 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de // ------ Part 1 ----- // ----- Part 2 ----- - fmt.Println("setting up ocr...") + lggr.Infow("setting up ocr...") *e, err = setupOCR(e, homeChainSel, feedChainSel) if err != nil { return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up OCR: %w", err) @@ -133,7 +133,7 @@ func DeployCCIPAndAddLanes(ctx context.Context, lggr logger.Logger, envConfig de // distribute funds to transmitters // we need to use the nodeinfo from the envConfig here, because multiAddr is not // populated in the environment variable - fmt.Println("distributing funds...") + lggr.Infow("distributing funds...") err = distributeTransmitterFunds(lggr, don.PluginNodes(), *e) if err != nil { return DeployCCIPOutput{}, err @@ -159,7 +159,7 @@ func DeployCCIPChains(ctx context.Context, lggr logger.Logger, envConfig devenv. e.ExistingAddresses = ab // Setup because we only need to deploy the contracts and distribute job specs - fmt.Println("setting up chains...") + lggr.Infow("setting up chains...") *e, err = setupChains(lggr, e, homeChainSel) if err != nil { return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up chain: %w", err) @@ -188,7 +188,7 @@ func ConnectCCIPLanes(ctx context.Context, lggr logger.Logger, envConfig devenv. return DeployCCIPOutput{}, fmt.Errorf("failed to load onchain state: %w", err) } - fmt.Println("setting up lanes...") + lggr.Infow("setting up lanes...") // Add all lanes *e, err = setupLanes(e, state) if err != nil { @@ -214,7 +214,7 @@ func ConfigureCCIPOCR(ctx context.Context, lggr logger.Logger, envConfig devenv. } e.ExistingAddresses = ab - fmt.Println("setting up ocr...") + lggr.Infow("setting up ocr...") *e, err = setupOCR(e, homeChainSel, feedChainSel) if err != nil { return DeployCCIPOutput{}, fmt.Errorf("failed to apply changesets for setting up OCR: %w", err) @@ -242,7 +242,7 @@ func FundCCIPTransmitters(ctx context.Context, lggr logger.Logger, envConfig dev // distribute funds to transmitters // we need to use the nodeinfo from the envConfig here, because multiAddr is not // populated in the environment variable - fmt.Println("distributing funds...") + lggr.Infow("distributing funds...") err = distributeTransmitterFunds(lggr, don.PluginNodes(), *e) if err != nil { return DeployCCIPOutput{}, err diff --git a/deployment/environment/crib/helpers.go b/deployment/environment/crib/helpers.go index 8cd6c6311eb..2b9171c0cbe 100644 --- a/deployment/environment/crib/helpers.go +++ b/deployment/environment/crib/helpers.go @@ -12,7 +12,6 @@ import ( "math/big" "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/conversions" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/environment/devenv" ) @@ -20,7 +19,6 @@ import ( func distributeTransmitterFunds(lggr logger.Logger, nodeInfo []devenv.Node, env deployment.Environment) error { transmittersStr := make([]common.Address, 0) fundingAmount := new(big.Int).Mul(deployment.UBigInt(100), deployment.UBigInt(1e18)) // 100 ETH - minThreshold := new(big.Int).Mul(deployment.UBigInt(5), deployment.UBigInt(1e16)) // 0.05 ETH g := new(errgroup.Group) for sel, chain := range env.Chains { @@ -33,20 +31,7 @@ func distributeTransmitterFunds(lggr logger.Logger, nodeInfo []devenv.Node, env return err } addr := common.HexToAddress(n.AccountAddr[chainID]) - balance, err := chain.Client.BalanceAt(env.GetContext(), addr, nil) - if err != nil { - lggr.Errorw("error fetching balance for %s: %v\n", n.Name, err) - return err - } - if balance.Cmp(minThreshold) < 0 { - lggr.Infow( - "sending funds to", - "node", n.Name, - "address", addr.String(), - "amount", conversions.WeiToEther(fundingAmount).String(), - ) - transmittersStr = append(transmittersStr, addr) - } + transmittersStr = append(transmittersStr, addr) } return SendFundsToAccounts(env.GetContext(), lggr, chain, transmittersStr, fundingAmount, sel) }) diff --git a/integration-tests/load/ccip/destination_gun.go b/integration-tests/load/ccip/destination_gun.go index 851a306d2ac..bbf86ef8fe5 100644 --- a/integration-tests/load/ccip/destination_gun.go +++ b/integration-tests/load/ccip/destination_gun.go @@ -144,7 +144,7 @@ func (m *DestinationGun) Call(_ *wasp.Generator) *wasp.Response { return &wasp.Response{Error: err.Error(), Group: waspGroup, Failed: true} } if msg.FeeToken == common.HexToAddress("0x0") { - acc.Value = big.NewInt(0).Mul(big.NewInt(6), fee) + acc.Value = fee defer func() { acc.Value = nil }() } m.l.Debugw("sending message ", diff --git a/integration-tests/load/ccip/helpers.go b/integration-tests/load/ccip/helpers.go index b2ec7fadc7e..0a217f9e87b 100644 --- a/integration-tests/load/ccip/helpers.go +++ b/integration-tests/load/ccip/helpers.go @@ -9,6 +9,8 @@ import ( "sync" "time" + "github.com/ethereum/go-ethereum/event" + "golang.org/x/sync/errgroup" "github.com/ethereum/go-ethereum/common" @@ -33,11 +35,12 @@ const ( transmitted = iota committed executed - tickerDuration = 30 * time.Second + tickerDuration = 3 * time.Minute + SubscriptionTimeout = 1 * time.Minute ) var ( - fundingAmount = new(big.Int).Mul(deployment.UBigInt(10), deployment.UBigInt(1e18)) // 100 eth + fundingAmount = new(big.Int).Mul(deployment.UBigInt(100), deployment.UBigInt(1e18)) // 100 eth ) // todo: Have a different struct for commit/exec? @@ -81,15 +84,12 @@ func subscribeCommitEvents( } sink := make(chan *offramp.OffRampCommitReportAccepted) - // todo: add event.Resubscriber if we move to unreliable rpcs - subscription, err := offRamp.WatchCommitReportAccepted(&bind.WatchOpts{ - Context: ctx, - Start: startBlock, - }, sink) - if err != nil { - errChan <- err - return - } + subscription := event.Resubscribe(SubscriptionTimeout, func(_ context.Context) (event.Subscription, error) { + return offRamp.WatchCommitReportAccepted(&bind.WatchOpts{ + Context: ctx, + Start: startBlock, + }, sink) + }) defer subscription.Unsubscribe() ticker := time.NewTicker(tickerDuration) defer ticker.Stop() @@ -212,15 +212,12 @@ func subscribeExecutionEvents( } sink := make(chan *offramp.OffRampExecutionStateChanged) - // todo: add event.Resubscriber if we move to unreliable rpcs - subscription, err := offRamp.WatchExecutionStateChanged(&bind.WatchOpts{ - Context: ctx, - Start: startBlock, - }, sink, nil, nil, nil) - if err != nil { - errChan <- err - return - } + subscription := event.Resubscribe(SubscriptionTimeout, func(_ context.Context) (event.Subscription, error) { + return offRamp.WatchExecutionStateChanged(&bind.WatchOpts{ + Context: ctx, + Start: startBlock, + }, sink, nil, nil, nil) + }) defer subscription.Unsubscribe() ticker := time.NewTicker(tickerDuration) defer ticker.Stop() diff --git a/integration-tests/load/ccip/metrics.go b/integration-tests/load/ccip/metrics.go index b913594e92c..8c64747a10e 100644 --- a/integration-tests/load/ccip/metrics.go +++ b/integration-tests/load/ccip/metrics.go @@ -117,7 +117,7 @@ func (mm *MetricManager) Start(ctx context.Context) { } SendMetricsToLoki(mm.lggr, mm.loki, lokiLabels, &LokiMetric{ ExecDuration: state.timestamps[executed] - state.timestamps[committed], - CommitDuration: state.timestamps[committed] - state.timestamps[executed], + CommitDuration: state.timestamps[committed] - state.timestamps[transmitted], SequenceNumber: data.seqNum, }) diff --git a/integration-tests/testconfig/ccip/ccip.toml b/integration-tests/testconfig/ccip/ccip.toml index bf5e64127d4..e8ca343bbab 100644 --- a/integration-tests/testconfig/ccip/ccip.toml +++ b/integration-tests/testconfig/ccip/ccip.toml @@ -244,12 +244,12 @@ ephemeral_addresses_number = 0 [Load.CCIP.Load] # MessageTypeWeights corresponds with [data only, token only, message with token] #MessageTypeWeights = [100,0,0] -MessageTypeWeights = [10,45,45] +MessageTypeWeights = [100,0,0] # each destination chain will receive 1 incoming request per RequestFrequency for the duration of LoadDuration -RequestFrequency = "10s" -LoadDuration = "30s" +RequestFrequency = "5s" +LoadDuration = "1h" # destination chain selectors to send messages to -NumDestinationChains = 2 +NumDestinationChains = 30 # Directory where we receive environment configuration from crib CribEnvDirectory = "../../../../crib/deployments/ccip-v2/.tmp" TimeoutDuration = "1h" \ No newline at end of file From 125f54723339cdaac00b2325c88dfe6f0359b0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Friedemann=20F=C3=BCrst?= <59653747+friedemannf@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:02:26 +0100 Subject: [PATCH 51/83] Deployment - Add Aptos Environment and State (#16352) * Add AptChain to deployments * Update aptos-go-sdk and use interfaces for environment * go mod tidy * Update names * Add changeset --- .changeset/gold-dogs-promise.md | 5 +++++ core/scripts/go.mod | 5 ++++- core/scripts/go.sum | 18 ++++++++++++++++-- deployment/aptos_chain.go | 12 ++++++++++++ deployment/ccip/changeset/aptos_state.go | 6 ++++++ deployment/ccip/changeset/state.go | 5 +++-- deployment/environment.go | 1 + deployment/go.mod | 5 ++++- deployment/go.sum | 18 ++++++++++++++++-- integration-tests/go.mod | 4 +++- integration-tests/go.sum | 16 ++++++++++++++-- integration-tests/load/go.mod | 4 +++- integration-tests/load/go.sum | 16 ++++++++++++++-- 13 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 .changeset/gold-dogs-promise.md create mode 100644 deployment/aptos_chain.go create mode 100644 deployment/ccip/changeset/aptos_state.go diff --git a/.changeset/gold-dogs-promise.md b/.changeset/gold-dogs-promise.md new file mode 100644 index 00000000000..04786b1f5a6 --- /dev/null +++ b/.changeset/gold-dogs-promise.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal Add Aptos environment and state diff --git a/core/scripts/go.mod b/core/scripts/go.mod index e2f5e54dea8..57ee4ff245d 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -71,6 +71,7 @@ require ( github.com/XSAM/otelsql v0.29.0 // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/apache/arrow-go/v18 v18.0.0 // indirect + github.com/aptos-labs/aptos-go-sdk v1.5.0 // indirect github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect github.com/avast/retry-go/v4 v4.6.0 // indirect github.com/aws/aws-sdk-go v1.54.19 // indirect @@ -99,6 +100,7 @@ require ( github.com/cockroachdb/pebble v1.1.2 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/coder/websocket v1.8.12 // indirect github.com/cometbft/cometbft v0.37.5 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/confio/ics23/go v0.9.0 // indirect @@ -211,7 +213,8 @@ require ( github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect - github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/hasura/go-graphql-client v0.13.1 // indirect + github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.1 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 85d9cd2144b..cd8f872bb98 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -110,6 +110,8 @@ github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= github.com/appleboy/gofight/v2 v2.1.2 h1:VOy3jow4vIK8BRQJoC/I9muxyYlJ2yb9ht2hZoS3rf4= github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= +github.com/aptos-labs/aptos-go-sdk v1.5.0 h1:QMdYmeqMb/kc/tuKhLiXq4SpJtLLFIaEDLHx0Peg2iU= +github.com/aptos-labs/aptos-go-sdk v1.5.0/go.mod h1:BgddSKFtfWFLK+no8l+AwCcb/Lh1lv74ybYLzeonloo= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -245,6 +247,8 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= +github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= github.com/cometbft/cometbft v0.37.5 h1:/U/TlgMh4NdnXNo+YU9T2NMCWyhXNDF34Mx582jlvq0= github.com/cometbft/cometbft v0.37.5/go.mod h1:QC+mU0lBhKn8r9qvmnq53Dmf3DWBt4VtkcKw2C81wxY= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= @@ -301,6 +305,12 @@ github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDF github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= 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/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo= +github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= @@ -666,6 +676,8 @@ github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVH github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= @@ -692,8 +704,10 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= +github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= +github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= +github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= diff --git a/deployment/aptos_chain.go b/deployment/aptos_chain.go new file mode 100644 index 00000000000..6b6345ddc72 --- /dev/null +++ b/deployment/aptos_chain.go @@ -0,0 +1,12 @@ +package deployment + +import ( + "github.com/aptos-labs/aptos-go-sdk" +) + +// AptosChain represents an Aptos chain. +type AptosChain struct { + Selector uint64 + Client aptos.AptosRpcClient + DeployerSigner aptos.TransactionSigner +} diff --git a/deployment/ccip/changeset/aptos_state.go b/deployment/ccip/changeset/aptos_state.go new file mode 100644 index 00000000000..37acc0ef34d --- /dev/null +++ b/deployment/ccip/changeset/aptos_state.go @@ -0,0 +1,6 @@ +package changeset + +// AptosCCIPChainState holds a Go binding for all the currently deployed CCIP contracts +// on a chain. If a binding is nil, it means here is no such contract on the chain. +type AptosCCIPChainState struct { +} diff --git a/deployment/ccip/changeset/state.go b/deployment/ccip/changeset/state.go index 8af120a2201..a38949c320a 100644 --- a/deployment/ccip/changeset/state.go +++ b/deployment/ccip/changeset/state.go @@ -378,8 +378,9 @@ type CCIPOnChainState struct { // Populated go bindings for the appropriate version for all contracts. // We would hold 2 versions of each contract here. Once we upgrade we can phase out the old one. // When generating bindings, make sure the package name corresponds to the version. - Chains map[uint64]CCIPChainState - SolChains map[uint64]SolCCIPChainState + Chains map[uint64]CCIPChainState + SolChains map[uint64]SolCCIPChainState + AptosChains map[uint64]AptosCCIPChainState } func (s CCIPOnChainState) Validate() error { diff --git a/deployment/environment.go b/deployment/environment.go index 2ef75c6154a..33a197c40f2 100644 --- a/deployment/environment.go +++ b/deployment/environment.go @@ -101,6 +101,7 @@ type Environment struct { ExistingAddresses AddressBook Chains map[uint64]Chain SolChains map[uint64]SolChain + AptosChains map[uint64]AptosChain NodeIDs []string Offchain OffchainClient GetContext func() context.Context diff --git a/deployment/go.mod b/deployment/go.mod index 463251f4122..f576460d69b 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -14,6 +14,7 @@ require github.com/smartcontractkit/chainlink/v2 v2.0.0-20250128231431-9279badae require ( github.com/Khan/genqlient v0.7.0 github.com/Masterminds/semver/v3 v3.3.0 + github.com/aptos-labs/aptos-go-sdk v1.5.0 github.com/avast/retry-go/v4 v4.6.0 github.com/aws/aws-sdk-go v1.54.19 github.com/deckarep/golang-set/v2 v2.6.0 @@ -126,6 +127,7 @@ require ( github.com/cockroachdb/pebble v1.1.2 // indirect github.com/cockroachdb/redact v1.1.5 // indirect github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect + github.com/coder/websocket v1.8.12 // indirect github.com/cometbft/cometbft v0.37.5 // indirect github.com/cometbft/cometbft-db v0.8.0 // indirect github.com/confio/ics23/go v0.9.0 // indirect @@ -240,7 +242,8 @@ require ( github.com/hashicorp/golang-lru v0.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect - github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/hasura/go-graphql-client v0.13.1 // indirect + github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.1 // indirect diff --git a/deployment/go.sum b/deployment/go.sum index df57356f8a7..7a279456735 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -115,6 +115,8 @@ github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A= github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aptos-labs/aptos-go-sdk v1.5.0 h1:QMdYmeqMb/kc/tuKhLiXq4SpJtLLFIaEDLHx0Peg2iU= +github.com/aptos-labs/aptos-go-sdk v1.5.0/go.mod h1:BgddSKFtfWFLK+no8l+AwCcb/Lh1lv74ybYLzeonloo= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -260,6 +262,8 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= +github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= github.com/cometbft/cometbft v0.37.5 h1:/U/TlgMh4NdnXNo+YU9T2NMCWyhXNDF34Mx582jlvq0= github.com/cometbft/cometbft v0.37.5/go.mod h1:QC+mU0lBhKn8r9qvmnq53Dmf3DWBt4VtkcKw2C81wxY= github.com/cometbft/cometbft-db v0.8.0 h1:vUMDaH3ApkX8m0KZvOFFy9b5DZHBAjsnEuo9AKVZpjo= @@ -316,6 +320,12 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo= +github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= @@ -670,6 +680,8 @@ github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVH github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-plugin v1.6.2 h1:zdGAEd0V1lCaU0u+MxWQhtSDQmahpkwOun8U8EiRVog= @@ -696,8 +708,10 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= +github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= +github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= +github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index b085bb1f030..d9a69bef75a 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -105,6 +105,7 @@ require ( github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/apache/arrow-go/v18 v18.0.0 // indirect + github.com/aptos-labs/aptos-go-sdk v1.5.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect @@ -305,7 +306,8 @@ require ( github.com/hashicorp/memberlist v0.5.0 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect - github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/hasura/go-graphql-client v0.13.1 // indirect + github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.1 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index c226e5b45e5..397b7a073b4 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -146,6 +146,8 @@ github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A= github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aptos-labs/aptos-go-sdk v1.5.0 h1:QMdYmeqMb/kc/tuKhLiXq4SpJtLLFIaEDLHx0Peg2iU= +github.com/aptos-labs/aptos-go-sdk v1.5.0/go.mod h1:BgddSKFtfWFLK+no8l+AwCcb/Lh1lv74ybYLzeonloo= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -380,6 +382,12 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo= +github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= @@ -801,6 +809,8 @@ github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVH github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -848,8 +858,10 @@ github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= +github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= +github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= +github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/henvic/httpretty v0.0.6 h1:JdzGzKZBajBfnvlMALXXMVQWxWMF/ofTy8C3/OSUTxs= github.com/henvic/httpretty v0.0.6/go.mod h1:X38wLjWXHkXT7r2+uK8LjCMne9rsuNaBLJ+5cU2/Pmo= github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 39b31b37dc3..96da427e9c6 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -73,6 +73,7 @@ require ( github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/apache/arrow-go/v18 v18.0.0 // indirect + github.com/aptos-labs/aptos-go-sdk v1.5.0 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/atombender/go-jsonschema v0.16.1-0.20240916205339-a74cd4e2851c // indirect @@ -283,7 +284,8 @@ require ( github.com/hashicorp/memberlist v0.5.0 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect - github.com/hdevalence/ed25519consensus v0.1.0 // indirect + github.com/hasura/go-graphql-client v0.13.1 // indirect + github.com/hdevalence/ed25519consensus v0.2.0 // indirect github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.3.1 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 7c900c4a6de..46af0260b06 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -150,6 +150,8 @@ github.com/apache/arrow-go/v18 v18.0.0 h1:1dBDaSbH3LtulTyOVYaBCHO3yVRwjV+TZaqn3g github.com/apache/arrow-go/v18 v18.0.0/go.mod h1:t6+cWRSmKgdQ6HsxisQjok+jBpKGhRDiqcf3p0p/F+A= github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE= github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw= +github.com/aptos-labs/aptos-go-sdk v1.5.0 h1:QMdYmeqMb/kc/tuKhLiXq4SpJtLLFIaEDLHx0Peg2iU= +github.com/aptos-labs/aptos-go-sdk v1.5.0/go.mod h1:BgddSKFtfWFLK+no8l+AwCcb/Lh1lv74ybYLzeonloo= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -370,6 +372,12 @@ github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7Do github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.15.0 h1:51AL8lBXF3f0cyA5CV4TnJFCTHpgiy+1x1Hb3TtZUmo= +github.com/cucumber/godog v0.15.0/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/danielkov/gin-helmet v0.0.0-20171108135313-1387e224435e h1:5jVSh2l/ho6ajWhSPNN84eHEdq3dp0T7+f6r3Tc6hsk= @@ -793,6 +801,8 @@ github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVH github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -840,8 +850,10 @@ github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU= -github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= +github.com/hasura/go-graphql-client v0.13.1 h1:kKbjhxhpwz58usVl+Xvgah/TDha5K2akNTRQdsEHN6U= +github.com/hasura/go-graphql-client v0.13.1/go.mod h1:k7FF7h53C+hSNFRG3++DdVZWIuHdCaTbI7siTJ//zGQ= +github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N3iBb1Tb4rdcU= +github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo= github.com/hetznercloud/hcloud-go/v2 v2.10.2 h1:9gyTUPhfNbfbS40Spgij5mV5k37bOZgt8iHKCbfGs5I= github.com/hetznercloud/hcloud-go/v2 v2.10.2/go.mod h1:xQ+8KhIS62W0D78Dpi57jsufWh844gUw1az5OUvaeq8= github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= From aeb468e1f9d4cccd7a73c474b0515700613d9bc4 Mon Sep 17 00:00:00 2001 From: Bartek Tofel Date: Thu, 13 Feb 2025 14:37:54 +0100 Subject: [PATCH 52/83] [TT-1977] multi don in smoke keystone test (#16263) * WIP, almost working... last step fails, when forwarder calls DF cache * working version * use newer PoR workflow * now its broken again * Update gethwrappers * go back to previous config, where all steps were correcty configured * use older config * fix port * use debug consumer contract * WORKING VERSION * remove mock streams capability * passes with workflow registry deployed with c/d * passes with keystone consumer deployed with c/d * passes with keystone forwarder deployed with c/d * remove some deps * allow to use chainlink-cli * restore old KeystoneFeedsConsumer.sol contract * try to run the test in CI * fix integration workflow * move the function * use existing env vars to get the image, use e2e tests workflow version that sets GH_TOKEN as env var available to tests * add missing PRIVATE_KEY env var * pass optional roles for GATI to be able to read from repositories * add some comments, update e2e workflow commit * add comments * fix integration tests workflow file * newer workflow version * update token name and workflow version * do not use chainlink CLI in the CI for now (we need a token that can access it) * fix env var name in CI * fix capability reference * clean up the workflow test * move capability test to smoke subfolder * restore old versions of feeds consumer wrapper * rename GITHUB_TOKEN env var to GITHUB_API_TOKEN * try one more approach to resolving placeholder env var * adjust env file to new location * revert testing-related changes to integration tests workflow * fix lints * use function from chainlink-common to generate workflow id, define new constants for binary file names * add JD * use C/D to setup all contracts * add extra debug information * fix lint * poll config every 500ms * change polling interval to 1s * fix config polling intervnal * use only chainlink/deployments when interacting with contract * JD is failing to create jobs due to a bug and authorization issue * do not use JD to setup jobs * CR changes * adjust to latest changes, move some configs to TOML * CR changes * move comments around * add test modification guideline and better debugging * fix config validations * fix lints * use fixed JD version in the CI * remove workflow registration artifact file * restore older environment file * get p2p ide from node labels, more comments, use contractset * fix lints and remove superfluous methods * dynamic transmission schedule * try out chainlink-cli in the CI * use configurable workflow_id also when registering the workflow * support configurable capabilities/chainlink-cli versions * remove unused struct * fix TOML * make chainlink-cli os/arch aware and extract it to the current folder * run chainlink-cli from current directory * use absolute path when running chainlink-cli * fix if condition * add ocr3 config accidentally deleted when resolving merge conflicts * add info about JD image to guidelines * code review changes + renaming of chainlink-cli to CRE CLI + configuration simplification * try 2 dons * works, but only write is remote, not any other capability * added code that allows to create 1-2 dons easily * add bit more logging, do not add capabilities don to p2p mesh * working 2 don version * support don type & capabilities in TOML config * streamline code further * always intialise peering * use same transmission schedule regardless of DON number * fix go.mods + changeset * fix lint and ci config * add nodeset flags validations * update config for CI test * typos, better comments, clean imports, cleaner clean up function and failure debugging working with multiple DONs * update PoR test documentation * CR#1: 1 environment to rule them all * use string flags * extract worker node config to separate function * update guidelines.md * fix lints --------- Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com> --- .changeset/shiny-phones-battle.md | 5 + .../executable/request/server_request.go | 2 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- .../smoke/capabilities/environment-ci.toml | 42 +- .../capabilities/environment-multi-don.toml | 243 +++ .../smoke/capabilities/environment.toml | 41 +- .../smoke/capabilities/guidelines.md | 307 +++- .../smoke/capabilities/workflow_test.go | 1414 +++++++++++------ 11 files changed, 1492 insertions(+), 574 deletions(-) create mode 100644 .changeset/shiny-phones-battle.md create mode 100644 integration-tests/smoke/capabilities/environment-multi-don.toml diff --git a/.changeset/shiny-phones-battle.md b/.changeset/shiny-phones-battle.md new file mode 100644 index 00000000000..8562ae02a3e --- /dev/null +++ b/.changeset/shiny-phones-battle.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#changed enhanced logging for capabilities' server requests diff --git a/core/capabilities/remote/executable/request/server_request.go b/core/capabilities/remote/executable/request/server_request.go index a4f58194328..af17d537ecc 100644 --- a/core/capabilities/remote/executable/request/server_request.go +++ b/core/capabilities/remote/executable/request/server_request.go @@ -89,7 +89,7 @@ func (e *ServerRequest) OnMessage(ctx context.Context, msg *types.MessageBody) e return fmt.Errorf("failed to add requester to request: %w", err) } - e.lggr.Debugw("OnMessage called for request", "msgId", msg.MessageId, "calls", len(e.requesters), "hasResponse", e.response != nil) + e.lggr.Debugw("OnMessage called for request", "msgId", msg.MessageId, "calls", len(e.requesters), "hasResponse", e.response != nil, "requester", requester.String(), "minRequsters", e.callingDon.F+1) if e.minimumRequiredRequestsReceived() && !e.hasResponse() { switch e.method { case types.MethodExecute: diff --git a/integration-tests/go.mod b/integration-tests/go.mod index d9a69bef75a..cb4676f07da 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -53,7 +53,7 @@ require ( github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 - github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 397b7a073b4..35da0731f61 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1404,8 +1404,8 @@ github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32 github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 h1:ywpcisqGbSqW2t+BwiBNLFlIuEHBFeJfXRmaB/2/wYI= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= 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.51.0 h1:z7t2OhfE32KK4r5Nt3U0hOnbRwOwIbJs8i7kqKvjAA0= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 96da427e9c6..4735ec2e1a8 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -424,7 +424,7 @@ require ( github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 // indirect - github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 // indirect + github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 // indirect github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 46af0260b06..c13fd165411 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1387,8 +1387,8 @@ github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32 github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= -github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 h1:ywpcisqGbSqW2t+BwiBNLFlIuEHBFeJfXRmaB/2/wYI= +github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= 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.51.0 h1:z7t2OhfE32KK4r5Nt3U0hOnbRwOwIbJs8i7kqKvjAA0= diff --git a/integration-tests/smoke/capabilities/environment-ci.toml b/integration-tests/smoke/capabilities/environment-ci.toml index 3c9d3c89f97..67501f60eb7 100644 --- a/integration-tests/smoke/capabilities/environment-ci.toml +++ b/integration-tests/smoke/capabilities/environment-ci.toml @@ -18,11 +18,11 @@ prices = [182.9] [workflow_config] - don_id = 1 workflow_name = "abcdefgasd" use_cre_cli = true should_compile_new_workflow = false + workflow_folder_location = "not-needed-here" [workflow_config.dependencies] capabilities_version = "v1.0.0-alpha" @@ -34,16 +34,20 @@ # since that's the OS of our CI runners. config_url = "https://gist.githubusercontent.com/Tofel/49308be74a7cc95bb50e4ab4f35fb49a/raw/aa893cc3412d66df214e1ad0af3d8b3533f796c2/config.json3083467369" -[nodeset] +[[nodesets]] nodes = 5 override_mode = "each" + http_port_range_start = 10100 + name = "workflow" -[nodeset.db] - image = "postgres:15.6" + [nodesets.db] + image = "postgres:12.0" + port = 13000 + volume_name = "workflow_volume" - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] + [nodesets.node_specs.node] image = "replace-me" user_config_overrides = """ [Feature] @@ -58,11 +62,11 @@ ListenAddresses = ['0.0.0.0:5001'] """ - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] - capabilities = ["./amd64_cron"] + [nodesets.node_specs.node] image = "replace-me" + capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] LogPoller = true @@ -76,11 +80,11 @@ ListenAddresses = ['0.0.0.0:5001'] """ - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] - capabilities = ["./amd64_cron"] + [nodesets.node_specs.node] image = "replace-me" + capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] LogPoller = true @@ -94,11 +98,11 @@ ListenAddresses = ['0.0.0.0:5001'] """ - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] - capabilities = ["./amd64_cron"] + [nodesets.node_specs.node] image = "replace-me" + capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] LogPoller = true @@ -112,11 +116,11 @@ ListenAddresses = ['0.0.0.0:5001'] """ - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] + [nodesets.node_specs.node] + image = "replace-me" capabilities = ["./amd64_cron"] - image = "replace-me0" user_config_overrides = """ [Feature] LogPoller = true @@ -128,4 +132,4 @@ [P2P.V2] Enabled = true ListenAddresses = ['0.0.0.0:5001'] - """ + """ \ No newline at end of file diff --git a/integration-tests/smoke/capabilities/environment-multi-don.toml b/integration-tests/smoke/capabilities/environment-multi-don.toml new file mode 100644 index 00000000000..9aa2d3f2c22 --- /dev/null +++ b/integration-tests/smoke/capabilities/environment-multi-don.toml @@ -0,0 +1,243 @@ + +[blockchain_a] + type = "anvil" + docker_cmd_params = ["-b", "5"] + +[jd] + # change to your version + image = "jd-test-1:latest" + +[price_provider] + # without 0x prefix! + feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" + # used only if [data_source_config.fake] is not present + # url = "api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD" + + [price_provider.fake] + port = 8171 + prices = [182.9, 162.71, 172.02] + +[workflow_config] + workflow_name = "abcdefgasd" + + use_cre_cli = true + should_compile_new_workflow = true + workflow_folder_location = "/Users/bartektofel/Downloads/workflow_test" + + [workflow_config.dependencies] + capabilities_version = "v1.0.0-alpha" + cre_cli_version = "v0.0.2" + + [workflow_config.compiled_config] + binary_url = "https://gist.githubusercontent.com/Tofel/b6e7afd05de86ba0444d85894f58857b/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" + config_url = "https://gist.githubusercontent.com/Tofel/cdd80b48ef6c6faf44c10a6673043a4a/raw/871c0b69c032edb4c1371fe896c10b973a93eb06/config.json1025406406" + +[[nodesets]] + capabilities = ["cron", "custom-compute", "ocr3"] + don_type = "workflow" + nodes = 5 + override_mode = "each" + http_port_range_start = 10100 + name = "workflow" + + [nodesets.db] + image = "postgres:12.0" + port = 13000 + volume_name = "workflow_volume" + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + capabilities = ["./amd64_cron"] + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + capabilities = ["./amd64_cron"] + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + capabilities = ["./amd64_cron"] + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + capabilities = ["./amd64_cron"] + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + +[[nodesets]] + don_type = "capabilities" + capabilities = ["write-evm"] + nodes = 5 + override_mode = "each" + http_port_range_start = 10200 + name = "capabilities" + + [nodesets.db] + image = "postgres:12.0" + port = 13100 + volume_name = "capabilities_volume" + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + docker_ctx = "../../.." + docker_file = "plugins/chainlink.Dockerfile" + user_config_overrides = """ + [Feature] + LogPoller = true + + [OCR2] + Enabled = true + DatabaseTimeout = '1s' + + [P2P.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:5001'] + """ \ No newline at end of file diff --git a/integration-tests/smoke/capabilities/environment.toml b/integration-tests/smoke/capabilities/environment.toml index 67e632bb2e3..4eac613f261 100644 --- a/integration-tests/smoke/capabilities/environment.toml +++ b/integration-tests/smoke/capabilities/environment.toml @@ -18,7 +18,6 @@ prices = [182.9, 162.71, 172.02] [workflow_config] - don_id = 1 workflow_name = "abcdefgasd" use_cre_cli = true @@ -33,16 +32,20 @@ binary_url = "https://gist.githubusercontent.com/Tofel/a91a240f16bb64bd1be44c93a38e6703/raw/cb7b2a56b37e333fe0bdce07b79538c4ce332f5f/binary.wasm.br" config_url = "https://gist.githubusercontent.com/Tofel/27c96141aac0c6eac832660c2abea6d4/raw/c8a3776ac34d484b81374bec01926619e1f54757/config.json2739136466" -[nodeset] +[[nodesets]] nodes = 5 override_mode = "each" + http_port_range_start = 10100 + name = "workflow" -[nodeset.db] - image = "postgres:15.6" + [nodesets.db] + image = "postgres:12.0" + port = 13000 + volume_name = "workflow_volume" - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] + [nodesets.node_specs.node] docker_ctx = "../../.." docker_file = "plugins/chainlink.Dockerfile" user_config_overrides = """ @@ -58,12 +61,12 @@ ListenAddresses = ['0.0.0.0:5001'] """ - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] - capabilities = ["./amd64_cron"] + [nodesets.node_specs.node] docker_ctx = "../../.." docker_file = "plugins/chainlink.Dockerfile" + capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] LogPoller = true @@ -77,12 +80,12 @@ ListenAddresses = ['0.0.0.0:5001'] """ - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] - capabilities = ["./amd64_cron"] + [nodesets.node_specs.node] docker_ctx = "../../.." docker_file = "plugins/chainlink.Dockerfile" + capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] LogPoller = true @@ -96,12 +99,12 @@ ListenAddresses = ['0.0.0.0:5001'] """ - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] - capabilities = ["./amd64_cron"] + [nodesets.node_specs.node] docker_ctx = "../../.." docker_file = "plugins/chainlink.Dockerfile" + capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] LogPoller = true @@ -115,12 +118,12 @@ ListenAddresses = ['0.0.0.0:5001'] """ - [[nodeset.node_specs]] + [[nodesets.node_specs]] - [nodeset.node_specs.node] - capabilities = ["./amd64_cron"] + [nodesets.node_specs.node] docker_ctx = "../../.." docker_file = "plugins/chainlink.Dockerfile" + capabilities = ["./amd64_cron"] user_config_overrides = """ [Feature] LogPoller = true @@ -132,4 +135,4 @@ [P2P.V2] Enabled = true ListenAddresses = ['0.0.0.0:5001'] - """ + """ \ No newline at end of file diff --git a/integration-tests/smoke/capabilities/guidelines.md b/integration-tests/smoke/capabilities/guidelines.md index fe1b992309d..a6b7d42e9f7 100644 --- a/integration-tests/smoke/capabilities/guidelines.md +++ b/integration-tests/smoke/capabilities/guidelines.md @@ -4,8 +4,11 @@ 1. [How to Run the Test](#how-to-run-the-test) 2. [Adding a New Capability](#adding-a-new-capability) - [Copying the Binary to the Container](#copying-the-binary-to-the-container) - - [Registering the Capability in the Registry Contract](#registering-the-capability-in-the-registry-contract) - - [Creating a New Capability Job](#creating-a-new-capability-job) + - [Adding support for the new capability in the testing code](#adding-support-for-the-new-capability-in-the-testing-code) + - [Defining new bitmask flag representing the capability](#defining-new-bitmask-flag-representing-the-capability) + - [Defining additional node configuration](#defining-additional-node-configuration) + - [Defining job spec for the new capability](#defining-job-spec-for-the-new-capability) + - [Registering the capability in the Capabilities Registry contract](#registering-the-capability-in-the-capabilities-registry-contract) 3. [Using a New Workflow](#using-a-new-workflow) - [Test Uploads the Binary](#test-uploads-the-binary) - [Workflow Configuration](#workflow-configuration) @@ -13,7 +16,17 @@ - [Manual Upload of the Binary](#manual-upload-of-the-binary) 4. [Deployer Address or Deployment Sequence Changes](#deployer-address-or-deployment-sequence-changes) 5. [Multiple DONs](#multiple-dons) -6. [Using a Specific Docker Image for Chainlink Node](#using-a-specific-docker-image-for-chainlink-node) + - [DON type](#don-type) + - [Capabilities](#capabilities) + - [HTTP port range start](#http-port-range-start) + - [DB port](#db-port) +6. [Price Data Source](#price-data-source) + - [Live Source](#live-source) + - [Mocked Data Source](#mocked-data-source) +7. [Using a Specific Docker Image for Chainlink Node](#using-a-specific-docker-image-for-chainlink-node) +8. [Troubleshooting](#troubleshooting) + - [Chainlink Node migrations fail](#chainlink-node-migrations-fail) + - [Chainlink image not found in local Docker registry](#chainlink-image-not-found-in-local-docker-registry) --- @@ -51,77 +64,167 @@ docker build -t jd-test-1 -f e2e/Dockerfile.e2e Alternatively, if you have access to the Docker image repository where it's stored you can modify `environment.toml` with the name of the image stored there. +In the CI test code modifies the config during runtime to production JD image hardcoded in the [.github/e2e-tests.yml](.github/e2e-tests.yml) file as `E2E_JD_VERSION` env var. + --- ## Adding a New Capability -To use a new capability in the test, follow these three steps: +To add a new capability to the test, follow these steps: 1. Copy the capability binary to the Chainlink node’s Docker container (must be in `linux/amd64` format). -2. Register the capability in the capability registry contract. -3. Create a new job on each worker node to launch the capability. + - You can skip this step if the capability is already included in the Chainlink image you are using or if it's built-in. +2. Add support for the new capability in the testing code: + - Define a new `CapabilityFlag` representing the capability. + - (Optional) Define additional node configuration if required. + - Define the job spec for the new capability. + - Register the capability in the Capabilities Registry contract. +3. Update the TOML configuration to assign the new capability to one of the DONs. + +Once these steps are complete, you can run a workflow that requires the new capability. -Only after completing these steps can you run a workflow that requires the new capability. +Let's assume we want to add a capability that represents writing to Aptos chain. ### Copying the Binary to the Container -The test configuration is defined in a TOML file (`environment.toml`), which specifies properties for the Chainlink nodes. The `capabilities` property determines which binaries are copied to the container: +The test configuration is defined in a TOML file (e.g. `environment.toml`), which specifies properties for Chainlink nodes. The `capabilities` property of the `node_specs.node` determines which binaries are copied to the container: ```toml [[nodeset.node_specs]] [nodeset.node_specs.node] - capabilities = ["./amd64_cron"] + capabilities = ["./aptos_linux_amd64"] ``` -This instructs the framework to copy `./amd64_cron` to the container’s `/home/capabilities/` directory, making it available as `/home/capabilities/amd64_cron`. +This instructs the framework to copy `./aptos_linux_amd64` to the container’s `/home/capabilities/` directory, making it available as `/home/capabilities/aptos_linux_amd64`. + +> **Note:** Copying the binary to the bootstrap node is unnecessary since it does not handle capability-related tasks. -> **Note:** While copying the binary to the bootstrap node causes no harm, it is unnecessary since the bootstrap node does not handle capability-related tasks. +### Adding Support for the New Capability in the Testing Code -### Registering the Capability in the Registry Contract +#### Defining a CapabilityFlag for the Capability -Next, register the new capability in the **capabilities registry contract** to make it accessible to the workflow DON. +The testing code uses string flags to map DON capabilities to node configuration, job creation, and the Capabilities Registry contract. This means that adding a new capability requires defining a unique flag. Let's name our capability flag as `WriteAptosCapability`. -Example definition for a cron capability: +First, define the new flag: ```go -{ - LabelledName: "cron-trigger", - Version: "1.0.0", - CapabilityType: uint8(0), // trigger +const ( + OCR3Capability CapabilityFlag = "ocr3" + CronCapability CapabilityFlag = "cron" + CustomComputeCapability CapabilityFlag = "custom-compute" + WriteEVMCapability CapabilityFlag = "write-evm" + WriteAptosCapability CapabilityFlag = "write-aptos" // <------------ New entry + + // Add more capabilities as needed +) +``` + +This ensures the TOML configuration correctly maps each DON to its capabilities. + +Optionally, add the new flag to the default capabilities used in a single DON setup: + +```go +var ( + // Add new capabilities here as well, if single DON should have them by default + SingleDonFlags = []string{"workflow", "capabilities", "ocr3", "cron", "custom-compute", "write-evm", "write-aptos"} + // <------------ New entry +) +``` + +Now that the flag is defined, let's configure the nodes and jobs. + +#### Defining Additional Node Configuration + +This step is optional, as not every capability requires additional node configuration. However, writing to the Aptos chain does. Depending on the capability, adjustments might be needed for the bootstrap node, the workflow nodes, or all nodes. + +The following code snippet adds the required settings: + +```go +if hasFlag(flags, WriteAptosCapability) { + writeAptosConfig := fmt.Sprintf(` + # Required for initializing the capability + [Aptos.Workflow] + # Configuration parameters + param_1 = "%s" + `, + "some value", + ) + workerNodeConfig += writeAptosConfig } ``` -Some capabilities may also require `ResponseType` or `ConfigurationContract`. Check with the capability author for the necessary values and ensure the correct capability type is set. +This is a placeholder snippet—you should replace it with the actual configuration required for the capability. Ensure it is added before restarting the nodes. -Since this test's code is a living creature we do not indicate any line numbers or functions names. It's advised that you search for the example used above or usages of `CapabilitiesRegistryCapability` type. +#### Defining a Job Spec for the New Capability -### Creating a New Capability Job +Unlike node configuration, defining a new job spec is always required for a new capability. Jobs should only be added to worker nodes. -Now that worker nodes have access to the binary and it is registered in the contract, create a capability job for each worker node. +Assume the Aptos capability job does not require special configuration (this may or may not be true): -Example cron capability job: +```go +if hasFlag(flags, WriteAptosCapability) { + aptosJobSpec := fmt.Sprintf(` + type = "standardcapabilities" + schemaVersion = 1 + externalJobID = "%s" + name = "aptos-write-capability" + command = "/home/capabilities/%s" # <-------- location of the capability binary within the container + config = "" + `, + uuid.NewString(), + "aptos_linux_amd64") + + aptosJobRequest := &jobv1.ProposeJobRequest{ + NodeId: node.NodeID, + Spec: aptosJobSpec, + } + + _, aptosErr := ctfEnv.Offchain.ProposeJob(context.Background(), aptosJobRequest) + if aptosErr != nil { + errCh <- errors.Wrapf(aptosErr, "failed to propose Aptos write job for node %s", node.NodeID) + return + } +} +``` -```toml -type = "standardcapabilities" -schemaVersion = 1 -name = "cron-capabilities" -forwardingAllowed = false -command = "/home/capabilities/amd64_cron" -config = "" +This code must be integrated into the section responsible for proposing and approving new jobs using the Job Distributor (JD). + +> **Note:** If the new capability requires a different job type, you may need to update the Chainlink Node code. If it works with `standardcapabilities`, no changes are necessary. + +#### Registering the Capability in the Capabilities Registry Contract + +The final step is adding support for registration of the capability with the Capabilities Registry contract: + +```go +if hasFlag(donTopology.Flags, WriteAptosCapability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "write_aptos-testnet", // <------- Ensure correct name + Version: "1.0.0", // <------- Ensure correct version + CapabilityType: 3, // TARGET + ResponseType: 1, // OBSERVATION_IDENTICAL + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) +} ``` -Since this is **not** a built-in capability, you must specify the binary’s path inside the Docker container. +Ensure that the **name and version** match: +- The values used by the capability itself. +- The values used in the workflow definition. -Also, remember that the exact content of the job is hard to know beforehand and you should work with the capability creator to figure out what exactly is required. +If they do not match, the test will likely fail in a way that is difficult to diagnose. ---- +Some capabilities may also require a `ConfigurationContract`. Check with the capability author for the necessary values and ensure the correct capability type is set. + +> **Note:** Since this test code is constantly evolving, no specific line numbers or function names are provided. ## Using a New Workflow To test a new workflow, you have two options: -1. Compile the workflow to a WASM binary and upload it to Gist inside the test. +1. Compile the workflow to a WASM binary and upload it to Gist **inside the test**. 2. Manually upload the binary and specify the workflow URL in the test configuration. ### Test Uploads the Binary @@ -151,10 +254,15 @@ workflowConfig := PoRWorkflowConfig{ ``` > **Note:** If the workflow is **not configurable**, do not pass configuration data. Instead, pass an empty `[]byte` when compiling or registering it. +> **Note:** Currently, we do not allow to update the configuration alone. Each configuration change is treated as workflow change and thus requires following the **upload mode**. + +--- ### Workflow Secrets Currently, workflow secrets are **not supported**. +--- + ### Manual Upload of the Binary If you compiled and uploaded the binary yourself, set the following in your configuration: @@ -190,7 +298,126 @@ If the deployer private key or deployment sequence changes, run the test in **up ## Multiple DONs -Multiple DONs are **not supported**. A single DON serves as both the **workflow** and **capabilities DON**. +You can choose to use one or multiple DONs. Configuring multiple DONs requires only TOML modifications, assuming they use capabilities already supported in the testing code. + +Currently, the supported capabilities are: +- `cron` +- `ocr3` +- `custom-compute` +- `write-evm` + +To enable multi-DON support, update the configuration file by: +- Defining a new nodeset. +- Explicitly assigning capabilities to each nodeset. +- Copying the required capabilities to the containers (if they are not built into the image already). + +Here’s an example configuration for a nodeset that only supports writing to an EVM chain: + +```toml +[[nodesets]] + don_type = "capabilities" + name = "capabilities" + capabilities = ["write-evm"] + nodes = 5 + override_mode = "each" + http_port_range_start = 10200 + + [nodesets.db] + image = "postgres:12.0" + port = 13100 + + [[nodesets.node_specs]] + + [nodesets.node_specs.node] + image = "some-CL-image" + # Rest of the node configuration follows + + # Additional nodes configuration follows +``` + +### Key Considerations +When configuring multiple DONs, keep the following in mind: +- **DON Type** +- **Capabilities List** +- **HTTP Port Range Start** +- **Database (DB) Port** + +### DON Type + +Two types of DONs are supported: +- `workflow` +- `capabilities` + +There should only be **one** `workflow` DON, but multiple `capabilities` DONs can be defined. + +### Capabilities + +- In a **single DON setup**, you can omit the capabilities list, as all known capabilities will be assigned and configured by default (as long as they are included in the `SingleDonFlags` constant). +- In a **multi-DON setup**, you must explicitly define the capabilities for each DON. + +Currently, the framework does not enforce validation on whether capabilities are assigned to the correct DON types. However, some capabilities **must** run on the `workflow` DON. These include: +* `ocr3` +* `cron` +* `custom-compute` +and possibly some other ones. + +The following capabilities are supported: +- `ocr3` +- `cron` +- `custom-compute` +- `write-evm` + +### HTTP Port Range Start + +Each node exposes a port to the host. To prevent port conflicts, assign a distinct range to each nodeset. A good practice is to separate port ranges by **50 or 100** between nodesets. + +### Database (DB) Port + +Similar to HTTP ports, ensure each nodeset has a unique database port. + +For a working example of a multi-DON setup, refer to the [`environment-multi-don.toml`](environment-multi-don.toml) file. + +--- + +## Price Data Source + +The test supports both **live** and **mocked** data sources, configurable via TOML. + +### Live Source + +The PoR workflow is designed to work with the following API: +[http://api.real-time-reserves.verinumus.io](http://api.real-time-reserves.verinumus.io) + +Only this response structure is supported. If you want to use a different data source, you must modify both the workflow code and its configuration. + +To configure a live data source, use the following TOML settings: + +```toml +[price_provider] + # Without the 0x prefix! + feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" + url = "api.real-time-reserves.verinumus.io/v1/chainlink/proof-of-reserves/TrueUSD" +``` + +### Mocked Data Source + +A mocked data source has been introduced to: +- Avoid dependency on a third-party endpoint. +- Enable verification of price values returned by the mock against those stored in the consumer contract. + +To configure a mocked data source, use the following TOML settings: + +```toml +[price_provider] + # Without the 0x prefix! + feed_id = "018bfe8840700040000000000000000000000000000000000000000000000000" + + [price_provider.fake] + port = 8171 + prices = [182.9, 162.71, 172.02] +``` + +This configuration launches a mock server on **port 8171** on the host machine. It will return prices in the sequence `[182.9, 162.71, 172.02]`. A new price is returned **only after the previous one has been observed in the consumer contract**. The test completes once all prices have been matched. --- @@ -215,3 +442,13 @@ To use an existing image, change it to: Apply this change to **all node entries** in the test configuration. +## Troubleshooting + +### Chainlink Node migrations fail + +If you see Chainlink Node migrations fail it might, because the Postgres volume has some old data on it. Do remove it and run the test again. +If you have the `ctf` CLI you can use following command: `ctf d rm`. + +### Chainlink image not found in local Docker registry + +If you are building the Chainlink image using the Dockerfile, image is successfuly built and yet nodes do not start, because image cannot be found in the local machine, simply restart your computer and try again. \ No newline at end of file diff --git a/integration-tests/smoke/capabilities/workflow_test.go b/integration-tests/smoke/capabilities/workflow_test.go index 4e5e99ad376..04ac23cb629 100644 --- a/integration-tests/smoke/capabilities/workflow_test.go +++ b/integration-tests/smoke/capabilities/workflow_test.go @@ -18,6 +18,7 @@ import ( "path/filepath" "regexp" "runtime" + "slices" "strconv" "strings" "sync" @@ -36,28 +37,28 @@ import ( "golang.org/x/oauth2" "google.golang.org/grpc/credentials/insecure" - chainselectors "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink-testing-framework/framework" - "github.com/smartcontractkit/chainlink-testing-framework/framework/clclient" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/blockchain" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/fake" "github.com/smartcontractkit/chainlink-testing-framework/framework/components/jd" ns "github.com/smartcontractkit/chainlink-testing-framework/framework/components/simple_node_set" - "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" "github.com/smartcontractkit/chainlink-testing-framework/seth" - "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/integration-tests/actions" pkgworkflows "github.com/smartcontractkit/chainlink-common/pkg/workflows" jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/feeds_consumer" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" "github.com/smartcontractkit/chainlink/v2/core/logger" + chainselectors "github.com/smartcontractkit/chain-selectors" + capabilitiespb "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" ctfconfig "github.com/smartcontractkit/chainlink-testing-framework/lib/config" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/ptr" + "github.com/smartcontractkit/chainlink/deployment/environment/devenv" "github.com/smartcontractkit/chainlink/deployment/environment/nodeclient" keystone_changeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" @@ -72,10 +73,7 @@ type WorkflowConfig struct { WorkflowFolderLocation *string `toml:"workflow_folder_location"` CompiledWorkflowConfig *CompiledConfig `toml:"compiled_config"` DependenciesConfig *DependenciesConfig `toml:"dependencies"` - // id, which will be used, when registering the DON with the workflow registry, - // and when instructing the Gateway job on the bootstrap node as to which workflow to run. - DonID uint32 `toml:"don_id" validate:"required"` - WorkflowName string `toml:"workflow_name" validate:"required" ` + WorkflowName string `toml:"workflow_name" validate:"required" ` } // Defines relases/versions of test dependencies that will be downloaded from Github @@ -92,14 +90,19 @@ type CompiledConfig struct { ConfigURL string `toml:"config_url"` } -type WorkflowTestConfig struct { - BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` - NodeSet *ns.Input `toml:"nodeset" validate:"required"` - WorkflowConfig *WorkflowConfig `toml:"workflow_config" validate:"required"` - JD *jd.Input `toml:"jd" validate:"required"` - PriceProvider *PriceProviderConfig `toml:"price_provider"` +type TestConfig struct { + BlockchainA *blockchain.Input `toml:"blockchain_a" validate:"required"` + NodeSets []*CapabilitiesAwareNodeSet `toml:"nodesets" validate:"required"` + WorkflowConfig *WorkflowConfig `toml:"workflow_config" validate:"required"` + JD *jd.Input `toml:"jd" validate:"required"` + PriceProvider *PriceProviderConfig `toml:"price_provider"` } +type CapabilitiesAwareNodeSet struct { + *ns.Input + Capabilities []string `toml:"capabilities"` + DONType string `toml:"don_type"` +} type FakeConfig struct { *fake.Input Prices []float64 `toml:"prices"` @@ -384,7 +387,7 @@ func downloadCronCapability(ghToken, version string) (string, error) { return fileName, nil } -func validateInputsAndEnvVars(t *testing.T, in *WorkflowTestConfig) { +func validateInputsAndEnvVars(t *testing.T, in *TestConfig) { require.NotEmpty(t, os.Getenv("PRIVATE_KEY"), "PRIVATE_KEY env var must be set") require.NotEmpty(t, in.WorkflowConfig.DependenciesConfig, "dependencies config must be set") @@ -446,13 +449,25 @@ func validateInputsAndEnvVars(t *testing.T, in *WorkflowTestConfig) { require.NotEmpty(t, in.PriceProvider.URL, "URL must be set in the price provider config, if fake provider is not used") } + if len(in.NodeSets) == 1 { + noneEmpty := in.NodeSets[0].DONType != "" && len(in.NodeSets[0].Capabilities) > 0 + bothEmpty := in.NodeSets[0].DONType == "" && len(in.NodeSets[0].Capabilities) == 0 + require.True(t, noneEmpty || bothEmpty, "either both DONType and Capabilities must be set or both must be empty, when using only one node set") + } else { + for _, nodeSet := range in.NodeSets { + require.NotEmpty(t, nodeSet.Capabilities, "capabilities must be set for each node set") + require.NotEmpty(t, nodeSet.DONType, "don_type must be set for each node set") + } + } + // make sure the feed id is in the correct format in.PriceProvider.FeedID = strings.TrimPrefix(in.PriceProvider.FeedID, "0x") } // copied from Bala's unmerged PR: https://github.com/smartcontractkit/chainlink/pull/15751 // TODO: remove this once the PR is merged and import his function -func getNodeInfo(nodeOut *ns.Output, bootstrapNodeCount int) ([]devenv.NodeInfo, error) { +// IMPORTANT ADDITION: prefix to differentiate between the different DONs +func getNodeInfo(nodeOut *ns.Output, prefix string, bootstrapNodeCount int) ([]devenv.NodeInfo, error) { var nodeInfo []devenv.NodeInfo for i := 1; i <= len(nodeOut.CLNodes); i++ { p2pURL, err := url.Parse(nodeOut.CLNodes[i-1].Node.DockerP2PUrl) @@ -462,7 +477,7 @@ func getNodeInfo(nodeOut *ns.Output, bootstrapNodeCount int) ([]devenv.NodeInfo, if i <= bootstrapNodeCount { nodeInfo = append(nodeInfo, devenv.NodeInfo{ IsBootstrap: true, - Name: fmt.Sprintf("bootstrap-%d", i), + Name: fmt.Sprintf("%s_bootstrap-%d", prefix, i), P2PPort: p2pURL.Port(), CLConfig: nodeclient.ChainlinkConfig{ URL: nodeOut.CLNodes[i-1].Node.HostURL, @@ -474,7 +489,7 @@ func getNodeInfo(nodeOut *ns.Output, bootstrapNodeCount int) ([]devenv.NodeInfo, } else { nodeInfo = append(nodeInfo, devenv.NodeInfo{ IsBootstrap: false, - Name: fmt.Sprintf("node-%d", i), + Name: fmt.Sprintf("%s_node-%d", prefix, i), P2PPort: p2pURL.Port(), CLConfig: nodeclient.ChainlinkConfig{ URL: nodeOut.CLNodes[i-1].Node.HostURL, @@ -488,70 +503,94 @@ func getNodeInfo(nodeOut *ns.Output, bootstrapNodeCount int) ([]devenv.NodeInfo, return nodeInfo, nil } -func buildChainlinkDeploymentEnv(t *testing.T, jdOutput *jd.Output, nodeOutput *ns.Output, bs *blockchain.Output, sc *seth.Client) (*deployment.Environment, *devenv.DON, uint64) { +func buildChainlinkDeploymentEnv(t *testing.T, keystoneEnv *KeystoneEnvironment) { lgr := logger.TestLogger(t) + require.NotNil(t, keystoneEnv, "keystone environment must be set") + require.NotNil(t, keystoneEnv.Blockchain, "blockchain must be set") + require.NotNil(t, keystoneEnv.WrappedNodeOutput, "wrapped node output must be set") + require.NotNil(t, keystoneEnv.JD, "job distributor must be set") + require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") + require.GreaterOrEqual(t, len(keystoneEnv.Blockchain.Nodes), 1, "expected at least one node in the blockchain output") + require.GreaterOrEqual(t, len(keystoneEnv.WrappedNodeOutput), 1, "expected at least one node in the wrapped node output") + + envs := make([]*deployment.Environment, len(keystoneEnv.WrappedNodeOutput)) + keystoneEnv.dons = make([]*devenv.DON, len(keystoneEnv.WrappedNodeOutput)) + + for i, nodeOutput := range keystoneEnv.WrappedNodeOutput { + // assume that each nodeset has only one bootstrap node + nodeInfo, err := getNodeInfo(nodeOutput.Output, nodeOutput.NodeSetName, 1) + require.NoError(t, err, "failed to get node info") + + jdConfig := devenv.JDConfig{ + GRPC: keystoneEnv.JD.HostGRPCUrl, + WSRPC: keystoneEnv.JD.DockerWSRPCUrl, + Creds: insecure.NewCredentials(), + NodeInfo: nodeInfo, + } - chainSelector, err := chainselectors.SelectorFromChainId(sc.Cfg.Network.ChainID) - require.NoError(t, err, "failed to get chain selector for chain id %d", sc.Cfg.Network.ChainID) + devenvConfig := devenv.EnvironmentConfig{ + JDConfig: jdConfig, + Chains: []devenv.ChainConfig{ + { + ChainID: keystoneEnv.SethClient.Cfg.Network.ChainID, + ChainName: keystoneEnv.SethClient.Cfg.Network.Name, + ChainType: strings.ToUpper(keystoneEnv.Blockchain.Family), + WSRPCs: []devenv.CribRPCs{{ + External: keystoneEnv.Blockchain.Nodes[0].HostWSUrl, + Internal: keystoneEnv.Blockchain.Nodes[0].DockerInternalWSUrl, + }}, + HTTPRPCs: []devenv.CribRPCs{{ + External: keystoneEnv.Blockchain.Nodes[0].HostHTTPUrl, + Internal: keystoneEnv.Blockchain.Nodes[0].DockerInternalHTTPUrl, + }}, + DeployerKey: keystoneEnv.SethClient.NewTXOpts(seth.WithNonce(nil)), // set nonce to nil, so that it will be fetched from the chain + }, + }, + } - nodeInfo, err := getNodeInfo(nodeOutput, 1) - require.NoError(t, err, "failed to get node info") + env, don, err := devenv.NewEnvironment(context.Background, lgr, devenvConfig) + require.NoError(t, err, "failed to create environment") - jdConfig := devenv.JDConfig{ - GRPC: jdOutput.HostGRPCUrl, - WSRPC: jdOutput.DockerWSRPCUrl, - Creds: insecure.NewCredentials(), - NodeInfo: nodeInfo, + envs[i] = env + keystoneEnv.dons[i] = don } - require.GreaterOrEqual(t, len(bs.Nodes), 1, "expected at least one node in the blockchain output") + var nodeIDs []string + for _, env := range envs { + nodeIDs = append(nodeIDs, env.NodeIDs...) + } - devenvConfig := devenv.EnvironmentConfig{ - JDConfig: jdConfig, - Chains: []devenv.ChainConfig{ - { - ChainID: sc.Cfg.Network.ChainID, - ChainName: sc.Cfg.Network.Name, - ChainType: strings.ToUpper(bs.Family), - WSRPCs: []devenv.CribRPCs{{ - External: bs.Nodes[0].HostWSUrl, - Internal: bs.Nodes[0].DockerInternalWSUrl, - }}, - HTTPRPCs: []devenv.CribRPCs{{ - External: bs.Nodes[0].HostHTTPUrl, - Internal: bs.Nodes[0].DockerInternalHTTPUrl, - }}, - DeployerKey: sc.NewTXOpts(seth.WithNonce(nil)), // set nonce to nil, so that it will be fetched from the chain - }, - }, + // we assume that all DONs run on the same chain and that there's only one chain + // also, we don't care which instance of offchain client we use, because we have + // only one instance of offchain client and we have just configured it to work + // with nodes from all DONs + keystoneEnv.Environment = &deployment.Environment{ + Name: envs[0].Name, + Logger: envs[0].Logger, + ExistingAddresses: envs[0].ExistingAddresses, + Chains: envs[0].Chains, + Offchain: envs[0].Offchain, + OCRSecrets: envs[0].OCRSecrets, + GetContext: envs[0].GetContext, + NodeIDs: nodeIDs, } +} - env, don, err := devenv.NewEnvironment(context.Background, lgr, devenvConfig) - require.NoError(t, err, "failed to create environment") +func deployKeystoneContracts(t *testing.T, testLogger zerolog.Logger, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, keystoneEnv, "keystone environment must be set") + require.NotNil(t, keystoneEnv.Environment, "environment must be set") + require.NotEmpty(t, keystoneEnv.ChainSelector, "chain selector must be set") - return env, don, chainSelector -} + keystoneEnv.KeystoneContractAddresses = &KeystoneContractAddresses{} -func deployKeystoneContracts(t *testing.T, testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) keystone_changeset.ContractSet { // Deploy keystone forwarder contract - _ = deployKeystoneForwarder(t, testLogger, ctfEnv, chainSelector) + keystoneEnv.KeystoneContractAddresses.ForwarderAddress = deployKeystoneForwarder(t, testLogger, keystoneEnv.Environment, keystoneEnv.ChainSelector) // Deploy OCR3 contract - _ = deployOCR3(t, testLogger, ctfEnv, chainSelector) + keystoneEnv.KeystoneContractAddresses.OCR3CapabilityAddress = deployOCR3(t, testLogger, keystoneEnv.Environment, keystoneEnv.ChainSelector) // Deploy capabilities registry contract - _ = deployCapabilitiesRegistry(t, testLogger, ctfEnv, chainSelector) - - contractSetResponse, err := keystone_changeset.GetContractSets(nil, &keystone_changeset.GetContractSetsRequest{ - Chains: ctfEnv.Chains, - AddressBook: ctfEnv.ExistingAddresses, - }) - require.NoError(t, err, "failed to get contract sets") - - contractSet, ok := contractSetResponse.ContractSets[chainSelector] - require.True(t, ok, "failed to get contract set for chain %d", chainSelector) - - return contractSet + keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress = deployCapabilitiesRegistry(t, testLogger, keystoneEnv.Environment, keystoneEnv.ChainSelector) } func deployOCR3(t *testing.T, testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64) common.Address { @@ -622,15 +661,21 @@ func deployKeystoneForwarder(t *testing.T, testLogger zerolog.Logger, ctfEnv *de return forwarderAddress } -func prepareWorkflowRegistry(t *testing.T, testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64, sc *seth.Client, donID uint32) common.Address { - output, err := workflow_registry_changeset.Deploy(*ctfEnv, chainSelector) +func prepareWorkflowRegistry(t *testing.T, testLogger zerolog.Logger, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, keystoneEnv, "keystone environment must be set") + require.NotNil(t, keystoneEnv.Environment, "environment must be set") + require.NotEmpty(t, keystoneEnv.ChainSelector, "chain selector must be set") + require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") + require.NotEmpty(t, keystoneEnv.WorkflowDONID, "workflow DON ID must be set") + + output, err := workflow_registry_changeset.Deploy(*keystoneEnv.Environment, keystoneEnv.ChainSelector) require.NoError(t, err, "failed to deploy workflow registry contract") - err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) + err = keystoneEnv.Environment.ExistingAddresses.Merge(output.AddressBook) require.NoError(t, err, "failed to merge address book") - addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) - require.NoError(t, err, "failed to get addresses for chain %d from the address book", chainSelector) + addresses, err := keystoneEnv.Environment.ExistingAddresses.AddressesForChain(keystoneEnv.ChainSelector) + require.NoError(t, err, "failed to get addresses for chain %d from the address book", keystoneEnv.ChainSelector) var workflowRegistryAddr common.Address for addrStr, tv := range addresses { @@ -641,34 +686,41 @@ func prepareWorkflowRegistry(t *testing.T, testLogger zerolog.Logger, ctfEnv *de } // Configure Workflow Registry contract - _, err = workflow_registry_changeset.UpdateAllowedDons(*ctfEnv, &workflow_registry_changeset.UpdateAllowedDonsRequest{ - RegistryChainSel: chainSelector, - DonIDs: []uint32{donID}, + _, err = workflow_registry_changeset.UpdateAllowedDons(*keystoneEnv.Environment, &workflow_registry_changeset.UpdateAllowedDonsRequest{ + RegistryChainSel: keystoneEnv.ChainSelector, + DonIDs: []uint32{keystoneEnv.WorkflowDONID}, Allowed: true, }) require.NoError(t, err, "failed to update allowed Dons") - _, err = workflow_registry_changeset.UpdateAuthorizedAddresses(*ctfEnv, &workflow_registry_changeset.UpdateAuthorizedAddressesRequest{ - RegistryChainSel: chainSelector, - Addresses: []string{sc.MustGetRootKeyAddress().Hex()}, + _, err = workflow_registry_changeset.UpdateAuthorizedAddresses(*keystoneEnv.Environment, &workflow_registry_changeset.UpdateAuthorizedAddressesRequest{ + RegistryChainSel: keystoneEnv.ChainSelector, + Addresses: []string{keystoneEnv.SethClient.MustGetRootKeyAddress().Hex()}, Allowed: true, }) require.NoError(t, err, "failed to update authorized addresses") - return workflowRegistryAddr + keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress = workflowRegistryAddr } -func prepareFeedsConsumer(t *testing.T, testLogger zerolog.Logger, ctfEnv *deployment.Environment, chainSelector uint64, sc *seth.Client, forwarderAddress common.Address, workflowName string) common.Address { - output, err := keystone_changeset.DeployFeedsConsumer(*ctfEnv, &keystone_changeset.DeployFeedsConsumerRequest{ - ChainSelector: chainSelector, +func prepareFeedsConsumer(t *testing.T, testLogger zerolog.Logger, workflowName string, keystonEnv *KeystoneEnvironment) { + require.NotNil(t, keystonEnv, "keystone environment must be set") + require.NotNil(t, keystonEnv.Environment, "environment must be set") + require.NotEmpty(t, keystonEnv.ChainSelector, "chain selector must be set") + require.NotNil(t, keystonEnv.SethClient, "seth client must be set") + require.NotNil(t, keystonEnv.KeystoneContractAddresses, "keystone contract addresses must be set") + require.NotEmpty(t, keystonEnv.KeystoneContractAddresses.ForwarderAddress, "forwarder address must be set") + + output, err := keystone_changeset.DeployFeedsConsumer(*keystonEnv.Environment, &keystone_changeset.DeployFeedsConsumerRequest{ + ChainSelector: keystonEnv.ChainSelector, }) require.NoError(t, err, "failed to deploy feeds_consumer contract") - err = ctfEnv.ExistingAddresses.Merge(output.AddressBook) + err = keystonEnv.Environment.ExistingAddresses.Merge(output.AddressBook) require.NoError(t, err, "failed to merge address book") - addresses, err := ctfEnv.ExistingAddresses.AddressesForChain(chainSelector) - require.NoError(t, err, "failed to get addresses for chain %d from the address book", chainSelector) + addresses, err := keystonEnv.Environment.ExistingAddresses.AddressesForChain(keystonEnv.ChainSelector) + require.NoError(t, err, "failed to get addresses for chain %d from the address book", keystonEnv.ChainSelector) var feedsConsumerAddress common.Address for addrStr, tv := range addresses { @@ -683,7 +735,7 @@ func prepareFeedsConsumer(t *testing.T, testLogger zerolog.Logger, ctfEnv *deplo // configure Keystone Feeds Consumer contract, so it can accept reports from the forwarder contract, // that come from our workflow that is owned by the root private key - feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(feedsConsumerAddress, sc.Client) + feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(feedsConsumerAddress, keystonEnv.SethClient.Client) require.NoError(t, err, "failed to create feeds consumer instance") // Prepare hex-encoded and truncated workflow name @@ -704,19 +756,19 @@ func prepareFeedsConsumer(t *testing.T, testLogger zerolog.Logger, ctfEnv *deplo truncated := HashTruncateName(workflowName) copy(workflowNameBytes[:], []byte(truncated)) - _, decodeErr := sc.Decode(feedsConsumerInstance.SetConfig( - sc.NewTXOpts(), - []common.Address{forwarderAddress}, // allowed senders - []common.Address{sc.MustGetRootKeyAddress()}, // allowed workflow owners + _, decodeErr := keystonEnv.SethClient.Decode(feedsConsumerInstance.SetConfig( + keystonEnv.SethClient.NewTXOpts(), + []common.Address{keystonEnv.KeystoneContractAddresses.ForwarderAddress}, // allowed senders + []common.Address{keystonEnv.SethClient.MustGetRootKeyAddress()}, // allowed workflow owners // here we need to use hex-encoded workflow name converted to []byte [][10]byte{workflowNameBytes}, // allowed workflow names )) require.NoError(t, decodeErr, "failed to set config for feeds consumer") - return feedsConsumerAddress + keystonEnv.KeystoneContractAddresses.FeedsConsumerAddress = feedsConsumerAddress } -func registerWorkflowDirectly(t *testing.T, in *WorkflowTestConfig, sc *seth.Client, workflowRegistryAddr common.Address, donID uint32, workflowName string) { +func registerWorkflowDirectly(t *testing.T, in *TestConfig, sc *seth.Client, workflowRegistryAddr common.Address, donID uint32, workflowName string) { require.NotEmpty(t, in.WorkflowConfig.CompiledWorkflowConfig.BinaryURL) workFlowData, err := downloadAndDecode(in.WorkflowConfig.CompiledWorkflowConfig.BinaryURL) require.NoError(t, err, "failed to download and decode workflow binary") @@ -740,7 +792,7 @@ func registerWorkflowDirectly(t *testing.T, in *WorkflowTestConfig, sc *seth.Cli } //revive:disable // ignore confusing-results -func compileWorkflowWithCRECLI(t *testing.T, in *WorkflowTestConfig, feedsConsumerAddress common.Address, feedID, dataURL string, settingsFile *os.File) (string, string) { +func compileWorkflowWithCRECLI(t *testing.T, in *TestConfig, feedsConsumerAddress common.Address, feedID, dataURL string, settingsFile *os.File) (string, string) { configFile, err := os.CreateTemp("", "config.json") require.NoError(t, err, "failed to create workflow config file") @@ -800,7 +852,6 @@ func compileWorkflowWithCRECLI(t *testing.T, in *WorkflowTestConfig, feedsConsum } func preapreCRECLISettingsFile(t *testing.T, sc *seth.Client, capRegAddr, workflowRegistryAddr common.Address, donID uint32, chainSelector uint64, rpcHTTPURL string) *os.File { - // create CRE CLI settings file settingsFile, err := os.CreateTemp("", CRECLISettingsFileName) require.NoError(t, err, "failed to create CRE CLI settings file") @@ -848,31 +899,45 @@ func preapreCRECLISettingsFile(t *testing.T, sc *seth.Client, capRegAddr, workfl return settingsFile } -func registerWorkflow(t *testing.T, in *WorkflowTestConfig, sc *seth.Client, capRegAddr, workflowRegistryAddr, feedsConsumerAddress common.Address, donID uint32, chainSelector uint64, workflowName, pkey, rpcHTTPURL, dataURL string) { +func registerWorkflow(t *testing.T, in *TestConfig, workflowName string, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, keystoneEnv, "keystone environment must be set") + require.NotNil(t, keystoneEnv.Environment, "environment must be set") + require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") + require.NotNil(t, keystoneEnv.Blockchain, "blockchain must be set") + require.NotEmpty(t, keystoneEnv.ChainSelector, "chain selector must be set") + require.NotNil(t, keystoneEnv.KeystoneContractAddresses, "keystone contract addresses must be set") + require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress, "capabilities registry address must be set") + require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, "workflow registry address must be set") + require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.FeedsConsumerAddress, "feed consumer address must be set") + require.NotEmpty(t, keystoneEnv.DeployerPrivateKey, "deployer private key must be set") + require.NotEmpty(t, keystoneEnv.WorkflowDONID, "workflow DON ID must be set") + require.NotNil(t, keystoneEnv.PriceProvider, "price provider must be set") + // Register workflow directly using the provided binary and config URLs - // This is a legacy solution, probably we can remove it soon + // This is a legacy solution, probably we can remove it soon, but there's still quite a lot of people + // who have no access to dev-platform repo, so they cannot use the CRE CLI if !in.WorkflowConfig.ShouldCompileNewWorkflow && !in.WorkflowConfig.UseCRECLI { - registerWorkflowDirectly(t, in, sc, workflowRegistryAddr, donID, workflowName) + registerWorkflowDirectly(t, in, keystoneEnv.SethClient, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, keystoneEnv.WorkflowDONID, workflowName) return } // These two env vars are required by the CRE CLI - err := os.Setenv("WORKFLOW_OWNER_ADDRESS", sc.MustGetRootKeyAddress().Hex()) + err := os.Setenv("WORKFLOW_OWNER_ADDRESS", keystoneEnv.SethClient.MustGetRootKeyAddress().Hex()) require.NoError(t, err, "failed to set WORKFLOW_OWNER_ADDRESS env var") - err = os.Setenv("ETH_PRIVATE_KEY", pkey) + err = os.Setenv("ETH_PRIVATE_KEY", keystoneEnv.DeployerPrivateKey) require.NoError(t, err, "failed to set ETH_PRIVATE_KEY env var") // create CRE CLI settings file - settingsFile := preapreCRECLISettingsFile(t, sc, capRegAddr, workflowRegistryAddr, donID, chainSelector, rpcHTTPURL) + settingsFile := preapreCRECLISettingsFile(t, keystoneEnv.SethClient, keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, keystoneEnv.WorkflowDONID, keystoneEnv.ChainSelector, keystoneEnv.Blockchain.Nodes[0].HostHTTPUrl) var workflowGistURL string var workflowConfigURL string // compile and upload the workflow, if we are not using an existing one if in.WorkflowConfig.ShouldCompileNewWorkflow { - workflowGistURL, workflowConfigURL = compileWorkflowWithCRECLI(t, in, feedsConsumerAddress, in.PriceProvider.FeedID, dataURL, settingsFile) + workflowGistURL, workflowConfigURL = compileWorkflowWithCRECLI(t, in, keystoneEnv.KeystoneContractAddresses.FeedsConsumerAddress, in.PriceProvider.FeedID, keystoneEnv.PriceProvider.URL(), settingsFile) } else { workflowGistURL = in.WorkflowConfig.CompiledWorkflowConfig.BinaryURL workflowConfigURL = in.WorkflowConfig.CompiledWorkflowConfig.ConfigURL @@ -886,22 +951,29 @@ func registerWorkflow(t *testing.T, in *WorkflowTestConfig, sc *seth.Client, cap require.NoError(t, err, "failed to register workflow using CRE CLI") } -func startNodes(t *testing.T, in *WorkflowTestConfig, bc *blockchain.Output) *ns.Output { +func startSingleNodeSet(t *testing.T, nsInput *CapabilitiesAwareNodeSet, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, keystoneEnv, "keystone environment must be set") + require.NotNil(t, keystoneEnv.Blockchain, "blockchain environment must be set") + // Hack for CI that allows us to dynamically set the chainlink image and version // CTFv2 currently doesn't support dynamic image and version setting if os.Getenv("CI") == "true" { // Due to how we pass custom env vars to reusable workflow we need to use placeholders, so first we need to resolve what's the name of the target environment variable // that stores chainlink version and then we can use it to resolve the image name image := fmt.Sprintf("%s:%s", os.Getenv(ctfconfig.E2E_TEST_CHAINLINK_IMAGE_ENV), ctfconfig.MustReadEnvVar_String(ctfconfig.E2E_TEST_CHAINLINK_VERSION_ENV)) - for _, nodeSpec := range in.NodeSet.NodeSpecs { + for _, nodeSpec := range nsInput.NodeSpecs { nodeSpec.Node.Image = image } } - nodeset, err := ns.NewSharedDBNodeSet(in.NodeSet, bc) + nodeset, err := ns.NewSharedDBNodeSet(nsInput.Input, keystoneEnv.Blockchain) require.NoError(t, err, "failed to deploy node set") - return nodeset + keystoneEnv.WrappedNodeOutput = append(keystoneEnv.WrappedNodeOutput, &WrappedNodeOutput{ + nodeset, + nsInput.Name, + nsInput.Capabilities, + }) } // In order to whitelist host IP in the gateway, we need to resolve the host.docker.internal to the host IP, @@ -926,25 +998,196 @@ func resolveHostDockerInternaIp(testLogger zerolog.Logger, nsOutput *ns.Output) return matches[1], nil } -func fundNodes(t *testing.T, don *devenv.DON, sc *seth.Client) { - for _, node := range don.Nodes { - _, err := actions.SendFunds(zerolog.Logger{}, sc, actions.FundsToSendPayload{ - ToAddress: common.HexToAddress(node.AccountAddr[sc.Cfg.Network.ChainID]), - Amount: big.NewInt(5000000000000000000), - PrivateKey: sc.MustGetRootPrivateKey(), - }) - require.NoError(t, err) +func fundNodes(t *testing.T, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, keystoneEnv, "keystone environment must be set") + require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") + require.NotNil(t, keystoneEnv.dons, "dons must be set") + + for _, don := range keystoneEnv.dons { + for _, node := range don.Nodes { + _, err := actions.SendFunds(zerolog.Logger{}, keystoneEnv.SethClient, actions.FundsToSendPayload{ + ToAddress: common.HexToAddress(node.AccountAddr[keystoneEnv.SethClient.Cfg.Network.ChainID]), + Amount: big.NewInt(5000000000000000000), + PrivateKey: keystoneEnv.SethClient.MustGetRootPrivateKey(), + }) + require.NoError(t, err, "failed to send funds to node %s", node.AccountAddr[keystoneEnv.SethClient.Cfg.Network.ChainID]) + } } } -func configureNodes(t *testing.T, don *devenv.DON, in *WorkflowTestConfig, bc *blockchain.Output, capRegAddr, workflowRegistryAddr, forwarderAddress common.Address) (*ns.Output, []*clclient.ChainlinkClient) { - workflowNodeSet := don.Nodes[1:] +type CapabilityFlag = string - bootstrapNodePeerId, err := nodeToP2PID(don.Nodes[0], keyExtractingTransformFn) - require.NoError(t, err, "failed to get bootstrap node peer ID") +// DON types +const ( + WorkflowDON CapabilityFlag = "workflow" + CapabilitiesDON CapabilityFlag = "capabilities" +) + +// Capabilities +const ( + OCR3Capability CapabilityFlag = "ocr3" + CronCapability CapabilityFlag = "cron" + CustomComputeCapability CapabilityFlag = "custom-compute" + WriteEVMCapability CapabilityFlag = "write-evm" + + // Add more capabilities as needed +) + +var ( + // Add new capabilities here as well, if single DON should have them by default + SingleDonFlags = []string{"workflow", "capabilities", "ocr3", "cron", "custom-compute", "write-evm"} +) + +// WrappedNodeOutput is a struct that holds the node output and the name of the node set (required by multiple functions) +type WrappedNodeOutput struct { + *ns.Output + NodeSetName string + Capabilities []string +} + +// DONTopology is a struct that holds the DON references and various metadata +type DONTopology struct { + DON *devenv.DON + NodeInput *CapabilitiesAwareNodeSet + NodeOutput *WrappedNodeOutput + ID uint32 + Flags []string +} + +func hasFlag(values []string, flag string) bool { + return slices.Contains(values, flag) +} + +func mustOneDONTopologyWithFlag(t *testing.T, donTopologies []*DONTopology, flag string) *DONTopology { + donTopologies = DONTopologyWithFlag(donTopologies, flag) + require.Len(t, donTopologies, 1, "expected exactly one DON topology with flag %d", flag) + + return donTopologies[0] +} + +func DONTopologyWithFlag(donTopologies []*DONTopology, flag string) []*DONTopology { + var result []*DONTopology + + for _, donTopology := range donTopologies { + if hasFlag(donTopology.Flags, flag) { + result = append(result, donTopology) + } + } + + return result +} + +type PeeringData struct { + GlobalBootstraperPeerId string + GlobalBootstraperAddress string +} + +func peeringData(donTopologies []*DONTopology) (PeeringData, error) { + globalBootstraperPeerId, globalBootstraperAddress, err := globalBootstraperNodeData(donTopologies) + if err != nil { + return PeeringData{}, err + } + + return PeeringData{ + GlobalBootstraperPeerId: globalBootstraperPeerId, + GlobalBootstraperAddress: globalBootstraperAddress, + }, nil +} + +type KeystoneContractAddresses struct { + CapabilitiesRegistryAddress common.Address + ForwarderAddress common.Address + OCR3CapabilityAddress common.Address + WorkflowRegistryAddress common.Address + FeedsConsumerAddress common.Address +} + +type KeystoneEnvironment struct { + *deployment.Environment + Blockchain *blockchain.Output + SethClient *seth.Client + ChainSelector uint64 + DeployerPrivateKey string + KeystoneContractAddresses *KeystoneContractAddresses + + JD *jd.Output + + WrappedNodeOutput []*WrappedNodeOutput + DONTopology []*DONTopology + dons []*devenv.DON + WorkflowDONID uint32 + + PriceProvider PriceProvider +} + +func configureNodes(t *testing.T, testLogger zerolog.Logger, in *TestConfig, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, keystoneEnv, "keystone environment must be set") + require.NotNil(t, keystoneEnv.Environment, "environment must be set") + require.NotNil(t, keystoneEnv.Blockchain, "blockchain must be set") + require.NotNil(t, keystoneEnv.WrappedNodeOutput, "wrapped node output must be set") + require.NotNil(t, keystoneEnv.JD, "job distributor must be set") + require.NotNil(t, keystoneEnv.SethClient, "seth client must be set") + require.NotEmpty(t, keystoneEnv.DONTopology, "DON topology must not be empty") + require.NotNil(t, keystoneEnv.KeystoneContractAddresses, "keystone contract addresses must be set") + require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress, "capabilities registry address must be set") + require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.OCR3CapabilityAddress, "OCR3 capability address must be set") + require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.ForwarderAddress, "forwarder address must be set") + require.NotEmpty(t, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, "workflow registry address must be set") + require.GreaterOrEqual(t, len(keystoneEnv.DONTopology), 1, "expected at least one DON topology") + + peeringData, err := peeringData(keystoneEnv.DONTopology) + require.NoError(t, err, "failed to get peering data") + + for i, donTopology := range keystoneEnv.DONTopology { + keystoneEnv.DONTopology[i].NodeOutput = configureDON(t, donTopology.DON, donTopology.NodeInput, donTopology.NodeOutput, keystoneEnv.Blockchain, donTopology.ID, donTopology.Flags, peeringData, keystoneEnv.KeystoneContractAddresses.CapabilitiesRegistryAddress, keystoneEnv.KeystoneContractAddresses.WorkflowRegistryAddress, keystoneEnv.KeystoneContractAddresses.ForwarderAddress) + } + + nodeOutputs := make([]*WrappedNodeOutput, 0, len(keystoneEnv.DONTopology)) + for i := range keystoneEnv.DONTopology { + nodeOutputs = append(nodeOutputs, keystoneEnv.DONTopology[i].NodeOutput) + } + + // after restarting the nodes, we need to reinitialize the JD clients otherwise + // communication between JD and nodes will fail due to invalidated session cookie + keystoneEnv.Environment = reinitialiseJDClients(t, keystoneEnv.Environment, keystoneEnv.JD, nodeOutputs...) + + for _, donTopology := range keystoneEnv.DONTopology { + ips, ports := extraAllowedPortsAndIps(t, testLogger, in, donTopology.NodeOutput.Output) + createJobs(t, keystoneEnv.Environment, donTopology.DON, donTopology.NodeOutput, keystoneEnv.Blockchain, keystoneEnv.KeystoneContractAddresses.OCR3CapabilityAddress, donTopology.ID, donTopology.Flags, ports, ips) + } +} + +func globalBootstraperNodeData(donTopologies []*DONTopology) (string, string, error) { + if len(donTopologies) == 1 { + // if there is only one DON, then the global bootstrapper is the bootstrap node of the DON + peerId, err := nodeToP2PID(donTopologies[0].DON.Nodes[0], keyExtractingTransformFn) + if err != nil { + return "", "", errors.Wrapf(err, "failed to get peer ID for node %s", donTopologies[0].DON.Nodes[0].Name) + } + + return peerId, donTopologies[0].NodeOutput.CLNodes[0].Node.ContainerName, nil + } else if len(donTopologies) > 1 { + // if there's more than one DON, then peering capabilitity needs to point to the same bootstrap node + // for all the DONs, and so we need to find it first. For us, it will always be the bootstrap node of the workflow DON. + for _, donTopology := range donTopologies { + if hasFlag(donTopology.Flags, WorkflowDON) { + peerId, err := nodeToP2PID(donTopology.DON.Nodes[0], keyExtractingTransformFn) + if err != nil { + return "", "", errors.Wrapf(err, "failed to get peer ID for node %s", donTopology.DON.Nodes[0].Name) + } + + return peerId, donTopology.NodeOutput.CLNodes[0].Node.ContainerName, nil + } + } + + return "", "", errors.New("expected at least one workflow DON") + } + + return "", "", errors.New("expected at least one DON topology") +} - // configure the bootstrap node - in.NodeSet.NodeSpecs[0].Node.TestConfigOverrides = fmt.Sprintf(` +func buildWorkerNodeConfig(donBootstrapNodePeerId, donBootstrapNodeAddress string, peeringData PeeringData, bc *blockchain.Output, capRegAddr, forwarderAddress, workflowRegistryAddr common.Address, donID uint32, flags []string, nodeAddress string) string { + workerNodeConfig := fmt.Sprintf(` [Feature] LogPoller = true @@ -956,14 +1199,13 @@ func configureNodes(t *testing.T, don *devenv.DON, in *WorkflowTestConfig, bc *b [P2P.V2] Enabled = true ListenAddresses = ['0.0.0.0:5001'] - DefaultBootstrappers = ['%s@localhost:5001'] + DefaultBootstrappers = ['%s@%s:5001'] [Capabilities.Peering.V2] Enabled = true ListenAddresses = ['0.0.0.0:6690'] - DefaultBootstrappers = ['%s@localhost:6690'] + DefaultBootstrappers = ['%s@%s:6690'] - # This is needed for the target capability to be initialized [[EVM]] ChainID = '%s' @@ -971,22 +1213,94 @@ func configureNodes(t *testing.T, don *devenv.DON, in *WorkflowTestConfig, bc *b Name = 'anvil' WSURL = '%s' HTTPURL = '%s' - `, - bootstrapNodePeerId, - bootstrapNodePeerId, + + # Capabilities registry address, always needed + [Capabilities.ExternalRegistry] + Address = '%s' + NetworkID = 'evm' + ChainID = '%s' + `, + donBootstrapNodePeerId, + donBootstrapNodeAddress, + peeringData.GlobalBootstraperPeerId, + peeringData.GlobalBootstraperAddress, bc.ChainID, bc.Nodes[0].DockerInternalWSUrl, bc.Nodes[0].DockerInternalHTTPUrl, + capRegAddr, + bc.ChainID, ) + if hasFlag(flags, WriteEVMCapability) { + writeEVMConfig := fmt.Sprintf(` + # Required for the target capability to be initialized + [EVM.Workflow] + FromAddress = '%s' + ForwarderAddress = '%s' + GasLimitDefault = 400_000 + `, + nodeAddress, + forwarderAddress.Hex(), + ) + workerNodeConfig += writeEVMConfig + } + + // if it's workflow DON configure workflow registry + if hasFlag(flags, WorkflowDON) { + workflowRegistryConfig := fmt.Sprintf(` + [Capabilities.WorkflowRegistry] + Address = "%s" + NetworkID = "evm" + ChainID = "%s" + `, + workflowRegistryAddr.Hex(), + bc.ChainID, + ) + + workerNodeConfig += workflowRegistryConfig + } + + // workflow DON nodes always needs gateway connector, otherwise they won't be able to fetch the workflow + // it's also required by custom compute, which can only run on workflow DON nodes + if hasFlag(flags, WorkflowDON) || hasFlag(flags, CustomComputeCapability) { + // assuming for now that gateway always used port 5003 and /node path + gatewayAddress := fmt.Sprintf("ws://%s:5003/node", donBootstrapNodeAddress) + gatewayConfig := fmt.Sprintf(` + [Capabilities.GatewayConnector] + DonID = "%s" + ChainIDForNodeKey = "%s" + NodeAddress = '%s' + + [[Capabilities.GatewayConnector.Gateways]] + Id = "por_gateway" + URL = "%s" + `, + strconv.FormatUint(uint64(donID), 10), + bc.ChainID, + nodeAddress, + gatewayAddress, + ) + + workerNodeConfig += gatewayConfig + } + + return workerNodeConfig +} + +func configureDON(t *testing.T, don *devenv.DON, nodeInput *CapabilitiesAwareNodeSet, nodeOutput *WrappedNodeOutput, bc *blockchain.Output, donID uint32, flags []string, peeringData PeeringData, capRegAddr, workflowRegistryAddr, forwarderAddress common.Address) *WrappedNodeOutput { + workflowNodeSet := don.Nodes[1:] + + donBootstrapNodePeerId, err := nodeToP2PID(don.Nodes[0], keyExtractingTransformFn) + require.NoError(t, err, "failed to get bootstrap node peer ID") + + donBootstrapNodeAddress := nodeOutput.CLNodes[0].Node.ContainerName + chainIDInt, err := strconv.Atoi(bc.ChainID) require.NoError(t, err, "failed to convert chain ID to int") chainIDUint64 := mustSafeUint64(int64(chainIDInt)) - // configure worker nodes with p2p, peering capabilitity (for DON-2-DON communication), - // capability (external) registry, workflow registry and gateway connector (required for reading from workflow registry and for external communication) - for i := range workflowNodeSet { - in.NodeSet.NodeSpecs[i+1].Node.TestConfigOverrides = fmt.Sprintf(` + // bootstrap node in the DON always points to itself as the OCR peering bootstrapper + bootstrapNodeConfig := fmt.Sprintf(` [Feature] LogPoller = true @@ -998,14 +1312,7 @@ func configureNodes(t *testing.T, don *devenv.DON, in *WorkflowTestConfig, bc *b [P2P.V2] Enabled = true ListenAddresses = ['0.0.0.0:5001'] - # assuming that node0 is the bootstrap node - DefaultBootstrappers = ['%s@node0:5001'] - - [Capabilities.Peering.V2] - Enabled = true - ListenAddresses = ['0.0.0.0:6690'] - # assuming that node0 is the bootstrap node - DefaultBootstrappers = ['%s@node0:6690'] + DefaultBootstrappers = ['%s@localhost:5001'] [[EVM]] ChainID = '%s' @@ -1015,109 +1322,72 @@ func configureNodes(t *testing.T, don *devenv.DON, in *WorkflowTestConfig, bc *b WSURL = '%s' HTTPURL = '%s' - # This is needed for the target capability to be initialized - [EVM.Workflow] - FromAddress = '%s' - ForwarderAddress = '%s' - GasLimitDefault = 400_000 - + # Capabilities registry address, required for do2don p2p mesh to work and for capabilities discovery + # Required even, when all capabilities are local to DON in a single DON scenario [Capabilities.ExternalRegistry] Address = '%s' NetworkID = 'evm' ChainID = '%s' - - [Capabilities.WorkflowRegistry] - Address = "%s" - NetworkID = "evm" - ChainID = "%s" - - [Capabilities.GatewayConnector] - DonID = "%s" - ChainIDForNodeKey = "%s" - NodeAddress = '%s' - - [[Capabilities.GatewayConnector.Gateways]] - Id = "por_gateway" - URL = "%s" `, - bootstrapNodePeerId, - bootstrapNodePeerId, - bc.ChainID, - bc.Nodes[0].DockerInternalWSUrl, - bc.Nodes[0].DockerInternalHTTPUrl, - workflowNodeSet[i].AccountAddr[chainIDUint64], - forwarderAddress.Hex(), - capRegAddr, - bc.ChainID, - workflowRegistryAddr.Hex(), - bc.ChainID, - strconv.FormatUint(uint64(in.WorkflowConfig.DonID), 10), - bc.ChainID, - workflowNodeSet[i].AccountAddr[chainIDUint64], - "ws://node0:5003/node", // bootstrap node exposes gateway port on 5003 + donBootstrapNodePeerId, + bc.ChainID, + bc.Nodes[0].DockerInternalWSUrl, + bc.Nodes[0].DockerInternalHTTPUrl, + capRegAddr, + bc.ChainID, + ) + + // configure Don2Don peering capability for workflow DON's bootstrap node, but not for other DON's bootstrap nodes + // since they do not have any capabilities + if hasFlag(flags, WorkflowDON) { + bootstrapNodeConfig += fmt.Sprintf(` + [Capabilities.Peering.V2] + Enabled = true + ListenAddresses = ['0.0.0.0:6690'] + DefaultBootstrappers = ['%s@%s:6690'] + `, + peeringData.GlobalBootstraperPeerId, + "localhost", // bootstrap node should always point to itself as the bootstrapper ) } - // we need to restart all nodes for configuration changes to take effect - nodeset, err := ns.UpgradeNodeSet(t, in.NodeSet, bc, 5*time.Second) - require.NoError(t, err, "failed to upgrade node set") - - // we need to recreate chainlink clients after the nodes are restarted - nodeClients, err := clclient.New(nodeset.CLNodes) - require.NoError(t, err, "failed to create chainlink clients") + nodeInput.NodeSpecs[0].Node.TestConfigOverrides = bootstrapNodeConfig - return nodeset, nodeClients -} - -func reinitialiseJDClient(t *testing.T, ctfEnv *deployment.Environment, jdOutput *jd.Output, nodeOutput *ns.Output) deployment.Environment { - nodeInfo, err := getNodeInfo(nodeOutput, 1) - require.NoError(t, err, "failed to get node info") - - jdConfig := devenv.JDConfig{ - GRPC: jdOutput.HostGRPCUrl, - WSRPC: jdOutput.DockerWSRPCUrl, - Creds: insecure.NewCredentials(), - NodeInfo: nodeInfo, + // configure worker nodes with OCR Peering, Don2Don peering, EVM, and capabilities registry + for i := range workflowNodeSet { + nodeInput.NodeSpecs[i+1].Node.TestConfigOverrides = buildWorkerNodeConfig(donBootstrapNodePeerId, donBootstrapNodeAddress, peeringData, bc, capRegAddr, forwarderAddress, workflowRegistryAddr, donID, flags, workflowNodeSet[i].AccountAddr[chainIDUint64]) } - offChain, err := devenv.NewJDClient(context.Background(), jdConfig) - require.NoError(t, err, "failed to create JD client") - - ctfEnv.Offchain = offChain - - return *ctfEnv -} + // we need to restart all nodes for configuration changes to take effect + nodeset, err := ns.UpgradeNodeSet(t, nodeInput.Input, bc, 5*time.Second) + require.NoError(t, err, "failed to upgrade node set") -func mustSafeUint64(input int64) uint64 { - if input < 0 { - panic(fmt.Errorf("int64 %d is below uint64 min value", input)) - } - return uint64(input) + return &WrappedNodeOutput{nodeset, nodeInput.Name, nodeInput.Capabilities} } -func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *devenv.DON, bc *blockchain.Output, keystoneContractSet keystone_changeset.ContractSet, extraAllowedPorts []int, extraAllowedIps []string) { - // if there's only one OCR3 contract in the set, we can use `nil` as the address to get its instance - ocr3Contract, err := keystoneContractSet.GetOCR3Contract(nil) - require.NoError(t, err, "failed to get OCR3 contract address") +func createJobs(t *testing.T, ctfEnv *deployment.Environment, don *devenv.DON, nodeOutput *WrappedNodeOutput, bc *blockchain.Output, ocr3CapabilityAddress common.Address, donID uint32, flags []string, extraAllowedPorts []int, extraAllowedIps []string) { + donBootstrapNodePeerId, err := nodeToP2PID(don.Nodes[0], keyExtractingTransformFn) + require.NoError(t, err, "failed to get bootstrap node peer ID") - ocr3CapabilityAddress := ocr3Contract.Address().Hex() + donBootstrapNodeAddress := nodeOutput.CLNodes[0].Node.ContainerName chainIDInt, err := strconv.Atoi(bc.ChainID) require.NoError(t, err, "failed to convert chain ID to int") chainIDUint64 := mustSafeUint64(int64(chainIDInt)) - bootstrapNodePeerId, err := nodeToP2PID(don.Nodes[0], keyExtractingTransformFn) - require.NoError(t, err, "failed to get bootstrap node peer ID") - jobCount := 2 + (len(don.Nodes)-1)*3 errCh := make(chan error, jobCount) var wg sync.WaitGroup + + // configuration of bootstrap node wg.Add(1) go func() { defer wg.Done() - bootstrapJobSpec := fmt.Sprintf(` + // create Bootstrap (OCR3 capability) job, if DON has OCR3 capability + if hasFlag(flags, OCR3Capability) { + bootstrapJobSpec := fmt.Sprintf(` type = "bootstrap" schemaVersion = 1 externalJobID = "%s" @@ -1130,21 +1400,35 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev chainID = %s providerType = "ocr3-capability" `, uuid.NewString(), - ocr3CapabilityAddress, - bc.ChainID) + ocr3CapabilityAddress.Hex(), + bc.ChainID) - bootstrapJobRequest := &jobv1.ProposeJobRequest{ - NodeId: don.Nodes[0].NodeID, - Spec: bootstrapJobSpec, - } + bootstrapJobRequest := &jobv1.ProposeJobRequest{ + NodeId: don.Nodes[0].NodeID, + Spec: bootstrapJobSpec, + } - _, bootErr := ctfEnv.Offchain.ProposeJob(context.Background(), bootstrapJobRequest) - if bootErr != nil { - errCh <- errors.Wrapf(bootErr, "failed to propose bootstrap job") - return + _, bootErr := ctfEnv.Offchain.ProposeJob(context.Background(), bootstrapJobRequest) + if bootErr != nil { + errCh <- errors.Wrapf(bootErr, "failed to propose bootstrap ocr3 job") + return + } } - gatewayJobSpec := fmt.Sprintf(` + // if it's a workflow DON or it has custom compute capability, we need to create a gateway job + if hasFlag(flags, WorkflowDON) || hasFlag(flags, CustomComputeCapability) { + var gatewayMembers string + for i := 1; i < len(don.Nodes); i++ { + gatewayMembers += fmt.Sprintf(` + [[gatewayConfig.Dons.Members]] + Address = "%s" + Name = "Node %d"`, + don.Nodes[i].AccountAddr[chainIDUint64], + i, + ) + } + + gatewayJobSpec := fmt.Sprintf(` type = "gateway" schemaVersion = 1 externalJobID = "%s" @@ -1156,7 +1440,7 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev AuthTimestampToleranceSec = 5 HeartbeatIntervalSec = 20 [[gatewayConfig.Dons]] - DonId = "1" + DonId = "%s" F = 1 HandlerName = "web-api-capabilities" [gatewayConfig.Dons.HandlerConfig] @@ -1166,18 +1450,7 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev GlobalRPS = 50 PerSenderBurst = 10 PerSenderRPS = 10 - [[gatewayConfig.Dons.Members]] - Address = "%s" - Name = "Workflow Node 1" - [[gatewayConfig.Dons.Members]] - Address = "%s" - Name = "Workflow Node 2" - [[gatewayConfig.Dons.Members]] - Address = "%s" - Name = "Workflow Node 3" - [[gatewayConfig.Dons.Members]] - Address = "%s" - Name = "Workflow Node 4" + %s [gatewayConfig.NodeServerConfig] HandshakeTimeoutMillis = 1_000 MaxRequestBytes = 100_000 @@ -1197,51 +1470,49 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev [gatewayConfig.HTTPClientConfig] MaxResponseBytes = 100_000_000 `, - uuid.NewString(), - // ETH keys of the workflow nodes - don.Nodes[1].AccountAddr[chainIDUint64], - don.Nodes[2].AccountAddr[chainIDUint64], - don.Nodes[3].AccountAddr[chainIDUint64], - don.Nodes[4].AccountAddr[chainIDUint64], - ) + uuid.NewString(), + strconv.FormatUint(uint64(donID), 10), + gatewayMembers, + ) - if len(extraAllowedPorts) != 0 { - var allowedPorts string - for _, port := range extraAllowedPorts { - allowedPorts += fmt.Sprintf("%d, ", port) - } + if len(extraAllowedPorts) != 0 { + var allowedPorts string + for _, port := range extraAllowedPorts { + allowedPorts += fmt.Sprintf("%d, ", port) + } - // when we pass custom allowed IPs, defaults are not used and we need to - // pass HTTP and HTTPS explicitly - gatewayJobSpec += fmt.Sprintf(` + // when we pass custom allowed IPs, defaults are not used and we need to + // pass HTTP and HTTPS explicitly + gatewayJobSpec += fmt.Sprintf(` AllowedPorts = [80, 443, %s] `, - allowedPorts, - ) - } + allowedPorts, + ) + } - if len(extraAllowedIps) != 0 { - allowedIPs := strings.Join(extraAllowedIps, `", "`) + if len(extraAllowedIps) != 0 { + allowedIPs := strings.Join(extraAllowedIps, `", "`) - gatewayJobSpec += fmt.Sprintf(` + gatewayJobSpec += fmt.Sprintf(` AllowedIps = ["%s"] `, - allowedIPs, - ) - } + allowedIPs, + ) + } - gatewayJobRequest := &jobv1.ProposeJobRequest{ - NodeId: don.Nodes[0].NodeID, - Spec: gatewayJobSpec, - } + gatewayJobRequest := &jobv1.ProposeJobRequest{ + NodeId: don.Nodes[0].NodeID, + Spec: gatewayJobSpec, + } - _, gateErr := ctfEnv.Offchain.ProposeJob(context.Background(), gatewayJobRequest) - if gateErr != nil { - errCh <- errors.Wrapf(gateErr, "failed to propose gateway job for the bootstrap node") + _, gateErr := ctfEnv.Offchain.ProposeJob(context.Background(), gatewayJobRequest) + if gateErr != nil { + errCh <- errors.Wrapf(gateErr, "failed to propose gateway job for the bootstrap node") + } } }() - // for each capability that's required by the workflow, create a job for workflow each node + // configuration of worker nodes for i, node := range don.Nodes { // First node is a bootstrap node, so we skip it if i == 0 { @@ -1251,11 +1522,12 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev wg.Add(1) go func() { defer wg.Done() - // since we are using a capability that is not bundled-in, we need to copy it to the Docker container - // and point the job to the copied binary - // failed to propose job. err: rpc error: code = Internal desc = failed to propose job to node: failed to generate a job based on spec: unknown job type: standardcapabilities - cronJobSpec := fmt.Sprintf(` + // create cron capability job, if DON has cron capability + // remember that since we are using a capability that is not bundled-in, we need to point the job + // to binary location within the container + if hasFlag(flags, CronCapability) { + cronJobSpec := fmt.Sprintf(` type = "standardcapabilities" schemaVersion = 1 externalJobID = "%s" @@ -1264,50 +1536,56 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev command = "/home/capabilities/%s" config = "" `, - uuid.NewString(), - cronCapabilityAssetFile) + uuid.NewString(), + cronCapabilityAssetFile) - cronJobRequest := &jobv1.ProposeJobRequest{ - NodeId: node.NodeID, - Spec: cronJobSpec, - } + cronJobRequest := &jobv1.ProposeJobRequest{ + NodeId: node.NodeID, + Spec: cronJobSpec, + } - _, cronErr := ctfEnv.Offchain.ProposeJob(context.Background(), cronJobRequest) - if cronErr != nil { - errCh <- errors.Wrapf(cronErr, "failed to propose cron job for node %s", node.NodeID) - return + _, cronErr := ctfEnv.Offchain.ProposeJob(context.Background(), cronJobRequest) + if cronErr != nil { + errCh <- errors.Wrapf(cronErr, "failed to propose cron job for node %s", node.NodeID) + return + } } - computeJobSpec := fmt.Sprintf(` - type = "standardcapabilities" - schemaVersion = 1 - externalJobID = "%s" - name = "compute-capabilities" - forwardingAllowed = false - command = "__builtin_custom-compute-action" - config = """ - NumWorkers = 3 - [rateLimiter] - globalRPS = 20.0 - globalBurst = 30 - perSenderRPS = 1.0 - perSenderBurst = 5 - """ - `, - uuid.NewString()) - - computeJobRequest := &jobv1.ProposeJobRequest{ - NodeId: node.NodeID, - Spec: computeJobSpec, - } + // create custom compute capability job, if DON has custom compute capability + if hasFlag(flags, CustomComputeCapability) { + computeJobSpec := fmt.Sprintf(` + type = "standardcapabilities" + schemaVersion = 1 + name = "compute-capabilities" + externalJobID = "%s" + forwardingAllowed = false + command = "__builtin_custom-compute-action" + config = """ + NumWorkers = 3 + [rateLimiter] + globalRPS = 20.0 + globalBurst = 30 + perSenderRPS = 1.0 + perSenderBurst = 5 + """`, + uuid.NewString(), + ) + + computeJobRequest := &jobv1.ProposeJobRequest{ + NodeId: node.NodeID, + Spec: computeJobSpec, + } - _, compErr := ctfEnv.Offchain.ProposeJob(context.Background(), computeJobRequest) - if compErr != nil { - errCh <- errors.Wrapf(compErr, "failed to propose compute job for node %s", node.NodeID) - return + _, compErr := ctfEnv.Offchain.ProposeJob(context.Background(), computeJobRequest) + if compErr != nil { + errCh <- errors.Wrapf(compErr, "failed to propose compute job for node %s", node.NodeID) + return + } } - consensusJobSpec := fmt.Sprintf(` + // create OCR3 consensus job, if DON has OCR3 capability + if hasFlag(flags, OCR3Capability) { + consensusJobSpec := fmt.Sprintf(` type = "offchainreporting2" schemaVersion = 1 externalJobID = "%s" @@ -1333,29 +1611,30 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev [onchainSigningStrategy.config] evm = "%s" `, - uuid.NewString(), - ocr3CapabilityAddress, - node.Ocr2KeyBundleID, - bootstrapNodePeerId, - "node0:5001", - node.AccountAddr[chainIDUint64], - bc.ChainID, - node.Ocr2KeyBundleID, - ) - - consensusJobRequest := &jobv1.ProposeJobRequest{ - NodeId: node.NodeID, - Spec: consensusJobSpec, - } + uuid.NewString(), + ocr3CapabilityAddress, + node.Ocr2KeyBundleID, + donBootstrapNodePeerId, + // assume that OCR3 nodes always use port 5001 (that's P2P V2 port of the bootstrap node) + donBootstrapNodeAddress+":5001", + don.Nodes[i].AccountAddr[chainIDUint64], + bc.ChainID, + node.Ocr2KeyBundleID, + ) + + consensusJobRequest := &jobv1.ProposeJobRequest{ + NodeId: node.NodeID, + Spec: consensusJobSpec, + } - _, consErr := ctfEnv.Offchain.ProposeJob(context.Background(), consensusJobRequest) - if consErr != nil { - errCh <- errors.Wrapf(consErr, "failed to propose consensus job for node %s ", node.NodeID) + _, consErr := ctfEnv.Offchain.ProposeJob(context.Background(), consensusJobRequest) + if consErr != nil { + errCh <- errors.Wrapf(consErr, "failed to propose consensus job for node %s ", node.NodeID) + } } }() } wg.Wait() - close(errCh) errFound := false @@ -1365,7 +1644,53 @@ func createNodeJobsWithJd(t *testing.T, ctfEnv *deployment.Environment, don *dev assert.NoError(t, err, "job creation/acception failed") } - require.False(t, errFound, "failed to create at least one job") + require.False(t, errFound, "failed to create at least one job for DON: %d", donID) +} + +func reinitialiseJDClients(t *testing.T, ctfEnv *deployment.Environment, jdOutput *jd.Output, nodeOutputs ...*WrappedNodeOutput) *deployment.Environment { + offchainClients := make([]deployment.OffchainClient, len(nodeOutputs)) + + for i, nodeOutput := range nodeOutputs { + nodeInfo, err := getNodeInfo(nodeOutput.Output, nodeOutput.NodeSetName, 1) + require.NoError(t, err, "failed to get node info") + + jdConfig := devenv.JDConfig{ + GRPC: jdOutput.HostGRPCUrl, + WSRPC: jdOutput.DockerWSRPCUrl, + Creds: insecure.NewCredentials(), + NodeInfo: nodeInfo, + } + + offChain, err := devenv.NewJDClient(context.Background(), jdConfig) + require.NoError(t, err, "failed to create JD client") + + offchainClients[i] = offChain + } + + // we don't really care, which instance we set here, since there's only one + // what's important is that we create a new JD client for each DON, because + // that authenticates JD with each node + ctfEnv.Offchain = offchainClients[0] + + return ctfEnv +} + +func mustSafeUint64(input int64) uint64 { + if input < 0 { + panic(fmt.Errorf("int64 %d is below uint64 min value", input)) + } + return uint64(input) +} + +func mustSafeUint32(input int) uint32 { + if input < 0 { + panic(fmt.Errorf("int %d is below uint32 min value", input)) + } + maxUint32 := (1 << 32) - 1 + if input > maxUint32 { + panic(fmt.Errorf("int %d exceeds uint32 max value", input)) + } + return uint32(input) } func noOpTransformFn(value string) string { @@ -1393,70 +1718,105 @@ func nodeToP2PID(node devenv.Node, transformFn func(string) string) (string, err return "", fmt.Errorf("p2p label not found for node %s", node.Name) } -func configureWorkflowDON(t *testing.T, ctfEnv *deployment.Environment, don *devenv.DON, chainSelector uint64) { - kcrAllCaps := []keystone_changeset.DONCapabilityWithConfig{ - { - Capability: kcr.CapabilitiesRegistryCapability{ - LabelledName: "offchain_reporting", - Version: "1.0.0", - CapabilityType: 2, // CONSENSUS - ResponseType: 0, // REPORT - }, - Config: &capabilitiespb.CapabilityConfig{}, - }, - { - Capability: kcr.CapabilitiesRegistryCapability{ - LabelledName: "write_geth-testnet", - Version: "1.0.0", - CapabilityType: 3, // TARGET - ResponseType: 1, // OBSERVATION_IDENTICAL - }, - Config: &capabilitiespb.CapabilityConfig{}, - }, - { - Capability: kcr.CapabilitiesRegistryCapability{ - LabelledName: "cron-trigger", - Version: "1.0.0", - CapabilityType: uint8(0), // trigger - }, - Config: &capabilitiespb.CapabilityConfig{}, - }, - { - Capability: kcr.CapabilitiesRegistryCapability{ - LabelledName: "custom-compute", - Version: "1.0.0", - CapabilityType: uint8(1), // action - }, - Config: &capabilitiespb.CapabilityConfig{}, - }, - } +func configureContracts(t *testing.T, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, keystoneEnv, "keystone environment must be set") + require.NotNil(t, keystoneEnv.DONTopology, "DON topology must be set") + require.NotEmpty(t, keystoneEnv.ChainSelector, "chain selector must be set") + require.NotNil(t, keystoneEnv.Environment, "environment must be set") - peerIds := make([]string, len(don.Nodes)-1) - for i, node := range don.Nodes { - if i == 0 { - continue + donCapabilities := make([]keystone_changeset.DonCapabilities, 0, len(keystoneEnv.DONTopology)) + + for _, donTopology := range keystoneEnv.DONTopology { + var capabilities []keystone_changeset.DONCapabilityWithConfig + + // check what capabilities each DON has and register them with Capabilities Registry contract + if hasFlag(donTopology.Flags, CronCapability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "cron-trigger", + Version: "1.0.0", + CapabilityType: 0, // TRIGGER + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) } - p2pId, err := nodeToP2PID(node, noOpTransformFn) - require.NoError(t, err, "failed to get p2p id for node %s", node.Name) + if hasFlag(donTopology.Flags, CustomComputeCapability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "custom-compute", + Version: "1.0.0", + CapabilityType: 1, // ACTION + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) + } - peerIds[i-1] = p2pId - } + if hasFlag(donTopology.Flags, OCR3Capability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "offchain_reporting", + Version: "1.0.0", + CapabilityType: 2, // CONSENSUS + ResponseType: 0, // REPORT + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) + } - nop := keystone_changeset.NOP{ - Name: "NOP 1", - Nodes: peerIds, + if hasFlag(donTopology.Flags, WriteEVMCapability) { + capabilities = append(capabilities, keystone_changeset.DONCapabilityWithConfig{ + Capability: kcr.CapabilitiesRegistryCapability{ + LabelledName: "write_geth-testnet", + Version: "1.0.0", + CapabilityType: 3, // TARGET + ResponseType: 1, // OBSERVATION_IDENTICAL + }, + Config: &capabilitiespb.CapabilityConfig{}, + }) + } + + // Add support for new capabilities here as needed + + donPeerIds := make([]string, len(donTopology.DON.Nodes)-1) + for i, node := range donTopology.DON.Nodes { + if i == 0 { + continue + } + + p2pId, err := nodeToP2PID(node, noOpTransformFn) + require.NoError(t, err, "failed to get p2p id for node %s", node.Name) + + donPeerIds[i-1] = p2pId + } + + // we only need to assign P2P IDs to NOPs, since `ConfigureInitialContractsChangeset` method + // will take care of creating DON to Nodes mapping + nop := keystone_changeset.NOP{ + Name: fmt.Sprintf("NOP for %s DON", donTopology.NodeOutput.NodeSetName), + Nodes: donPeerIds, + } + + donName := donTopology.NodeOutput.NodeSetName + "-don" + donCapabilities = append(donCapabilities, keystone_changeset.DonCapabilities{ + Name: donName, + F: 1, + Nops: []keystone_changeset.NOP{nop}, + Capabilities: capabilities, + }) } - donName := "keystone-don" - donCap := keystone_changeset.DonCapabilities{ - Name: donName, - F: 1, - Nops: []keystone_changeset.NOP{nop}, - Capabilities: kcrAllCaps, + var transmissionSchedule []int + + for _, donTopology := range keystoneEnv.DONTopology { + if hasFlag(donTopology.Flags, OCR3Capability) { + // this schedule makes sure that all worker nodes are transmitting OCR3 reports + transmissionSchedule = []int{len(donTopology.DON.Nodes) - 1} + break + } } - transmissionSchedule := []int{len(don.Nodes) - 1} + require.NotEmpty(t, transmissionSchedule, "transmission schedule must not be empty") // values supplied by Alexandr Yepishev as the expected values for OCR3 config oracleConfig := keystone_changeset.OracleConfig{ @@ -1482,16 +1842,16 @@ func configureWorkflowDON(t *testing.T, ctfEnv *deployment.Environment, don *dev } cfg := keystone_changeset.InitialContractsCfg{ - RegistryChainSel: chainSelector, - Dons: []keystone_changeset.DonCapabilities{donCap}, + RegistryChainSel: keystoneEnv.ChainSelector, + Dons: donCapabilities, OCR3Config: &oracleConfig, } - _, err := keystone_changeset.ConfigureInitialContractsChangeset(*ctfEnv, cfg) + _, err := keystone_changeset.ConfigureInitialContractsChangeset(*keystoneEnv.Environment, cfg) require.NoError(t, err, "failed to configure initial contracts") } -func startJobDistributor(t *testing.T, in *WorkflowTestConfig) *jd.Output { +func startJobDistributor(t *testing.T, in *TestConfig, keystoneEnv *KeystoneEnvironment) { if os.Getenv("CI") == "true" { jdImage := ctfconfig.MustReadEnvVar_String(e2eJobDistributorImageEnvVarName) jdVersion := os.Getenv(e2eJobDistributorVersionEnvVarName) @@ -1500,7 +1860,57 @@ func startJobDistributor(t *testing.T, in *WorkflowTestConfig) *jd.Output { jdOutput, err := jd.NewJD(in.JD) require.NoError(t, err, "failed to create new job distributor") - return jdOutput + keystoneEnv.JD = jdOutput +} + +func nodeSetFlags(nodeSet *CapabilitiesAwareNodeSet) ([]string, error) { + var stringCaps []string + if len(nodeSet.Capabilities) == 0 && nodeSet.DONType == "" { + // if no flags are set, we assign all known capabilities to the DON + return SingleDonFlags, nil + } + + stringCaps = append(stringCaps, append(nodeSet.Capabilities, nodeSet.DONType)...) + return stringCaps, nil +} + +func buildDONTopology(t *testing.T, in *TestConfig, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, in, "test config must not be nil") + require.NotNil(t, keystoneEnv, "keystone environment must not be nil") + require.NotNil(t, keystoneEnv.dons, "keystone environment must have DONs") + require.NotNil(t, keystoneEnv.WrappedNodeOutput, "keystone environment must have node outputs") + + require.Equal(t, len(keystoneEnv.dons), len(keystoneEnv.WrappedNodeOutput), "number of DONs and node outputs must match") + keystoneEnv.DONTopology = make([]*DONTopology, len(keystoneEnv.dons)) + + // one DON to do everything + if len(keystoneEnv.dons) == 1 { + flags, err := nodeSetFlags(in.NodeSets[0]) + require.NoError(t, err, "failed to convert string flags to bitmap for nodeset %s", in.NodeSets[0].Name) + + keystoneEnv.DONTopology[0] = &DONTopology{ + DON: keystoneEnv.dons[0], + NodeInput: in.NodeSets[0], + NodeOutput: keystoneEnv.WrappedNodeOutput[0], + ID: 1, + Flags: flags, + } + } else { + for i, don := range keystoneEnv.dons { + flags, err := nodeSetFlags(in.NodeSets[i]) + require.NoError(t, err, "failed to convert string flags to bitmap for nodeset %s", in.NodeSets[i].Name) + + keystoneEnv.DONTopology[i] = &DONTopology{ + DON: don, + NodeInput: in.NodeSets[i], + NodeOutput: keystoneEnv.WrappedNodeOutput[i], + ID: mustSafeUint32(i + 1), + Flags: flags, + } + } + } + + keystoneEnv.WorkflowDONID = mustOneDONTopologyWithFlag(t, keystoneEnv.DONTopology, WorkflowDON).ID } func getLogFileHandles(t *testing.T, l zerolog.Logger, ns *ns.Output) ([]*os.File, error) { @@ -1639,45 +2049,60 @@ func debugReportTransmissions(logFiles []*os.File, l zerolog.Logger, wsRPCURL st // this function is used to print debug information from Chainlink Node logs // it checks whether workflow was executing, OCR was executing and whether reports were sent // and if they were, it traces each report transmission transaction -func printTestDebug(t *testing.T, l zerolog.Logger, ns *ns.Output, wsRPCURL string) { - logFiles, err := getLogFileHandles(t, l, ns) - if err != nil { - l.Error().Err(err).Msg("Failed to get log file handles. No debug information will be printed") - return - } +func printTestDebug(t *testing.T, l zerolog.Logger, keystoneEnv *KeystoneEnvironment) { + require.NotNil(t, keystoneEnv, "keystone environment must not be nil") + require.NotNil(t, keystoneEnv.DONTopology, "keystone environment must have DON topology") + require.NotNil(t, keystoneEnv.Blockchain, "keystone environment must have blockchain") - defer func() { - for _, f := range logFiles { - _ = f.Close() + l.Info().Msg("🔍 Debug information from Chainlink Node logs:") + + for _, donTopology := range keystoneEnv.DONTopology { + logFiles, err := getLogFileHandles(t, l, donTopology.NodeOutput.Output) + if err != nil { + l.Error().Err(err).Msg("Failed to get log file handles. No debug information will be printed") + return } - }() - l.Info().Msg("🔍 Debug information from Chainlink Node logs:") + defer func() { + for _, f := range logFiles { + _ = f.Close() + } + }() - // assuming one bootstrap node - workflowNodeCount := len(ns.CLNodes) - 1 - if !checkIfWorkflowWasExecuting(logFiles, workflowNodeCount) { - l.Error().Msg("❌ Workflow was not executing") - return - } else { - l.Info().Msg("✅ Workflow was executing") - } + // assuming one bootstrap node + workflowNodeCount := len(donTopology.NodeOutput.CLNodes) - 1 - if !checkIfOCRWasExecuting(logFiles, workflowNodeCount) { - l.Error().Msg("❌ OCR was not executing") - return - } else { - l.Info().Msg("✅ OCR was executing") - } + if hasFlag(donTopology.Flags, WorkflowDON) { + if !checkIfWorkflowWasExecuting(logFiles, workflowNodeCount) { + l.Error().Msg("❌ Workflow was not executing") + return + } else { + l.Info().Msg("✅ Workflow was executing") + } + } - if !checkIfAtLeastOneReportWasSent(logFiles, workflowNodeCount) { - l.Error().Msg("❌ Reports were not sent") - return - } else { - l.Info().Msg("✅ Reports were sent") + if hasFlag(donTopology.Flags, OCR3Capability) { + if !checkIfOCRWasExecuting(logFiles, workflowNodeCount) { + l.Error().Msg("❌ OCR was not executing") + return + } else { + l.Info().Msg("✅ OCR was executing") + } + } + + if hasFlag(donTopology.Flags, WriteEVMCapability) { + if !checkIfAtLeastOneReportWasSent(logFiles, workflowNodeCount) { + l.Error().Msg("❌ Reports were not sent") + return + } else { + l.Info().Msg("✅ Reports were sent") + + // debug report transmissions + debugReportTransmissions(logFiles, l, keystoneEnv.Blockchain.Nodes[0].HostWSUrl) + } + } - // debug report transmissions - debugReportTransmissions(logFiles, l, wsRPCURL) + // Add support for new capabilities here as needed, if there is some specific debug information to be printed } } @@ -1765,7 +2190,7 @@ func float64ToBigInt(f float64) *big.Int { return bigInt } -func setupFakeDataProvider(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig, priceIndex *int) string { +func setupFakeDataProvider(t *testing.T, testLogger zerolog.Logger, in *TestConfig, priceIndex *int) string { _, err := fake.NewFakeDataProvider(in.PriceProvider.Fake.Input) require.NoError(t, err) fakeApiPath := "/fake/api/price" @@ -1798,12 +2223,13 @@ func setupFakeDataProvider(t *testing.T, testLogger zerolog.Logger, in *Workflow return fakeFinalUrl } -func setupPriceProvider(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig) PriceProvider { +func setupPriceProvider(t *testing.T, testLogger zerolog.Logger, in *TestConfig, keystoneEnv *KeystoneEnvironment) { if in.PriceProvider.Fake != nil { - return NewFakePriceProvider(t, testLogger, in) + keystoneEnv.PriceProvider = NewFakePriceProvider(t, testLogger, in) + return } - return NewLivePriceProvider(t, testLogger, in) + keystoneEnv.PriceProvider = NewLivePriceProvider(t, testLogger, in) } // PriceProvider abstracts away the logic of checking whether the feed has been correctly updated @@ -1825,7 +2251,7 @@ type LivePriceProvider struct { actualPrices []*big.Int } -func NewLivePriceProvider(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig) PriceProvider { +func NewLivePriceProvider(t *testing.T, testLogger zerolog.Logger, in *TestConfig) PriceProvider { return &LivePriceProvider{ testLogger: testLogger, url: in.PriceProvider.URL, @@ -1868,7 +2294,7 @@ type FakePriceProvider struct { actualPrices []*big.Int } -func NewFakePriceProvider(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig) PriceProvider { +func NewFakePriceProvider(t *testing.T, testLogger zerolog.Logger, in *TestConfig) PriceProvider { priceIndex := ptr.Ptr(0) expectedPrices := make([]*big.Int, len(in.PriceProvider.Fake.Prices)) for i, p := range in.PriceProvider.Fake.Prices { @@ -1911,7 +2337,7 @@ func (f *FakePriceProvider) NextPrice(price *big.Int, elapsed time.Duration) boo return false } else { require.Less(f.t, len(f.actualPrices), len(f.expectedPrices), "more prices found than expected") - f.testLogger.Info().Msgf("Changing price provider price to %f", f.expectedPrices[len(f.actualPrices)]) + f.testLogger.Info().Msgf("Changing price provider price to %s", f.expectedPrices[len(f.actualPrices)].String()) *f.priceIndex = len(f.actualPrices) // set new price and continue checking @@ -1932,7 +2358,29 @@ func (f *FakePriceProvider) URL() string { return f.url } -func extraAllowedPortsAndIps(t *testing.T, testLogger zerolog.Logger, in *WorkflowTestConfig, nodeOutput *ns.Output) ([]string, []int) { +func startBlockchain(t *testing.T, in *TestConfig, keystoneEnv *KeystoneEnvironment) { + bc, err := blockchain.NewBlockchainNetwork(in.BlockchainA) + require.NoError(t, err, "failed to create blockchain network") + + pkey := os.Getenv("PRIVATE_KEY") + require.NotEmpty(t, pkey, "private key must not be empty") + + sc, err := seth.NewClientBuilder(). + WithRpcUrl(bc.Nodes[0].HostWSUrl). + WithPrivateKeys([]string{pkey}). + Build() + require.NoError(t, err, "failed to create seth client") + + chainSelector, err := chainselectors.SelectorFromChainId(sc.Cfg.Network.ChainID) + require.NoError(t, err, "failed to get chain selector for chain id %d", sc.Cfg.Network.ChainID) + + keystoneEnv.Blockchain = bc + keystoneEnv.SethClient = sc + keystoneEnv.DeployerPrivateKey = pkey + keystoneEnv.ChainSelector = chainSelector +} + +func extraAllowedPortsAndIps(t *testing.T, testLogger zerolog.Logger, in *TestConfig, nodeOutput *ns.Output) ([]string, []int) { // no need to allow anything, if we are using live feed if in.PriceProvider.Fake == nil { return nil, nil @@ -1963,99 +2411,77 @@ func extraAllowedPortsAndIps(t *testing.T, testLogger zerolog.Logger, in *Workfl // we also need to explicitly allow Gist's IP return []string{hostIp, GistIP}, []int{in.PriceProvider.Fake.Port} } - -/* -!!! ATTENTION !!! - -Do not use this test as a template for your tests. It's hacky, since we were working under time pressure. We will soon refactor it follow best practices -and a golden example. Apart from its structure what is currently missing is: -- DON-2-DON support -- better structured and reusable methods -*/ func TestKeystoneWithOCR3Workflow(t *testing.T) { testLogger := framework.L - // we need to use double-pointers, so that what's captured in the cleanup function is a pointer, not the actual object, - // which is only set later in the test, after the cleanup function is defined - var nodes **ns.Output - var wsRPCURL *string - - // clean up is LIFO, so we need to make sure we execute the debug report transmission after logs are written down - // by function added to clean up by framework.Load() method - t.Cleanup(func() { - if t.Failed() { - if nodes == nil { - testLogger.Warn().Msg("nodeset output is nil, skipping debug report transmission") - return - } - printTestDebug(t, testLogger, *nodes, *wsRPCURL) - } - }) - // Load test configuration - in, err := framework.Load[WorkflowTestConfig](t) + in, err := framework.Load[TestConfig](t) require.NoError(t, err, "couldn't load test config") validateInputsAndEnvVars(t, in) - pkey := os.Getenv("PRIVATE_KEY") + keystoneEnv := &KeystoneEnvironment{} // Create a new blockchain network and Seth client to interact with it - bc, err := blockchain.NewBlockchainNetwork(in.BlockchainA) - require.NoError(t, err) - - sc, err := seth.NewClientBuilder(). - WithRpcUrl(bc.Nodes[0].HostWSUrl). - WithPrivateKeys([]string{pkey}). - Build() - require.NoError(t, err, "failed to create seth client") + startBlockchain(t, in, keystoneEnv) // Get either a no-op price provider (for live endpoint) // or a fake price provider (for mock endpoint) - priceProvider := setupPriceProvider(t, testLogger, in) + setupPriceProvider(t, testLogger, in, keystoneEnv) // Start job distributor - jdOutput := startJobDistributor(t, in) + startJobDistributor(t, in, keystoneEnv) - // Deploy the DON - nodeOutput := startNodes(t, in, bc) + // Deploy the DONs + for _, nodeSet := range in.NodeSets { + startSingleNodeSet(t, nodeSet, keystoneEnv) + } - // Prepare the chainlink/deployment environment - ctfEnv, don, chainSelector := buildChainlinkDeploymentEnv(t, jdOutput, nodeOutput, bc, sc) + // Prepare the chainlink/deployment environment, which also configures chains for nodes and job distributor + buildChainlinkDeploymentEnv(t, keystoneEnv) // Fund the nodes - fundNodes(t, don, sc) + fundNodes(t, keystoneEnv) + + buildDONTopology(t, in, keystoneEnv) // Deploy keystone contracts (forwarder, capability registry, ocr3 capability) - keystoneContractSet := deployKeystoneContracts(t, testLogger, ctfEnv, chainSelector) + deployKeystoneContracts(t, testLogger, keystoneEnv) - // Deploy and pre-configure workflow registry contract - workflowRegistryAddr := prepareWorkflowRegistry(t, testLogger, ctfEnv, chainSelector, sc, in.WorkflowConfig.DonID) + // Deploy and pre-configure workflow registry contract (using only workflow DON id) + prepareWorkflowRegistry(t, testLogger, keystoneEnv) // Deploy and configure Keystone Feeds Consumer contract - feedsConsumerAddress := prepareFeedsConsumer(t, testLogger, ctfEnv, chainSelector, sc, keystoneContractSet.Forwarder.Address(), in.WorkflowConfig.WorkflowName) - - // Register the workflow (either via CRE CLI or by calling the workflow registry directly) - registerWorkflow(t, in, sc, keystoneContractSet.CapabilitiesRegistry.Address(), workflowRegistryAddr, feedsConsumerAddress, in.WorkflowConfig.DonID, chainSelector, in.WorkflowConfig.WorkflowName, pkey, bc.Nodes[0].HostHTTPUrl, priceProvider.URL()) + prepareFeedsConsumer(t, testLogger, in.WorkflowConfig.WorkflowName, keystoneEnv) - // Create OCR3 and capability jobs for each node JD - ns, _ := configureNodes(t, don, in, bc, keystoneContractSet.CapabilitiesRegistry.Address(), workflowRegistryAddr, keystoneContractSet.Forwarder.Address()) - // JD client needs to be reinitialised after restarting nodes - ctfEnv = ptr.Ptr(reinitialiseJDClient(t, ctfEnv, jdOutput, nodeOutput)) + // Register the workflow (either via CRE CLI or by calling the workflow registry directly; using only workflow DON id) + registerWorkflow(t, in, in.WorkflowConfig.WorkflowName, keystoneEnv) - ips, ports := extraAllowedPortsAndIps(t, testLogger, in, ns) - createNodeJobsWithJd(t, ctfEnv, don, bc, keystoneContractSet, ports, ips) + // update node configuration and create jobs + configureNodes(t, testLogger, in, keystoneEnv) // Log extra information that might help debugging t.Cleanup(func() { if t.Failed() { - logTestInfo(testLogger, in.PriceProvider.FeedID, in.WorkflowConfig.WorkflowName, feedsConsumerAddress.Hex(), keystoneContractSet.Forwarder.Address().Hex()) + logTestInfo(testLogger, in.PriceProvider.FeedID, in.WorkflowConfig.WorkflowName, keystoneEnv.KeystoneContractAddresses.FeedsConsumerAddress.Hex(), keystoneEnv.KeystoneContractAddresses.ForwarderAddress.Hex()) + + logDir := fmt.Sprintf("%s-%s", framework.DefaultCTFLogsDir, t.Name()) + + err := os.RemoveAll(logDir) + if err != nil { + testLogger.Error().Err(err).Msg("failed to remove log directory") + return + } + + _, err = framework.SaveContainerLogs(logDir) + if err != nil { + testLogger.Error().Err(err).Msg("failed to save container logs") + return + } + + printTestDebug(t, testLogger, keystoneEnv) } }) - // set variables that are needed for the cleanup function, which debugs report transmissions - nodes = &ns - wsRPCURL = &bc.Nodes[0].HostWSUrl - // CAUTION: It is crucial to configure OCR3 jobs on nodes before configuring the workflow contracts. // Wait for OCR listeners to be ready before setting the configuration. // If the ConfigSet event is missed, OCR protocol will not start. @@ -2065,14 +2491,14 @@ func TestKeystoneWithOCR3Workflow(t *testing.T) { testLogger.Info().Msg("Proceeding to set OCR3 configuration.") // Configure the workflow DON and contracts - configureWorkflowDON(t, ctfEnv, don, chainSelector) + configureContracts(t, keystoneEnv) // It can take a while before the first report is produced, particularly on CI. timeout := 10 * time.Minute ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(feedsConsumerAddress, sc.Client) + feedsConsumerInstance, err := feeds_consumer.NewKeystoneFeedsConsumer(keystoneEnv.KeystoneContractAddresses.FeedsConsumerAddress, keystoneEnv.SethClient.Client) require.NoError(t, err, "failed to create feeds consumer instance") testLogger.Info().Msg("Waiting for feed to update...") @@ -2087,14 +2513,14 @@ func TestKeystoneWithOCR3Workflow(t *testing.T) { case <-time.After(10 * time.Second): elapsed := time.Since(startTime).Round(time.Second) price, _, err := feedsConsumerInstance.GetPrice( - sc.NewCallOpts(), + keystoneEnv.SethClient.NewCallOpts(), feedBytes, ) require.NoError(t, err, "failed to get price from Keystone Consumer contract") - if !priceProvider.NextPrice(price, elapsed) { + if !keystoneEnv.PriceProvider.NextPrice(price, elapsed) { // check if all expected prices were found and finish the test - priceProvider.CheckPrices() + keystoneEnv.PriceProvider.CheckPrices() return } testLogger.Info().Msgf("Feed not updated yet, waiting for %s", elapsed) From fba3796a5d4f936ba28590d1ec8724394f49b35e Mon Sep 17 00:00:00 2001 From: Rens Rooimans Date: Thu, 13 Feb 2025 14:59:16 +0100 Subject: [PATCH 53/83] Bump npm deps and Foundry (#16293) * bump foundry * bump npm deps * bump solhint * changeset * add default.allow_internal_expect_revert --- contracts/.changeset/eight-starfishes-own.md | 5 + contracts/.solhint-test.json | 2 +- contracts/.solhint.json | 2 +- contracts/GNUmakefile | 2 +- contracts/STYLE_GUIDE.md | 4 +- contracts/package.json | 26 +- contracts/pnpm-lock.yaml | 545 +++++++++--------- .../test/libraries/MerkleMultiProof.t.sol | 2 + .../libraries/test/ByteUtilTest.t.sol | 11 + .../test/util/SortedSetValidationUtil.t.sol | 13 +- contracts/src/v0.8/vrf/dev/ArbitrumL1Fees.sol | 1 - contracts/src/v0.8/vrf/dev/OptimismL1Fees.sol | 1 - .../src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol | 1 - .../vrf/dev/VRFCoordinatorV2_5_Arbitrum.sol | 1 - .../vrf/dev/VRFCoordinatorV2_5_Optimism.sol | 1 - .../vrf/dev/VRFV2PlusWrapper_Arbitrum.sol | 1 - .../vrf/dev/VRFV2PlusWrapper_Optimism.sol | 1 - .../testhelpers/ExposedVRFCoordinatorV2_5.sol | 1 - .../ExposedVRFCoordinatorV2_5_Arbitrum.sol | 1 - .../ExposedVRFCoordinatorV2_5_Optimism.sol | 1 - .../testhelpers/VRFCoordinatorTestV2_5.sol | 1 - .../VRFCoordinatorV2Plus_V2Example.sol | 1 - 22 files changed, 329 insertions(+), 295 deletions(-) create mode 100644 contracts/.changeset/eight-starfishes-own.md diff --git a/contracts/.changeset/eight-starfishes-own.md b/contracts/.changeset/eight-starfishes-own.md new file mode 100644 index 00000000000..17e07711cde --- /dev/null +++ b/contracts/.changeset/eight-starfishes-own.md @@ -0,0 +1,5 @@ +--- +'@chainlink/contracts': patch +--- + +#internal fix solhint issues diff --git a/contracts/.solhint-test.json b/contracts/.solhint-test.json index e26b18b597b..3f12e3457f2 100644 --- a/contracts/.solhint-test.json +++ b/contracts/.solhint-test.json @@ -9,7 +9,7 @@ "func-named-parameters": "off", "immutable-vars-naming": "off", "no-inline-assembly": "off", - "contract-name-camelcase": "off", + "contract-name-capwords": "off", "one-contract-per-file": "off", "avoid-low-level-calls": "off", "reentrancy": "off", diff --git a/contracts/.solhint.json b/contracts/.solhint.json index 5168d4e7838..8ba4f120395 100644 --- a/contracts/.solhint.json +++ b/contracts/.solhint.json @@ -9,7 +9,7 @@ "func-named-parameters": "off", "immutable-vars-naming": "off", "no-inline-assembly": "off", - "contract-name-camelcase": "off", + "contract-name-capwords": "off", "no-unused-import": "error", "gas-struct-packing": "warn", "interface-starts-with-i": "warn", diff --git a/contracts/GNUmakefile b/contracts/GNUmakefile index 835a712c2d8..37422b6a8e9 100644 --- a/contracts/GNUmakefile +++ b/contracts/GNUmakefile @@ -43,7 +43,7 @@ mockery: $(mockery) ## Install mockery. .PHONY: foundry foundry: ## Install foundry. - foundryup --install v0.3.0 + foundryup --install v1.0.0 .PHONY: foundry-refresh foundry-refresh: foundry diff --git a/contracts/STYLE_GUIDE.md b/contracts/STYLE_GUIDE.md index 1fbdc061f23..091fdc479bc 100644 --- a/contracts/STYLE_GUIDE.md +++ b/contracts/STYLE_GUIDE.md @@ -219,8 +219,8 @@ Please read the [Foundry Guide](FOUNDRY_GUIDE.md). No new tests should be writte - Otherwise, Solidity contracts should have a pragma that is locked to a specific version. - Example: Most concrete contracts. - Avoid changing pragmas after the audit. Unless there is a bug that affects your contract, then you should try to stick to a known good pragma. In practice, this means we typically only support one (occasionally two) pragma for any “major”(minor by Semver naming) Solidity version. -- The current advised pragma is `0.8.24`, lower versions should be avoided when starting a new project. Newer versions can be considered. - - Explicitly use the `Paris` hardfork when compiling with 0.8.24 to keep the bytecode compatible with all chains. +- The current advised pragma is `0.8.26`, lower versions should be avoided when starting a new project. Newer versions can be considered. + - Explicitly use the `Paris` hardfork when compiling with >=0.8.20 to keep the bytecode compatible with all chains. - All contracts should have an SPDX license identifier. If unsure about which one to pick, please consult with legal. Most older contracts have been MIT, but some of the newer products have been using BUSL-1.1 diff --git a/contracts/package.json b/contracts/package.json index 2401451cbec..0fe5dcbce6f 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -49,49 +49,49 @@ "@nomicfoundation/hardhat-chai-matchers": "^1.0.6", "@nomicfoundation/hardhat-ethers": "^3.0.8", "@nomicfoundation/hardhat-network-helpers": "^1.0.12", - "@nomicfoundation/hardhat-verify": "^2.0.11", + "@nomicfoundation/hardhat-verify": "^2.0.12", "@typechain/ethers-v5": "^7.2.0", "@typechain/hardhat": "^7.0.0", "@types/cbor": "~5.0.1", "@types/chai": "^4.3.20", "@types/debug": "^4.1.12", - "@types/deep-equal-in-any-order": "^1.0.3", - "@types/mocha": "^10.0.8", - "@types/node": "^20.16.10", + "@types/deep-equal-in-any-order": "^1.0.4", + "@types/mocha": "^10.0.10", + "@types/node": "^20.17.17", "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", "abi-to-sol": "^0.6.6", "cbor": "^5.2.0", "chai": "^4.5.0", - "debug": "^4.3.7", + "debug": "^4.4.0", "deep-equal-in-any-order": "^2.0.6", "eslint": "^8.57.1", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-prettier": "^5.2.3", "ethers": "~5.7.2", "hardhat": "~2.20.1", "hardhat-abi-exporter": "^2.10.1", - "hardhat-ignore-warnings": "^0.2.6", + "hardhat-ignore-warnings": "^0.2.12", "moment": "^2.30.1", - "prettier": "^3.3.3", - "prettier-plugin-solidity": "^1.4.1", - "solhint": "^5.0.3", + "prettier": "^3.5.0", + "prettier-plugin-solidity": "^1.4.2", + "solhint": "^5.0.5", "solhint-plugin-chainlink-solidity": "git+https://github.com/smartcontractkit/chainlink-solhint-rules.git#v1.2.1", "solhint-plugin-prettier": "^0.1.0", "ts-node": "^10.9.2", "typechain": "^8.2.1", - "typescript": "^5.6.2" + "typescript": "^5.7.3" }, "dependencies": { "@arbitrum/nitro-contracts": "1.1.1", "@arbitrum/token-bridge-contracts": "1.1.2", - "@changesets/cli": "~2.27.8", + "@changesets/cli": "~2.27.12", "@changesets/get-github-info": "^0.6.0", "@eth-optimism/contracts": "0.6.0", "@openzeppelin/contracts": "4.9.3", "@openzeppelin/contracts-upgradeable": "4.9.3", "@scroll-tech/contracts": "0.1.0", "@zksync/contracts": "git+https://github.com/matter-labs/era-contracts.git#446d391d34bdb48255d5f8fef8a8248925fc98b9", - "semver": "^7.6.3" + "semver": "^7.7.1" } } diff --git a/contracts/pnpm-lock.yaml b/contracts/pnpm-lock.yaml index 2ea91943b13..232a8900409 100644 --- a/contracts/pnpm-lock.yaml +++ b/contracts/pnpm-lock.yaml @@ -18,8 +18,8 @@ importers: specifier: 1.1.2 version: 1.1.2 '@changesets/cli': - specifier: ~2.27.8 - version: 2.27.8 + specifier: ~2.27.12 + version: 2.27.12 '@changesets/get-github-info': specifier: ^0.6.0 version: 0.6.0 @@ -39,8 +39,8 @@ importers: specifier: git+https://github.com/matter-labs/era-contracts.git#446d391d34bdb48255d5f8fef8a8248925fc98b9 version: era-contracts@https://codeload.github.com/matter-labs/era-contracts/tar.gz/446d391d34bdb48255d5f8fef8a8248925fc98b9 semver: - specifier: ^7.6.3 - version: 7.6.3 + specifier: ^7.7.1 + version: 7.7.1 devDependencies: '@ethereum-waffle/mock-contract': specifier: ^3.4.4 @@ -59,22 +59,22 @@ importers: version: 5.7.2 '@nomicfoundation/hardhat-chai-matchers': specifier: ^1.0.6 - version: 1.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)) + version: 1.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)))(chai@4.5.0)(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) '@nomicfoundation/hardhat-ethers': specifier: ^3.0.8 - version: 3.0.8(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)) + version: 3.0.8(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) '@nomicfoundation/hardhat-network-helpers': specifier: ^1.0.12 - version: 1.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)) + version: 1.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) '@nomicfoundation/hardhat-verify': - specifier: ^2.0.11 - version: 2.0.11(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)) + specifier: ^2.0.12 + version: 2.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) '@typechain/ethers-v5': specifier: ^7.2.0 - version: 7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) + version: 7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3) '@typechain/hardhat': specifier: ^7.0.0 - version: 7.0.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2)) + version: 7.0.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3))(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))(typechain@8.3.2(typescript@5.7.3)) '@types/cbor': specifier: ~5.0.1 version: 5.0.1 @@ -85,20 +85,20 @@ importers: specifier: ^4.1.12 version: 4.1.12 '@types/deep-equal-in-any-order': - specifier: ^1.0.3 - version: 1.0.3 + specifier: ^1.0.4 + version: 1.0.4 '@types/mocha': - specifier: ^10.0.8 - version: 10.0.8 + specifier: ^10.0.10 + version: 10.0.10 '@types/node': - specifier: ^20.16.10 - version: 20.16.10 + specifier: ^20.17.17 + version: 20.17.17 '@typescript-eslint/eslint-plugin': specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) '@typescript-eslint/parser': specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.6.2) + version: 7.18.0(eslint@8.57.1)(typescript@5.7.3) abi-to-sol: specifier: ^0.6.6 version: 0.6.6 @@ -109,8 +109,8 @@ importers: specifier: ^4.5.0 version: 4.5.0 debug: - specifier: ^4.3.7 - version: 4.3.7 + specifier: ^4.4.0 + version: 4.4.0 deep-equal-in-any-order: specifier: ^2.0.6 version: 2.0.6 @@ -121,47 +121,47 @@ importers: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.1) eslint-plugin-prettier: - specifier: ^5.2.1 - version: 5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3) + specifier: ^5.2.3 + version: 5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.0) ethers: specifier: ~5.7.2 version: 5.7.2 hardhat: specifier: ~2.20.1 - version: 2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2) + version: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) hardhat-abi-exporter: specifier: ^2.10.1 - version: 2.10.1(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)) + version: 2.10.1(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) hardhat-ignore-warnings: - specifier: ^0.2.6 - version: 0.2.11 + specifier: ^0.2.12 + version: 0.2.12 moment: specifier: ^2.30.1 version: 2.30.1 prettier: - specifier: ^3.3.3 - version: 3.3.3 + specifier: ^3.5.0 + version: 3.5.0 prettier-plugin-solidity: - specifier: ^1.4.1 - version: 1.4.1(prettier@3.3.3) + specifier: ^1.4.2 + version: 1.4.2(prettier@3.5.0) solhint: - specifier: ^5.0.3 - version: 5.0.3 + specifier: ^5.0.5 + version: 5.0.5 solhint-plugin-chainlink-solidity: specifier: git+https://github.com/smartcontractkit/chainlink-solhint-rules.git#v1.2.1 version: '@chainlink/solhint-plugin-chainlink-solidity@https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/1b4c0c2663fcd983589d4f33a2e73908624ed43c' solhint-plugin-prettier: specifier: ^0.1.0 - version: 0.1.0(prettier-plugin-solidity@1.4.1(prettier@3.3.3))(prettier@3.3.3) + version: 0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.0))(prettier@3.5.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) + version: 10.9.2(@types/node@20.17.17)(typescript@5.7.3) typechain: specifier: ^8.2.1 - version: 8.3.2(typescript@5.6.2) + version: 8.3.2(typescript@5.7.3) typescript: - specifier: ^5.6.2 - version: 5.6.2 + specifier: ^5.7.3 + version: 5.7.3 packages: @@ -195,21 +195,21 @@ packages: resolution: {tarball: https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/1b4c0c2663fcd983589d4f33a2e73908624ed43c} version: 1.2.0 - '@changesets/apply-release-plan@7.0.5': - resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + '@changesets/apply-release-plan@7.0.8': + resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} - '@changesets/assemble-release-plan@6.0.4': - resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + '@changesets/assemble-release-plan@6.0.5': + resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - '@changesets/cli@2.27.8': - resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} + '@changesets/cli@2.27.12': + resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} hasBin: true - '@changesets/config@3.0.3': - resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + '@changesets/config@3.0.5': + resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -220,14 +220,14 @@ packages: '@changesets/get-github-info@0.6.0': resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} - '@changesets/get-release-plan@4.0.4': - resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + '@changesets/get-release-plan@4.0.6': + resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.1': - resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + '@changesets/git@3.0.2': + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} @@ -238,8 +238,8 @@ packages: '@changesets/pre@2.0.1': resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} - '@changesets/read@0.6.1': - resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + '@changesets/read@0.6.2': + resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} '@changesets/should-skip-package@0.1.1': resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} @@ -513,8 +513,8 @@ packages: peerDependencies: hardhat: ^2.9.5 - '@nomicfoundation/hardhat-verify@2.0.11': - resolution: {integrity: sha512-lGIo4dNjVQFdsiEgZp3KP6ntLiF7xJEJsbNHfSyIiFCyI0Yv0518ElsFtMC5uCuHEChiBBMrib9jWQvHHT+X3Q==} + '@nomicfoundation/hardhat-verify@2.0.12': + resolution: {integrity: sha512-Lg3Nu7DCXASQRVI/YysjuAX2z8jwOCbS0w5tz2HalWGSTZThqA0v9N0v0psHbKNqzPJa8bNOeapIVSziyJTnAg==} peerDependencies: hardhat: ^2.0.4 @@ -684,8 +684,8 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@solidity-parser/parser@0.18.0': - resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + '@solidity-parser/parser@0.19.0': + resolution: {integrity: sha512-RV16k/qIxW/wWc+mLzV3ARyKUaMUTBy9tOLMzFhtNSKYeTAanQ3a5MudJKf/8arIFnA2L27SNjarQKmFg0w/jA==} '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} @@ -750,8 +750,8 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/deep-equal-in-any-order@1.0.3': - resolution: {integrity: sha512-jT0O3hAILDKeKbdWJ9FZLD0Xdfhz7hMvfyFlRWpirjiEVr8G+GZ4kVIzPIqM6x6Rpp93TNPgOAed4XmvcuV6Qg==} + '@types/deep-equal-in-any-order@1.0.4': + resolution: {integrity: sha512-nkgl+KTkRWeybgMSBCrWrc1YHFrLADVxZ6Kllj40p9U499NGsCrFUjzgHgQY+Upsa/VWOc3YlsFEvhg+drUmkA==} '@types/http-cache-semantics@4.0.1': resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} @@ -762,8 +762,8 @@ packages: '@types/lru-cache@5.1.1': resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - '@types/mocha@10.0.8': - resolution: {integrity: sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==} + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} '@types/ms@0.7.31': resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} @@ -771,8 +771,8 @@ packages: '@types/node@12.19.16': resolution: {integrity: sha512-7xHmXm/QJ7cbK2laF+YYD7gb5MggHIIQwqyjin3bpEGiSuvScMQ5JZZXPvRipi1MwckTQbJZROMns/JxdnIL1Q==} - '@types/node@20.16.10': - resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} + '@types/node@20.17.17': + resolution: {integrity: sha512-/WndGO4kIfMicEQLTi/mDANUu/iVUhT7KboZPdEqqHQ4aTS+3qT3U5gIqWDFV+XouorjfgGqvKILJeHhuQgFYg==} '@types/pbkdf2@3.1.0': resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} @@ -789,9 +789,6 @@ packages: '@types/secp256k1@4.0.3': resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} - '@types/semver@7.5.0': - resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} - '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -1056,6 +1053,10 @@ packages: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} @@ -1244,9 +1245,6 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@6.0.5: resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} engines: {node: '>=4.8'} @@ -1255,6 +1253,10 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} @@ -1279,8 +1281,8 @@ packages: supports-color: optional: true - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1371,6 +1373,10 @@ packages: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -1435,8 +1441,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.2.1: - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + eslint-plugin-prettier@5.2.3: + resolution: {integrity: sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -1558,6 +1564,10 @@ packages: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + find-replace@3.0.0: resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} engines: {node: '>=4.0.0'} @@ -1725,8 +1735,8 @@ packages: peerDependencies: hardhat: ^2.0.0 - hardhat-ignore-warnings@0.2.11: - resolution: {integrity: sha512-+nHnRbP6COFZaXE7HAY7TZNE3au5vHe5dkcnyq0XaP07ikT2fJ3NhFY0vn7Deh4Qbz0Z/9Xpnj2ki6Ktgk61pg==} + hardhat-ignore-warnings@0.2.12: + resolution: {integrity: sha512-SaxCLKzYBMk3Rd1275TnanUmmxwgU+bu4Ekf2MKcqXxxt6xTGcPTtTaM+USrLgmejZHC4Itg/PaWITlOp4RL3g==} hardhat@2.20.1: resolution: {integrity: sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==} @@ -2141,9 +2151,6 @@ packages: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} @@ -2165,6 +2172,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -2461,9 +2472,9 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-solidity@1.4.1: - resolution: {integrity: sha512-Mq8EtfacVZ/0+uDKTtHZGW3Aa7vEbX/BNx63hmVg6YTiTXSiuKP0amj0G6pGwjmLaOfymWh3QgXEZkjQbU8QRg==} - engines: {node: '>=16'} + prettier-plugin-solidity@1.4.2: + resolution: {integrity: sha512-VVD/4XlDjSzyPWWCPW8JEleFa8JNKFYac5kNlMjVXemQyQZKfpekPMhFZSePuXB6L+RixlFvWe20iacGjFYrLw==} + engines: {node: '>=18'} peerDependencies: prettier: '>=2.3.0' @@ -2472,8 +2483,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.5.0: + resolution: {integrity: sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==} engines: {node: '>=14'} hasBin: true @@ -2483,9 +2494,6 @@ packages: proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -2643,8 +2651,8 @@ packages: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} engines: {node: '>=10'} hasBin: true @@ -2701,6 +2709,10 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + slash@2.0.0: resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} engines: {node: '>=6'} @@ -2727,8 +2739,8 @@ packages: prettier: ^3.0.0 prettier-plugin-solidity: ^1.0.0 - solhint@5.0.3: - resolution: {integrity: sha512-OLCH6qm/mZTCpplTXzXTJGId1zrtNuDYP5c2e6snIv/hdRVxPfBBz/bAlL91bY/Accavkayp2Zp2BaDSrLVXTQ==} + solhint@5.0.5: + resolution: {integrity: sha512-WrnG6T+/UduuzSWsSOAbfq1ywLUDwNea3Gd5hg6PS+pLUm8lz2ECNr0beX609clBxmDeZ3676AiA9nPDljmbJQ==} hasBin: true solidity-ast@0.4.56: @@ -2808,8 +2820,8 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -3030,8 +3042,8 @@ packages: resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} engines: {node: '>= 0.4'} - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -3163,9 +3175,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -3230,11 +3239,11 @@ snapshots: '@chainlink/solhint-plugin-chainlink-solidity@https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/1b4c0c2663fcd983589d4f33a2e73908624ed43c': {} - '@changesets/apply-release-plan@7.0.5': + '@changesets/apply-release-plan@7.0.8': dependencies: - '@changesets/config': 3.0.3 + '@changesets/config': 3.0.5 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.1 + '@changesets/git': 3.0.2 '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -3244,55 +3253,53 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.6.3 + semver: 7.7.1 - '@changesets/assemble-release-plan@6.0.4': + '@changesets/assemble-release-plan@6.0.5': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - semver: 7.6.3 + semver: 7.7.1 '@changesets/changelog-git@0.2.0': dependencies: '@changesets/types': 6.0.0 - '@changesets/cli@2.27.8': + '@changesets/cli@2.27.12': dependencies: - '@changesets/apply-release-plan': 7.0.5 - '@changesets/assemble-release-plan': 6.0.4 + '@changesets/apply-release-plan': 7.0.8 + '@changesets/assemble-release-plan': 6.0.5 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.3 + '@changesets/config': 3.0.5 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.4 - '@changesets/git': 3.0.1 + '@changesets/get-release-plan': 4.0.6 + '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@changesets/read': 0.6.2 '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@changesets/write': 0.3.2 '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.0 ansi-colors: 4.1.3 ci-info: 3.9.0 - enquirer: 2.3.6 + enquirer: 2.4.1 external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 - outdent: 0.5.0 p-limit: 2.3.0 package-manager-detector: 0.2.0 picocolors: 1.1.0 resolve-from: 5.0.0 - semver: 7.6.3 - spawndamnit: 2.0.0 + semver: 7.7.1 + spawndamnit: 3.0.1 term-size: 2.2.1 - '@changesets/config@3.0.3': + '@changesets/config@3.0.5': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 @@ -3300,7 +3307,7 @@ snapshots: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.5 + micromatch: 4.0.8 '@changesets/errors@0.2.0': dependencies: @@ -3311,7 +3318,7 @@ snapshots: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.0 - semver: 7.6.3 + semver: 7.7.1 '@changesets/get-github-info@0.6.0': dependencies: @@ -3320,24 +3327,24 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.4': + '@changesets/get-release-plan@4.0.6': dependencies: - '@changesets/assemble-release-plan': 6.0.4 - '@changesets/config': 3.0.3 + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/config': 3.0.5 '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@changesets/read': 0.6.2 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.1': + '@changesets/git@3.0.2': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.5 - spawndamnit: 2.0.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 '@changesets/logger@0.1.1': dependencies: @@ -3355,9 +3362,9 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.1': + '@changesets/read@0.6.2': dependencies: - '@changesets/git': 3.0.1 + '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 '@changesets/parse': 0.4.0 '@changesets/types': 6.0.0 @@ -3395,7 +3402,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7 + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -3708,7 +3715,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -3786,7 +3793,7 @@ snapshots: '@nomicfoundation/ethereumjs-trie': 6.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - debug: 4.3.7 + debug: 4.4.0 ethereum-cryptography: 0.1.3 lru-cache: 10.2.2 transitivePeerDependencies: @@ -3816,7 +3823,7 @@ snapshots: '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 '@types/debug': 4.1.12 - debug: 4.3.7 + debug: 4.4.0 ethereum-cryptography: 0.1.3 rustbn-wasm: 0.2.0 transitivePeerDependencies: @@ -3832,7 +3839,7 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 '@nomicfoundation/ethereumjs-trie': 6.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - debug: 4.3.7 + debug: 4.4.0 ethereum-cryptography: 0.1.3 js-sdsl: 4.4.2 lru-cache: 10.2.2 @@ -3885,48 +3892,48 @@ snapshots: '@nomicfoundation/ethereumjs-trie': 6.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - debug: 4.3.7 + debug: 4.4.0 ethereum-cryptography: 0.1.3 transitivePeerDependencies: - '@nomicfoundation/ethereumjs-verkle' - c-kzg - supports-color - '@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)))(chai@4.5.0)(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2))': + '@nomicfoundation/hardhat-chai-matchers@1.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)))(chai@4.5.0)(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': dependencies: '@ethersproject/abi': 5.7.0 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)) '@types/chai-as-promised': 7.1.8 chai: 4.5.0 chai-as-promised: 7.1.1(chai@4.5.0) deep-eql: 4.1.3 ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2))': + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': dependencies: - debug: 4.3.7 + debug: 4.4.0 ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2))': + '@nomicfoundation/hardhat-network-helpers@1.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) - '@nomicfoundation/hardhat-verify@2.0.11(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2))': + '@nomicfoundation/hardhat-verify@2.0.12(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.7.0 cbor: 8.1.0 - chalk: 2.4.2 - debug: 4.3.7 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2) + debug: 4.4.0 + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) lodash.clonedeep: 4.5.0 + picocolors: 1.1.0 semver: 6.3.0 table: 6.8.1 undici: 5.28.4 @@ -3976,10 +3983,10 @@ snapshots: '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.0 '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.0 - '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2))': + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))': dependencies: ethers: 5.7.2 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) '@offchainlabs/upgrade-executor@1.1.0-beta.0': dependencies: @@ -4007,7 +4014,7 @@ snapshots: cbor: 9.0.2 chalk: 4.1.2 compare-versions: 6.1.1 - debug: 4.3.7 + debug: 4.4.0 ethereumjs-util: 7.1.5 minimist: 1.2.8 proper-lockfile: 4.1.2 @@ -4030,9 +4037,9 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@prettier/sync@0.3.0(prettier@3.3.3)': + '@prettier/sync@0.3.0(prettier@3.5.0)': dependencies: - prettier: 3.3.3 + prettier: 3.5.0 '@scroll-tech/contracts@0.1.0': {} @@ -4100,7 +4107,7 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@solidity-parser/parser@0.18.0': {} + '@solidity-parser/parser@0.19.0': {} '@szmarczak/http-timer@5.0.1': dependencies: @@ -4115,7 +4122,7 @@ snapshots: '@truffle/contract-schema@3.4.10': dependencies: ajv: 6.12.6 - debug: 4.3.7 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -4127,45 +4134,45 @@ snapshots: '@tsconfig/node16@1.0.3': {} - '@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2)': + '@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3)': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/bytes': 5.7.0 '@ethersproject/providers': 5.7.2 ethers: 5.7.2 lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.6.2) - typechain: 8.3.2(typescript@5.6.2) - typescript: 5.6.2 + ts-essentials: 7.0.3(typescript@5.7.3) + typechain: 8.3.2(typescript@5.7.3) + typescript: 5.7.3 - '@typechain/hardhat@7.0.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2))(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2))(typechain@8.3.2(typescript@5.6.2))': + '@typechain/hardhat@7.0.0(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(@typechain/ethers-v5@7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3))(ethers@5.7.2)(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3))(typechain@8.3.2(typescript@5.7.3))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/providers': 5.7.2 - '@typechain/ethers-v5': 7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.6.2))(typescript@5.6.2) + '@typechain/ethers-v5': 7.2.0(@ethersproject/abi@5.7.0)(@ethersproject/bytes@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2(typescript@5.7.3))(typescript@5.7.3) ethers: 5.7.2 fs-extra: 9.1.0 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2) - typechain: 8.3.2(typescript@5.6.2) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) + typechain: 8.3.2(typescript@5.7.3) '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.17 '@types/bn.js@5.1.1': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.17 '@types/cacheable-request@6.0.2': dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 20.16.10 + '@types/node': 20.17.17 '@types/responselike': 1.0.0 '@types/cbor@5.0.1': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.17 '@types/chai-as-promised@7.1.8': dependencies: @@ -4177,75 +4184,73 @@ snapshots: dependencies: '@types/ms': 0.7.31 - '@types/deep-equal-in-any-order@1.0.3': {} + '@types/deep-equal-in-any-order@1.0.4': {} '@types/http-cache-semantics@4.0.1': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.17 '@types/lru-cache@5.1.1': {} - '@types/mocha@10.0.8': {} + '@types/mocha@10.0.10': {} '@types/ms@0.7.31': {} '@types/node@12.19.16': {} - '@types/node@20.16.10': + '@types/node@20.17.17': dependencies: undici-types: 6.19.8 '@types/pbkdf2@3.1.0': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.17 '@types/prettier@2.7.1': {} '@types/readable-stream@2.3.15': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.17 safe-buffer: 5.1.2 '@types/responselike@1.0.0': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.17 '@types/secp256k1@4.0.3': dependencies: - '@types/node': 20.16.10 + '@types/node': 20.17.17 - '@types/semver@7.5.0': {} - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.7.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7 + debug: 4.4.0 eslint: 8.57.1 optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -4254,41 +4259,41 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.6.2) - debug: 4.3.7 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.7.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.4 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + semver: 7.7.1 + ts-api-utils: 1.3.0(typescript@5.7.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.6.2)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) eslint: 8.57.1 transitivePeerDependencies: - supports-color @@ -4310,11 +4315,11 @@ snapshots: ajv: 6.12.6 better-ajv-errors: 0.8.2(ajv@6.12.6) neodoc: 2.0.2 - semver: 7.6.3 + semver: 7.7.1 source-map-support: 0.5.21 optionalDependencies: prettier: 2.8.8 - prettier-plugin-solidity: 1.4.1(prettier@2.8.8) + prettier-plugin-solidity: 1.4.2(prettier@2.8.8) transitivePeerDependencies: - supports-color @@ -4334,7 +4339,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -4524,6 +4529,10 @@ snapshots: dependencies: fill-range: 7.0.1 + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + brorand@1.1.0: {} browser-stdout@1.3.1: {} @@ -4773,12 +4782,6 @@ snapshots: create-require@1.1.1: {} - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@6.0.5: dependencies: nice-try: 1.0.5 @@ -4793,6 +4796,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + data-view-buffer@1.0.1: dependencies: call-bind: 1.0.7 @@ -4822,7 +4831,7 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -4915,6 +4924,11 @@ snapshots: dependencies: ansi-colors: 4.1.3 + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + env-paths@2.2.1: {} era-contracts@https://codeload.github.com/matter-labs/era-contracts/tar.gz/446d391d34bdb48255d5f8fef8a8248925fc98b9: {} @@ -5065,10 +5079,10 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.3.3): + eslint-plugin-prettier@5.2.3(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.5.0): dependencies: eslint: 8.57.1 - prettier: 3.3.3 + prettier: 3.5.0 prettier-linter-helpers: 1.0.0 synckit: 0.9.1 optionalDependencies: @@ -5094,7 +5108,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7 + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -5287,6 +5301,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + find-replace@3.0.0: dependencies: array-back: 3.1.0 @@ -5319,9 +5337,9 @@ snapshots: flatted@3.3.1: {} - follow-redirects@1.15.6(debug@4.3.7): + follow-redirects@1.15.6(debug@4.4.0): optionalDependencies: - debug: 4.3.7 + debug: 4.4.0 for-each@0.3.3: dependencies: @@ -5506,19 +5524,19 @@ snapshots: graphemer@1.4.0: {} - hardhat-abi-exporter@2.10.1(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2)): + hardhat-abi-exporter@2.10.1(hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3)): dependencies: '@ethersproject/abi': 5.7.0 delete-empty: 3.0.0 - hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2) + hardhat: 2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3) - hardhat-ignore-warnings@0.2.11: + hardhat-ignore-warnings@0.2.12: dependencies: minimatch: 5.1.6 node-interval-tree: 2.1.2 solidity-comments: 0.0.2 - hardhat@2.20.1(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2))(typescript@5.6.2): + hardhat@2.20.1(ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3))(typescript@5.7.3): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -5544,7 +5562,7 @@ snapshots: chalk: 2.4.2 chokidar: 3.5.3 ci-info: 2.0.0 - debug: 4.3.7 + debug: 4.4.0 enquirer: 2.3.6 env-paths: 2.2.1 ethereum-cryptography: 1.1.2 @@ -5563,7 +5581,7 @@ snapshots: raw-body: 2.5.1 resolve: 1.17.0 semver: 6.3.0 - solc: 0.7.3(debug@4.3.7) + solc: 0.7.3(debug@4.4.0) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 tsort: 0.0.1 @@ -5571,8 +5589,8 @@ snapshots: uuid: 8.3.2 ws: 7.5.9 optionalDependencies: - ts-node: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) - typescript: 5.6.2 + ts-node: 10.9.2(@types/node@20.17.17)(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - bufferutil - c-kzg @@ -5667,7 +5685,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5984,11 +6002,6 @@ snapshots: lru-cache@10.2.2: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - lru_map@0.3.3: {} make-error@1.3.6: {} @@ -6008,6 +6021,11 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + mimic-response@1.0.1: {} mimic-response@3.1.0: {} @@ -6204,7 +6222,7 @@ snapshots: got: 12.1.0 registry-auth-token: 5.0.2 registry-url: 6.0.1 - semver: 7.6.3 + semver: 7.7.1 package-manager-detector@0.2.0: {} @@ -6292,22 +6310,22 @@ snapshots: dependencies: fast-diff: 1.2.0 - prettier-plugin-solidity@1.4.1(prettier@2.8.8): + prettier-plugin-solidity@1.4.2(prettier@2.8.8): dependencies: - '@solidity-parser/parser': 0.18.0 + '@solidity-parser/parser': 0.19.0 prettier: 2.8.8 - semver: 7.6.3 + semver: 7.7.1 optional: true - prettier-plugin-solidity@1.4.1(prettier@3.3.3): + prettier-plugin-solidity@1.4.2(prettier@3.5.0): dependencies: - '@solidity-parser/parser': 0.18.0 - prettier: 3.3.3 - semver: 7.6.3 + '@solidity-parser/parser': 0.19.0 + prettier: 3.5.0 + semver: 7.7.1 prettier@2.8.8: {} - prettier@3.3.3: {} + prettier@3.5.0: {} proper-lockfile@4.1.2: dependencies: @@ -6318,8 +6336,6 @@ snapshots: proto-list@1.2.4: {} - pseudomap@1.0.2: {} - pump@3.0.0: dependencies: end-of-stream: 1.4.4 @@ -6489,7 +6505,7 @@ snapshots: semver@6.3.0: {} - semver@7.6.3: {} + semver@7.7.1: {} sentence-case@2.1.1: dependencies: @@ -6555,7 +6571,10 @@ snapshots: object-inspect: 1.13.1 optional: true - signal-exit@3.0.7: {} + signal-exit@3.0.7: + optional: true + + signal-exit@4.1.0: {} slash@2.0.0: {} @@ -6571,11 +6590,11 @@ snapshots: dependencies: no-case: 2.3.2 - solc@0.7.3(debug@4.3.7): + solc@0.7.3(debug@4.4.0): dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.6(debug@4.3.7) + follow-redirects: 1.15.6(debug@4.4.0) fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 @@ -6585,16 +6604,16 @@ snapshots: transitivePeerDependencies: - debug - solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.1(prettier@3.3.3))(prettier@3.3.3): + solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.4.2(prettier@3.5.0))(prettier@3.5.0): dependencies: - '@prettier/sync': 0.3.0(prettier@3.3.3) - prettier: 3.3.3 + '@prettier/sync': 0.3.0(prettier@3.5.0) + prettier: 3.5.0 prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.4.1(prettier@3.3.3) + prettier-plugin-solidity: 1.4.2(prettier@3.5.0) - solhint@5.0.3: + solhint@5.0.5: dependencies: - '@solidity-parser/parser': 0.18.0 + '@solidity-parser/parser': 0.19.0 ajv: 6.12.6 antlr4: 4.13.1-patch-1 ast-parents: 0.0.1 @@ -6608,7 +6627,7 @@ snapshots: latest-version: 7.0.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.6.3 + semver: 7.7.1 strip-ansi: 6.0.1 table: 6.8.1 text-table: 0.2.0 @@ -6674,10 +6693,10 @@ snapshots: source-map@0.6.1: {} - spawndamnit@2.0.0: + spawndamnit@3.0.1: dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 + cross-spawn: 7.0.6 + signal-exit: 4.1.0 sprintf-js@1.0.3: {} @@ -6814,9 +6833,9 @@ snapshots: tr46@0.0.3: {} - ts-api-utils@1.3.0(typescript@5.6.2): + ts-api-utils@1.3.0(typescript@5.7.3): dependencies: - typescript: 5.6.2 + typescript: 5.7.3 ts-command-line-args@2.5.1: dependencies: @@ -6825,25 +6844,25 @@ snapshots: command-line-usage: 6.1.3 string-format: 2.0.0 - ts-essentials@7.0.3(typescript@5.6.2): + ts-essentials@7.0.3(typescript@5.7.3): dependencies: - typescript: 5.6.2 + typescript: 5.7.3 - ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2): + ts-node@10.9.2(@types/node@20.17.17)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 20.16.10 + '@types/node': 20.17.17 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.6.2 + typescript: 5.7.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -6871,10 +6890,10 @@ snapshots: type-fest@0.7.1: {} - typechain@8.3.2(typescript@5.6.2): + typechain@8.3.2(typescript@5.7.3): dependencies: '@types/prettier': 2.7.1 - debug: 4.3.7 + debug: 4.4.0 fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -6882,8 +6901,8 @@ snapshots: mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.6.2) - typescript: 5.6.2 + ts-essentials: 7.0.3(typescript@5.7.3) + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -6954,7 +6973,7 @@ snapshots: possible-typed-array-names: 1.0.0 optional: true - typescript@5.6.2: {} + typescript@5.7.3: {} typical@4.0.0: {} @@ -7075,8 +7094,6 @@ snapshots: y18n@5.0.8: {} - yallist@2.1.2: {} - yaml@1.10.2: {} yargs-parser@20.2.4: {} diff --git a/contracts/src/v0.8/ccip/test/libraries/MerkleMultiProof.t.sol b/contracts/src/v0.8/ccip/test/libraries/MerkleMultiProof.t.sol index 6a287ce7369..6484f7bcb07 100644 --- a/contracts/src/v0.8/ccip/test/libraries/MerkleMultiProof.t.sol +++ b/contracts/src/v0.8/ccip/test/libraries/MerkleMultiProof.t.sol @@ -167,6 +167,7 @@ contract MerkleMultiProofTest is Test { assertEq(MerkleMultiProof._merkleRoot(leaves, proofs, 0), leaves[0]); } + /// forge-config: default.allow_internal_expect_revert = true function test_RevertWhen_EmptyLeaf() public { bytes32[] memory leaves = new bytes32[](0); bytes32[] memory proofs = new bytes32[](0); @@ -175,6 +176,7 @@ contract MerkleMultiProofTest is Test { MerkleMultiProof._merkleRoot(leaves, proofs, 0); } + /// forge-config: default.allow_internal_expect_revert = true function test_CVE_2023_34459() public { bytes32[] memory leaves = new bytes32[](2); // leaves[0] stays uninitialized, i.e., 0x000...0 diff --git a/contracts/src/v0.8/llo-feeds/libraries/test/ByteUtilTest.t.sol b/contracts/src/v0.8/llo-feeds/libraries/test/ByteUtilTest.t.sol index 8f11dab0936..d0ad9256325 100644 --- a/contracts/src/v0.8/llo-feeds/libraries/test/ByteUtilTest.t.sol +++ b/contracts/src/v0.8/llo-feeds/libraries/test/ByteUtilTest.t.sol @@ -87,6 +87,7 @@ contract ByteUtilTest is Test { assertEq(result, type(uint32).max << 24); } + /// forge-config: default.allow_internal_expect_revert = true function test_readUint256WithNotEnoughBytes() public { //should revert if there's not enough bytes vm.expectRevert(MALFORMED_ERROR_SELECTOR); @@ -95,6 +96,7 @@ contract ByteUtilTest is Test { B_128._readUint256(0); } + /// forge-config: default.allow_internal_expect_revert = true function test_readUint192WithNotEnoughBytes() public { //should revert if there's not enough bytes vm.expectRevert(MALFORMED_ERROR_SELECTOR); @@ -103,6 +105,7 @@ contract ByteUtilTest is Test { B_128._readUint192(0); } + /// forge-config: default.allow_internal_expect_revert = true function test_readUint32WithNotEnoughBytes() public { //should revert if there's not enough bytes vm.expectRevert(MALFORMED_ERROR_SELECTOR); @@ -111,6 +114,7 @@ contract ByteUtilTest is Test { B_16._readUint32(0); } + /// forge-config: default.allow_internal_expect_revert = true function test_readUint256WithEmptyArray() public { //should revert if there's not enough bytes vm.expectRevert(MALFORMED_ERROR_SELECTOR); @@ -119,6 +123,7 @@ contract ByteUtilTest is Test { B_EMPTY._readUint256(0); } + /// forge-config: default.allow_internal_expect_revert = true function test_readUint192WithEmptyArray() public { //should revert if there's not enough bytes vm.expectRevert(MALFORMED_ERROR_SELECTOR); @@ -127,6 +132,7 @@ contract ByteUtilTest is Test { B_EMPTY._readUint192(0); } + /// forge-config: default.allow_internal_expect_revert = true function test_readUint32WithEmptyArray() public { //should revert if there's not enough bytes vm.expectRevert(MALFORMED_ERROR_SELECTOR); @@ -135,6 +141,7 @@ contract ByteUtilTest is Test { B_EMPTY._readUint32(0); } + /// forge-config: default.allow_internal_expect_revert = true function test_readAddress() public pure { //read the first 20 bytes address result = B_512._readAddress(0); @@ -143,6 +150,7 @@ contract ByteUtilTest is Test { assertEq(result, address(type(uint160).max)); } + /// forge-config: default.allow_internal_expect_revert = true function test_readZeroAddress() public pure { //read the first 32 bytes after the first word address result = B_512._readAddress(32); @@ -151,6 +159,7 @@ contract ByteUtilTest is Test { assertEq(result, address(type(uint160).min)); } + /// forge-config: default.allow_internal_expect_revert = true function test_readAddressMultiWord() public pure { //read the first 20 bytes after byte 13 address result = B_512._readAddress(13); @@ -159,6 +168,7 @@ contract ByteUtilTest is Test { assertEq(result, address(type(uint160).max << 8)); } + /// forge-config: default.allow_internal_expect_revert = true function test_readAddressWithNotEnoughBytes() public { //should revert if there's not enough bytes vm.expectRevert(MALFORMED_ERROR_SELECTOR); @@ -167,6 +177,7 @@ contract ByteUtilTest is Test { B_128._readAddress(0); } + /// forge-config: default.allow_internal_expect_revert = true function test_readAddressWithEmptyArray() public { //should revert if there's not enough bytes vm.expectRevert(MALFORMED_ERROR_SELECTOR); diff --git a/contracts/src/v0.8/shared/test/util/SortedSetValidationUtil.t.sol b/contracts/src/v0.8/shared/test/util/SortedSetValidationUtil.t.sol index bf88df64ad5..31187740d40 100644 --- a/contracts/src/v0.8/shared/test/util/SortedSetValidationUtil.t.sol +++ b/contracts/src/v0.8/shared/test/util/SortedSetValidationUtil.t.sol @@ -59,7 +59,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida } // Reverts. - + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_EmptySubset_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(0, 5); _convertArrayToSortedSet(superset, OFFSET); @@ -68,6 +68,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_EmptySuperset_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(3, 0); _convertArrayToSortedSet(subset, OFFSET); @@ -76,6 +77,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_NotASubset_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(3, 5); _convertArrayToSortedSet(superset, OFFSET); @@ -85,6 +87,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_UnsortedSubset_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(3, 5); _convertArrayToSortedSet(superset, OFFSET); @@ -94,6 +97,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_UnsortedSuperset_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(3, 5); _convertArrayToSortedSet(superset, OFFSET); @@ -104,6 +108,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_HasDuplicates_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(3, 5); _convertArrayToSortedSet(superset, OFFSET); @@ -114,6 +119,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_SubsetLargerThanSuperset_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(6, 5); _convertArrayToSortedSet(subset, OFFSET); @@ -123,6 +129,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_SubsetEqualsSuperset_NoRevert() public pure { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(5, 5); _convertArrayToSortedSet(subset, OFFSET); @@ -131,6 +138,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_SingleElementSubset() public pure { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(1, 5); _convertArrayToSortedSet(superset, OFFSET); @@ -139,6 +147,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_SingleElementSubsetAndSuperset_Equal() public pure { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(1, 1); _convertArrayToSortedSet(subset, OFFSET); @@ -147,6 +156,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_SingleElementSubsetAndSuperset_NotEqual_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(1, 1); _convertArrayToSortedSet(subset, OFFSET); @@ -156,6 +166,7 @@ contract SortedSetValidationUtil_CheckIsValidUniqueSubsetTest is SortedSetValida SortedSetValidationUtil._checkIsValidUniqueSubset(subset, superset); } + /// forge-config: default.allow_internal_expect_revert = true function test__checkIsValidUniqueSubset_SupersetHasDuplicates_Reverts() public { (bytes32[] memory subset, bytes32[] memory superset) = _createSets(3, 5); _convertArrayToSortedSet(superset, OFFSET); diff --git a/contracts/src/v0.8/vrf/dev/ArbitrumL1Fees.sol b/contracts/src/v0.8/vrf/dev/ArbitrumL1Fees.sol index e03736d667c..5f56084370e 100644 --- a/contracts/src/v0.8/vrf/dev/ArbitrumL1Fees.sol +++ b/contracts/src/v0.8/vrf/dev/ArbitrumL1Fees.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.19; import {ArbGasInfo} from "../../vendor/@arbitrum/nitro-contracts/src/precompiles/ArbGasInfo.sol"; /// @dev An abstract contract that provides Arbitrum specific L1 fee calculations. -// solhint-disable-next-line contract-name-camelcase abstract contract ArbitrumL1Fees { /// @dev ARBGAS_ADDR is the address of the ArbGasInfo precompile on Arbitrum. /// @dev reference: https://github.com/OffchainLabs/nitro/blob/v2.0.14/contracts/src/precompiles/ArbGasInfo.sol#L10 diff --git a/contracts/src/v0.8/vrf/dev/OptimismL1Fees.sol b/contracts/src/v0.8/vrf/dev/OptimismL1Fees.sol index 999e18134bb..bf8181d4d89 100644 --- a/contracts/src/v0.8/vrf/dev/OptimismL1Fees.sol +++ b/contracts/src/v0.8/vrf/dev/OptimismL1Fees.sol @@ -5,7 +5,6 @@ import {ConfirmedOwner} from "../../shared/access/ConfirmedOwner.sol"; import {GasPriceOracle as OVM_GasPriceOracle} from "../../vendor/@eth-optimism/contracts-bedrock/v0.17.3/src/L2/GasPriceOracle.sol"; /// @dev An abstract contract that provides Optimism specific L1 fee calculations. -// solhint-disable-next-line contract-name-camelcase abstract contract OptimismL1Fees is ConfirmedOwner { /// @dev This is the padding size for unsigned RLP-encoded transaction without the signature data /// @dev The padding size was estimated based on hypothetical max RLP-encoded transaction size diff --git a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol index 53d19c1279b..8652367f790 100644 --- a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol +++ b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol @@ -11,7 +11,6 @@ import {IVRFCoordinatorV2PlusMigration} from "./interfaces/IVRFCoordinatorV2Plus // solhint-disable-next-line no-unused-import import {IVRFCoordinatorV2Plus, IVRFSubscriptionV2Plus} from "./interfaces/IVRFCoordinatorV2Plus.sol"; -// solhint-disable-next-line contract-name-camelcase contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus { /// @dev should always be available // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i diff --git a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5_Arbitrum.sol b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5_Arbitrum.sol index 9b2357cbb74..aa27ecf9eff 100644 --- a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5_Arbitrum.sol +++ b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5_Arbitrum.sol @@ -7,7 +7,6 @@ import {ArbitrumL1Fees} from "./ArbitrumL1Fees.sol"; /// @dev VRFCoordinatorV2_5_Arbitrum combines VRFCoordinatorV2_5 base contract with /// @dev Arbitrum specific opcodes and L1 gas fee calculations. -// solhint-disable-next-line contract-name-camelcase contract VRFCoordinatorV2_5_Arbitrum is VRFCoordinatorV2_5, ArbitrumL1Fees { /// @dev ARBSYS_ADDR is the address of the ArbSys precompile on Arbitrum. /// @dev reference: https://github.com/OffchainLabs/nitro/blob/v2.0.14/contracts/src/precompiles/ArbSys.sol#L10 diff --git a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5_Optimism.sol b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5_Optimism.sol index ce5abbe632b..9db1c84895e 100644 --- a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5_Optimism.sol +++ b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5_Optimism.sol @@ -7,7 +7,6 @@ import {OptimismL1Fees} from "./OptimismL1Fees.sol"; /// @dev VRFCoordinatorV2_5_Optimism combines VRFCoordinatorV2_5 base contract with /// @dev Optimism specific opcodes and L1 gas fee calculations. /// @dev This coordinator contract is used for all chains in the OP stack (e.g. Base). -// solhint-disable-next-line contract-name-camelcase contract VRFCoordinatorV2_5_Optimism is VRFCoordinatorV2_5, OptimismL1Fees { constructor(address blockhashStore) VRFCoordinatorV2_5(blockhashStore) {} diff --git a/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper_Arbitrum.sol b/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper_Arbitrum.sol index 1ab5e8b5db5..dd57dd6bb8a 100644 --- a/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper_Arbitrum.sol +++ b/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper_Arbitrum.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.19; import {ArbitrumL1Fees} from "./ArbitrumL1Fees.sol"; import {VRFV2PlusWrapper} from "./VRFV2PlusWrapper.sol"; -// solhint-disable-next-line contract-name-camelcase contract VRFV2PlusWrapper_Arbitrum is VRFV2PlusWrapper, ArbitrumL1Fees { constructor( address _link, diff --git a/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper_Optimism.sol b/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper_Optimism.sol index 6913b2ff1ea..7fdfcbacc2c 100644 --- a/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper_Optimism.sol +++ b/contracts/src/v0.8/vrf/dev/VRFV2PlusWrapper_Optimism.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.19; import {OptimismL1Fees} from "./OptimismL1Fees.sol"; import {VRFV2PlusWrapper} from "./VRFV2PlusWrapper.sol"; -// solhint-disable-next-line contract-name-camelcase contract VRFV2PlusWrapper_Optimism is VRFV2PlusWrapper, OptimismL1Fees { error UnsupportedL1FeeCalculationMode(uint8 mode); diff --git a/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol b/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol index 1e781d1e17b..8569e736822 100644 --- a/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol +++ b/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol @@ -5,7 +5,6 @@ import {VRFCoordinatorV2_5} from "../VRFCoordinatorV2_5.sol"; import {VRFTypes} from "../../VRFTypes.sol"; import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.7.3/contracts/utils/structs/EnumerableSet.sol"; -// solhint-disable-next-line contract-name-camelcase contract ExposedVRFCoordinatorV2_5 is VRFCoordinatorV2_5 { using EnumerableSet for EnumerableSet.UintSet; diff --git a/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5_Arbitrum.sol b/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5_Arbitrum.sol index 4f816dbc652..8224b53b550 100644 --- a/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5_Arbitrum.sol +++ b/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5_Arbitrum.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.4; import {VRFCoordinatorV2_5_Arbitrum} from "../VRFCoordinatorV2_5_Arbitrum.sol"; -// solhint-disable-next-line contract-name-camelcase contract ExposedVRFCoordinatorV2_5_Arbitrum is VRFCoordinatorV2_5_Arbitrum { constructor(address blockhashStore) VRFCoordinatorV2_5_Arbitrum(blockhashStore) {} diff --git a/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5_Optimism.sol b/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5_Optimism.sol index 3732a1ed192..3009e54456b 100644 --- a/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5_Optimism.sol +++ b/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5_Optimism.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.4; import {VRFCoordinatorV2_5_Optimism} from "../VRFCoordinatorV2_5_Optimism.sol"; -// solhint-disable-next-line contract-name-camelcase contract ExposedVRFCoordinatorV2_5_Optimism is VRFCoordinatorV2_5_Optimism { constructor(address blockhashStore) VRFCoordinatorV2_5_Optimism(blockhashStore) {} diff --git a/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorTestV2_5.sol b/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorTestV2_5.sol index 62dfddbee8d..88085c89d8e 100644 --- a/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorTestV2_5.sol +++ b/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorTestV2_5.sol @@ -12,7 +12,6 @@ import {IVRFCoordinatorV2PlusMigration} from "../interfaces/IVRFCoordinatorV2Plu // solhint-disable-next-line no-unused-import import {IVRFCoordinatorV2Plus, IVRFSubscriptionV2Plus} from "../interfaces/IVRFCoordinatorV2Plus.sol"; -// solhint-disable-next-line contract-name-camelcase contract VRFCoordinatorTestV2_5 is VRFOld, SubscriptionAPI, IVRFCoordinatorV2Plus { /// @dev should always be available // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i diff --git a/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2Plus_V2Example.sol b/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2Plus_V2Example.sol index 1a2ed50e6f0..712092a1983 100644 --- a/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2Plus_V2Example.sol +++ b/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2Plus_V2Example.sol @@ -7,7 +7,6 @@ import {VRFV2PlusClient} from "../libraries/VRFV2PlusClient.sol"; /// @dev this contract is only meant for testing migration /// @dev it is a simplified example of future version (V2) of VRFCoordinatorV2Plus -// solhint-disable-next-line contract-name-camelcase contract VRFCoordinatorV2Plus_V2Example is IVRFCoordinatorV2PlusMigration { error SubscriptionIDCollisionFound(); From 83a393fc18a93cfc02144a48fccf11c628ace752 Mon Sep 17 00:00:00 2001 From: Makram Date: Thu, 13 Feb 2025 16:07:02 +0200 Subject: [PATCH 54/83] deployment: support config overrides in memory nodes (#16346) * deployment: support config overrides in memory nodes * bump cl-ccip * bump cl-ccip to main sha * fix lint * goimports * bump again --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- .../testhelpers/messagingtest/helpers.go | 4 + .../changeset/testhelpers/test_assertions.go | 108 ++++++++++++++++++ .../changeset/testhelpers/test_environment.go | 9 +- deployment/environment/memory/environment.go | 15 ++- deployment/environment/memory/node.go | 22 ++++ deployment/go.mod | 2 +- deployment/go.sum | 4 +- go.mod | 2 +- go.sum | 4 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- .../smoke/ccip/ccip_messaging_test.go | 38 +++++- .../smoke/ccip/ccip_reader_test.go | 80 ------------- 17 files changed, 204 insertions(+), 102 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 57ee4ff245d..555a6318011 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -305,7 +305,7 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index cd8f872bb98..a7817f25d0c 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1123,8 +1123,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go index 3f935472c77..2f2fc32ae3f 100644 --- a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go +++ b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go @@ -169,8 +169,12 @@ func Run(tc TestCase) (out TestCaseOutput) { } if tc.ValidateResp { + commitStart := time.Now() testhelpers.ConfirmCommitForAllWithExpectedSeqNums(tc.T, tc.Env, tc.OnchainState, expectedSeqNum, startBlocks) + tc.T.Logf("confirmed commit of seq nums %+v in %s", expectedSeqNum, time.Since(commitStart).String()) + execStart := time.Now() execStates := testhelpers.ConfirmExecWithSeqNrsForAll(tc.T, tc.Env, tc.OnchainState, expectedSeqNumExec, startBlocks) + tc.T.Logf("confirmed exec of seq nums %+v in %s", expectedSeqNumExec, time.Since(execStart).String()) require.Equalf( tc.T, diff --git a/deployment/ccip/changeset/testhelpers/test_assertions.go b/deployment/ccip/changeset/testhelpers/test_assertions.go index ff026962ce6..4baf1f18ac5 100644 --- a/deployment/ccip/changeset/testhelpers/test_assertions.go +++ b/deployment/ccip/changeset/testhelpers/test_assertions.go @@ -442,6 +442,114 @@ func ConfirmExecWithSeqNrsForAll( return executionStates } +func ConfirmDoubleExecutions( + t *testing.T, + e deployment.Environment, + state changeset.CCIPOnChainState, + expectedSeqNums map[SourceDestPair][]uint64, + startBlocks map[uint64]*uint64, +) { + var ( + wg errgroup.Group + ) + for sourceDest, seqRange := range expectedSeqNums { + seqRange := seqRange + srcChain := sourceDest.SourceChainSelector + dstChain := sourceDest.DestChainSelector + + var startBlock *uint64 + if startBlocks != nil { + startBlock = startBlocks[dstChain] + } + + wg.Go(func() error { + err := ConfirmDoubleExecution( + t, + srcChain, + e.Chains[dstChain], + state.Chains[dstChain].OffRamp, + startBlock, + seqRange, + ) + return err + }) + } + + require.NoError(t, wg.Wait()) +} + +func ConfirmDoubleExecution( + t *testing.T, + sourceSelector uint64, + dest deployment.Chain, + offRamp offramp.OffRampInterface, + startBlock *uint64, + expectedSeqNrRange []uint64, +) error { + timer := time.NewTimer(tests.WaitTimeout(t)) + defer timer.Stop() + tick := time.NewTicker(3 * time.Second) + defer tick.Stop() + alreadyExecutedSink := make(chan *offramp.OffRampSkippedAlreadyExecutedMessage) + alreadyAttemptedSink := make(chan *offramp.OffRampAlreadyAttempted) + alreadyExecutedSub, err := offRamp.WatchSkippedAlreadyExecutedMessage(&bind.WatchOpts{ + Context: tests.Context(t), + Start: startBlock, + }, alreadyExecutedSink) + if err != nil { + return fmt.Errorf("error to subscribe SkippedAlreadyExecutedMessage : %w", err) + } + defer alreadyExecutedSub.Unsubscribe() + alreadyAttemptedSub, err := offRamp.WatchAlreadyAttempted(&bind.WatchOpts{ + Context: tests.Context(t), + Start: startBlock, + }, alreadyAttemptedSink) + if err != nil { + return fmt.Errorf("error to subscribe AlreadyAttempted : %w", err) + } + defer alreadyAttemptedSub.Unsubscribe() + + seenAlreadyExecuted := make(map[uint64]struct{}) + seenAlreadyAttempted := make(map[uint64]struct{}) + seqNrsToWatch := make(map[uint64]struct{}) + for _, seqNr := range expectedSeqNrRange { + seqNrsToWatch[seqNr] = struct{}{} + } + for { + select { + case <-tick.C: + for _, expectedSeqNr := range expectedSeqNrRange { + _, alreadyExecuted := seenAlreadyExecuted[expectedSeqNr] + _, alreadyAttempted := seenAlreadyAttempted[expectedSeqNr] + if alreadyAttempted || alreadyExecuted { + t.Logf("Seq nr %d already attempted (%t) or executed (%t) on chain %d (offramp %s) from chain %d", + expectedSeqNr, alreadyAttempted, alreadyExecuted, dest.Selector, offRamp.Address().String(), sourceSelector) + delete(seqNrsToWatch, expectedSeqNr) + } + if len(seqNrsToWatch) == 0 { + return nil + } + } + case alreadyExecutedMsg := <-alreadyExecutedSink: + t.Logf("Received SkippedAlreadyExecutedMessage for seqNum %d on chain %d (offramp %s) from chain %d", + alreadyExecutedMsg.SequenceNumber, dest.Selector, offRamp.Address().String(), sourceSelector) + seenAlreadyExecuted[alreadyExecutedMsg.SequenceNumber] = struct{}{} + delete(seqNrsToWatch, alreadyExecutedMsg.SequenceNumber) + if len(seqNrsToWatch) == 0 { + return nil + } + case alreadyAttemptedMsg := <-alreadyAttemptedSink: + t.Logf("Received AlreadyAttempted for seqNum %d on chain %d (offramp %s) from chain %d", + alreadyAttemptedMsg.SequenceNumber, dest.Selector, offRamp.Address().String(), sourceSelector) + seenAlreadyAttempted[alreadyAttemptedMsg.SequenceNumber] = struct{}{} + delete(seqNrsToWatch, alreadyAttemptedMsg.SequenceNumber) + if len(seqNrsToWatch) == 0 { + return nil + } + } + } +} + // ConfirmExecWithSeqNrs waits for an execution state change on the destination chain with the expected sequence number. // startBlock is the block number to start watching from. // If startBlock is nil, it will start watching from the latest block. diff --git a/deployment/ccip/changeset/testhelpers/test_environment.go b/deployment/ccip/changeset/testhelpers/test_environment.go index 0b77d1b5c6b..f05d76f3150 100644 --- a/deployment/ccip/changeset/testhelpers/test_environment.go +++ b/deployment/ccip/changeset/testhelpers/test_environment.go @@ -66,6 +66,7 @@ type TestConfigs struct { LinkPrice *big.Int WethPrice *big.Int BlockTime time.Duration + CLNodeConfigOpts []memory.ConfigOpt } func (tc *TestConfigs) Validate() error { @@ -110,6 +111,12 @@ func DefaultTestConfigs() *TestConfigs { type TestOps func(testCfg *TestConfigs) +func WithCLNodeConfigOpts(opts ...memory.ConfigOpt) TestOps { + return func(testCfg *TestConfigs) { + testCfg.CLNodeConfigOpts = opts + } +} + func WithBlockTime(blockTime time.Duration) TestOps { return func(testCfg *TestConfigs) { testCfg.BlockTime = blockTime @@ -319,7 +326,7 @@ func (m *MemoryEnvironment) StartNodes(t *testing.T, crConfig deployment.Capabil require.NotNil(t, m.Chains, "start chains first, chains are empty") require.NotNil(t, m.DeployedEnv, "start chains and initiate deployed env first before starting nodes") tc := m.TestConfig - nodes := memory.NewNodes(t, zapcore.InfoLevel, m.Chains, m.SolChains, tc.Nodes, tc.Bootstraps, crConfig) + nodes := memory.NewNodes(t, zapcore.InfoLevel, m.Chains, m.SolChains, tc.Nodes, tc.Bootstraps, crConfig, tc.CLNodeConfigOpts...) ctx := testcontext.Get(t) lggr := logger.Test(t) for _, node := range nodes { diff --git a/deployment/environment/memory/environment.go b/deployment/environment/memory/environment.go index 48fa7d71d46..a50cce559dd 100644 --- a/deployment/environment/memory/environment.go +++ b/deployment/environment/memory/environment.go @@ -160,7 +160,16 @@ func generateMemoryChainSol(inputs map[uint64]SolanaChain) map[uint64]deployment return chains } -func NewNodes(t *testing.T, logLevel zapcore.Level, chains map[uint64]deployment.Chain, solChains map[uint64]deployment.SolChain, numNodes, numBootstraps int, registryConfig deployment.CapabilityRegistryConfig) map[string]Node { +func NewNodes( + t *testing.T, + logLevel zapcore.Level, + chains map[uint64]deployment.Chain, + solChains map[uint64]deployment.SolChain, + numNodes, + numBootstraps int, + registryConfig deployment.CapabilityRegistryConfig, + configOpts ...ConfigOpt, +) map[string]Node { nodesByPeerID := make(map[string]Node) if numNodes+numBootstraps == 0 { return nodesByPeerID @@ -170,13 +179,13 @@ func NewNodes(t *testing.T, logLevel zapcore.Level, chains map[uint64]deployment // since we won't run a bootstrapper and a plugin oracle on the same // chainlink node in production. for i := 0; i < numBootstraps; i++ { - node := NewNode(t, ports[i], chains, solChains, logLevel, true /* bootstrap */, registryConfig) + node := NewNode(t, ports[i], chains, solChains, logLevel, true /* bootstrap */, registryConfig, configOpts...) nodesByPeerID[node.Keys.PeerID.String()] = *node // Note in real env, this ID is allocated by JD. } for i := 0; i < numNodes; i++ { // grab port offset by numBootstraps, since above loop also takes some ports. - node := NewNode(t, ports[numBootstraps+i], chains, solChains, logLevel, false /* bootstrap */, registryConfig) + node := NewNode(t, ports[numBootstraps+i], chains, solChains, logLevel, false /* bootstrap */, registryConfig, configOpts...) nodesByPeerID[node.Keys.PeerID.String()] = *node // Note in real env, this ID is allocated by JD. } diff --git a/deployment/environment/memory/node.go b/deployment/environment/memory/node.go index caff467496d..ba3ee24e5db 100644 --- a/deployment/environment/memory/node.go +++ b/deployment/environment/memory/node.go @@ -68,6 +68,23 @@ func (n Node) ReplayLogs(chains map[uint64]uint64) error { return nil } +type ConfigOpt func(c *chainlink.Config) + +// WithFinalityDepths sets the finality depths of the evm chain +// in the map. +func WithFinalityDepths(finalityDepths map[uint64]uint32) ConfigOpt { + return func(c *chainlink.Config) { + for chainID, depth := range finalityDepths { + chainIDBig := evmutils.New(new(big.Int).SetUint64(chainID)) + for _, evmChainConfig := range c.EVM { + if evmChainConfig.ChainID.Cmp(chainIDBig) == 0 { + evmChainConfig.Chain.FinalityDepth = ptr(depth) + } + } + } + } +} + // Creates a CL node which is: // - Configured for OCR // - Configured for the chains specified @@ -80,6 +97,7 @@ func NewNode( logLevel zapcore.Level, bootstrap bool, registryConfig deployment.CapabilityRegistryConfig, + configOpts ...ConfigOpt, ) *Node { evmchains := make(map[uint64]EVMChain) for _, chain := range chains { @@ -144,6 +162,10 @@ func NewNode( solConfigs = append(solConfigs, createSolanaChainConfig(solanaChainID, chain)) } c.Solana = solConfigs + + for _, opt := range configOpts { + opt(c) + } }) // Set logging. diff --git a/deployment/go.mod b/deployment/go.mod index f576460d69b..c76f91166ec 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -31,7 +31,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index 7a279456735..2b92b0fd544 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1126,8 +1126,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/go.mod b/go.mod index 638ab732587..05f5a2540e4 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index 99563d56e28..21b28af3a3c 100644 --- a/go.sum +++ b/go.sum @@ -1010,8 +1010,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index cb4676f07da..634f52f745f 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 35da0731f61..3f4ccc6c3fd 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1378,8 +1378,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 4735ec2e1a8..33bf319133e 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index c13fd165411..4decd4ff1ff 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1361,8 +1361,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a h1:iciffyGz76BiyILT8WSHePGr2C9v5PYK+PKwcW5ETLw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250212131315-e9b53b05b02a/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/smoke/ccip/ccip_messaging_test.go b/integration-tests/smoke/ccip/ccip_messaging_test.go index cb4accf34bd..43c38d8d5eb 100644 --- a/integration-tests/smoke/ccip/ccip_messaging_test.go +++ b/integration-tests/smoke/ccip/ccip_messaging_test.go @@ -5,12 +5,15 @@ import ( "fmt" "math/big" "testing" + "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" "golang.org/x/exp/maps" + chainsel "github.com/smartcontractkit/chain-selectors" + "github.com/smartcontractkit/chainlink-common/pkg/hashutil" "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" @@ -18,22 +21,40 @@ import ( "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" mt "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/messagingtest" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" ) func Test_CCIPMessaging(t *testing.T) { + // fix the chain ids for the test so we can appropriately set finality depth numbers on the destination chain. + chains := []chainsel.Chain{ + chainsel.GETH_TESTNET, // source + chainsel.TEST_90000001, // dest + } + var chainIDs = []uint64{ + chains[0].EvmChainID, + chains[1].EvmChainID, + } // Setup 2 chains and a single lane. ctx := testhelpers.Context(t) - e, _, _ := testsetups.NewIntegrationEnvironment(t) + e, _, _ := testsetups.NewIntegrationEnvironment( + t, + testhelpers.WithChainIDs(chainIDs), + testhelpers.WithCLNodeConfigOpts(memory.WithFinalityDepths(map[uint64]uint32{ + chains[1].EvmChainID: 30, // make dest chain finality depth 30 so we can observe exec behavior + })), + ) state, err := changeset.LoadOnchainState(e.Env) require.NoError(t, err) allChainSelectors := maps.Keys(e.Env.Chains) require.Len(t, allChainSelectors, 2) - sourceChain := allChainSelectors[0] - destChain := allChainSelectors[1] + sourceChain := chains[0].Selector + destChain := chains[1].Selector + require.Contains(t, allChainSelectors, sourceChain) + require.Contains(t, allChainSelectors, destChain) t.Log("All chain selectors:", allChainSelectors, ", home chain selector:", e.HomeChainSel, ", feed chain selector:", e.FeedChainSel, @@ -70,6 +91,17 @@ func Test_CCIPMessaging(t *testing.T) { MsgData: []byte("hello eoa"), ExtraArgs: nil, // default extraArgs ExpectedExecutionState: testhelpers.EXECUTION_STATE_SUCCESS, // success because offRamp won't call an EOA + ExtraAssertions: []func(t *testing.T){ + func(t *testing.T) { + // TODO: remove this or make it a "require.Never" once we fix double execution! + doubleExecStart := time.Now() + require.NoError( + t, + testhelpers.ConfirmDoubleExecution(t, sourceChain, e.Env.Chains[destChain], state.Chains[destChain].OffRamp, nil, []uint64{1}), + ) + t.Logf("Confirmed double execution in %s", time.Since(doubleExecStart).String()) + }, + }, }, ) }) diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index 99f5af89312..bfb06b03b84 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -549,86 +549,6 @@ func requireEqualRoots( } } -// NOTE: this test should eventually be removed when CommitReportsGTETimestamp fetches -// unconfirmed CommitReportAccepted events. -func TestCCIPReader_CommitReportsGTETimestamp_RespectsFinality(t *testing.T) { - t.Parallel() - ctx := tests.Context(t) - var finalityDepth int64 = 10 - s, _, onRampAddress := setupGetCommitGTETimestampTest(ctx, t, finalityDepth, false) - - tokenA := common.HexToAddress("123") - const numReports = 5 - - firstReportTs := emitCommitReports(ctx, t, s, numReports, tokenA, onRampAddress) - - iter, err := s.contract.FilterCommitReportAccepted(&bind.FilterOpts{ - Start: 0, - }) - require.NoError(t, err) - var onchainEvents []*ccip_reader_tester.CCIPReaderTesterCommitReportAccepted - for iter.Next() { - onchainEvents = append(onchainEvents, iter.Event) - } - require.Len(t, onchainEvents, numReports) - sort.Slice(onchainEvents, func(i, j int) bool { - return onchainEvents[i].Raw.BlockNumber < onchainEvents[j].Raw.BlockNumber - }) - - // Need to replay as sometimes the logs are not picked up by the log poller (?) - // Maybe another situation where chain reader doesn't register filters as expected. - require.NoError(t, s.lp.Replay(ctx, 1)) - - var ccipReaderReports []plugintypes.CommitPluginReportWithMeta - // Will not return any reports as the finality depth is not reached. - require.Never(t, func() bool { - var err2 error - ccipReaderReports, err2 = s.reader.CommitReportsGTETimestamp( - ctx, - // Skips first report - //nolint:gosec // this won't overflow - time.Unix(int64(firstReportTs)+1, 0), - 10, - ) - require.NoError(t, err2) - return len(ccipReaderReports) == numReports-1 - }, 20*time.Second, 50*time.Millisecond) - - // Commit finality depth number of blocks. - for i := 0; i < int(finalityDepth); i++ { - s.sb.Commit() - } - - require.Eventually(t, func() bool { - ccipReaderReports, err = s.reader.CommitReportsGTETimestamp( - ctx, - // Skips first report - //nolint:gosec // this won't overflow - time.Unix(int64(firstReportTs)+1, 0), - 10, - ) - require.NoError(t, err) - return len(ccipReaderReports) == numReports-1 - }, 30*time.Second, 50*time.Millisecond) - - require.Len(t, ccipReaderReports, numReports-1) - // trim the first report to simulate the finality filter above. - onchainEvents = onchainEvents[1:] - require.Len(t, onchainEvents, numReports-1) - - require.Len(t, ccipReaderReports, numReports-1) - for i := range onchainEvents { - // check blessed roots are deserialized correctly - requireEqualRoots(t, onchainEvents[i].BlessedMerkleRoots, ccipReaderReports[i].Report.BlessedMerkleRoots) - - // check unblessed roots are deserialized correctly - requireEqualRoots(t, onchainEvents[i].UnblessedMerkleRoots, ccipReaderReports[i].Report.UnblessedMerkleRoots) - - // check price updates are deserialized correctly - requireEqualPriceUpdates(t, onchainEvents[i].PriceUpdates, ccipReaderReports[i].Report.PriceUpdates) - } -} - func TestCCIPReader_ExecutedMessages(t *testing.T) { t.Parallel() ctx := tests.Context(t) From 9572552616008598432ed3acdd4efb99b7a19838 Mon Sep 17 00:00:00 2001 From: chainchad <96362174+chainchad@users.noreply.github.com> Date: Thu, 13 Feb 2025 09:53:13 -0500 Subject: [PATCH 55/83] Consume changesets for CCIP Contracts v1.6.0 (#16361) * Migrate CCIP releated changesets to dedicated dir * Use corrected package name in changesets * Fix path to changelog generator * WIP: temporarily delete unused and non-CCIP changesets * Run pnpm install * Consume changesets for CCIP Contracts v1.6.0 Signed-off-by: chainchad <96362174+chainchad@users.noreply.github.com> * Add changeset configs back --------- Signed-off-by: chainchad <96362174+chainchad@users.noreply.github.com> --- contracts/.changeset/angry-needles-approve.md | 5 - contracts/.changeset/bright-jokes-kiss.md | 10 - contracts/.changeset/chatty-keys-kneel.md | 8 - contracts/.changeset/chilly-news-wink.md | 10 - contracts/.changeset/chilly-rockets-share.md | 10 - contracts/.changeset/clean-horses-cheat.md | 10 - contracts/.changeset/cold-geckos-yawn.md | 10 - contracts/.changeset/cool-laws-drum.md | 7 - contracts/.changeset/cuddly-roses-vanish.md | 10 - contracts/.changeset/curly-seahorses-eat.md | 10 - contracts/.changeset/dry-seas-grow.md | 11 - contracts/.changeset/dull-otters-behave.md | 5 - contracts/.changeset/dull-plums-flash.md | 9 - contracts/.changeset/early-cups-relax.md | 9 - contracts/.changeset/eighty-cycles-film.md | 10 - contracts/.changeset/eighty-ducks-flow.md | 10 - contracts/.changeset/empty-baboons-wonder.md | 9 - contracts/.changeset/fair-pans-prove.md | 5 - contracts/.changeset/fair-zoos-repeat.md | 10 - contracts/.changeset/five-brooms-knock.md | 9 - contracts/.changeset/fluffy-eels-tan.md | 10 - contracts/.changeset/gold-items-dance.md | 10 - contracts/.changeset/happy-crabs-rescue.md | 10 - contracts/.changeset/happy-planets-accept.md | 10 - .../.changeset/honest-carpets-compare.md | 5 - contracts/.changeset/hot-pandas-carry.md | 10 - contracts/.changeset/hungry-badgers-jump.md | 9 - contracts/.changeset/little-frogs-roll.md | 10 - contracts/.changeset/loud-penguins-float.md | 5 - contracts/.changeset/mean-masks-poke.md | 10 - contracts/.changeset/metal-ducks-hunt.md | 10 - contracts/.changeset/metal-radios-push.md | 10 - contracts/.changeset/modern-mayflies-give.md | 10 - contracts/.changeset/moody-humans-judge.md | 10 - contracts/.changeset/neat-melons-retire.md | 5 - .../.changeset/nervous-cherries-judge.md | 10 - contracts/.changeset/new-elephants-behave.md | 5 - contracts/.changeset/nice-rocks-trade.md | 9 - contracts/.changeset/ninety-coins-mate.md | 10 - contracts/.changeset/ninety-lions-complain.md | 5 - contracts/.changeset/ninety-pianos-approve.md | 5 - contracts/.changeset/perfect-bears-clean.md | 5 - contracts/.changeset/poor-ears-hear.md | 5 - contracts/.changeset/poor-turtles-give.md | 5 - contracts/.changeset/proud-brooms-fetch.md | 10 - contracts/.changeset/purple-spies-draw.md | 5 - contracts/.changeset/quick-pans-tie.md | 5 - contracts/.changeset/quiet-masks-act.md | 10 - contracts/.changeset/rude-badgers-tickle.md | 5 - contracts/.changeset/seven-worms-yawn.md | 10 - contracts/.changeset/silver-pets-thank.md | 10 - contracts/.changeset/six-games-drum.md | 9 - contracts/.changeset/slow-gorillas-notice.md | 10 - contracts/.changeset/small-countries-flow.md | 5 - contracts/.changeset/smart-bats-repair.md | 5 - contracts/.changeset/soft-glasses-peel.md | 10 - contracts/.changeset/stale-dots-destroy.md | 5 - .../.changeset/swift-pumpkins-impress.md | 10 - contracts/.changeset/tame-cycles-ring.md | 10 - contracts/.changeset/tasty-eggs-yell.md | 5 - contracts/.changeset/tender-lemons-punch.md | 9 - contracts/.changeset/thin-owls-hug.md | 7 - contracts/.changeset/thirty-rules-rule.md | 10 - contracts/.changeset/three-dogs-return.md | 5 - contracts/.changeset/tiny-beans-leave.md | 10 - contracts/.changeset/tricky-cups-hammer.md | 8 - contracts/.changeset/twelve-pianos-chew.md | 10 - .../.changeset/twenty-pillows-remember.md | 10 - contracts/.changeset/two-feet-tap.md | 10 - contracts/.changeset/violet-lamps-pump.md | 10 - contracts/.changeset/warm-queens-tan.md | 9 - contracts/.changeset/wet-eyes-accept.md | 7 - .../.changeset/wicked-fireants-explain.md | 5 - contracts/.changeset/wicked-maps-thank.md | 10 - contracts/.changeset/wild-tigers-know.md | 8 - contracts/.changeset/yellow-mugs-explode.md | 9 - contracts/.changeset/young-bats-rhyme.md | 10 - contracts/release/ccip/.changeset/config.json | 2 +- .../ccip/.changeset/loud-drinks-worry.md | 5 - contracts/release/ccip/CHANGELOG.md | 302 ++++++ contracts/release/ccip/pnpm-lock.yaml | 858 ++++++++++++++++++ 81 files changed, 1161 insertions(+), 647 deletions(-) delete mode 100644 contracts/.changeset/angry-needles-approve.md delete mode 100644 contracts/.changeset/bright-jokes-kiss.md delete mode 100644 contracts/.changeset/chatty-keys-kneel.md delete mode 100644 contracts/.changeset/chilly-news-wink.md delete mode 100644 contracts/.changeset/chilly-rockets-share.md delete mode 100644 contracts/.changeset/clean-horses-cheat.md delete mode 100644 contracts/.changeset/cold-geckos-yawn.md delete mode 100644 contracts/.changeset/cool-laws-drum.md delete mode 100644 contracts/.changeset/cuddly-roses-vanish.md delete mode 100644 contracts/.changeset/curly-seahorses-eat.md delete mode 100644 contracts/.changeset/dry-seas-grow.md delete mode 100644 contracts/.changeset/dull-otters-behave.md delete mode 100644 contracts/.changeset/dull-plums-flash.md delete mode 100644 contracts/.changeset/early-cups-relax.md delete mode 100644 contracts/.changeset/eighty-cycles-film.md delete mode 100644 contracts/.changeset/eighty-ducks-flow.md delete mode 100644 contracts/.changeset/empty-baboons-wonder.md delete mode 100644 contracts/.changeset/fair-pans-prove.md delete mode 100644 contracts/.changeset/fair-zoos-repeat.md delete mode 100644 contracts/.changeset/five-brooms-knock.md delete mode 100644 contracts/.changeset/fluffy-eels-tan.md delete mode 100644 contracts/.changeset/gold-items-dance.md delete mode 100644 contracts/.changeset/happy-crabs-rescue.md delete mode 100644 contracts/.changeset/happy-planets-accept.md delete mode 100644 contracts/.changeset/honest-carpets-compare.md delete mode 100644 contracts/.changeset/hot-pandas-carry.md delete mode 100644 contracts/.changeset/hungry-badgers-jump.md delete mode 100644 contracts/.changeset/little-frogs-roll.md delete mode 100644 contracts/.changeset/loud-penguins-float.md delete mode 100644 contracts/.changeset/mean-masks-poke.md delete mode 100644 contracts/.changeset/metal-ducks-hunt.md delete mode 100644 contracts/.changeset/metal-radios-push.md delete mode 100644 contracts/.changeset/modern-mayflies-give.md delete mode 100644 contracts/.changeset/moody-humans-judge.md delete mode 100644 contracts/.changeset/neat-melons-retire.md delete mode 100644 contracts/.changeset/nervous-cherries-judge.md delete mode 100644 contracts/.changeset/new-elephants-behave.md delete mode 100644 contracts/.changeset/nice-rocks-trade.md delete mode 100644 contracts/.changeset/ninety-coins-mate.md delete mode 100644 contracts/.changeset/ninety-lions-complain.md delete mode 100644 contracts/.changeset/ninety-pianos-approve.md delete mode 100644 contracts/.changeset/perfect-bears-clean.md delete mode 100644 contracts/.changeset/poor-ears-hear.md delete mode 100644 contracts/.changeset/poor-turtles-give.md delete mode 100644 contracts/.changeset/proud-brooms-fetch.md delete mode 100644 contracts/.changeset/purple-spies-draw.md delete mode 100644 contracts/.changeset/quick-pans-tie.md delete mode 100644 contracts/.changeset/quiet-masks-act.md delete mode 100644 contracts/.changeset/rude-badgers-tickle.md delete mode 100644 contracts/.changeset/seven-worms-yawn.md delete mode 100644 contracts/.changeset/silver-pets-thank.md delete mode 100644 contracts/.changeset/six-games-drum.md delete mode 100644 contracts/.changeset/slow-gorillas-notice.md delete mode 100644 contracts/.changeset/small-countries-flow.md delete mode 100644 contracts/.changeset/smart-bats-repair.md delete mode 100644 contracts/.changeset/soft-glasses-peel.md delete mode 100644 contracts/.changeset/stale-dots-destroy.md delete mode 100644 contracts/.changeset/swift-pumpkins-impress.md delete mode 100644 contracts/.changeset/tame-cycles-ring.md delete mode 100644 contracts/.changeset/tasty-eggs-yell.md delete mode 100644 contracts/.changeset/tender-lemons-punch.md delete mode 100644 contracts/.changeset/thin-owls-hug.md delete mode 100644 contracts/.changeset/thirty-rules-rule.md delete mode 100644 contracts/.changeset/three-dogs-return.md delete mode 100644 contracts/.changeset/tiny-beans-leave.md delete mode 100644 contracts/.changeset/tricky-cups-hammer.md delete mode 100644 contracts/.changeset/twelve-pianos-chew.md delete mode 100644 contracts/.changeset/twenty-pillows-remember.md delete mode 100644 contracts/.changeset/two-feet-tap.md delete mode 100644 contracts/.changeset/violet-lamps-pump.md delete mode 100644 contracts/.changeset/warm-queens-tan.md delete mode 100644 contracts/.changeset/wet-eyes-accept.md delete mode 100644 contracts/.changeset/wicked-fireants-explain.md delete mode 100644 contracts/.changeset/wicked-maps-thank.md delete mode 100644 contracts/.changeset/wild-tigers-know.md delete mode 100644 contracts/.changeset/yellow-mugs-explode.md delete mode 100644 contracts/.changeset/young-bats-rhyme.md delete mode 100644 contracts/release/ccip/.changeset/loud-drinks-worry.md create mode 100644 contracts/release/ccip/pnpm-lock.yaml diff --git a/contracts/.changeset/angry-needles-approve.md b/contracts/.changeset/angry-needles-approve.md deleted file mode 100644 index 689f2ac6063..00000000000 --- a/contracts/.changeset/angry-needles-approve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal Removal and moving of various older Solidity contracts. Unused test helpers are removed, used files are now in their proper product folders diff --git a/contracts/.changeset/bright-jokes-kiss.md b/contracts/.changeset/bright-jokes-kiss.md deleted file mode 100644 index 9aac95d84c9..00000000000 --- a/contracts/.changeset/bright-jokes-kiss.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -add legacy fallback to RMN - - -PR issue: CCIP-4261 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/chatty-keys-kneel.md b/contracts/.changeset/chatty-keys-kneel.md deleted file mode 100644 index ace3539ad87..00000000000 --- a/contracts/.changeset/chatty-keys-kneel.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal fixing comments and data availability bytes length calculation - - -PR issue : CCIP-3785 \ No newline at end of file diff --git a/contracts/.changeset/chilly-news-wink.md b/contracts/.changeset/chilly-news-wink.md deleted file mode 100644 index 2ccdbb483ca..00000000000 --- a/contracts/.changeset/chilly-news-wink.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#feature Add two new pool types: Siloed-LockRelease and BurnToAddress and fix bug in HybridUSDCTokenPool for transferLiqudity #bugfix - - -PR issue: CCIP-4723 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/chilly-rockets-share.md b/contracts/.changeset/chilly-rockets-share.md deleted file mode 100644 index ef5d3e454d7..00000000000 --- a/contracts/.changeset/chilly-rockets-share.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Moves all audited L2EP contracts out from dev directory - - -PR issue: SHIP-3191 - -Solidity Review issue: SHIP-4050 \ No newline at end of file diff --git a/contracts/.changeset/clean-horses-cheat.md b/contracts/.changeset/clean-horses-cheat.md deleted file mode 100644 index 09cce822451..00000000000 --- a/contracts/.changeset/clean-horses-cheat.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -Update FeeQuoter to support Solana chain families #feature - - -PR issue: CCIP-4687 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/cold-geckos-yawn.md b/contracts/.changeset/cold-geckos-yawn.md deleted file mode 100644 index e7677f1282e..00000000000 --- a/contracts/.changeset/cold-geckos-yawn.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -Remove dead transmission code - - -PR issue: CM-661 - -Solidity Review issue: CM-662 \ No newline at end of file diff --git a/contracts/.changeset/cool-laws-drum.md b/contracts/.changeset/cool-laws-drum.md deleted file mode 100644 index f7851c3d822..00000000000 --- a/contracts/.changeset/cool-laws-drum.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Add new Configurator contract for blue-green LLO deployments - -PR issue: MERC-5954 diff --git a/contracts/.changeset/cuddly-roses-vanish.md b/contracts/.changeset/cuddly-roses-vanish.md deleted file mode 100644 index 29282bab46b..00000000000 --- a/contracts/.changeset/cuddly-roses-vanish.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal Generate gethwrappers through Foundry instead of solc-select via python - - -PR issue: CCIP-4737 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/curly-seahorses-eat.md b/contracts/.changeset/curly-seahorses-eat.md deleted file mode 100644 index 9af314106eb..00000000000 --- a/contracts/.changeset/curly-seahorses-eat.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal enable both blessed and unblessed roots in a single commit report - - -PR issue: CCIP-5140 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/dry-seas-grow.md b/contracts/.changeset/dry-seas-grow.md deleted file mode 100644 index d74b2a50b6b..00000000000 --- a/contracts/.changeset/dry-seas-grow.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -New contract for deploying, CCIP-compatible token pools and configuring with the tokenAdminRegistry, and a new ERC20 with constructor compatible with the factory's deployment pattern. #internal - - - -PR issue: CCIP-3171 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/dull-otters-behave.md b/contracts/.changeset/dull-otters-behave.md deleted file mode 100644 index 00b45157a51..00000000000 --- a/contracts/.changeset/dull-otters-behave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal rework the regex for snapshot inclusion diff --git a/contracts/.changeset/dull-plums-flash.md b/contracts/.changeset/dull-plums-flash.md deleted file mode 100644 index 8282b0150a4..00000000000 --- a/contracts/.changeset/dull-plums-flash.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal Add new event in setRateLimitAdmin for Atlas - -PR issue: CCIP-4099 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/early-cups-relax.md b/contracts/.changeset/early-cups-relax.md deleted file mode 100644 index 1ec6aaba0b7..00000000000 --- a/contracts/.changeset/early-cups-relax.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal Account for tokenTransferBytesOverhead in exec cost - -PR issue: CCIP-4646 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/eighty-cycles-film.md b/contracts/.changeset/eighty-cycles-film.md deleted file mode 100644 index 6cd56afa80a..00000000000 --- a/contracts/.changeset/eighty-cycles-film.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -remove legacy curse check from RMNRemote isCursed() method #bugfix - - -PR issue: CCIP-4476 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/eighty-ducks-flow.md b/contracts/.changeset/eighty-ducks-flow.md deleted file mode 100644 index cc56f6788cb..00000000000 --- a/contracts/.changeset/eighty-ducks-flow.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -release CCIP 1.6, remove -dev suffix - - -PR issue: CCIP-5181 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/empty-baboons-wonder.md b/contracts/.changeset/empty-baboons-wonder.md deleted file mode 100644 index 9e3d827fc40..00000000000 --- a/contracts/.changeset/empty-baboons-wonder.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal Add Support for SVM ATA to USDCTokenPool and send correct tokenReceiver to token pools - -PR issue: CCIP-5139 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/fair-pans-prove.md b/contracts/.changeset/fair-pans-prove.md deleted file mode 100644 index 652af3c9fe7..00000000000 --- a/contracts/.changeset/fair-pans-prove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal bump license to 1.6 diff --git a/contracts/.changeset/fair-zoos-repeat.md b/contracts/.changeset/fair-zoos-repeat.md deleted file mode 100644 index 3763e3e6629..00000000000 --- a/contracts/.changeset/fair-zoos-repeat.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#added Add Data Feeds CRE contracts - - -PR issue: DF-21039 - -Solidity Review issue: DF-21067 \ No newline at end of file diff --git a/contracts/.changeset/five-brooms-knock.md b/contracts/.changeset/five-brooms-knock.md deleted file mode 100644 index 6ba2f1b4b97..00000000000 --- a/contracts/.changeset/five-brooms-knock.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal decouple LiquidityManager tests with LockReleaseTokenPool + Test Rename - -PR issue: CCIP-4428 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/fluffy-eels-tan.md b/contracts/.changeset/fluffy-eels-tan.md deleted file mode 100644 index 967e7e2f72d..00000000000 --- a/contracts/.changeset/fluffy-eels-tan.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Add token address to TokenHandlingError - - -PR issue: CCIP-4174 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/gold-items-dance.md b/contracts/.changeset/gold-items-dance.md deleted file mode 100644 index 0da36b92c8f..00000000000 --- a/contracts/.changeset/gold-items-dance.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal move multiple weth9 implementations to vendor - - -PR issue: CCIP-5081 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/happy-crabs-rescue.md b/contracts/.changeset/happy-crabs-rescue.md deleted file mode 100644 index 2aa3bbacecc..00000000000 --- a/contracts/.changeset/happy-crabs-rescue.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Gas optimizations and comment cleanup #internal - - -PR issue: CCIP-3736 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/happy-planets-accept.md b/contracts/.changeset/happy-planets-accept.md deleted file mode 100644 index bdd21c0caef..00000000000 --- a/contracts/.changeset/happy-planets-accept.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -add accountStr to chainReader test contract struct in order to test the new address bytes to string modifier. #internal - - -PR issue: BCFR-147 - -Solidity Review issue: BCFR-957 \ No newline at end of file diff --git a/contracts/.changeset/honest-carpets-compare.md b/contracts/.changeset/honest-carpets-compare.md deleted file mode 100644 index 737d00ad071..00000000000 --- a/contracts/.changeset/honest-carpets-compare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -# internal fix comments diff --git a/contracts/.changeset/hot-pandas-carry.md b/contracts/.changeset/hot-pandas-carry.md deleted file mode 100644 index 8042cd82da6..00000000000 --- a/contracts/.changeset/hot-pandas-carry.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -Add a new contract, BurnMintERC20, which is basically just our ERC677 implementation without the transferAndCall function. #internal - - -PR issue: CCIP-4130 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/hungry-badgers-jump.md b/contracts/.changeset/hungry-badgers-jump.md deleted file mode 100644 index 9fba12fb6f2..00000000000 --- a/contracts/.changeset/hungry-badgers-jump.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal add getNextDonId() and getNodes(bytes32[] calldata p2pIds) in CapabilitiesRegistry and define interface for node info - - - -PR issue: CCIP-3569 \ No newline at end of file diff --git a/contracts/.changeset/little-frogs-roll.md b/contracts/.changeset/little-frogs-roll.md deleted file mode 100644 index f8883bf7f42..00000000000 --- a/contracts/.changeset/little-frogs-roll.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal add EIP-7623 support - - -PR issue: CCIP-4761 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/loud-penguins-float.md b/contracts/.changeset/loud-penguins-float.md deleted file mode 100644 index 89c43fe5a43..00000000000 --- a/contracts/.changeset/loud-penguins-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -# internal Fix: Ensure the correct timestamp is used from the oracle feed and select the most recent price between local and oracle data. diff --git a/contracts/.changeset/mean-masks-poke.md b/contracts/.changeset/mean-masks-poke.md deleted file mode 100644 index 00d8434e226..00000000000 --- a/contracts/.changeset/mean-masks-poke.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#added new function to CCIPReaderTester getLatestPriceSequenceNumber - - -PR issue: CCIP-4239 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/metal-ducks-hunt.md b/contracts/.changeset/metal-ducks-hunt.md deleted file mode 100644 index caba4819256..00000000000 --- a/contracts/.changeset/metal-ducks-hunt.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#feature adds OZ AccessControl support to the registry module - - -PR issue: CCIP-4105 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/metal-radios-push.md b/contracts/.changeset/metal-radios-push.md deleted file mode 100644 index ebf95bcddc6..00000000000 --- a/contracts/.changeset/metal-radios-push.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal minor nits, allow Router updates even when the offRamp has been used. Remove getRouter from onRamp - - -PR issue: CCIP-4010 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/modern-mayflies-give.md b/contracts/.changeset/modern-mayflies-give.md deleted file mode 100644 index c54f69e8489..00000000000 --- a/contracts/.changeset/modern-mayflies-give.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -allow multiple remote pools per chain selector - - -PR issue: CCIP-4269 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/moody-humans-judge.md b/contracts/.changeset/moody-humans-judge.md deleted file mode 100644 index ef562264a30..00000000000 --- a/contracts/.changeset/moody-humans-judge.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Minor fixes to formatting, pragma, imports, etc. for Hybrid USDC Token Pools #bugfix - - -PR issue: CCIP-3014 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/neat-melons-retire.md b/contracts/.changeset/neat-melons-retire.md deleted file mode 100644 index a3f6d185dcd..00000000000 --- a/contracts/.changeset/neat-melons-retire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -Add workflow registry contract to core in /dev folder diff --git a/contracts/.changeset/nervous-cherries-judge.md b/contracts/.changeset/nervous-cherries-judge.md deleted file mode 100644 index 92b82e9fcf6..00000000000 --- a/contracts/.changeset/nervous-cherries-judge.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -remove rawVs from RMNRemote - - -PR issue: CCIP-4015 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/new-elephants-behave.md b/contracts/.changeset/new-elephants-behave.md deleted file mode 100644 index 29f3c248afc..00000000000 --- a/contracts/.changeset/new-elephants-behave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -fix test naming diff --git a/contracts/.changeset/nice-rocks-trade.md b/contracts/.changeset/nice-rocks-trade.md deleted file mode 100644 index a60cfd4bd9b..00000000000 --- a/contracts/.changeset/nice-rocks-trade.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal Minor fixes and changing the order of removes/adds in feeToken config - -CCIP-3730 -CCIP-3727 -CCIP-3725 \ No newline at end of file diff --git a/contracts/.changeset/ninety-coins-mate.md b/contracts/.changeset/ninety-coins-mate.md deleted file mode 100644 index eda09d5c473..00000000000 --- a/contracts/.changeset/ninety-coins-mate.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Modified TokenPriceFeedConfig to support tokens with zero decimals #bugfix - - -PR issue: CCIP-3723 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/ninety-lions-complain.md b/contracts/.changeset/ninety-lions-complain.md deleted file mode 100644 index 32c81e46eee..00000000000 --- a/contracts/.changeset/ninety-lions-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Update token pool factory to support new token pool design with arbitrary decimals #bugfix diff --git a/contracts/.changeset/ninety-pianos-approve.md b/contracts/.changeset/ninety-pianos-approve.md deleted file mode 100644 index d19823ceb6c..00000000000 --- a/contracts/.changeset/ninety-pianos-approve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Address misc fixes for workflow registry contract diff --git a/contracts/.changeset/perfect-bears-clean.md b/contracts/.changeset/perfect-bears-clean.md deleted file mode 100644 index 0f8284037f5..00000000000 --- a/contracts/.changeset/perfect-bears-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Add BalanceReader contract for native balance reads through a contract diff --git a/contracts/.changeset/poor-ears-hear.md b/contracts/.changeset/poor-ears-hear.md deleted file mode 100644 index 6e0fbe26663..00000000000 --- a/contracts/.changeset/poor-ears-hear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal split onRamp and feeQuoter tests diff --git a/contracts/.changeset/poor-turtles-give.md b/contracts/.changeset/poor-turtles-give.md deleted file mode 100644 index 7776bdd195e..00000000000 --- a/contracts/.changeset/poor-turtles-give.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -DEVSVCS-958: fix automation v2.3 batching bug #bugfix diff --git a/contracts/.changeset/proud-brooms-fetch.md b/contracts/.changeset/proud-brooms-fetch.md deleted file mode 100644 index 1ab6e455c29..00000000000 --- a/contracts/.changeset/proud-brooms-fetch.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -minor gas optimizations and input sanity checks for CCIPHome #bugfix - - -PR issue: CCIP-4075 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/purple-spies-draw.md b/contracts/.changeset/purple-spies-draw.md deleted file mode 100644 index ada0d279657..00000000000 --- a/contracts/.changeset/purple-spies-draw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -Added new Data Streams contract version v0.5 diff --git a/contracts/.changeset/quick-pans-tie.md b/contracts/.changeset/quick-pans-tie.md deleted file mode 100644 index 5c96ea701dc..00000000000 --- a/contracts/.changeset/quick-pans-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal Enable Solhint for tests diff --git a/contracts/.changeset/quiet-masks-act.md b/contracts/.changeset/quiet-masks-act.md deleted file mode 100644 index 7a987553d9d..00000000000 --- a/contracts/.changeset/quiet-masks-act.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Comment and parameter validation fixes and remove outstandingTokens from BurnToAddressMintTokenPool #bugfix - - -PR issue: CCIP-5061 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/rude-badgers-tickle.md b/contracts/.changeset/rude-badgers-tickle.md deleted file mode 100644 index 4dddf8d430e..00000000000 --- a/contracts/.changeset/rude-badgers-tickle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -reduce length of reportContext in OCR3 diff --git a/contracts/.changeset/seven-worms-yawn.md b/contracts/.changeset/seven-worms-yawn.md deleted file mode 100644 index 3a8674a9d68..00000000000 --- a/contracts/.changeset/seven-worms-yawn.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal Minor FeeQuoter audit fixes - -PR issue: CCIP-5046 - - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/silver-pets-thank.md b/contracts/.changeset/silver-pets-thank.md deleted file mode 100644 index cc299b0d9a2..00000000000 --- a/contracts/.changeset/silver-pets-thank.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal skip stale price update from keystone instead of reverting - - -PR issue: CCIP-3795 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/six-games-drum.md b/contracts/.changeset/six-games-drum.md deleted file mode 100644 index 00e5ca9dc5b..00000000000 --- a/contracts/.changeset/six-games-drum.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal CCIP test restructuring - -PR issue: CCIP-4116 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/slow-gorillas-notice.md b/contracts/.changeset/slow-gorillas-notice.md deleted file mode 100644 index d470fb5832e..00000000000 --- a/contracts/.changeset/slow-gorillas-notice.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal cap max accounts in svm extra args - - -PR issue: CCIP-5111 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/small-countries-flow.md b/contracts/.changeset/small-countries-flow.md deleted file mode 100644 index 953102874bc..00000000000 --- a/contracts/.changeset/small-countries-flow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Modify TokenPool.sol function setChainRateLimiterConfig to now accept an array of configs and set sequentially. Requested by front-end. PR issue CCIP-4329 #bugfix diff --git a/contracts/.changeset/smart-bats-repair.md b/contracts/.changeset/smart-bats-repair.md deleted file mode 100644 index 220880ef2b1..00000000000 --- a/contracts/.changeset/smart-bats-repair.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Update mayberevertmessagereceiver contract to emit message received event and allow token withdrawal diff --git a/contracts/.changeset/soft-glasses-peel.md b/contracts/.changeset/soft-glasses-peel.md deleted file mode 100644 index 39c66fdc63b..00000000000 --- a/contracts/.changeset/soft-glasses-peel.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal fix missing case in gas estimation logic - - -PR issue: CCIP-4919 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/stale-dots-destroy.md b/contracts/.changeset/stale-dots-destroy.md deleted file mode 100644 index 98cea8292e0..00000000000 --- a/contracts/.changeset/stale-dots-destroy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -replace f with fObserve in RMNHome and RMNRemote and update all tests CCIP-4058 diff --git a/contracts/.changeset/swift-pumpkins-impress.md b/contracts/.changeset/swift-pumpkins-impress.md deleted file mode 100644 index d3a94f0a49c..00000000000 --- a/contracts/.changeset/swift-pumpkins-impress.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -change minSigners to f in RMNRemote/RMNHome - - -PR issue: CCIP-3614 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/tame-cycles-ring.md b/contracts/.changeset/tame-cycles-ring.md deleted file mode 100644 index 31fb56ce133..00000000000 --- a/contracts/.changeset/tame-cycles-ring.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -enable via-ir in CCIP compilation - - -PR issue: CCIP-4656 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/tasty-eggs-yell.md b/contracts/.changeset/tasty-eggs-yell.md deleted file mode 100644 index 4fb665486e1..00000000000 --- a/contracts/.changeset/tasty-eggs-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -CCIP-3789 Add check on MultiAggregateRateLimiter:UpdateRateLimitTokens that remote token is not abi.encode(address(0)) #bugfix diff --git a/contracts/.changeset/tender-lemons-punch.md b/contracts/.changeset/tender-lemons-punch.md deleted file mode 100644 index cac2e7ea0cf..00000000000 --- a/contracts/.changeset/tender-lemons-punch.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal Add supportsInterface to FeeQuoter for Keystone - -PR issue: CCIP-4359 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/thin-owls-hug.md b/contracts/.changeset/thin-owls-hug.md deleted file mode 100644 index a90875b12c5..00000000000 --- a/contracts/.changeset/thin-owls-hug.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal fix sender encoding and comments in CCIP Any2EVMMEssage and corrected comments - -PR issue: CCIP-3899 diff --git a/contracts/.changeset/thirty-rules-rule.md b/contracts/.changeset/thirty-rules-rule.md deleted file mode 100644 index 1c69192981c..00000000000 --- a/contracts/.changeset/thirty-rules-rule.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -[L2EP] Refactor tests and fix file exclusion for coverage - - -PR issue: SHIP-3521 - -Solidity Review issue: SHIP-4050 \ No newline at end of file diff --git a/contracts/.changeset/three-dogs-return.md b/contracts/.changeset/three-dogs-return.md deleted file mode 100644 index c0b4a48f7f6..00000000000 --- a/contracts/.changeset/three-dogs-return.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -extra validation on decimal logic in token pools diff --git a/contracts/.changeset/tiny-beans-leave.md b/contracts/.changeset/tiny-beans-leave.md deleted file mode 100644 index 89715004d2b..00000000000 --- a/contracts/.changeset/tiny-beans-leave.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal more efficient ownership usage - - -PR issue: CCIP-4083 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/tricky-cups-hammer.md b/contracts/.changeset/tricky-cups-hammer.md deleted file mode 100644 index a6e213c9be0..00000000000 --- a/contracts/.changeset/tricky-cups-hammer.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Make stalenessThreshold per dest chain and have 0 mean no staleness check. - - -PR issue: CCIP-3414 \ No newline at end of file diff --git a/contracts/.changeset/twelve-pianos-chew.md b/contracts/.changeset/twelve-pianos-chew.md deleted file mode 100644 index 9aa4fa8f2b2..00000000000 --- a/contracts/.changeset/twelve-pianos-chew.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal Fix gas estimation by adding a reverting clause - -PR issue: CCIP-4223 - - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/twenty-pillows-remember.md b/contracts/.changeset/twenty-pillows-remember.md deleted file mode 100644 index 02c3053c650..00000000000 --- a/contracts/.changeset/twenty-pillows-remember.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Additional security and parameter checks and comment fixes - - -PR issue: CCIP-5183 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/two-feet-tap.md b/contracts/.changeset/two-feet-tap.md deleted file mode 100644 index cc75f3e8055..00000000000 --- a/contracts/.changeset/two-feet-tap.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal Add a missing condition for the Execution plugin in the \_afterOCR3ConfigSet function. Now, the function correctly reverts if signature verification is enabled for the Execution plugin - - -PR issue: CCIP-3799 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/violet-lamps-pump.md b/contracts/.changeset/violet-lamps-pump.md deleted file mode 100644 index 4b180df24cd..00000000000 --- a/contracts/.changeset/violet-lamps-pump.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Create a new version of the ERC165Checker library which checks for sufficient gas before making an external call to prevent message delivery issues. #bugfix - - -PR issue: CCIP-4659 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/warm-queens-tan.md b/contracts/.changeset/warm-queens-tan.md deleted file mode 100644 index d3b94761a5c..00000000000 --- a/contracts/.changeset/warm-queens-tan.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal applyRateLimiterConfigUpdates validation - -PR issue: CCIP-3797 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/wet-eyes-accept.md b/contracts/.changeset/wet-eyes-accept.md deleted file mode 100644 index ea783366220..00000000000 --- a/contracts/.changeset/wet-eyes-accept.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -Refactor MockCCIPRouter to support EVMExtraArgsV2 - -PR issue : CCIP-4288 diff --git a/contracts/.changeset/wicked-fireants-explain.md b/contracts/.changeset/wicked-fireants-explain.md deleted file mode 100644 index 9fddb4a924c..00000000000 --- a/contracts/.changeset/wicked-fireants-explain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -#internal fix contract names and versions diff --git a/contracts/.changeset/wicked-maps-thank.md b/contracts/.changeset/wicked-maps-thank.md deleted file mode 100644 index 40609e6a3f5..00000000000 --- a/contracts/.changeset/wicked-maps-thank.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal Add EVM extraArgs encode & decode to MessageHasher - -PR issue: CCIP-4918 - - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/wild-tigers-know.md b/contracts/.changeset/wild-tigers-know.md deleted file mode 100644 index e7b33aeb75a..00000000000 --- a/contracts/.changeset/wild-tigers-know.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -change else if to else..if.. - - -PR issue: CCIP-3726 \ No newline at end of file diff --git a/contracts/.changeset/yellow-mugs-explode.md b/contracts/.changeset/yellow-mugs-explode.md deleted file mode 100644 index bd488e559ef..00000000000 --- a/contracts/.changeset/yellow-mugs-explode.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@chainlink/contracts': minor ---- - -#internal make gas for call exact check immutable - -PR issue: CCIP-4477 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/.changeset/young-bats-rhyme.md b/contracts/.changeset/young-bats-rhyme.md deleted file mode 100644 index e68a646b78e..00000000000 --- a/contracts/.changeset/young-bats-rhyme.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@chainlink/contracts': patch ---- - -add getChainConfig to ccipHome - - -PR issue: CCIP-4517 - -Solidity Review issue: CCIP-3966 \ No newline at end of file diff --git a/contracts/release/ccip/.changeset/config.json b/contracts/release/ccip/.changeset/config.json index c5f760594dc..98990885a8e 100644 --- a/contracts/release/ccip/.changeset/config.json +++ b/contracts/release/ccip/.changeset/config.json @@ -1,7 +1,7 @@ { "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", "changelog": [ - "../../.changeset/changelog-generator.js", + "../../../../.changeset/changelog-generator.js", { "repo": "smartcontractkit/chainlink" } diff --git a/contracts/release/ccip/.changeset/loud-drinks-worry.md b/contracts/release/ccip/.changeset/loud-drinks-worry.md deleted file mode 100644 index 701370a2686..00000000000 --- a/contracts/release/ccip/.changeset/loud-drinks-worry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@chainlink/contracts-ccip': minor ---- - -release CCIP 1.6, remove -dev suffix diff --git a/contracts/release/ccip/CHANGELOG.md b/contracts/release/ccip/CHANGELOG.md index fc9030323b4..99237927fdb 100644 --- a/contracts/release/ccip/CHANGELOG.md +++ b/contracts/release/ccip/CHANGELOG.md @@ -1,5 +1,307 @@ # @chainlink/contracts-ccip +## 1.6.0 + +### Minor Changes + +- [#15804](https://github.com/smartcontractkit/chainlink/pull/15804) [`46ef625`](https://github.com/smartcontractkit/chainlink/commit/46ef62537ea0389a86de03465253a8629766c2c9) - #feature Add two new pool types: Siloed-LockRelease and BurnToAddress and fix bug in HybridUSDCTokenPool for transferLiqudity #bugfix + + PR issue: CCIP-4723 + + Solidity Review issue: CCIP-3966 + +- [#15811](https://github.com/smartcontractkit/chainlink/pull/15811) [`4e28497`](https://github.com/smartcontractkit/chainlink/commit/4e284976ea8ca7c0e355efce6336742d70918ac2) - Update FeeQuoter to support Solana chain families #feature + + PR issue: CCIP-4687 + + Solidity Review issue: CCIP-3966 + +- [#14924](https://github.com/smartcontractkit/chainlink/pull/14924) [`161d227`](https://github.com/smartcontractkit/chainlink/commit/161d227575bbeca0119e5eee8e5a54cf3b4df677) - New contract for deploying, CCIP-compatible token pools and configuring with the tokenAdminRegistry, and a new ERC20 with constructor compatible with the factory's deployment pattern. #internal + + PR issue: CCIP-3171 + + Solidity Review issue: CCIP-3966 + +- [#15099](https://github.com/smartcontractkit/chainlink/pull/15099) [`9c79488`](https://github.com/smartcontractkit/chainlink/commit/9c79488e4259bd59aa4d25b2be9c2ffd9390333d) - #internal Add new event in setRateLimitAdmin for Atlas + + PR issue: CCIP-4099 + + Solidity Review issue: CCIP-3966 + +- [#15737](https://github.com/smartcontractkit/chainlink/pull/15737) [`631cd8f`](https://github.com/smartcontractkit/chainlink/commit/631cd8fae34c73801e223f9ef96f23a032cf407f) - #internal Account for tokenTransferBytesOverhead in exec cost + + PR issue: CCIP-4646 + + Solidity Review issue: CCIP-3966 + +- [#16298](https://github.com/smartcontractkit/chainlink/pull/16298) [`ab06bf0`](https://github.com/smartcontractkit/chainlink/commit/ab06bf0277b5641c24596d05351dd23df544a72c) - release CCIP 1.6, remove -dev suffix + + PR issue: CCIP-5181 + + Solidity Review issue: CCIP-3966 + +- [#15123](https://github.com/smartcontractkit/chainlink/pull/15123) [`72da397`](https://github.com/smartcontractkit/chainlink/commit/72da397b9b1a8baa95129ffe635e5d60852e9ebc) - Add a new contract, BurnMintERC20, which is basically just our ERC677 implementation without the transferAndCall function. #internal + + PR issue: CCIP-4130 + + Solidity Review issue: CCIP-3966 + +- [#14696](https://github.com/smartcontractkit/chainlink/pull/14696) [`072bfb6`](https://github.com/smartcontractkit/chainlink/commit/072bfb667a4e1f7cc0c874409ebfe6ef7f7b6cbe) - #internal add getNextDonId() and getNodes(bytes32[] calldata p2pIds) in CapabilitiesRegistry and define interface for node info + + PR issue: CCIP-3569 + +- release CCIP 1.6, remove -dev suffix + +- [#14981](https://github.com/smartcontractkit/chainlink/pull/14981) [`a0309c9`](https://github.com/smartcontractkit/chainlink/commit/a0309c9a87ca7bcbe50db2fa272f9fab024bef13) - #internal skip stale price update from keystone instead of reverting + + PR issue: CCIP-3795 + + Solidity Review issue: CCIP-3966 + +- [#15165](https://github.com/smartcontractkit/chainlink/pull/15165) [`03827b9`](https://github.com/smartcontractkit/chainlink/commit/03827b9d291cb11501162f9eafa1eba5619cabc9) - #internal CCIP test restructuring + + PR issue: CCIP-4116 + + Solidity Review issue: CCIP-3966 + +- [#14817](https://github.com/smartcontractkit/chainlink/pull/14817) [`974def5`](https://github.com/smartcontractkit/chainlink/commit/974def52d97ee548b7568cf2facbc556dfa0e797) - change minSigners to f in RMNRemote/RMNHome + + PR issue: CCIP-3614 + + Solidity Review issue: CCIP-3966 + +- [#15448](https://github.com/smartcontractkit/chainlink/pull/15448) [`c1ee7ab`](https://github.com/smartcontractkit/chainlink/commit/c1ee7ab715b524df6b580593e18f51637bd1500d) - #internal Add supportsInterface to FeeQuoter for Keystone + + PR issue: CCIP-4359 + + Solidity Review issue: CCIP-3966 + +- [#14877](https://github.com/smartcontractkit/chainlink/pull/14877) [`317f930`](https://github.com/smartcontractkit/chainlink/commit/317f93014d9b5deb76e5b54685b020f44be9b46e) - #internal fix sender encoding and comments in CCIP Any2EVMMEssage and corrected comments + + PR issue: CCIP-3899 + +- [#15504](https://github.com/smartcontractkit/chainlink/pull/15504) [`437ef64`](https://github.com/smartcontractkit/chainlink/commit/437ef640db1d4455e7b4d90868c9e5c4d62054df) - #internal Fix gas estimation by adding a reverting clause + + PR issue: CCIP-4223 + + Solidity Review issue: CCIP-3966 + +- [#14951](https://github.com/smartcontractkit/chainlink/pull/14951) [`2fab939`](https://github.com/smartcontractkit/chainlink/commit/2fab939ad3fbd49f79e96c177a9ffb11387f397e) - #internal Add a missing condition for the Execution plugin in the \_afterOCR3ConfigSet function. Now, the function correctly reverts if signature verification is enabled for the Execution plugin + + PR issue: CCIP-3799 + + Solidity Review issue: CCIP-3966 + +- [#14918](https://github.com/smartcontractkit/chainlink/pull/14918) [`1c53ec2`](https://github.com/smartcontractkit/chainlink/commit/1c53ec25ed6c6bfee37e9052236fe595eeef8d89) - #internal applyRateLimiterConfigUpdates validation + + PR issue: CCIP-3797 + + Solidity Review issue: CCIP-3966 + +- [#15983](https://github.com/smartcontractkit/chainlink/pull/15983) [`78d548d`](https://github.com/smartcontractkit/chainlink/commit/78d548d6101afd7fc82c2568a3665b4b57d5b1eb) - #internal Add EVM extraArgs encode & decode to MessageHasher + + PR issue: CCIP-4918 + + Solidity Review issue: CCIP-3966 + +- [#15575](https://github.com/smartcontractkit/chainlink/pull/15575) [`ef0dd1c`](https://github.com/smartcontractkit/chainlink/commit/ef0dd1c1b9c9650a3dba7b5c3d5f2e81db90a555) - #internal make gas for call exact check immutable + + PR issue: CCIP-4477 + + Solidity Review issue: CCIP-3966 + +### Patch Changes + +- [#15422](https://github.com/smartcontractkit/chainlink/pull/15422) [`3cecd5f`](https://github.com/smartcontractkit/chainlink/commit/3cecd5f7dd5f8eaa624eafd8db701475facb8617) - add legacy fallback to RMN + + PR issue: CCIP-4261 + + Solidity Review issue: CCIP-3966 + +- [#14798](https://github.com/smartcontractkit/chainlink/pull/14798) [`26e22eb`](https://github.com/smartcontractkit/chainlink/commit/26e22eb6cfc320d981c91b1bfeb87c3c645f10d6) - #internal fixing comments and data availability bytes length calculation + + PR issue : CCIP-3785 + +- [#15829](https://github.com/smartcontractkit/chainlink/pull/15829) [`6e65dee`](https://github.com/smartcontractkit/chainlink/commit/6e65deecae053ee1e885da7ce6d1d308364ced1d) - #internal Generate gethwrappers through Foundry instead of solc-select via python + + PR issue: CCIP-4737 + + Solidity Review issue: CCIP-3966 + +- [#16201](https://github.com/smartcontractkit/chainlink/pull/16201) [`8ab88c2`](https://github.com/smartcontractkit/chainlink/commit/8ab88c2d9d5e5df4f8496763e74b0bb9c4c183a9) - #internal enable both blessed and unblessed roots in a single commit report + + PR issue: CCIP-5140 + + Solidity Review issue: CCIP-3966 + +- [#15523](https://github.com/smartcontractkit/chainlink/pull/15523) [`baa225e`](https://github.com/smartcontractkit/chainlink/commit/baa225e7614f504a70cb51a8b0d0a98402971268) - remove legacy curse check from RMNRemote isCursed() method #bugfix + + PR issue: CCIP-4476 + + Solidity Review issue: CCIP-3966 + +- [#16226](https://github.com/smartcontractkit/chainlink/pull/16226) [`b92a304`](https://github.com/smartcontractkit/chainlink/commit/b92a304b55570fdeb87a4f3e840819d1cf33f043) - #internal Add Support for SVM ATA to USDCTokenPool and send correct tokenReceiver to token pools + + PR issue: CCIP-5139 + + Solidity Review issue: CCIP-3966 + +- [#16017](https://github.com/smartcontractkit/chainlink/pull/16017) [`17a9e2a`](https://github.com/smartcontractkit/chainlink/commit/17a9e2af202a313ea734a556af3f4460d3e8c795) - #internal decouple LiquidityManager tests with LockReleaseTokenPool + Test Rename + + PR issue: CCIP-4428 + + Solidity Review issue: CCIP-3966 + +- [#15458](https://github.com/smartcontractkit/chainlink/pull/15458) [`5a3a99b`](https://github.com/smartcontractkit/chainlink/commit/5a3a99b7982dbf0f8aa57654dac356419736bd30) - Add token address to TokenHandlingError + + PR issue: CCIP-4174 + + Solidity Review issue: CCIP-3966 + +- [#16141](https://github.com/smartcontractkit/chainlink/pull/16141) [`16a7985`](https://github.com/smartcontractkit/chainlink/commit/16a7985836d2055aca62d4cd331f2d374792d0d1) - #internal move multiple weth9 implementations to vendor + + PR issue: CCIP-5081 + + Solidity Review issue: CCIP-3966 + +- [#14805](https://github.com/smartcontractkit/chainlink/pull/14805) [`b17c09d`](https://github.com/smartcontractkit/chainlink/commit/b17c09d252f75071f6ec54b3389257c1f27df9b2) - Gas optimizations and comment cleanup #internal + + PR issue: CCIP-3736 + + Solidity Review issue: CCIP-3966 + +- [#15904](https://github.com/smartcontractkit/chainlink/pull/15904) [`5314b41`](https://github.com/smartcontractkit/chainlink/commit/5314b4127404aa2f402cd396c3088923136ac9d0) - #internal add EIP-7623 support + + PR issue: CCIP-4761 + + Solidity Review issue: CCIP-3966 + +- [#15357](https://github.com/smartcontractkit/chainlink/pull/15357) [`18cb44e`](https://github.com/smartcontractkit/chainlink/commit/18cb44e891a00edff7486640ffc8e0c9275a04f8) - #added new function to CCIPReaderTester getLatestPriceSequenceNumber + + PR issue: CCIP-4239 + + Solidity Review issue: CCIP-3966 + +- [#15067](https://github.com/smartcontractkit/chainlink/pull/15067) [`eeb58e2`](https://github.com/smartcontractkit/chainlink/commit/eeb58e2d3ae5d84826b31eaf805b30f722a8e87d) - #feature adds OZ AccessControl support to the registry module + + PR issue: CCIP-4105 + + Solidity Review issue: CCIP-3966 + +- [#14972](https://github.com/smartcontractkit/chainlink/pull/14972) [`6db71d3`](https://github.com/smartcontractkit/chainlink/commit/6db71d32d756eba147ec69f385252aa51589d517) - #internal minor nits, allow Router updates even when the offRamp has been used. Remove getRouter from onRamp + + PR issue: CCIP-4010 + + Solidity Review issue: CCIP-3966 + +- [#15293](https://github.com/smartcontractkit/chainlink/pull/15293) [`4665863`](https://github.com/smartcontractkit/chainlink/commit/466586309a8cbbfc1c793ff1021b7fcd3522dd3e) - allow multiple remote pools per chain selector + + PR issue: CCIP-4269 + + Solidity Review issue: CCIP-3966 + +- [#14922](https://github.com/smartcontractkit/chainlink/pull/14922) [`42db9fd`](https://github.com/smartcontractkit/chainlink/commit/42db9fd17ca32d554f8bc9d0c6aab01e5c0e8c81) - Minor fixes to formatting, pragma, imports, etc. for Hybrid USDC Token Pools #bugfix + + PR issue: CCIP-3014 + + Solidity Review issue: CCIP-3966 + +- [#14969](https://github.com/smartcontractkit/chainlink/pull/14969) [`ccd9956`](https://github.com/smartcontractkit/chainlink/commit/ccd9956ac6cec25770c93e57e283aa2a5ebb6737) - remove rawVs from RMNRemote + + PR issue: CCIP-4015 + + Solidity Review issue: CCIP-3966 + +- [#14845](https://github.com/smartcontractkit/chainlink/pull/14845) [`3f955bf`](https://github.com/smartcontractkit/chainlink/commit/3f955bfde18bbad19f7195da1da179d04275a873) - #internal Minor fixes and changing the order of removes/adds in feeToken config + + CCIP-3730 + CCIP-3727 + CCIP-3725 + +- [#14809](https://github.com/smartcontractkit/chainlink/pull/14809) [`082e6fc`](https://github.com/smartcontractkit/chainlink/commit/082e6fc8f918dc69e9a5a2acbff6644dca74f2b1) - Modified TokenPriceFeedConfig to support tokens with zero decimals #bugfix + + PR issue: CCIP-3723 + + Solidity Review issue: CCIP-3966 + +- [#15006](https://github.com/smartcontractkit/chainlink/pull/15006) [`33dba89`](https://github.com/smartcontractkit/chainlink/commit/33dba89a3beda1138fe7332a4947411e748fd99f) - minor gas optimizations and input sanity checks for CCIPHome #bugfix + + PR issue: CCIP-4075 + + Solidity Review issue: CCIP-3966 + +- [#16102](https://github.com/smartcontractkit/chainlink/pull/16102) [`57ca0fb`](https://github.com/smartcontractkit/chainlink/commit/57ca0fb8f3c74fec461e2168d362b62374e26b63) - Comment and parameter validation fixes and remove outstandingTokens from BurnToAddressMintTokenPool #bugfix + + PR issue: CCIP-5061 + + Solidity Review issue: CCIP-3966 + +- [#16090](https://github.com/smartcontractkit/chainlink/pull/16090) [`2efb46c`](https://github.com/smartcontractkit/chainlink/commit/2efb46c470867127671d39b214297f9419b24a48) - #internal Minor FeeQuoter audit fixes + + PR issue: CCIP-5046 + + Solidity Review issue: CCIP-3966 + +- [#16175](https://github.com/smartcontractkit/chainlink/pull/16175) [`1c76b30`](https://github.com/smartcontractkit/chainlink/commit/1c76b30f78fdb542d9f5b7ee4c7238e6b8f408d2) - #internal cap max accounts in svm extra args + + PR issue: CCIP-5111 + + Solidity Review issue: CCIP-3966 + +- [#15386](https://github.com/smartcontractkit/chainlink/pull/15386) [`62c2376`](https://github.com/smartcontractkit/chainlink/commit/62c23768cd483b179301625603a785dd773f2c78) - Modify TokenPool.sol function setChainRateLimiterConfig to now accept an array of configs and set sequentially. Requested by front-end. PR issue CCIP-4329 #bugfix + +- [#15984](https://github.com/smartcontractkit/chainlink/pull/15984) [`86e9119`](https://github.com/smartcontractkit/chainlink/commit/86e9119d69b15c5e83ed38edc4debe1e6ce87674) - #internal fix missing case in gas estimation logic + + PR issue: CCIP-4919 + + Solidity Review issue: CCIP-3966 + +- [#15605](https://github.com/smartcontractkit/chainlink/pull/15605) [`8c65527`](https://github.com/smartcontractkit/chainlink/commit/8c65527c82a20c74b2a4707221ef496802b21804) - replace f with fObserve in RMNHome and RMNRemote and update all tests CCIP-4058 + +- [#15405](https://github.com/smartcontractkit/chainlink/pull/15405) [`16f1529`](https://github.com/smartcontractkit/chainlink/commit/16f1529856a575c8d2091a16033a8d0371408d96) - enable via-ir in CCIP compilation + + PR issue: CCIP-4656 + + Solidity Review issue: CCIP-3966 + +- [#14960](https://github.com/smartcontractkit/chainlink/pull/14960) [`1b1dc3b`](https://github.com/smartcontractkit/chainlink/commit/1b1dc3b8ee058901828963a0b9e59fc239444e93) - CCIP-3789 Add check on MultiAggregateRateLimiter:UpdateRateLimitTokens that remote token is not abi.encode(address(0)) #bugfix + +- [#15020](https://github.com/smartcontractkit/chainlink/pull/15020) [`9ec788e`](https://github.com/smartcontractkit/chainlink/commit/9ec788e78b4fcf3266b5e0a9ed2e166cea51388f) - #internal more efficient ownership usage + + PR issue: CCIP-4083 + + Solidity Review issue: CCIP-3966 + +- [#14734](https://github.com/smartcontractkit/chainlink/pull/14734) [`ca71878`](https://github.com/smartcontractkit/chainlink/commit/ca71878aa5a55fe239a456d7b564ffeba9bc84d7) - Make stalenessThreshold per dest chain and have 0 mean no staleness check. + + PR issue: CCIP-3414 + +- [#16299](https://github.com/smartcontractkit/chainlink/pull/16299) [`3b89c46`](https://github.com/smartcontractkit/chainlink/commit/3b89c464872609a87a172d93175f3314cb8558f6) - Additional security and parameter checks and comment fixes + + PR issue: CCIP-5183 + + Solidity Review issue: CCIP-3966 + +- [#15743](https://github.com/smartcontractkit/chainlink/pull/15743) [`4a19318`](https://github.com/smartcontractkit/chainlink/commit/4a19318efa56c079da53777f82404a1fbb24479a) - Create a new version of the ERC165Checker library which checks for sufficient gas before making an external call to prevent message delivery issues. #bugfix + + PR issue: CCIP-4659 + + Solidity Review issue: CCIP-3966 + +- [#15301](https://github.com/smartcontractkit/chainlink/pull/15301) [`6c4f1b9`](https://github.com/smartcontractkit/chainlink/commit/6c4f1b920c64b9c066b19119bb5990f0bb0714b0) - Refactor MockCCIPRouter to support EVMExtraArgsV2 + + PR issue : CCIP-4288 + +- [#14863](https://github.com/smartcontractkit/chainlink/pull/14863) [`84bcbe0`](https://github.com/smartcontractkit/chainlink/commit/84bcbe03ebfa3ab7f58b97897eb0c55b45191859) - change else if to else..if.. + + PR issue: CCIP-3726 + +- [#15570](https://github.com/smartcontractkit/chainlink/pull/15570) [`c1341a5`](https://github.com/smartcontractkit/chainlink/commit/c1341a5081d098bce04a7564a6525a91f2beeecf) - add getChainConfig to ccipHome + + PR issue: CCIP-4517 + + Solidity Review issue: CCIP-3966 + ## 1.5.0 ### Minor Changes diff --git a/contracts/release/ccip/pnpm-lock.yaml b/contracts/release/ccip/pnpm-lock.yaml new file mode 100644 index 00000000000..f8bedad8e52 --- /dev/null +++ b/contracts/release/ccip/pnpm-lock.yaml @@ -0,0 +1,858 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@changesets/cli': + specifier: ~2.27.8 + version: 2.27.12 + '@changesets/get-github-info': + specifier: ^0.6.0 + version: 0.6.0 + semver: + specifier: ^7.6.3 + version: 7.7.1 + +packages: + + '@babel/runtime@7.26.7': + resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.8': + resolution: {integrity: sha512-qjMUj4DYQ1Z6qHawsn7S71SujrExJ+nceyKKyI9iB+M5p9lCL55afuEd6uLBPRpLGWQwkwvWegDHtwHJb1UjpA==} + + '@changesets/assemble-release-plan@6.0.5': + resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.12': + resolution: {integrity: sha512-9o3fOfHYOvBnyEn0mcahB7wzaA3P4bGJf8PNqGit5PKaMEFdsRixik+txkrJWd2VX+O6wRFXpxQL8j/1ANKE9g==} + hasBin: true + + '@changesets/config@3.0.5': + resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.1.2': + resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + + '@changesets/get-github-info@0.6.0': + resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} + + '@changesets/get-release-plan@4.0.6': + resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.2': + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + + '@changesets/logger@0.1.1': + resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.1': + resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + + '@changesets/read@0.6.2': + resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} + + '@changesets/should-skip-package@0.1.1': + resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.2': + resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + dataloader@1.4.0: + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-manager-detector@0.2.9: + resolution: {integrity: sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + semver@7.7.1: + resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + +snapshots: + + '@babel/runtime@7.26.7': + dependencies: + regenerator-runtime: 0.14.1 + + '@changesets/apply-release-plan@7.0.8': + dependencies: + '@changesets/config': 3.0.5 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.7.1 + + '@changesets/assemble-release-plan@6.0.5': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.7.1 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.12': + dependencies: + '@changesets/apply-release-plan': 7.0.8 + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.5 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-release-plan': 4.0.6 + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/should-skip-package': 0.1.1 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.2 + '@manypkg/get-packages': 1.1.3 + ansi-colors: 4.1.3 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + mri: 1.2.0 + p-limit: 2.3.0 + package-manager-detector: 0.2.9 + picocolors: 1.1.1 + resolve-from: 5.0.0 + semver: 7.7.1 + spawndamnit: 3.0.1 + term-size: 2.2.1 + + '@changesets/config@3.0.5': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.1.2 + '@changesets/logger': 0.1.1 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.8 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.1.2': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + picocolors: 1.1.1 + semver: 7.7.1 + + '@changesets/get-github-info@0.6.0': + dependencies: + dataloader: 1.4.0 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + '@changesets/get-release-plan@4.0.6': + dependencies: + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/config': 3.0.5 + '@changesets/pre': 2.0.1 + '@changesets/read': 0.6.2 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.2': + dependencies: + '@changesets/errors': 0.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.8 + spawndamnit: 3.0.1 + + '@changesets/logger@0.1.1': + dependencies: + picocolors: 1.1.1 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.1': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.2': + dependencies: + '@changesets/git': 3.0.2 + '@changesets/logger': 0.1.1 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + p-filter: 2.1.0 + picocolors: 1.1.1 + + '@changesets/should-skip-package@0.1.1': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.2': + dependencies: + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.26.7 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.26.7 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.0 + + '@types/node@12.20.55': {} + + ansi-colors@4.1.3: {} + + ansi-regex@5.0.1: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + array-union@2.1.0: {} + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + chardet@0.7.0: {} + + ci-info@3.9.0: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + dataloader@1.4.0: {} + + detect-indent@6.1.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + esprima@4.0.1: {} + + extendable-error@0.1.7: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastq@1.19.0: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + graceful-fs@4.2.11: {} + + human-id@1.0.2: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-windows@1.0.2: {} + + isexe@2.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + lodash.startcase@4.4.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mri@1.2.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + os-tmpdir@1.0.2: {} + + outdent@0.5.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-map@2.1.0: {} + + p-try@2.2.0: {} + + package-manager-detector@0.2.9: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@4.0.1: {} + + prettier@2.8.8: {} + + queue-microtask@1.2.3: {} + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + regenerator-runtime@0.14.1: {} + + resolve-from@5.0.0: {} + + reusify@1.0.4: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + semver@7.7.1: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + spawndamnit@3.0.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + sprintf-js@1.0.3: {} + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + term-size@2.2.1: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + universalify@0.1.2: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 From 9170d92bbe78ec8517a9025c3e2b687bdf2a37e1 Mon Sep 17 00:00:00 2001 From: Lukasz <120112546+lukaszcl@users.noreply.github.com> Date: Thu, 13 Feb 2025 16:08:56 +0100 Subject: [PATCH 56/83] TT-1994 Restrict Solana build artifacts step to deployment project in Flakeguard (#16378) * Build Solana artifacts in Flakeguard only for deployment project * trigger tests * Revert "trigger tests" This reverts commit ba88c7f0d16510b9445ed0b1f6d4009d1db8b02d. --- .github/workflows/flakeguard.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/flakeguard.yml b/.github/workflows/flakeguard.yml index 6b672985845..5c24e4973b3 100644 --- a/.github/workflows/flakeguard.yml +++ b/.github/workflows/flakeguard.yml @@ -295,6 +295,8 @@ jobs: uses: ./.github/actions/setup-solana - name: Build Solana artifacts + # Only required for the deployment project + if: ${{ inputs.projectPath == 'deployment' }} uses: ./.github/actions/setup-solana/build-contracts with: github-token: ${{ secrets.GH_TOKEN }} From 34898b5fb807f8e8c55efd9c064082e07082a680 Mon Sep 17 00:00:00 2001 From: Mateusz Sekara Date: Thu, 13 Feb 2025 16:41:43 +0100 Subject: [PATCH 57/83] don't enforce ccip tag format in package json (#16375) --- .github/workflows/build-publish.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/build-publish.yml b/.github/workflows/build-publish.yml index 283e04f307b..0c26836cd4e 100644 --- a/.github/workflows/build-publish.yml +++ b/.github/workflows/build-publish.yml @@ -43,16 +43,6 @@ jobs: - name: Check release tag id: release-tag-check uses: smartcontractkit/.github/actions/release-tag-check@c5c4a8186da4218cff6cac8184e47dd3dec69ba3 # release-tag-check@0.1.0 - - name: Fail if CCIP release has wrong version - if: ${{ steps.check-git-tag-type.outputs.git-tag-type == 'ccip' }} - run: | - version=$(jq -r '.version' ./package.json) - echo "Package version: $version" - echo "Git tag type: ${{ steps.check-git-tag-type.outputs.git-tag-type }}" - if [[ $version != *"-ccip"* ]]; then - echo "Error: Version '$version' does not match required CCIP format." - exit 1 - fi - name: Check for VERSION file bump on tags # Avoids checking VERSION file bump on forks or from CCIP releases. if: ${{ github.repository == 'smartcontractkit/chainlink' && steps.check-git-tag-type.outputs.git-tag-type == 'core' }} From 0bb4791898e6921a4b1c99be566b5d3851b029a0 Mon Sep 17 00:00:00 2001 From: Njegos Railic Date: Thu, 13 Feb 2025 16:48:20 +0100 Subject: [PATCH 58/83] Disabling GAP for client compatibility tests (#16386) --- .../workflows/client-compatibility-tests.yml | 39 ++++++++++--------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/.github/workflows/client-compatibility-tests.yml b/.github/workflows/client-compatibility-tests.yml index 45b06b7b94b..ebf2e55dcfd 100644 --- a/.github/workflows/client-compatibility-tests.yml +++ b/.github/workflows/client-compatibility-tests.yml @@ -107,12 +107,12 @@ jobs: echo "should_run=true" >> $GITHUB_OUTPUT elif [ "$GITHUB_EVENT_NAME" = "schedule" ]; then echo "## Build trigger" >> $GITHUB_STEP_SUMMARY - echo "schedule" >> $GITHUB_STEP_SUMMARY + echo "schedule" >> $GITHUB_STEP_SUMMARY echo "Will run tests, because trigger event was $GITHUB_EVENT_NAME" echo "should_run=true" >> $GITHUB_OUTPUT elif [ "$GITHUB_EVENT_NAME" = "workflow_dispatch" ]; then echo "Will run tests, because trigger event was $GITHUB_EVENT_NAME" - echo "should_run=true" >> $GITHUB_OUTPUT + echo "should_run=true" >> $GITHUB_OUTPUT elif [ "$GITHUB_REF_TYPE" = "tag" ]; then echo "## Build trigger" >> $GITHUB_STEP_SUMMARY echo "new tag" >> $GITHUB_STEP_SUMMARY @@ -150,7 +150,7 @@ jobs: GH_EVENT_INPUTS_EVM_IMPLEMENTATIONS: ${{ github.event.inputs.evmImplementations }} run: | PATH=$PATH:$(go env GOPATH)/bin - export PATH + export PATH if [ "$GITHUB_EVENT_NAME" = "schedule" ]; then echo "Checking for new releases" @@ -180,7 +180,7 @@ jobs: echo "New reth release found: $new_reth" implementations_arr+=("reth") fi - + IFS=',' eth_implementations="${implementations_arr[*]}" if [ -n "$eth_implementations" ]; then @@ -196,7 +196,7 @@ jobs: echo "Will test following EVM implementations: $GH_EVENT_INPUTS_EVM_IMPLEMENTATIONS" echo "evm_implementations=$GH_EVENT_INPUTS_EVM_IMPLEMENTATIONS" >> $GITHUB_OUTPUT fi - else + else echo "Will test all EVM implementations" echo "evm_implementations=geth,besu,nethermind,erigon,reth" >> $GITHUB_OUTPUT fi @@ -223,7 +223,7 @@ jobs: echo "Fetching Chainlink version from input" if [ -n "$GH_EVENT_INPUTS_CHAINLINK_VERSION" ]; then echo "Chainlink version provided in input" - chainlink_version="$GH_EVENT_INPUTS_CHAINLINK_VERSION" + chainlink_version="$GH_EVENT_INPUTS_CHAINLINK_VERSION" if [[ "$chainlink_version" =~ ^[0-9a-f]{40}$ ]]; then cl_ref_path="commit" chainlink_image_version=$chainlink_version @@ -400,7 +400,7 @@ jobs: ETH_IMPLEMENTATIONS: ${{ needs.select-versions.outputs.evm_implementations }} run: | PATH=$PATH:$(go env GOPATH)/bin - export PATH + export PATH if [[ "$ETH_IMPLEMENTATIONS" == *"geth"* ]]; then geth_images=$(ecrimagefetcher 'ethereum/client-go' '^v?[0-9]+\.[0-9]+\.[0-9]+$' ${{ env.LATEST_IMAGE_COUNT }}) echo "GETH_IMAGES=$geth_images" >> $GITHUB_ENV @@ -424,14 +424,14 @@ jobs: # 2.60.0 and 2.60.1 are ignored as they stopped working with CL node erigon_images=$(ecrimagefetcher 'thorax/erigon' '^v?[0-9]+\.[0-9]+\.[0-9]+$' ${{ env.LATEST_IMAGE_COUNT }} "v2.60.2") echo "ERIGON_IMAGES=$erigon_images" >> $GITHUB_ENV - echo "Erigon latest images: $erigon_images" + echo "Erigon latest images: $erigon_images" fi - + if [[ "$ETH_IMPLEMENTATIONS" == *"reth"* ]]; then reth_images=$(ecrimagefetcher 'ghcr.io/paradigmxyz/reth' '^v?[0-9]+\.[0-9]+\.[0-9]+$' ${{ env.LATEST_IMAGE_COUNT }}) echo "RETH_IMAGES=$reth_images" >> $GITHUB_ENV - echo "Reth latest images: $reth_images" - fi + echo "Reth latest images: $reth_images" + fi # End Build Test Dependencies @@ -490,7 +490,7 @@ jobs: run: | PATH=$PATH:$(go env GOPATH)/bin export PATH - + if [[ "$ETH_IMPLEMENTATIONS" == *"geth"* ]]; then echo "Will test compatibility with geth" testlistgenerator -o compatibility_test_list.json -p cron -r TestCronBasic -f './smoke/cron_test.go' -e geth -d "${{ needs.get-latest-available-images.outputs.geth_images }}" -t "evm-implementation-compatibility-test" -n "ubuntu-latest" @@ -560,7 +560,7 @@ jobs: else echo "Will not test compatibility with nethermind" fi - + if [[ "$ETH_IMPLEMENTATIONS" == *"reth"* ]]; then echo "Will test compatibility with reth" testlistgenerator -o compatibility_test_list.json -p cron -r TestCronBasic -f './smoke/cron_test.go' -e reth -d "${{ needs.get-latest-available-images.outputs.reth_images }}" -t "evm-implementation-compatibility-test" -n "ubuntu-latest" @@ -576,8 +576,8 @@ jobs: testlistgenerator -o compatibility_test_list.json -p vrfv2plus -r '^TestVRFv2Plus$/^Link_Billing$' -f './smoke/vrfv2plus_test.go' -e reth -d "${{ needs.get-latest-available-images.outputs.reth_images }}" -t "evm-implementation-compatibility-test" -n "ubuntu-latest" else echo "Will not test compatibility with reth" - fi - + fi + jq . compatibility_test_list.json JOB_MATRIX_JSON=$(jq -c . compatibility_test_list.json) echo "JOB_MATRIX_JSON=${JOB_MATRIX_JSON}" >> $GITHUB_ENV @@ -651,7 +651,7 @@ jobs: # comment_on_pr: false # theme: 'dark' - name: Run Tests - uses: smartcontractkit/.github/actions/ctf-run-tests@725dd141dd77cc87dad420e9484416fc4ae26be2 # ctf-run-tests@v0.5.0 + uses: smartcontractkit/.github/actions/ctf-run-tests@a48a41903275a2cd1b2bbe29cb3eb420848eb801 # ctf-run-tests@v0.6.0 with: test_command_to_run: cd ./integration-tests && touch .root_dir && go test -timeout 30m -count=1 -json ${{ matrix.evm_node.run }} 2>&1 | tee /tmp/gotest.log | gotestloghelper -ci -singlepackage -hidepassingtests=false -hidepassinglogs test_download_vendor_packages_command: cd ./integration-tests && go mod download @@ -659,7 +659,7 @@ jobs: artifacts_name: ${{ env.TEST_LOG_NAME }} artifacts_location: | ./integration-tests/smoke/logs/ - ./integration-tests/smoke/db_dumps/ + ./integration-tests/smoke/db_dumps/ /tmp/gotest.log publish_check_name: ${{ matrix.evm_node.product }}-${{ matrix.evm_node.eth_implementation }} token: ${{ secrets.GITHUB_TOKEN }} @@ -673,6 +673,7 @@ jobs: go_coverage_dest_dir: ${{ github.workspace }}/.covdata main-dns-zone: ${{ secrets.MAIN_DNS_ZONE_PUBLIC_SDLC }} k8s-cluster-name: ${{ secrets.AWS_K8S_CLUSTER_NAME_SDLC }} + enable-gap: "false" env: E2E_TEST_SELECTED_NETWORK: ${{ env.SELECTED_NETWORKS}} E2E_TEST_CHAINLINK_IMAGE: ${{ env.CHAINLINK_IMAGE }} @@ -790,7 +791,7 @@ jobs: workflowresultparser -workflowRunID ${{ github.run_id }} -githubToken ${{ github.token }} -githubRepo "${{ github.repository }}" -jobNameRegex "^flux compatibility with (.*?)$" -namedKey="flux" -outputFile=output.json workflowresultparser -workflowRunID ${{ github.run_id }} -githubToken ${{ github.token }} -githubRepo "${{ github.repository }}" -jobNameRegex "^runlog compatibility with (.*?)$" -namedKey="runlog" -outputFile=output.json workflowresultparser -workflowRunID ${{ github.run_id }} -githubToken ${{ github.token }} -githubRepo "${{ github.repository }}" -jobNameRegex "^cron compatibility with (.*?)$" -namedKey="cron" -outputFile=output.json - + echo "base64_parsed_results=$(base64 -w 0 output.json)" >> $GITHUB_OUTPUT display-test-results: @@ -818,7 +819,7 @@ jobs: raw_results="$(echo ${{ needs.parse-test-results.outputs.base64_parsed_results }} | base64 -d)" echo $raw_results > input.json - asciitable --firstColumn "EVM Implementation" --secondColumn Result --jsonfile input.json --outputFile output.txt --section "automation" --namedKey "automation" + asciitable --firstColumn "EVM Implementation" --secondColumn Result --jsonfile input.json --outputFile output.txt --section "automation" --namedKey "automation" asciitable --firstColumn "EVM Implementation" --secondColumn Result --jsonfile input.json --outputFile output.txt --section "keeper" --namedKey "keeper" asciitable --firstColumn "EVM Implementation" --secondColumn Result --jsonfile input.json --outputFile output.txt --section "log_poller" --namedKey "log_poller" asciitable --firstColumn "EVM Implementation" --secondColumn Result --jsonfile input.json --outputFile output.txt --section "ocr" --namedKey "ocr" From 6b99dad8301efccd1305e89c409f3cefa60b3efe Mon Sep 17 00:00:00 2001 From: gustavogama-cll <165679773+gustavogama-cll@users.noreply.github.com> Date: Thu, 13 Feb 2025 14:56:18 -0300 Subject: [PATCH 59/83] fix: execute all operations from proposals when using new mcms lib (#16368) * fix: execute all operations from proposals when using new mcms lib As opposed to executing "per chain". The existing code that executed per chain was broken as it (1) did not build the executors map properly, (2) did not skip execution of operations from different chains in the inner for loop, and (3) uses the `IsReady` call, which checks the readiness of *all* operations, regardless of chain. The new implementations simply executes all the proposal operations, in order, regardless of chain. It seems to suit the requirements of the existing changeset tests. * review: drop unnecessary "chains" map * review: drop unnecessary chainSelectors map --- deployment/common/changeset/test_helpers.go | 27 +---- .../common/proposalutils/mcms_test_helpers.go | 114 +++++++++++------- 2 files changed, 72 insertions(+), 69 deletions(-) diff --git a/deployment/common/changeset/test_helpers.go b/deployment/common/changeset/test_helpers.go index f9876f50e4c..7b29af4cac0 100644 --- a/deployment/common/changeset/test_helpers.go +++ b/deployment/common/changeset/test_helpers.go @@ -89,34 +89,15 @@ func ApplyChangesets(t *testing.T, e deployment.Environment, timelockContractsPe } if out.MCMSTimelockProposals != nil { for _, prop := range out.MCMSTimelockProposals { - chains := mapset.NewSet[uint64]() - for _, op := range prop.Operations { - chains.Add(uint64(op.ChainSelector)) - } - - p := proposalutils.SignMCMSTimelockProposal(t, e, &prop) - for _, sel := range chains.ToSlice() { - timelockContracts, ok := timelockContractsPerChain[sel] - if !ok || timelockContracts == nil { - return deployment.Environment{}, fmt.Errorf("timelock contracts not found for chain %d", sel) - } - - proposalutils.ExecuteMCMSProposalV2(t, e, p, sel) - proposalutils.ExecuteMCMSTimelockProposalV2(t, e, &prop, sel) - } + mcmProp := proposalutils.SignMCMSTimelockProposal(t, e, &prop) + proposalutils.ExecuteMCMSProposalV2(t, e, mcmProp) + proposalutils.ExecuteMCMSTimelockProposalV2(t, e, &prop) } } if out.MCMSProposals != nil { for _, prop := range out.MCMSProposals { - chains := mapset.NewSet[uint64]() - for _, op := range prop.Operations { - chains.Add(uint64(op.ChainSelector)) - } - p := proposalutils.SignMCMSProposal(t, e, &prop) - for _, sel := range chains.ToSlice() { - proposalutils.ExecuteMCMSProposalV2(t, e, p, sel) - } + proposalutils.ExecuteMCMSProposalV2(t, e, p) } } currentEnv = deployment.Environment{ diff --git a/deployment/common/proposalutils/mcms_test_helpers.go b/deployment/common/proposalutils/mcms_test_helpers.go index e0d39127ee2..f9f4be153ec 100644 --- a/deployment/common/proposalutils/mcms_test_helpers.go +++ b/deployment/common/proposalutils/mcms_test_helpers.go @@ -172,51 +172,66 @@ func SignMCMSProposal(t *testing.T, env deployment.Environment, proposal *mcmsli } // ExecuteMCMSProposalV2 - Executes an MCMS proposal on a chain. For timelock proposal, use ExecuteMCMSTimelockProposalV2 instead. -func ExecuteMCMSProposalV2(t *testing.T, env deployment.Environment, proposal *mcmslib.Proposal, sel uint64) { - t.Log("Executing proposal on chain", sel) +func ExecuteMCMSProposalV2(t *testing.T, env deployment.Environment, proposal *mcmslib.Proposal) { + t.Log("Executing proposal") - executorsMap := map[types.ChainSelector]sdk.Executor{} encoders, err := proposal.GetEncoders() require.NoError(t, err) - family, err := chainsel.GetSelectorFamily(sel) - require.NoError(t, err) + // build a map with chainSelector => executor + executorsMap := map[types.ChainSelector]sdk.Executor{} + for _, op := range proposal.Operations { + family, err := chainsel.GetSelectorFamily(uint64(op.ChainSelector)) + require.NoError(t, err) - chainSel := types.ChainSelector(sel) - - switch family { - case chainsel.FamilyEVM: - encoder := encoders[chainSel].(*evm.Encoder) - chain := env.Chains[sel] - executorsMap[chainSel] = evm.NewExecutor(encoder, chain.Client, chain.DeployerKey) - case chainsel.FamilySolana: - encoder := encoders[chainSel].(*solana.Encoder) - chain := env.SolChains[sel] - executorsMap[chainSel] = solana.NewExecutor(encoder, chain.Client, *chain.DeployerKey) - default: - require.FailNow(t, "unsupported chain family") + switch family { + case chainsel.FamilyEVM: + encoder := encoders[op.ChainSelector].(*evm.Encoder) + executorsMap[op.ChainSelector] = evm.NewExecutor( + encoder, + env.Chains[uint64(op.ChainSelector)].Client, + env.Chains[uint64(op.ChainSelector)].DeployerKey) + case chainsel.FamilySolana: + encoder := encoders[op.ChainSelector].(*solana.Encoder) + executorsMap[op.ChainSelector] = solana.NewExecutor( + encoder, + env.SolChains[uint64(op.ChainSelector)].Client, + *env.SolChains[uint64(op.ChainSelector)].DeployerKey) + default: + require.FailNow(t, "unsupported chain family") + } } executable, err := mcmslib.NewExecutable(proposal, executorsMap) require.NoError(t, err) - root, err := executable.SetRoot(env.GetContext(), chainSel) - require.NoError(t, deployment.MaybeDataErr(err)) + // call SetRoot for each chain + for chainSelector := range executorsMap { + root, err := executable.SetRoot(env.GetContext(), chainSelector) + require.NoError(t, deployment.MaybeDataErr(err)) - // no need to confirm transaction on solana as the MCMS sdk confirms it internally - if family == chainsel.FamilyEVM { - chain := env.Chains[sel] - evmTransaction := root.RawTransaction.(*gethtypes.Transaction) - _, err = chain.Confirm(evmTransaction) + family, err := chainsel.GetSelectorFamily(uint64(chainSelector)) require.NoError(t, err) + + // no need to confirm transaction on solana as the MCMS sdk confirms it internally + if family == chainsel.FamilyEVM { + chain := env.Chains[uint64(chainSelector)] + evmTransaction := root.RawTransaction.(*gethtypes.Transaction) + _, err = chain.Confirm(evmTransaction) + require.NoError(t, err) + } } - for i := range proposal.Operations { + // execute each operation sequentially + for i, op := range proposal.Operations { result, err := executable.Execute(env.GetContext(), i) require.NoError(t, err) + family, err := chainsel.GetSelectorFamily(uint64(op.ChainSelector)) + require.NoError(t, err) + if family == chainsel.FamilyEVM { - chain := env.Chains[sel] + chain := env.Chains[uint64(op.ChainSelector)] evmTransaction := result.RawTransaction.(*gethtypes.Transaction) _, err = chain.Confirm(evmTransaction) require.NoError(t, err) @@ -226,40 +241,47 @@ func ExecuteMCMSProposalV2(t *testing.T, env deployment.Environment, proposal *m // ExecuteMCMSTimelockProposalV2 - Includes an option to set callProxy to execute the calls through a proxy. // If the callProxy is not set, the calls will be executed directly to the timelock. -func ExecuteMCMSTimelockProposalV2(t *testing.T, env deployment.Environment, timelockProposal *mcmslib.TimelockProposal, sel uint64, opts ...mcmslib.Option) { - t.Log("Executing timelock proposal on chain", sel) +func ExecuteMCMSTimelockProposalV2(t *testing.T, env deployment.Environment, timelockProposal *mcmslib.TimelockProposal, opts ...mcmslib.Option) { + t.Log("Executing timelock proposal") - tExecutors := map[types.ChainSelector]sdk.TimelockExecutor{} - family, err := chainsel.GetSelectorFamily(sel) - require.NoError(t, err) + // build a "chainSelector => executor" map + executorsMap := map[types.ChainSelector]sdk.TimelockExecutor{} + for _, op := range timelockProposal.Operations { + family, err := chainsel.GetSelectorFamily(uint64(op.ChainSelector)) + require.NoError(t, err) - switch family { - case chainsel.FamilyEVM: - tExecutors[types.ChainSelector(sel)] = evm.NewTimelockExecutor( - env.Chains[sel].Client, - env.Chains[sel].DeployerKey) - case chainsel.FamilySolana: - tExecutors[types.ChainSelector(sel)] = solana.NewTimelockExecutor( - env.SolChains[sel].Client, - *env.SolChains[sel].DeployerKey) - default: - require.FailNow(t, "unsupported chain family") + switch family { + case chainsel.FamilyEVM: + executorsMap[op.ChainSelector] = evm.NewTimelockExecutor( + env.Chains[uint64(op.ChainSelector)].Client, + env.Chains[uint64(op.ChainSelector)].DeployerKey) + case chainsel.FamilySolana: + executorsMap[op.ChainSelector] = solana.NewTimelockExecutor( + env.SolChains[uint64(op.ChainSelector)].Client, + *env.SolChains[uint64(op.ChainSelector)].DeployerKey) + default: + require.FailNow(t, "unsupported chain family") + } } - timelockExecutable, err := mcmslib.NewTimelockExecutable(timelockProposal, tExecutors) + timelockExecutable, err := mcmslib.NewTimelockExecutable(timelockProposal, executorsMap) require.NoError(t, err) err = timelockExecutable.IsReady(env.GetContext()) require.NoError(t, err) + // execute each operation sequentially var tx = types.TransactionResult{} - for i := range timelockProposal.Operations { + for i, op := range timelockProposal.Operations { tx, err = timelockExecutable.Execute(env.GetContext(), i, opts...) require.NoError(t, err) + family, err := chainsel.GetSelectorFamily(uint64(op.ChainSelector)) + require.NoError(t, err) + // no need to confirm transaction on solana as the MCMS sdk confirms it internally if family == chainsel.FamilyEVM { - chain := env.Chains[sel] + chain := env.Chains[uint64(op.ChainSelector)] evmTransaction := tx.RawTransaction.(*gethtypes.Transaction) _, err = chain.Confirm(evmTransaction) require.NoError(t, err) From 1de1a493c35911ec5a5d68b53cd087263a82322d Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Thu, 13 Feb 2025 10:52:54 -0800 Subject: [PATCH 60/83] fix: disable go module index during ci-core tests (#16393) --- .github/workflows/ci-core.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index 8c164840535..574fa7de456 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -277,7 +277,10 @@ jobs: env: OUTPUT_FILE: ./output.txt CL_DATABASE_URL: ${{ env.DB_URL }} - run: ./tools/bin/${{ matrix.type.cmd }} ./... + run: | + # See: https://github.com/golang/go/issues/69179 + GODEBUG=goindex=0 + ./tools/bin/${{ matrix.type.cmd }} ./... - name: Print Races id: print-races From 10cbdc2d7089f66aa255172fa33bf6bc2c335be9 Mon Sep 17 00:00:00 2001 From: Austin <107539019+0xAustinWang@users.noreply.github.com> Date: Fri, 14 Feb 2025 03:41:50 +0800 Subject: [PATCH 61/83] parallelize deployer group per chain (#16387) * parallelize operations in the deployer group * goimport --- deployment/ccip/changeset/deployer_group.go | 30 ++++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/deployment/ccip/changeset/deployer_group.go b/deployment/ccip/changeset/deployer_group.go index 0768c95e9ed..6f3732a760b 100644 --- a/deployment/ccip/changeset/deployer_group.go +++ b/deployment/ccip/changeset/deployer_group.go @@ -7,6 +7,8 @@ import ( "slices" "time" + "golang.org/x/sync/errgroup" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" @@ -272,18 +274,26 @@ func getBatchCountForChain(chain mcms.ChainIdentifier, m *timelock.MCMSWithTimel func (d *DeployerGroup) enactDeployer() (deployment.ChangesetOutput, error) { contexts := d.getContextChainInOrder() for _, c := range contexts { + g := errgroup.Group{} for selector, txs := range c.transactions { - for _, tx := range txs { - err := d.e.Chains[selector].Client.SendTransaction(context.Background(), tx) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("failed to send transaction: %w", err) - } - // TODO how to pass abi here to decode error reason - _, err = deployment.ConfirmIfNoError(d.e.Chains[selector], tx, err) - if err != nil { - return deployment.ChangesetOutput{}, fmt.Errorf("waiting for tx to be mined failed: %w", err) + selector, txs := selector, txs + g.Go(func() error { + for _, tx := range txs { + err := d.e.Chains[selector].Client.SendTransaction(context.Background(), tx) + if err != nil { + return fmt.Errorf("failed to send transaction: %w", err) + } + // TODO how to pass abi here to decode error reason + _, err = deployment.ConfirmIfNoError(d.e.Chains[selector], tx, err) + if err != nil { + return fmt.Errorf("waiting for tx to be mined failed: %w", err) + } } - } + return nil + }) + } + if err := g.Wait(); err != nil { + return deployment.ChangesetOutput{}, err } } return deployment.ChangesetOutput{}, nil From 8aab3d22aeb7f8a419385f5bf851c58f81dd37a6 Mon Sep 17 00:00:00 2001 From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com> Date: Thu, 13 Feb 2025 12:06:33 -0800 Subject: [PATCH 62/83] Ccip-2672 nonce manager checks (#16370) * nonce manager checks * fixes --- .../ccip/changeset/cs_chain_contracts.go | 37 +++++++------------ .../common/changeset/deploy_link_token.go | 33 +++++++++++------ .../ccip/ccip_migration_to_v_1_6_test.go | 4 -- 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go index 26c78f1a2fd..49f777e32b2 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/cs_chain_contracts.go @@ -75,8 +75,6 @@ type NonceManagerUpdate struct { type PreviousRampCfg struct { RemoteChainSelector uint64 OverrideExisting bool - EnableOnRamp bool - EnableOffRamp bool } func (cfg UpdateNonceManagerConfig) Validate(e deployment.Environment) error { @@ -106,22 +104,18 @@ func (cfg UpdateNonceManagerConfig) Validate(e deployment.Environment) error { if _, ok := state.Chains[prevRamp.RemoteChainSelector]; !ok { return fmt.Errorf("dest chain %d not found in onchain state for chain %d", prevRamp.RemoteChainSelector, sourceSel) } - if !prevRamp.EnableOnRamp && !prevRamp.EnableOffRamp { - return errors.New("must specify either onramp or offramp") + // If one of the onRamp or OffRamp is set with non-zero address and other is set with zero address, + // it will not be possible to update the previous ramps later. + // see https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ccip/NonceManager.sol#L139-L142 + if prevOnRamp := state.Chains[sourceSel].EVM2EVMOnRamp; prevOnRamp == nil { + return fmt.Errorf("no previous onramp for source chain %d", sourceSel) + } else if prevOnRamp[prevRamp.RemoteChainSelector] == nil || prevOnRamp[prevRamp.RemoteChainSelector].Address() == (common.Address{}) { + return fmt.Errorf("no previous onramp for source chain %d and dest chain %d", sourceSel, prevRamp.RemoteChainSelector) } - if prevRamp.EnableOnRamp { - if prevOnRamp := state.Chains[sourceSel].EVM2EVMOnRamp; prevOnRamp == nil { - return fmt.Errorf("no previous onramp for source chain %d", sourceSel) - } else if prevOnRamp[prevRamp.RemoteChainSelector] == nil { - return fmt.Errorf("no previous onramp for source chain %d and dest chain %d", sourceSel, prevRamp.RemoteChainSelector) - } - } - if prevRamp.EnableOffRamp { - if prevOffRamp := state.Chains[sourceSel].EVM2EVMOffRamp; prevOffRamp == nil { - return fmt.Errorf("missing previous offramps for chain %d", sourceSel) - } else if prevOffRamp[prevRamp.RemoteChainSelector] == nil { - return fmt.Errorf("no previous offramp for source chain %d and dest chain %d", prevRamp.RemoteChainSelector, sourceSel) - } + if prevOffRamp := state.Chains[sourceSel].EVM2EVMOffRamp; prevOffRamp == nil { + return fmt.Errorf("missing previous offramps for chain %d", sourceSel) + } else if prevOffRamp[prevRamp.RemoteChainSelector] == nil || prevOffRamp[prevRamp.RemoteChainSelector].Address() == (common.Address{}) { + return fmt.Errorf("no previous offramp for source chain %d and dest chain %d", prevRamp.RemoteChainSelector, sourceSel) } } } @@ -165,13 +159,8 @@ func UpdateNonceManagersChangeset(e deployment.Environment, cfg UpdateNonceManag if len(updates.PreviousRampsArgs) > 0 { previousRampsArgs := make([]nonce_manager.NonceManagerPreviousRampsArgs, 0) for _, prevRamp := range updates.PreviousRampsArgs { - var onRamp, offRamp common.Address - if prevRamp.EnableOnRamp { - onRamp = s.Chains[chainSel].EVM2EVMOnRamp[prevRamp.RemoteChainSelector].Address() - } - if prevRamp.EnableOffRamp { - offRamp = s.Chains[chainSel].EVM2EVMOffRamp[prevRamp.RemoteChainSelector].Address() - } + onRamp := s.Chains[chainSel].EVM2EVMOnRamp[prevRamp.RemoteChainSelector].Address() + offRamp := s.Chains[chainSel].EVM2EVMOffRamp[prevRamp.RemoteChainSelector].Address() previousRampsArgs = append(previousRampsArgs, nonce_manager.NonceManagerPreviousRampsArgs{ RemoteChainSelector: prevRamp.RemoteChainSelector, OverrideExistingRamps: prevRamp.OverrideExisting, diff --git a/deployment/common/changeset/deploy_link_token.go b/deployment/common/changeset/deploy_link_token.go index 86783ea4118..81540d40547 100644 --- a/deployment/common/changeset/deploy_link_token.go +++ b/deployment/common/changeset/deploy_link_token.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/smartcontractkit/chainlink-common/pkg/logger" + "golang.org/x/sync/errgroup" "github.com/gagliardetto/solana-go" chainsel "github.com/smartcontractkit/chain-selectors" @@ -31,31 +32,41 @@ func DeployLinkToken(e deployment.Environment, chains []uint64) (deployment.Chan return deployment.ChangesetOutput{}, err } newAddresses := deployment.NewMemoryAddressBook() + deployGrp := errgroup.Group{} for _, chain := range chains { family, err := chainsel.GetSelectorFamily(chain) if err != nil { return deployment.ChangesetOutput{AddressBook: newAddresses}, err } + var deployFn func() error switch family { case chainsel.FamilyEVM: // Deploy EVM LINK token - _, err := deployLinkTokenContractEVM( - e.Logger, e.Chains[chain], newAddresses, - ) - if err != nil { - return deployment.ChangesetOutput{AddressBook: newAddresses}, err + deployFn = func() error { + _, err := deployLinkTokenContractEVM( + e.Logger, e.Chains[chain], newAddresses, + ) + return err } case chainsel.FamilySolana: // Deploy Solana LINK token - err := deployLinkTokenContractSolana( - e.Logger, e.SolChains[chain], newAddresses, - ) - if err != nil { - return deployment.ChangesetOutput{AddressBook: newAddresses}, err + deployFn = func() error { + err := deployLinkTokenContractSolana( + e.Logger, e.SolChains[chain], newAddresses, + ) + return err } } + deployGrp.Go(func() error { + err := deployFn() + if err != nil { + e.Logger.Errorw("Failed to deploy link token", "chain", chain, "err", err) + return fmt.Errorf("failed to deploy link token for chain %d: %w", chain, err) + } + return nil + }) } - return deployment.ChangesetOutput{AddressBook: newAddresses}, nil + return deployment.ChangesetOutput{AddressBook: newAddresses}, deployGrp.Wait() } // DeployStaticLinkToken deploys a static link token contract to the chain identified by the ChainSelector. diff --git a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go index 1f5f5b850a2..3273b113717 100644 --- a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go +++ b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go @@ -206,7 +206,6 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { PreviousRampsArgs: []changeset.PreviousRampCfg{ { RemoteChainSelector: dest, - EnableOnRamp: true, }, }, }, @@ -214,7 +213,6 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { PreviousRampsArgs: []changeset.PreviousRampCfg{ { RemoteChainSelector: dest, - EnableOnRamp: true, }, }, }, @@ -222,11 +220,9 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { PreviousRampsArgs: []changeset.PreviousRampCfg{ { RemoteChainSelector: src1, - EnableOffRamp: true, }, { RemoteChainSelector: src2, - EnableOffRamp: true, }, }, }, From c200abc2bfa2448bfc45e93b456498cce0fcde14 Mon Sep 17 00:00:00 2001 From: krehermann <16602512+krehermann@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:51:41 -0700 Subject: [PATCH 63/83] fix(cre-297): unique id per execution step (#16328) --- .changeset/fuzzy-pugs-provide.md | 5 +++++ .../capabilities/remote/executable/request/client_request.go | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/fuzzy-pugs-provide.md diff --git a/.changeset/fuzzy-pugs-provide.md b/.changeset/fuzzy-pugs-provide.md new file mode 100644 index 00000000000..80d747e33b1 --- /dev/null +++ b/.changeset/fuzzy-pugs-provide.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +#internal #bugfix correct request id to support parallel step execution diff --git a/core/capabilities/remote/executable/request/client_request.go b/core/capabilities/remote/executable/request/client_request.go index 1d98e3366f1..e2874788ca6 100644 --- a/core/capabilities/remote/executable/request/client_request.go +++ b/core/capabilities/remote/executable/request/client_request.go @@ -61,7 +61,9 @@ func NewClientExecuteRequest(ctx context.Context, lggr logger.Logger, req common return nil, fmt.Errorf("workflow execution ID is invalid: %w", err) } - requestID := types.MethodExecute + ":" + workflowExecutionID + // the requestID must be delineated by the workflow execution ID and the reference ID + // to ensure that it supports parallel step execution + requestID := types.MethodExecute + ":" + workflowExecutionID + ":" + req.Metadata.ReferenceID tc, err := transmission.ExtractTransmissionConfig(req.Config) if err != nil { From ab8e8fa22136fafff08ffaf01b92fb5542bf7c4c Mon Sep 17 00:00:00 2001 From: krehermann <16602512+krehermann@users.noreply.github.com> Date: Thu, 13 Feb 2025 13:53:44 -0700 Subject: [PATCH 64/83] chore(cre-deployment): lightweight changeset tests (#16322) * chore(cre-deployment): contract only changeset tests * adapter from memory node to deployment node * test * refactor * refactoring setupTestEnv to support both kinds of dons * 5x test speed up * use contract only tests * rename func for clarity * move files * dedup; fix tests * address comments * fix print --- deployment/environment.go | 53 ++- deployment/environment/memory/job_client.go | 83 +---- deployment/environment/memory/node.go | 120 +++++++ deployment/environment/memory/node_test.go | 27 ++ deployment/environment/test/jd.go | 86 ++++- deployment/environment/test/nodes.go | 92 +++++ deployment/environment_test.go | 35 ++ .../changeset/add_capabilities_test.go | 16 +- .../keystone/changeset/add_nodes_test.go | 12 +- .../keystone/changeset/add_nops_test.go | 16 +- .../append_node_capabilities_test.go | 33 +- .../changeset/deploy_forwarder_test.go | 24 +- .../keystone/changeset/deploy_ocr3_test.go | 65 ++-- .../internal/capability_definitions.go | 12 - deployment/keystone/changeset/test/dons.go | 201 +++++++++++ .../test/{helpers.go => env_setup.go} | 317 +++++++++++------- .../keystone/changeset/test/env_setup_test.go | 64 ++++ .../keystone/changeset/test/helpers_test.go | 34 -- deployment/keystone/changeset/test/utils.go | 87 +++++ .../keystone/changeset/update_don_test.go | 32 +- .../update_node_capabilities_test.go | 39 +-- .../keystone/changeset/update_nodes_test.go | 33 +- .../update_allowed_dons_test.go | 8 +- .../update_authorized_addresses_test.go | 8 +- 24 files changed, 1056 insertions(+), 441 deletions(-) create mode 100644 deployment/environment/test/nodes.go create mode 100644 deployment/keystone/changeset/test/dons.go rename deployment/keystone/changeset/test/{helpers.go => env_setup.go} (59%) create mode 100644 deployment/keystone/changeset/test/env_setup_test.go delete mode 100644 deployment/keystone/changeset/test/helpers_test.go create mode 100644 deployment/keystone/changeset/test/utils.go diff --git a/deployment/environment.go b/deployment/environment.go index 33a197c40f2..58d61061541 100644 --- a/deployment/environment.go +++ b/deployment/environment.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "math/big" + "regexp" "sort" "strconv" "strings" @@ -246,6 +247,15 @@ type OCRConfig struct { KeyBundleID string } +func (ocrCfg OCRConfig) JDOCR2KeyBundle() *nodev1.OCR2Config_OCRKeyBundle { + return &nodev1.OCR2Config_OCRKeyBundle{ + OffchainPublicKey: hex.EncodeToString(ocrCfg.OffchainPublicKey[:]), + OnchainSigningAddress: hex.EncodeToString(ocrCfg.OnchainPublicKey), + ConfigPublicKey: hex.EncodeToString(ocrCfg.ConfigEncryptionPublicKey[:]), + BundleId: ocrCfg.KeyBundleID, + } +} + // Nodes includes is a group CL nodes. type Nodes []Node @@ -276,13 +286,24 @@ func (n Nodes) DefaultF() uint8 { return uint8(len(n) / 3) } +func (n Nodes) IDs() []string { + var ids []string + for _, node := range n { + ids = append(ids, node.NodeID) + } + return ids +} + func (n Nodes) BootstrapLocators() []string { bootstrapMp := make(map[string]struct{}) for _, node := range n { if node.IsBootstrap { - bootstrapMp[fmt.Sprintf("%s@%s", - // p2p_12D3... -> 12D3... - node.PeerID.String()[4:], node.MultiAddr)] = struct{}{} + key := node.MultiAddr + // compatibility with legacy code. unclear what code path is setting half baked node.MultiAddr + if !isValidMultiAddr(key) { + key = fmt.Sprintf("%s@%s", strings.TrimPrefix(node.PeerID.String(), "p2p_"), node.MultiAddr) + } + bootstrapMp[key] = struct{}{} } } var locators []string @@ -292,6 +313,21 @@ func (n Nodes) BootstrapLocators() []string { return locators } +func isValidMultiAddr(s string) bool { + // Define the regular expression pattern + pattern := `^(.+)@(.+):(\d+)$` + + // Compile the regular expression + re := regexp.MustCompile(pattern) + matches := re.FindStringSubmatch(s) + if len(matches) != 4 { // 4 because the entire match + 3 submatches + return false + } + + _, err := p2pkey.MakePeerID("p2p_" + matches[1]) + return err == nil +} + type Node struct { NodeID string Name string @@ -344,12 +380,7 @@ func (n Node) ChainConfigs() ([]*nodev1.ChainConfig, error) { Chain: c, // only have ocr2 in Node Ocr2Config: &nodev1.OCR2Config{ - OcrKeyBundle: &nodev1.OCR2Config_OCRKeyBundle{ - OffchainPublicKey: hex.EncodeToString(ocrCfg.OffchainPublicKey[:]), - OnchainSigningAddress: hex.EncodeToString(ocrCfg.OnchainPublicKey), - ConfigPublicKey: hex.EncodeToString(ocrCfg.ConfigEncryptionPublicKey[:]), - BundleId: ocrCfg.KeyBundleID, - }, + OcrKeyBundle: ocrCfg.JDOCR2KeyBundle(), P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ PeerId: n.PeerID.String(), // note: we don't have the public key in the OCRConfig struct @@ -476,7 +507,7 @@ func NewNodeFromJD(jdNode *nodev1.Node, chainConfigs []*nodev1.ChainConfig) (*No bootstrap := goldenConfig.Ocr2Config.IsBootstrap if !bootstrap { // no ocr config on bootstrap var err error - selToOCRConfig, err = chainConfigsToOCRConfig(chainConfigs) + selToOCRConfig, err = ChainConfigsToOCRConfig(chainConfigs) if err != nil { return emptyNode, fmt.Errorf("failed to get chain to ocr config: %w", err) } @@ -494,7 +525,7 @@ func NewNodeFromJD(jdNode *nodev1.Node, chainConfigs []*nodev1.ChainConfig) (*No }, nil } -func chainConfigsToOCRConfig(chainConfigs []*nodev1.ChainConfig) (map[chain_selectors.ChainDetails]OCRConfig, error) { +func ChainConfigsToOCRConfig(chainConfigs []*nodev1.ChainConfig) (map[chain_selectors.ChainDetails]OCRConfig, error) { selToOCRConfig := make(map[chain_selectors.ChainDetails]OCRConfig) for _, chainConfig := range chainConfigs { b := common.Hex2Bytes(chainConfig.Ocr2Config.OcrKeyBundle.OffchainPublicKey) diff --git a/deployment/environment/memory/job_client.go b/deployment/environment/memory/job_client.go index 37ee50ef37e..2b8adec6a14 100644 --- a/deployment/environment/memory/job_client.go +++ b/deployment/environment/memory/job_client.go @@ -7,20 +7,16 @@ import ( "slices" "strings" - "github.com/ethereum/go-ethereum/common" "github.com/pelletier/go-toml/v2" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/timestamppb" - chainsel "github.com/smartcontractkit/chain-selectors" - csav1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/csa" jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype" ocr2validate "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/validate" "github.com/smartcontractkit/chainlink/v2/core/services/ocrbootstrap" ) @@ -149,82 +145,9 @@ func (j JobClient) ListNodeChainConfigs(ctx context.Context, in *nodev1.ListNode if !ok { return nil, fmt.Errorf("node id not found: %s", in.Filter.NodeIds[0]) } - var chainConfigs []*nodev1.ChainConfig - for _, selector := range n.Chains { - family, err := chainsel.GetSelectorFamily(selector) - if err != nil { - return nil, err - } - - // NOTE: this supports non-EVM too - chainID, err := chainsel.GetChainIDFromSelector(selector) - if err != nil { - return nil, err - } - - var ocrtype chaintype.ChainType - switch family { - case chainsel.FamilyEVM: - ocrtype = chaintype.EVM - case chainsel.FamilySolana: - ocrtype = chaintype.Solana - case chainsel.FamilyStarknet: - ocrtype = chaintype.StarkNet - case chainsel.FamilyCosmos: - ocrtype = chaintype.Cosmos - case chainsel.FamilyAptos: - ocrtype = chaintype.Aptos - default: - return nil, fmt.Errorf("Unsupported chain family %v", family) - } - - bundle := n.Keys.OCRKeyBundles[ocrtype] - offpk := bundle.OffchainPublicKey() - cpk := bundle.ConfigEncryptionPublicKey() - - keyBundle := &nodev1.OCR2Config_OCRKeyBundle{ - BundleId: bundle.ID(), - ConfigPublicKey: common.Bytes2Hex(cpk[:]), - OffchainPublicKey: common.Bytes2Hex(offpk[:]), - OnchainSigningAddress: bundle.OnChainPublicKey(), - } - - var ctype nodev1.ChainType - switch family { - case chainsel.FamilyEVM: - ctype = nodev1.ChainType_CHAIN_TYPE_EVM - case chainsel.FamilySolana: - ctype = nodev1.ChainType_CHAIN_TYPE_SOLANA - case chainsel.FamilyStarknet: - ctype = nodev1.ChainType_CHAIN_TYPE_STARKNET - case chainsel.FamilyAptos: - ctype = nodev1.ChainType_CHAIN_TYPE_APTOS - default: - panic(fmt.Sprintf("Unsupported chain family %v", family)) - } - - transmitter := n.Keys.Transmitters[selector] - - chainConfigs = append(chainConfigs, &nodev1.ChainConfig{ - Chain: &nodev1.Chain{ - Id: chainID, - Type: ctype, - }, - AccountAddress: transmitter, - AdminAddress: transmitter, - Ocr1Config: nil, - Ocr2Config: &nodev1.OCR2Config{ - Enabled: true, - IsBootstrap: n.IsBoostrap, - P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ - PeerId: n.Keys.PeerID.String(), - }, - OcrKeyBundle: keyBundle, - Multiaddr: n.Addr.String(), - Plugins: nil, - ForwarderAddress: ptr(""), - }, - }) + chainConfigs, err := n.JDChainConfigs() + if err != nil { + return nil, err } return &nodev1.ListNodeChainConfigsResponse{ ChainConfigs: chainConfigs, diff --git a/deployment/environment/memory/node.go b/deployment/environment/memory/node.go index ba3ee24e5db..0f81bb60b19 100644 --- a/deployment/environment/memory/node.go +++ b/deployment/environment/memory/node.go @@ -8,6 +8,7 @@ import ( "net/http" "slices" "strconv" + "strings" "testing" "time" @@ -18,6 +19,8 @@ import ( "go.uber.org/zap/zapcore" "golang.org/x/exp/maps" + nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" + "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/loop" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" @@ -58,6 +61,14 @@ type Node struct { IsBoostrap bool } +func (n Node) MultiAddr() string { + a := "" + if n.IsBoostrap { + a = fmt.Sprintf("%s@%s", strings.TrimPrefix(n.Keys.PeerID.String(), "p2p_"), n.Addr.String()) + } + return a +} + func (n Node) ReplayLogs(chains map[uint64]uint64) error { for sel, block := range chains { chainID, _ := chainsel.ChainIdFromSelector(sel) @@ -68,6 +79,115 @@ func (n Node) ReplayLogs(chains map[uint64]uint64) error { return nil } +// DeploymentNode is an adapter for deployment.Node +func (n Node) DeploymentNode() (deployment.Node, error) { + jdChainConfigs, err := n.JDChainConfigs() + if err != nil { + return deployment.Node{}, err + } + selMap, err := deployment.ChainConfigsToOCRConfig(jdChainConfigs) + if err != nil { + return deployment.Node{}, err + } + // arbitrarily set the first evm chain as the transmitter + var admin string + for _, k := range n.Keys.Transmitters { + admin = k + break + } + return deployment.Node{ + NodeID: n.Keys.PeerID.String(), + Name: n.Keys.PeerID.String(), + SelToOCRConfig: selMap, + CSAKey: n.Keys.CSA.ID(), + PeerID: n.Keys.PeerID, + AdminAddr: admin, + MultiAddr: n.MultiAddr(), + IsBootstrap: n.IsBoostrap, + }, nil +} + +func (n Node) JDChainConfigs() ([]*nodev1.ChainConfig, error) { + var chainConfigs []*nodev1.ChainConfig + for _, selector := range n.Chains { + family, err := chainsel.GetSelectorFamily(selector) + if err != nil { + return nil, err + } + + // NOTE: this supports non-EVM too + chainID, err := chainsel.GetChainIDFromSelector(selector) + if err != nil { + return nil, err + } + + var ocrtype chaintype.ChainType + switch family { + case chainsel.FamilyEVM: + ocrtype = chaintype.EVM + case chainsel.FamilySolana: + ocrtype = chaintype.Solana + case chainsel.FamilyStarknet: + ocrtype = chaintype.StarkNet + case chainsel.FamilyCosmos: + ocrtype = chaintype.Cosmos + case chainsel.FamilyAptos: + ocrtype = chaintype.Aptos + default: + return nil, fmt.Errorf("Unsupported chain family %v", family) + } + + bundle := n.Keys.OCRKeyBundles[ocrtype] + offpk := bundle.OffchainPublicKey() + cpk := bundle.ConfigEncryptionPublicKey() + + keyBundle := &nodev1.OCR2Config_OCRKeyBundle{ + BundleId: bundle.ID(), + ConfigPublicKey: common.Bytes2Hex(cpk[:]), + OffchainPublicKey: common.Bytes2Hex(offpk[:]), + OnchainSigningAddress: bundle.OnChainPublicKey(), + } + + var ctype nodev1.ChainType + switch family { + case chainsel.FamilyEVM: + ctype = nodev1.ChainType_CHAIN_TYPE_EVM + case chainsel.FamilySolana: + ctype = nodev1.ChainType_CHAIN_TYPE_SOLANA + case chainsel.FamilyStarknet: + ctype = nodev1.ChainType_CHAIN_TYPE_STARKNET + case chainsel.FamilyAptos: + ctype = nodev1.ChainType_CHAIN_TYPE_APTOS + default: + panic(fmt.Sprintf("Unsupported chain family %v", family)) + } + + transmitter := n.Keys.Transmitters[selector] + + chainConfigs = append(chainConfigs, &nodev1.ChainConfig{ + Chain: &nodev1.Chain{ + Id: chainID, + Type: ctype, + }, + AccountAddress: transmitter, + AdminAddress: transmitter, + Ocr1Config: nil, + Ocr2Config: &nodev1.OCR2Config{ + Enabled: true, + IsBootstrap: n.IsBoostrap, + P2PKeyBundle: &nodev1.OCR2Config_P2PKeyBundle{ + PeerId: n.Keys.PeerID.String(), + }, + OcrKeyBundle: keyBundle, + Multiaddr: n.MultiAddr(), + Plugins: nil, // TODO: programmatic way to list these from the embedded chainlink.Application? + ForwarderAddress: ptr(""), + }, + }) + } + return chainConfigs, nil +} + type ConfigOpt func(c *chainlink.Config) // WithFinalityDepths sets the finality depths of the evm chain diff --git a/deployment/environment/memory/node_test.go b/deployment/environment/memory/node_test.go index b9562f0290a..4daf2436f9a 100644 --- a/deployment/environment/memory/node_test.go +++ b/deployment/environment/memory/node_test.go @@ -1,9 +1,12 @@ package memory import ( + "maps" + "slices" "testing" "github.com/hashicorp/consul/sdk/freeport" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" @@ -24,4 +27,28 @@ func TestNode(t *testing.T) { evmChains := node.App.GetRelayers().LegacyEVMChains().Slice() require.NoError(t, err) require.Len(t, evmChains, 3) + + t.Run("DeploymentNode", func(t *testing.T) { + dn, err := node.DeploymentNode() + require.NoError(t, err) + assert.Equal(t, node.Keys.PeerID, dn.PeerID) + assert.Equal(t, node.Keys.CSA.ID(), dn.CSAKey) + assert.Len(t, dn.SelToOCRConfig, 3) + gotChains := make([]uint64, len(dn.SelToOCRConfig)) + i := 0 + for k := range dn.SelToOCRConfig { + gotChains[i] = k.ChainSelector + i++ + } + assert.ElementsMatch(t, slices.Collect(maps.Keys(chains)), gotChains) + }) + + t.Run("JDChainConfigs", func(t *testing.T) { + jdChainConfigs, err := node.JDChainConfigs() + require.NoError(t, err) + assert.Len(t, jdChainConfigs, 3) + for i, cc := range jdChainConfigs { + assert.Equal(t, node.Keys.PeerID.String(), cc.Ocr2Config.P2PKeyBundle.PeerId, "chain %d", i) + } + }) } diff --git a/deployment/environment/test/jd.go b/deployment/environment/test/jd.go index e1b1249d116..a5efd5ebe19 100644 --- a/deployment/environment/test/jd.go +++ b/deployment/environment/test/jd.go @@ -5,25 +5,27 @@ import ( "fmt" "sync" - "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" - - // "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/csa" + "google.golang.org/grpc" + csav1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/csa" + jobv1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/job" nodev1 "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/environment/memory" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" ) -var _ node.NodeServiceServer = (*JDNodeService)(nil) +var _ nodev1.NodeServiceClient = (*JDNodeService)(nil) +var _ jobv1.JobServiceClient = (*JDNodeService)(nil) +var _ csav1.CSAServiceClient = (*JDNodeService)(nil) // JDNodeService is a mock implementation of the JobDistributor that supports // the Node methods type JDNodeService struct { - mu sync.RWMutex - // store map[string]*wrapper + mu sync.RWMutex store *store - node.UnimplementedNodeServiceServer + *UnimplementedJobServiceClient + *UnimplementedCSAServiceClient } func NewJDService(nodes []deployment.Node) *JDNodeService { @@ -48,7 +50,7 @@ func NewJDServiceFromListNodes(resp *nodev1.ListNodesResponse) (*JDNodeService, }, nil } -func (s *JDNodeService) GetNode(ctx context.Context, req *nodev1.GetNodeRequest) (*nodev1.GetNodeResponse, error) { +func (s *JDNodeService) GetNode(ctx context.Context, req *nodev1.GetNodeRequest, opts ...grpc.CallOption) (*nodev1.GetNodeResponse, error) { s.mu.RLock() defer s.mu.RUnlock() @@ -62,7 +64,7 @@ func (s *JDNodeService) GetNode(ctx context.Context, req *nodev1.GetNodeRequest) }, nil } -func (s *JDNodeService) ListNodes(ctx context.Context, req *nodev1.ListNodesRequest) (*nodev1.ListNodesResponse, error) { +func (s *JDNodeService) ListNodes(ctx context.Context, req *nodev1.ListNodesRequest, opts ...grpc.CallOption) (*nodev1.ListNodesResponse, error) { s.mu.RLock() defer s.mu.RUnlock() @@ -79,7 +81,7 @@ func (s *JDNodeService) ListNodes(ctx context.Context, req *nodev1.ListNodesRequ }, nil } -func (s *JDNodeService) DisableNode(ctx context.Context, req *nodev1.DisableNodeRequest) (*nodev1.DisableNodeResponse, error) { +func (s *JDNodeService) DisableNode(ctx context.Context, req *nodev1.DisableNodeRequest, opts ...grpc.CallOption) (*nodev1.DisableNodeResponse, error) { s.mu.Lock() defer s.mu.Unlock() @@ -94,7 +96,7 @@ func (s *JDNodeService) DisableNode(ctx context.Context, req *nodev1.DisableNode return &nodev1.DisableNodeResponse{}, nil } -func (s *JDNodeService) EnableNode(ctx context.Context, req *nodev1.EnableNodeRequest) (*nodev1.EnableNodeResponse, error) { +func (s *JDNodeService) EnableNode(ctx context.Context, req *nodev1.EnableNodeRequest, opts ...grpc.CallOption) (*nodev1.EnableNodeResponse, error) { s.mu.Lock() defer s.mu.Unlock() @@ -110,7 +112,7 @@ func (s *JDNodeService) EnableNode(ctx context.Context, req *nodev1.EnableNodeRe return &nodev1.EnableNodeResponse{}, nil } -func (s *JDNodeService) RegisterNode(ctx context.Context, req *nodev1.RegisterNodeRequest) (*nodev1.RegisterNodeResponse, error) { +func (s *JDNodeService) RegisterNode(ctx context.Context, req *nodev1.RegisterNodeRequest, opts ...grpc.CallOption) (*nodev1.RegisterNodeResponse, error) { s.mu.Lock() defer s.mu.Unlock() @@ -128,7 +130,7 @@ func (s *JDNodeService) RegisterNode(ctx context.Context, req *nodev1.RegisterNo return &nodev1.RegisterNodeResponse{}, nil } -func (s *JDNodeService) ListNodeChainConfigs(ctx context.Context, req *nodev1.ListNodeChainConfigsRequest) (*nodev1.ListNodeChainConfigsResponse, error) { +func (s *JDNodeService) ListNodeChainConfigs(ctx context.Context, req *nodev1.ListNodeChainConfigsRequest, opts ...grpc.CallOption) (*nodev1.ListNodeChainConfigsResponse, error) { s.mu.RLock() defer s.mu.RUnlock() @@ -158,7 +160,7 @@ func newWrapperFromRegister(req *nodev1.RegisterNodeRequest) (*wrappedNode, erro return nil, nil } -func (s *JDNodeService) UpdateNode(ctx context.Context, req *nodev1.UpdateNodeRequest) (*nodev1.UpdateNodeResponse, error) { +func (s *JDNodeService) UpdateNode(ctx context.Context, req *nodev1.UpdateNodeRequest, opts ...grpc.CallOption) (*nodev1.UpdateNodeResponse, error) { s.mu.Lock() defer s.mu.Unlock() @@ -309,3 +311,59 @@ func (s *store) put(n *wrappedNode) { s.csaToID[n.Node.CSAKey] = n.NodeID s.p2pToID[p2pKey(n.Node.PeerID.String())] = n.NodeID } + +type UnimplementedJobServiceClient struct{} + +func (s *UnimplementedJobServiceClient) BatchProposeJob(ctx context.Context, in *jobv1.BatchProposeJobRequest, opts ...grpc.CallOption) (*jobv1.BatchProposeJobResponse, error) { + // TODO CCIP-3108 implement me + panic("implement me") +} + +func (s *UnimplementedJobServiceClient) DeleteJob(ctx context.Context, in *jobv1.DeleteJobRequest, opts ...grpc.CallOption) (*jobv1.DeleteJobResponse, error) { + panic("unimplemented") +} + +func (s *UnimplementedJobServiceClient) UpdateJob(ctx context.Context, in *jobv1.UpdateJobRequest, opts ...grpc.CallOption) (*jobv1.UpdateJobResponse, error) { + panic("unimplemented") +} + +// GetJob implements job.JobServiceClient. +func (s *UnimplementedJobServiceClient) GetJob(ctx context.Context, in *jobv1.GetJobRequest, opts ...grpc.CallOption) (*jobv1.GetJobResponse, error) { + panic("unimplemented") +} + +// GetProposal implements job.JobServiceClient. +func (s *UnimplementedJobServiceClient) GetProposal(ctx context.Context, in *jobv1.GetProposalRequest, opts ...grpc.CallOption) (*jobv1.GetProposalResponse, error) { + panic("unimplemented") +} + +// ListJobs implements job.JobServiceClient. +func (s *UnimplementedJobServiceClient) ListJobs(ctx context.Context, in *jobv1.ListJobsRequest, opts ...grpc.CallOption) (*jobv1.ListJobsResponse, error) { + panic("unimplemented") +} + +// ListProposals implements job.JobServiceClient. +func (s *UnimplementedJobServiceClient) ListProposals(ctx context.Context, in *jobv1.ListProposalsRequest, opts ...grpc.CallOption) (*jobv1.ListProposalsResponse, error) { + panic("unimplemented") +} + +// ProposeJob implements job.JobServiceClient. +func (s *UnimplementedJobServiceClient) ProposeJob(ctx context.Context, in *jobv1.ProposeJobRequest, opts ...grpc.CallOption) (*jobv1.ProposeJobResponse, error) { + panic("unimplemented") +} + +// RevokeJob implements job.JobServiceClient. +func (s *UnimplementedJobServiceClient) RevokeJob(ctx context.Context, in *jobv1.RevokeJobRequest, opts ...grpc.CallOption) (*jobv1.RevokeJobResponse, error) { + panic("unimplemented") +} + +type UnimplementedCSAServiceClient struct{} + +func (s *UnimplementedCSAServiceClient) GetKeypair(ctx context.Context, in *csav1.GetKeypairRequest, opts ...grpc.CallOption) (*csav1.GetKeypairResponse, error) { + // TODO implement me + panic("implement me") +} + +func (s *UnimplementedCSAServiceClient) ListKeypairs(ctx context.Context, in *csav1.ListKeypairsRequest, opts ...grpc.CallOption) (*csav1.ListKeypairsResponse, error) { + panic("unimplemented") +} diff --git a/deployment/environment/test/nodes.go b/deployment/environment/test/nodes.go new file mode 100644 index 00000000000..1f91dac82ba --- /dev/null +++ b/deployment/environment/test/nodes.go @@ -0,0 +1,92 @@ +package test + +import ( + "crypto/rand" + "math/big" + "testing" + + gethcommon "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" + + chain_selectors "github.com/smartcontractkit/chain-selectors" + types2 "github.com/smartcontractkit/libocr/offchainreporting2/types" + + "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/shared/ptypes" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/csakey" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" +) + +type NodeConfig struct { + ChainSelectors []uint64 + Name string + Labels map[string]string +} + +func NewNode(t *testing.T, c NodeConfig) *deployment.Node { + t.Helper() + k := randSeed(t) + p2p := p2pkey.MustNewV2XXXTestingOnly(k) + ocrConfigs := make(map[chain_selectors.ChainDetails]deployment.OCRConfig) + for _, cs := range c.ChainSelectors { + ocrConfigs[chain_selectors.ChainDetails{ChainSelector: cs}] = testOCRConfig(t, cs, p2p) + } + if c.Labels == nil { + c.Labels = map[string]string{} + } + // make sure to add the p2p_id label b/c downstream systems expect it + c.Labels["p2p_id"] = p2p.PeerID().String() + return &deployment.Node{ + NodeID: c.Name, + Name: c.Name, + PeerID: p2p.PeerID(), + CSAKey: csakey.MustNewV2XXXTestingOnly(k).ID(), + AdminAddr: gethcommon.BigToAddress(k).Hex(), + Labels: labelsConversion(c.Labels), + SelToOCRConfig: ocrConfigs, + } +} + +func NewNodes(t *testing.T, configs []NodeConfig) []*deployment.Node { + nodes := make([]*deployment.Node, len(configs)) + for i, c := range configs { + nodes[i] = NewNode(t, c) + } + return nodes +} + +func randSeed(t *testing.T) *big.Int { + maxVal := new(big.Int) + maxVal.Exp(big.NewInt(2), big.NewInt(256), nil) + randomInt, err := rand.Int(rand.Reader, maxVal) + require.NoError(t, err) + return randomInt +} + +func labelsConversion(m map[string]string) []*ptypes.Label { + out := make([]*ptypes.Label, len(m)) + i := 0 + for k, v := range m { + v := v + out[i] = &ptypes.Label{Key: k, Value: &v} + i++ + } + return out +} + +func testOCRConfig(t *testing.T, sel uint64, p2p p2pkey.KeyV2) deployment.OCRConfig { + t.Helper() + f, err := chain_selectors.GetSelectorFamily(sel) + require.NoError(t, err, "selector %d not found", sel) + seed := p2p.PeerID() + copy(seed[:], []byte(f)) + require.NoError(t, err) + return deployment.OCRConfig{ + PeerID: p2p.PeerID(), + OffchainPublicKey: types2.OffchainPublicKey(seed), + OnchainPublicKey: types2.OnchainPublicKey(seed[:32]), + TransmitAccount: types2.Account(gethcommon.BytesToAddress(seed[:]).Hex()), + ConfigEncryptionPublicKey: types2.ConfigEncryptionPublicKey(seed[:32]), + KeyBundleID: "fake_orc_bundle_" + f, + } +} diff --git a/deployment/environment_test.go b/deployment/environment_test.go index fd96248a02c..ac23ee2889c 100644 --- a/deployment/environment_test.go +++ b/deployment/environment_test.go @@ -3,6 +3,7 @@ package deployment import ( "encoding/hex" "math" + "math/big" "reflect" "strconv" "testing" @@ -303,6 +304,40 @@ func hexFrom32Byte(t *testing.T, s string) string { return hex.EncodeToString(b[:]) } +func Test_isValidMultiAddr(t *testing.T) { + // Generate a p2p piece using p2pkey.MustNewV2XXXTestingOnly() + seed := big.NewInt(123) + p2p := p2pkey.MustNewV2XXXTestingOnly(seed).PeerID().String() + + // Create valid and invalid multi-address strings + validMultiAddr := p2p[4:] + "@example.com:12345" // Remove "p2p_" prefix from p2p + invalidMultiAddr1 := "invalid@address:12345" + invalidMultiAddr2 := p2p[4:] + "@example.com:notanumber" + invalidMultiAddr3 := "missingatsign.com:12345" + invalidMultiAddr4 := p2p[4:] + "@example.com" + invalidMultiAddr5 := "@missingp2p:123" + + // Test cases + tests := []struct { + name string + addr string + expected bool + }{ + {"Valid MultiAddr", validMultiAddr, true}, + {"Invalid MultiAddr - Invalid Address", invalidMultiAddr1, false}, + {"Invalid MultiAddr - Non-numeric Port", invalidMultiAddr2, false}, + {"Invalid MultiAddr - Missing @", invalidMultiAddr3, false}, + {"Invalid MultiAddr - Missing Port", invalidMultiAddr4, false}, + {"Invalid MultiAddr - Missing p2p", invalidMultiAddr5, false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := isValidMultiAddr(tt.addr) + assert.Equal(t, tt.expected, result) + }) + } +} func TestNewNodeFromJD(t *testing.T) { type args struct { jdNode *nodev1.Node diff --git a/deployment/keystone/changeset/add_capabilities_test.go b/deployment/keystone/changeset/add_capabilities_test.go index 3c517212e2b..7175a29f86f 100644 --- a/deployment/keystone/changeset/add_capabilities_test.go +++ b/deployment/keystone/changeset/add_capabilities_test.go @@ -30,10 +30,10 @@ func TestAddCapabilities(t *testing.T) { }, } t.Run("no mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) @@ -48,10 +48,10 @@ func TestAddCapabilities(t *testing.T) { }) t.Run("with mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) diff --git a/deployment/keystone/changeset/add_nodes_test.go b/deployment/keystone/changeset/add_nodes_test.go index 1cefd1b07ab..fca2a0318af 100644 --- a/deployment/keystone/changeset/add_nodes_test.go +++ b/deployment/keystone/changeset/add_nodes_test.go @@ -20,7 +20,7 @@ func TestAddNodes(t *testing.T) { t.Parallel() type input struct { - te test.TestEnv + te test.EnvWrapper CreateNodeRequests map[string]changeset.CreateNodeRequest MCMSConfig *changeset.MCMSConfig } @@ -38,10 +38,10 @@ func TestAddNodes(t *testing.T) { } t.Run(prefix, func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: mc != nil, }) @@ -302,7 +302,7 @@ func assertNodesExist(t *testing.T, registry *kcr.CapabilitiesRegistry, nodes .. } } -func applyProposal(t *testing.T, te test.TestEnv, applicable ...commonchangeset.ConfiguredChangeSet) error { +func applyProposal(t *testing.T, te test.EnvWrapper, applicable ...commonchangeset.ConfiguredChangeSet) error { // now apply the changeset such that the proposal is signed and execed contracts := te.ContractSets()[te.RegistrySelector] timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{ diff --git a/deployment/keystone/changeset/add_nops_test.go b/deployment/keystone/changeset/add_nops_test.go index 1b0128a1fef..bd970eb9d0f 100644 --- a/deployment/keystone/changeset/add_nops_test.go +++ b/deployment/keystone/changeset/add_nops_test.go @@ -29,10 +29,10 @@ func TestAddNops(t *testing.T) { }, } t.Run("no mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) @@ -59,10 +59,10 @@ func TestAddNops(t *testing.T) { }) t.Run("with mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) diff --git a/deployment/keystone/changeset/append_node_capabilities_test.go b/deployment/keystone/changeset/append_node_capabilities_test.go index a2a5f685da2..3952b0ef158 100644 --- a/deployment/keystone/changeset/append_node_capabilities_test.go +++ b/deployment/keystone/changeset/append_node_capabilities_test.go @@ -5,7 +5,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -31,18 +30,16 @@ func TestAppendNodeCapabilities(t *testing.T) { caps = []kcr.CapabilitiesRegistryCapability{capA, capB} ) t.Run("no mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) newCapabilities := make(map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) - for id := range te.WFNodes { - k, err := p2pkey.MakePeerID(id) - require.NoError(t, err) - newCapabilities[k] = caps + for _, id := range te.GetP2PIDs("wfDon") { + newCapabilities[id] = caps } t.Run("succeeds if existing capabilities not explicit", func(t *testing.T) { @@ -60,19 +57,17 @@ func TestAppendNodeCapabilities(t *testing.T) { }) }) t.Run("with mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) newCapabilities := make(map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) - for id := range te.WFNodes { - k, err := p2pkey.MakePeerID(id) - require.NoError(t, err) - newCapabilities[k] = caps + for _, id := range te.GetP2PIDs("wfDon") { + newCapabilities[id] = caps } cfg := changeset.AppendNodeCapabilitiesRequest{ @@ -109,9 +104,9 @@ func TestAppendNodeCapabilities(t *testing.T) { } // validateUpdate checks reads nodes from the registry and checks they have the expected updates -func validateCapabilityAppends(t *testing.T, te test.TestEnv, appended map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) { +func validateCapabilityAppends(t *testing.T, te test.EnvWrapper, appended map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) { registry := te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry - wfP2PIDs := p2pIDs(t, maps.Keys(te.WFNodes)) + wfP2PIDs := te.GetP2PIDs("wfDon").Bytes32() nodes, err := registry.GetNodesByP2PIds(nil, wfP2PIDs) require.NoError(t, err) require.Len(t, nodes, len(wfP2PIDs)) diff --git a/deployment/keystone/changeset/deploy_forwarder_test.go b/deployment/keystone/changeset/deploy_forwarder_test.go index f60141d26f0..5b173c132a7 100644 --- a/deployment/keystone/changeset/deploy_forwarder_test.go +++ b/deployment/keystone/changeset/deploy_forwarder_test.go @@ -56,16 +56,16 @@ func TestConfigureForwarders(t *testing.T) { for _, nChains := range []int{1, 3} { name := fmt.Sprintf("nChains=%d", nChains) t.Run(name, func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: nChains, }) var wfNodes []string - for id := range te.WFNodes { - wfNodes = append(wfNodes, id) + for _, id := range te.GetP2PIDs("wfDon") { + wfNodes = append(wfNodes, id.String()) } cfg := changeset.ConfigureForwardContractsRequest{ @@ -93,17 +93,17 @@ func TestConfigureForwarders(t *testing.T) { for _, nChains := range []int{1, 3} { name := fmt.Sprintf("nChains=%d", nChains) t.Run(name, func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: nChains, UseMCMS: true, }) var wfNodes []string - for id := range te.WFNodes { - wfNodes = append(wfNodes, id) + for _, id := range te.GetP2PIDs("wfDon") { + wfNodes = append(wfNodes, id.String()) } cfg := changeset.ConfigureForwardContractsRequest{ diff --git a/deployment/keystone/changeset/deploy_ocr3_test.go b/deployment/keystone/changeset/deploy_ocr3_test.go index e5e0c05aa1a..b8fa43e9076 100644 --- a/deployment/keystone/changeset/deploy_ocr3_test.go +++ b/deployment/keystone/changeset/deploy_ocr3_test.go @@ -57,17 +57,14 @@ func TestConfigureOCR3(t *testing.T) { } t.Run("no mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: nWfNodes}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: nWfNodes}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) - var wfNodes []string - for id := range te.WFNodes { - wfNodes = append(wfNodes, id) - } + wfNodes := te.GetP2PIDs("wfDon").Strings() w := &bytes.Buffer{} cfg := changeset.ConfigureOCR3Config{ @@ -88,10 +85,10 @@ func TestConfigureOCR3(t *testing.T) { }) t.Run("success multiple OCR3 contracts", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: nWfNodes}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: nWfNodes}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) @@ -130,10 +127,7 @@ func TestConfigureOCR3(t *testing.T) { } } - var wfNodes []string - for id := range te.WFNodes { - wfNodes = append(wfNodes, id) - } + wfNodes := te.GetP2PIDs("wfDon").Strings() na := common.HexToAddress(newOCR3Addr) w := &bytes.Buffer{} @@ -156,10 +150,10 @@ func TestConfigureOCR3(t *testing.T) { }) t.Run("fails multiple OCR3 contracts but unspecified address", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: nWfNodes}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: nWfNodes}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) @@ -180,10 +174,7 @@ func TestConfigureOCR3(t *testing.T) { require.NoError(t, err) require.Len(t, addrs, 5) - var wfNodes []string - for id := range te.WFNodes { - wfNodes = append(wfNodes, id) - } + wfNodes := te.GetP2PIDs("wfDon").Strings() w := &bytes.Buffer{} cfg := changeset.ConfigureOCR3Config{ @@ -199,10 +190,10 @@ func TestConfigureOCR3(t *testing.T) { }) t.Run("fails multiple OCR3 contracts but address not found", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: nWfNodes}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: nWfNodes}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) @@ -223,10 +214,7 @@ func TestConfigureOCR3(t *testing.T) { require.NoError(t, err) require.Len(t, addrs, 5) - var wfNodes []string - for id := range te.WFNodes { - wfNodes = append(wfNodes, id) - } + wfNodes := te.GetP2PIDs("wfDon").Strings() nfa := common.HexToAddress("0x1234567890123456789012345678901234567890") w := &bytes.Buffer{} @@ -244,18 +232,15 @@ func TestConfigureOCR3(t *testing.T) { }) t.Run("mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: nWfNodes}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: nWfNodes}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) - var wfNodes []string - for id := range te.WFNodes { - wfNodes = append(wfNodes, id) - } + wfNodes := te.GetP2PIDs("wfDon").Strings() w := &bytes.Buffer{} cfg := changeset.ConfigureOCR3Config{ diff --git a/deployment/keystone/changeset/internal/capability_definitions.go b/deployment/keystone/changeset/internal/capability_definitions.go index 21c2b4fce01..10a80c67a32 100644 --- a/deployment/keystone/changeset/internal/capability_definitions.go +++ b/deployment/keystone/changeset/internal/capability_definitions.go @@ -20,15 +20,3 @@ var OCR3Cap = kcr.CapabilitiesRegistryCapability{ Version: "1.0.0", CapabilityType: uint8(2), // consensus } - -var DonToCapabilities = map[string][]kcr.CapabilitiesRegistryCapability{ - WFDonName: []kcr.CapabilitiesRegistryCapability{OCR3Cap}, - TargetDonName: []kcr.CapabilitiesRegistryCapability{WriteChainCap}, - StreamDonName: []kcr.CapabilitiesRegistryCapability{StreamTriggerCap}, -} - -var ( - WFDonName = "wf" - TargetDonName = "target" - StreamDonName = "streams" -) diff --git a/deployment/keystone/changeset/test/dons.go b/deployment/keystone/changeset/test/dons.go new file mode 100644 index 00000000000..1bbdce4a0ba --- /dev/null +++ b/deployment/keystone/changeset/test/dons.go @@ -0,0 +1,201 @@ +package test + +import ( + "sort" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" +) + +// testDon is an interface for a DON that can be used in tests +type testDon interface { + GetP2PIDs() P2PIDs + N() int + F() int + Name() string +} + +var _ testDon = (*memoryDon)(nil) + +// memoryDon is backed by in-memory nodes running the full chainlink Application +type memoryDon struct { + name string + m map[string]memory.Node +} + +func newMemoryDon(name string, m map[string]memory.Node) *memoryDon { + return &memoryDon{name: name, m: m} +} + +func (d *memoryDon) GetP2PIDs() P2PIDs { + var out []p2pkey.PeerID + for _, n := range d.m { + out = append(out, n.Keys.PeerID) + } + return out +} + +func (d *memoryDon) N() int { + return len(d.m) +} + +func (d *memoryDon) F() int { + return (d.N() - 1) / 3 +} + +func (d *memoryDon) Name() string { + return d.name +} + +// viewOnlyDon represents a DON that is backed by view of nodes, not actual, useable nodes +type viewOnlyDon struct { + name string + m map[string]*deployment.Node +} + +func newViewOnlyDon(name string, nodes []*deployment.Node) *viewOnlyDon { + m := make(map[string]*deployment.Node) + for _, n := range nodes { + m[n.PeerID.String()] = n + } + return &viewOnlyDon{name: name, m: m} +} + +func (d *viewOnlyDon) GetP2PIDs() P2PIDs { + var out []p2pkey.PeerID + for _, n := range d.m { + out = append(out, n.PeerID) + } + return out +} + +func (d *viewOnlyDon) N() int { + return len(d.m) +} + +func (d *viewOnlyDon) F() int { + return (d.N() - 1) / 3 +} + +func (d *viewOnlyDon) Name() string { + return d.name +} + +// testDons is a collection of testDon with convenience methods commonly used in tests +type testDons interface { + Get(name string) testDon + Put(d testDon) + List() []testDon + // Unique list of p2pIDs across all dons + P2PIDs() P2PIDs +} + +var _ testDons = (*memoryDons)(nil) + +// memoryDons implements [testDons] backed by [memoryDon] +type memoryDons struct { + dons map[string]*memoryDon +} + +func newMemoryDons() *memoryDons { + return &memoryDons{dons: make(map[string]*memoryDon)} +} + +func (d *memoryDons) Get(name string) testDon { + x := d.dons[name] + return x +} + +func (d *memoryDons) Put(d2 testDon) { + d.dons[d2.Name()] = d2.(*memoryDon) +} + +func (d *memoryDons) List() []testDon { + out := make([]testDon, 0, len(d.dons)) + donNames := make([]string, 0, len(d.dons)) + for k := range d.dons { + donNames = append(donNames, k) + } + sort.Strings(donNames) + for _, name := range donNames { + out = append(out, d.dons[name]) + } + return out +} + +func (d *memoryDons) P2PIDs() P2PIDs { + var out P2PIDs + for _, d := range d.dons { + out = append(out, d.GetP2PIDs()...) + } + return out.Unique() +} + +func (d *memoryDons) AllNodes() map[string]memory.Node { + out := make(map[string]memory.Node) + for _, d := range d.dons { + for k, v := range d.m { + out[k] = v + } + } + return out +} + +// viewOnlyDons implements [testDons] backed by [viewOnlyDon] +type viewOnlyDons struct { + dons map[string]*viewOnlyDon +} + +func newViewOnlyDons() *viewOnlyDons { + return &viewOnlyDons{dons: make(map[string]*viewOnlyDon)} +} + +func (d *viewOnlyDons) Get(name string) testDon { + x := d.dons[name] + return x +} + +func (d *viewOnlyDons) Put(d2 testDon) { + d.dons[d2.Name()] = d2.(*viewOnlyDon) +} + +func (d *viewOnlyDons) List() []testDon { + out := make([]testDon, 0, len(d.dons)) + donNames := make([]string, 0, len(d.dons)) + for k := range d.dons { + donNames = append(donNames, k) + } + sort.Strings(donNames) + for _, name := range donNames { + out = append(out, d.dons[name]) + } + return out +} + +func (d *viewOnlyDons) P2PIDs() P2PIDs { + var out P2PIDs + for _, d := range d.dons { + out = append(out, d.GetP2PIDs()...) + } + return out.Unique() +} + +func (d *viewOnlyDons) AllNodes() map[string]*deployment.Node { + out := make(map[string]*deployment.Node) + for _, d := range d.dons { + for k, v := range d.m { + out[k] = v + } + } + return out +} + +func (d *viewOnlyDons) NodeList() deployment.Nodes { + tmp := d.AllNodes() + nodes := make([]deployment.Node, 0, len(tmp)) + for _, v := range tmp { + nodes = append(nodes, *v) + } + return nodes +} diff --git a/deployment/keystone/changeset/test/helpers.go b/deployment/keystone/changeset/test/env_setup.go similarity index 59% rename from deployment/keystone/changeset/test/helpers.go rename to deployment/keystone/changeset/test/env_setup.go index 3c90fd4a661..f8b1b46f248 100644 --- a/deployment/keystone/changeset/test/helpers.go +++ b/deployment/keystone/changeset/test/env_setup.go @@ -1,19 +1,17 @@ package test import ( - "bytes" "context" - "crypto/sha256" - "encoding/hex" "errors" + "fmt" "math" - "sort" "testing" "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" "golang.org/x/exp/maps" + "github.com/smartcontractkit/chainlink-common/pkg/capabilities/pb" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" @@ -22,16 +20,27 @@ import ( "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" "github.com/smartcontractkit/chainlink/deployment/environment/memory" + envtest "github.com/smartcontractkit/chainlink/deployment/environment/test" kschangeset "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/workflowregistry" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" - "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" ) type DonConfig struct { - N int + Name string // required, must be unique across all dons + N int + F *int // if nil, defaults to floor(N-1/3) + 1 + CapabilityConfig map[CapabilityNaturalKey]*pb.CapabilityConfig // optional DON specific configuration for the given capability + Labels map[string]string // optional + RegistryChainSel uint64 // require, must be the same for all dons + ChainSelectors []uint64 // optional chains +} + +type CapabilityNaturalKey struct { + LabelledName string + Version string } func (c DonConfig) Validate() error { @@ -41,21 +50,33 @@ func (c DonConfig) Validate() error { return nil } +type testEnvIface interface { + ContractSets() map[uint64]internal.ContractSet + CapabilitiesRegistry() *kcr.CapabilitiesRegistry + CapabilityInfos() []kcr.CapabilitiesRegistryCapabilityInfo + Nops() []kcr.CapabilitiesRegistryNodeOperatorAdded + + GetP2PIDs(donName string) P2PIDs +} + // TODO: separate the config into different types; wf should expand to types of ocr keybundles; writer to target chains; ... type WFDonConfig = DonConfig type AssetDonConfig = DonConfig type WriterDonConfig = DonConfig -type TestConfig struct { +type EnvWrapperConfig struct { WFDonConfig AssetDonConfig WriterDonConfig NumChains int UseMCMS bool + // if true, use in-memory nodes for testing + // if false, view only nodes will be used + useInMemoryNodes bool } -func (c TestConfig) Validate() error { +func (c EnvWrapperConfig) Validate() error { if err := c.WFDonConfig.Validate(); err != nil { return err } @@ -71,17 +92,17 @@ func (c TestConfig) Validate() error { return nil } -type TestEnv struct { +var _ testEnvIface = (*EnvWrapper)(nil) + +type EnvWrapper struct { t *testing.T Env deployment.Environment RegistrySelector uint64 - WFNodes map[string]memory.Node - CWNodes map[string]memory.Node - AssetNodes map[string]memory.Node + dons testDons } -func (te TestEnv) ContractSets() map[uint64]internal.ContractSet { +func (te EnvWrapper) ContractSets() map[uint64]internal.ContractSet { r, err := internal.GetContractSets(te.Env.Logger, &internal.GetContractSetsRequest{ Chains: te.Env.Chains, AddressBook: te.Env.ExistingAddresses, @@ -90,7 +111,7 @@ func (te TestEnv) ContractSets() map[uint64]internal.ContractSet { return r.ContractSets } -func (te TestEnv) CapabilitiesRegistry() *kcr.CapabilitiesRegistry { +func (te EnvWrapper) CapabilitiesRegistry() *kcr.CapabilitiesRegistry { r, err := internal.GetContractSets(te.Env.Logger, &internal.GetContractSetsRequest{ Chains: te.Env.Chains, AddressBook: te.Env.ExistingAddresses, @@ -99,14 +120,14 @@ func (te TestEnv) CapabilitiesRegistry() *kcr.CapabilitiesRegistry { return r.ContractSets[te.RegistrySelector].CapabilitiesRegistry } -func (te TestEnv) CapabilityInfos() []kcr.CapabilitiesRegistryCapabilityInfo { +func (te EnvWrapper) CapabilityInfos() []kcr.CapabilitiesRegistryCapabilityInfo { te.t.Helper() caps, err := te.CapabilitiesRegistry().GetCapabilities(nil) require.NoError(te.t, err) return caps } -func (te TestEnv) Nops() []kcr.CapabilitiesRegistryNodeOperatorAdded { +func (te EnvWrapper) Nops() []kcr.CapabilitiesRegistryNodeOperatorAdded { te.t.Helper() nops, err := te.CapabilitiesRegistry().GetNodeOperators(nil) require.NoError(te.t, err) @@ -122,24 +143,23 @@ func (te TestEnv) Nops() []kcr.CapabilitiesRegistryNodeOperatorAdded { return out } -// SetupTestEnv sets up a keystone test environment with the given configuration -// TODO: make more configurable; eg many tests don't need all the nodes (like when testing a registry change) -func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { - require.NoError(t, c.Validate()) - lggr := logger.Test(t) - ctx := tests.Context(t) - chains, _ := memory.NewMemoryChains(t, c.NumChains, 1) - registryChainSel := registryChain(t, chains) +func (te EnvWrapper) GetP2PIDs(donName string) P2PIDs { + return te.dons.Get(donName).GetP2PIDs() +} + +func initEnv(t *testing.T, nChains int) (registryChainSel uint64, env deployment.Environment) { + chains, _ := memory.NewMemoryChains(t, nChains, 1) + registryChainSel = registryChain(t, chains) // note that all the nodes require TOML configuration of the cap registry address // and writers need forwarder address as TOML config // we choose to use changesets to deploy the initial contracts because that's how it's done in the real world // this requires a initial environment to house the address book - e := deployment.Environment{ - Logger: lggr, + env = deployment.Environment{ + Logger: logger.Test(t), Chains: chains, ExistingAddresses: deployment.NewMemoryAddressBook(), } - e, err := commonchangeset.Apply(t, e, nil, + env, err := commonchangeset.Apply(t, env, nil, commonchangeset.Configure( deployment.CreateLegacyChangeSet(kschangeset.DeployCapabilityRegistry), registryChainSel, @@ -158,30 +178,41 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { ), ) require.NoError(t, err) - require.NotNil(t, e) - require.Len(t, e.Chains, c.NumChains) - validateInitialChainState(t, e, registryChainSel) - // now that we have the initial contracts deployed, we can configure the nodes with the addresses - // TODO: configure the nodes with the correct override functions - crConfig := deployment.CapabilityRegistryConfig{ - EVMChainID: registryChainSel, - Contract: [20]byte{}, - } + require.NotNil(t, env) + require.Len(t, env.Chains, nChains) + validateInitialChainState(t, env, registryChainSel) + return registryChainSel, env +} - wfChains := map[uint64]deployment.Chain{} - wfChains[registryChainSel] = chains[registryChainSel] - wfNodes := memory.NewNodes(t, zapcore.InfoLevel, wfChains, nil, c.WFDonConfig.N, 0, crConfig) - require.Len(t, wfNodes, c.WFDonConfig.N) +func SetupContractTestEnv(t *testing.T, c EnvWrapperConfig) EnvWrapper { + c.useInMemoryNodes = false + return setupTestEnv(t, c) +} - writerChains := map[uint64]deployment.Chain{} - maps.Copy(writerChains, chains) - cwNodes := memory.NewNodes(t, zapcore.InfoLevel, writerChains, nil, c.WriterDonConfig.N, 0, crConfig) - require.Len(t, cwNodes, c.WriterDonConfig.N) +func SetupDevTestEnv(t *testing.T, c EnvWrapperConfig) EnvWrapper { + c.useInMemoryNodes = true + return setupTestEnv(t, c) +} - assetChains := map[uint64]deployment.Chain{} - assetChains[registryChainSel] = chains[registryChainSel] - assetNodes := memory.NewNodes(t, zapcore.InfoLevel, assetChains, nil, c.AssetDonConfig.N, 0, crConfig) - require.Len(t, assetNodes, c.AssetDonConfig.N) +// SetupContractTestEnv sets up a keystone test environment with the given configuration +// TODO: make more configurable; eg many tests don't need all the nodes (like when testing a registry change) +func setupTestEnv(t *testing.T, c EnvWrapperConfig) EnvWrapper { + require.NoError(t, c.Validate()) + lggr := logger.Test(t) + + registryChainSel, envWithContracts := initEnv(t, c.NumChains) + lggr.Debug("done init env") + var ( + dons testDons + env deployment.Environment + ) + if c.useInMemoryNodes { + dons, env = setupMemoryNodeTest(t, registryChainSel, envWithContracts.Chains, c) + } else { + dons, env = setupViewOnlyNodeTest(t, registryChainSel, envWithContracts.Chains, c) + } + err := env.ExistingAddresses.Merge(envWithContracts.ExistingAddresses) + require.NoError(t, err) ocr3CapCfg := GetDefaultCapConfig(t, internal.OCR3Cap) writerChainCapCfg := GetDefaultCapConfig(t, internal.WriteChainCap) @@ -189,36 +220,36 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { // TODO: partition nodes into multiple nops - wfDon := internal.DonCapabilities{ - Name: internal.WFDonName, + wfDonCapabilities := internal.DonCapabilities{ + Name: c.WFDonConfig.Name, Nops: []internal.NOP{ { Name: "nop 1", - Nodes: maps.Keys(wfNodes), + Nodes: dons.Get(c.WFDonConfig.Name).GetP2PIDs().Strings(), }, }, Capabilities: []internal.DONCapabilityWithConfig{ {Capability: internal.OCR3Cap, Config: ocr3CapCfg}, }, } - cwDon := internal.DonCapabilities{ - Name: internal.TargetDonName, + cwDonCapabilities := internal.DonCapabilities{ + Name: c.WriterDonConfig.Name, Nops: []internal.NOP{ { Name: "nop 2", - Nodes: maps.Keys(cwNodes), + Nodes: dons.Get(c.WriterDonConfig.Name).GetP2PIDs().Strings(), }, }, Capabilities: []internal.DONCapabilityWithConfig{ {Capability: internal.WriteChainCap, Config: writerChainCapCfg}, }, } - assetDon := internal.DonCapabilities{ - Name: internal.StreamDonName, + assetDonCapabilities := internal.DonCapabilities{ + Name: c.AssetDonConfig.Name, Nops: []internal.NOP{ { Name: "nop 3", - Nodes: maps.Keys(assetNodes), + Nodes: dons.Get(c.AssetDonConfig.Name).GetP2PIDs().Strings(), }, }, Capabilities: []internal.DONCapabilityWithConfig{ @@ -226,23 +257,11 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { }, } - allChains := make(map[uint64]deployment.Chain) - maps.Copy(allChains, chains) - - allNodes := make(map[string]memory.Node) - maps.Copy(allNodes, wfNodes) - maps.Copy(allNodes, cwNodes) - maps.Copy(allNodes, assetNodes) - env := memory.NewMemoryEnvironmentFromChainsNodes(func() context.Context { return ctx }, lggr, allChains, nil, allNodes) - // set the env addresses to the deployed addresses that were created prior to configuring the nodes - err = env.ExistingAddresses.Merge(e.ExistingAddresses) - require.NoError(t, err) - var ocr3Config = internal.OracleConfig{ - MaxFaultyOracles: len(wfNodes) / 3, - TransmissionSchedule: []int{len(wfNodes)}, + MaxFaultyOracles: dons.Get(c.WFDonConfig.Name).F(), + TransmissionSchedule: []int{dons.Get(c.WFDonConfig.Name).N()}, } - var allDons = []internal.DonCapabilities{wfDon, cwDon, assetDon} + var allDons = []internal.DonCapabilities{wfDonCapabilities, cwDonCapabilities, assetDonCapabilities} csOut, err := kschangeset.ConfigureInitialContractsChangeset(env, kschangeset.InitialContractsCfg{ RegistryChainSel: registryChainSel, @@ -267,15 +286,15 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { // check the nodes gotNodes, err := gotRegistry.GetNodes(nil) require.NoError(t, err) - require.Len(t, gotNodes, len(allNodes)) - validateNodes(t, gotRegistry, wfNodes, expectedHashedCapabilities(t, gotRegistry, wfDon)) - validateNodes(t, gotRegistry, cwNodes, expectedHashedCapabilities(t, gotRegistry, cwDon)) - validateNodes(t, gotRegistry, assetNodes, expectedHashedCapabilities(t, gotRegistry, assetDon)) + require.Len(t, gotNodes, len(dons.P2PIDs())) + validateNodes(t, gotRegistry, dons.Get(c.WFDonConfig.Name), expectedHashedCapabilities(t, gotRegistry, wfDonCapabilities)) + validateNodes(t, gotRegistry, dons.Get(c.WriterDonConfig.Name), expectedHashedCapabilities(t, gotRegistry, cwDonCapabilities)) + validateNodes(t, gotRegistry, dons.Get(c.AssetDonConfig.Name), expectedHashedCapabilities(t, gotRegistry, assetDonCapabilities)) // check the dons - validateDon(t, gotRegistry, wfNodes, wfDon) - validateDon(t, gotRegistry, cwNodes, cwDon) - validateDon(t, gotRegistry, assetNodes, assetDon) + validateDon(t, gotRegistry, dons.Get(c.WFDonConfig.Name), wfDonCapabilities) + validateDon(t, gotRegistry, dons.Get(c.WriterDonConfig.Name), cwDonCapabilities) + validateDon(t, gotRegistry, dons.Get(c.AssetDonConfig.Name), assetDonCapabilities) if c.UseMCMS { // deploy, configure and xfer ownership of MCMS on all chains @@ -318,16 +337,99 @@ func SetupTestEnv(t *testing.T, c TestConfig) TestEnv { require.NoError(t, err) } } - return TestEnv{ + return EnvWrapper{ t: t, Env: env, RegistrySelector: registryChainSel, - WFNodes: wfNodes, - CWNodes: cwNodes, - AssetNodes: assetNodes, + dons: dons, } } +func setupViewOnlyNodeTest(t *testing.T, registryChainSel uint64, chains map[uint64]deployment.Chain, c EnvWrapperConfig) (testDons, deployment.Environment) { + // now that we have the initial contracts deployed, we can configure the nodes with the addresses + wfConfig := make([]envtest.NodeConfig, 0, len(c.WFDonConfig.ChainSelectors)) + for i := 0; i < c.WFDonConfig.N; i++ { + wfConfig = append(wfConfig, envtest.NodeConfig{ + ChainSelectors: []uint64{registryChainSel}, + Name: fmt.Sprintf("%s-%d", c.WFDonConfig.Name, i), + }) + } + wfNodes := envtest.NewNodes(t, wfConfig) + require.Len(t, wfNodes, c.WFDonConfig.N) + + assetConfig := make([]envtest.NodeConfig, 0, len(c.AssetDonConfig.ChainSelectors)) + for i := 0; i < c.AssetDonConfig.N; i++ { + assetConfig = append(assetConfig, envtest.NodeConfig{ + ChainSelectors: maps.Keys(chains), + Name: fmt.Sprintf("%s-%d", c.AssetDonConfig.Name, i), + }) + } + assetNodes := envtest.NewNodes(t, assetConfig) + require.Len(t, assetNodes, c.AssetDonConfig.N) + + writerConfig := make([]envtest.NodeConfig, 0, len(c.WriterDonConfig.ChainSelectors)) + for i := 0; i < c.WriterDonConfig.N; i++ { + writerConfig = append(writerConfig, envtest.NodeConfig{ + ChainSelectors: maps.Keys(chains), + Name: fmt.Sprintf("%s-%d", c.WriterDonConfig.Name, i), + }) + } + writerNodes := envtest.NewNodes(t, writerConfig) + require.Len(t, writerNodes, c.WriterDonConfig.N) + + dons := newViewOnlyDons() + dons.Put(newViewOnlyDon(c.WFDonConfig.Name, wfNodes)) + dons.Put(newViewOnlyDon(c.AssetDonConfig.Name, assetNodes)) + dons.Put(newViewOnlyDon(c.WriterDonConfig.Name, writerNodes)) + + env := deployment.NewEnvironment( + "view only nodes", + logger.Test(t), + deployment.NewMemoryAddressBook(), + chains, + nil, + dons.NodeList().IDs(), + envtest.NewJDService(dons.NodeList()), + func() context.Context { return tests.Context(t) }, + deployment.XXXGenerateTestOCRSecrets(), + ) + + return dons, *env +} + +func setupMemoryNodeTest(t *testing.T, registryChainSel uint64, chains map[uint64]deployment.Chain, c EnvWrapperConfig) (testDons, deployment.Environment) { + // now that we have the initial contracts deployed, we can configure the nodes with the addresses + // TODO: configure the nodes with the correct override functions + lggr := logger.Test(t) + crConfig := deployment.CapabilityRegistryConfig{ + EVMChainID: registryChainSel, + Contract: [20]byte{}, + } + + wfChains := map[uint64]deployment.Chain{} + wfChains[registryChainSel] = chains[registryChainSel] + wfNodes := memory.NewNodes(t, zapcore.InfoLevel, wfChains, nil, c.WFDonConfig.N, 0, crConfig) + require.Len(t, wfNodes, c.WFDonConfig.N) + + writerChains := map[uint64]deployment.Chain{} + maps.Copy(writerChains, chains) + cwNodes := memory.NewNodes(t, zapcore.InfoLevel, writerChains, nil, c.WriterDonConfig.N, 0, crConfig) + require.Len(t, cwNodes, c.WriterDonConfig.N) + + assetChains := map[uint64]deployment.Chain{} + assetChains[registryChainSel] = chains[registryChainSel] + assetNodes := memory.NewNodes(t, zapcore.InfoLevel, assetChains, nil, c.AssetDonConfig.N, 0, crConfig) + require.Len(t, assetNodes, c.AssetDonConfig.N) + + dons := newMemoryDons() + dons.Put(newMemoryDon(c.WFDonConfig.Name, wfNodes)) + dons.Put(newMemoryDon(c.AssetDonConfig.Name, assetNodes)) + dons.Put(newMemoryDon(c.WriterDonConfig.Name, cwNodes)) + + env := memory.NewMemoryEnvironmentFromChainsNodes(func() context.Context { return tests.Context(t) }, lggr, chains, nil, dons.AllNodes()) + return dons, env +} + func registryChain(t *testing.T, chains map[uint64]deployment.Chain) uint64 { var registryChainSel uint64 = math.MaxUint64 for sel := range chains { @@ -367,20 +469,20 @@ func validateInitialChainState(t *testing.T, env deployment.Environment, registr } // validateNodes checks that the nodes exist and have the expected capabilities -func validateNodes(t *testing.T, gotRegistry *kcr.CapabilitiesRegistry, nodes map[string]memory.Node, expectedHashedCaps [][32]byte) { - gotNodes, err := gotRegistry.GetNodesByP2PIds(nil, p2pIDs(t, maps.Keys(nodes))) +func validateNodes(t *testing.T, gotRegistry *kcr.CapabilitiesRegistry, nodes testDon, expectedHashedCaps [][32]byte) { + gotNodes, err := gotRegistry.GetNodesByP2PIds(nil, p2p32Bytes(t, nodes.GetP2PIDs())) require.NoError(t, err) - require.Len(t, gotNodes, len(nodes)) + require.Len(t, gotNodes, nodes.N()) for _, n := range gotNodes { require.Equal(t, expectedHashedCaps, n.HashedCapabilityIds) } } // validateDon checks that the don exists and has the expected capabilities -func validateDon(t *testing.T, gotRegistry *kcr.CapabilitiesRegistry, nodes map[string]memory.Node, don internal.DonCapabilities) { +func validateDon(t *testing.T, gotRegistry *kcr.CapabilitiesRegistry, nodes testDon, don internal.DonCapabilities) { gotDons, err := gotRegistry.GetDONs(nil) require.NoError(t, err) - wantP2PID := sortedHash(p2pIDs(t, maps.Keys(nodes))) + wantP2PID := sortedHash(p2p32Bytes(t, nodes.GetP2PIDs())) found := false for _, have := range gotDons { gotP2PID := sortedHash(have.NodeP2PIds) @@ -393,42 +495,3 @@ func validateDon(t *testing.T, gotRegistry *kcr.CapabilitiesRegistry, nodes map[ } require.True(t, found, "don not found in registry") } - -func capIDs(t *testing.T, cfgs []kcr.CapabilitiesRegistryCapabilityConfiguration) [][32]byte { - var out [][32]byte - for _, cfg := range cfgs { - out = append(out, cfg.CapabilityId) - } - return out -} - -func p2pIDs(t *testing.T, vals []string) [][32]byte { - var out [][32]byte - for _, v := range vals { - id, err := p2pkey.MakePeerID(v) - require.NoError(t, err) - out = append(out, id) - } - return out -} - -func expectedHashedCapabilities(t *testing.T, registry *kcr.CapabilitiesRegistry, don internal.DonCapabilities) [][32]byte { - out := make([][32]byte, len(don.Capabilities)) - var err error - for i, capWithCfg := range don.Capabilities { - out[i], err = registry.GetHashedCapabilityId(nil, capWithCfg.Capability.LabelledName, capWithCfg.Capability.Version) - require.NoError(t, err) - } - return out -} - -func sortedHash(p2pids [][32]byte) string { - sha256Hash := sha256.New() - sort.Slice(p2pids, func(i, j int) bool { - return bytes.Compare(p2pids[i][:], p2pids[j][:]) < 0 - }) - for _, id := range p2pids { - sha256Hash.Write(id[:]) - } - return hex.EncodeToString(sha256Hash.Sum(nil)) -} diff --git a/deployment/keystone/changeset/test/env_setup_test.go b/deployment/keystone/changeset/test/env_setup_test.go new file mode 100644 index 00000000000..c9172135583 --- /dev/null +++ b/deployment/keystone/changeset/test/env_setup_test.go @@ -0,0 +1,64 @@ +package test + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" +) + +func TestSetupEnv(t *testing.T) { + t.Parallel() + ctx := tests.Context(t) + + t.Run("test env with in memory nodes", func(t *testing.T) { + for _, useMCMS := range []bool{true, false} { + te := SetupContractTestEnv(t, EnvWrapperConfig{ + WFDonConfig: DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: DonConfig{Name: "writerDon", N: 4}, + NumChains: 3, + UseMCMS: useMCMS, + }) + t.Run(fmt.Sprintf("set up test env using MCMS: %t", useMCMS), func(t *testing.T) { + require.NotNil(t, te.Env.ExistingAddresses) + require.Len(t, te.Env.Chains, 3) + require.NotEmpty(t, te.RegistrySelector) + require.NotNil(t, te.Env.Offchain) + r, err := te.Env.Offchain.ListNodes(ctx, &node.ListNodesRequest{}) + require.NoError(t, err) + require.Len(t, r.Nodes, 12) + for _, donNames := range []string{"wfDon", "assetDon", "writerDon"} { + require.Len(t, te.GetP2PIDs(donNames), 4, "don %s should have 4 p2p ids", donNames) + } + }) + } + }) + + t.Run("test env with view only, non functional node stubs", func(t *testing.T) { + for _, useMCMS := range []bool{true, false} { + te := SetupContractTestEnv(t, EnvWrapperConfig{ + WFDonConfig: DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: DonConfig{Name: "writerDon", N: 4}, + NumChains: 3, + UseMCMS: useMCMS, + }) + t.Run(fmt.Sprintf("set up test env using MCMS: %t", useMCMS), func(t *testing.T) { + require.NotNil(t, te.Env.ExistingAddresses) + require.Len(t, te.Env.Chains, 3) + require.NotEmpty(t, te.RegistrySelector) + require.NotNil(t, te.Env.Offchain) + r, err := te.Env.Offchain.ListNodes(ctx, &node.ListNodesRequest{}) + require.NoError(t, err) + require.Len(t, r.Nodes, 12) + for _, donNames := range []string{"wfDon", "assetDon", "writerDon"} { + require.Len(t, te.GetP2PIDs(donNames), 4, "don %s should have 4 p2p ids", donNames) + } + }) + } + }) +} diff --git a/deployment/keystone/changeset/test/helpers_test.go b/deployment/keystone/changeset/test/helpers_test.go deleted file mode 100644 index 2d06e087db0..00000000000 --- a/deployment/keystone/changeset/test/helpers_test.go +++ /dev/null @@ -1,34 +0,0 @@ -package test - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - "github.com/smartcontractkit/chainlink-protos/job-distributor/v1/node" -) - -func TestSetupTestEnv(t *testing.T) { - t.Parallel() - ctx := tests.Context(t) - for _, useMCMS := range []bool{true, false} { - te := SetupTestEnv(t, TestConfig{ - WFDonConfig: DonConfig{N: 4}, - AssetDonConfig: DonConfig{N: 4}, - WriterDonConfig: DonConfig{N: 4}, - NumChains: 3, - UseMCMS: useMCMS, - }) - t.Run(fmt.Sprintf("set up test env using MCMS: %t", useMCMS), func(t *testing.T) { - require.NotNil(t, te.Env.ExistingAddresses) - require.Len(t, te.Env.Chains, 3) - require.NotEmpty(t, te.RegistrySelector) - require.NotNil(t, te.Env.Offchain) - r, err := te.Env.Offchain.ListNodes(ctx, &node.ListNodesRequest{}) - require.NoError(t, err) - require.Len(t, r.Nodes, 12) - }) - } -} diff --git a/deployment/keystone/changeset/test/utils.go b/deployment/keystone/changeset/test/utils.go new file mode 100644 index 00000000000..b83efc077a2 --- /dev/null +++ b/deployment/keystone/changeset/test/utils.go @@ -0,0 +1,87 @@ +package test + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "sort" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" + kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" + "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" +) + +// P2PIDs is a slice of p2pkey.PeerID with convenient transform methods. +type P2PIDs []p2pkey.PeerID + +// Strings returns the string representation of the p2p IDs. +func (ps P2PIDs) Strings() []string { + out := make([]string, len(ps)) + for i, p := range ps { + out[i] = p.String() + } + return out +} + +// Bytes32 returns the byte representation of the p2p IDs. +func (ps P2PIDs) Bytes32() [][32]byte { + out := make([][32]byte, len(ps)) + for i, p := range ps { + out[i] = p + } + return out +} + +// Unique returns a new slice with duplicate p2p IDs removed. +func (ps P2PIDs) Unique() P2PIDs { + dedup := make(map[p2pkey.PeerID]struct{}) + var out []p2pkey.PeerID + for _, p := range ps { + if _, exists := dedup[p]; !exists { + out = append(out, p) + + dedup[p] = struct{}{} + } + } + return out +} + +func capIDs(t *testing.T, cfgs []kcr.CapabilitiesRegistryCapabilityConfiguration) [][32]byte { + var out [][32]byte + for _, cfg := range cfgs { + out = append(out, cfg.CapabilityId) + } + return out +} + +func expectedHashedCapabilities(t *testing.T, registry *kcr.CapabilitiesRegistry, don internal.DonCapabilities) [][32]byte { + out := make([][32]byte, len(don.Capabilities)) + var err error + for i, capWithCfg := range don.Capabilities { + out[i], err = registry.GetHashedCapabilityId(nil, capWithCfg.Capability.LabelledName, capWithCfg.Capability.Version) + require.NoError(t, err) + } + return out +} + +func sortedHash(p2pids [][32]byte) string { + sha256Hash := sha256.New() + sort.Slice(p2pids, func(i, j int) bool { + return bytes.Compare(p2pids[i][:], p2pids[j][:]) < 0 + }) + for _, id := range p2pids { + sha256Hash.Write(id[:]) + } + return hex.EncodeToString(sha256Hash.Sum(nil)) +} + +func p2p32Bytes(t *testing.T, p2pIDs []p2pkey.PeerID) [][32]byte { + bs := make([][32]byte, len(p2pIDs)) + for i, p := range p2pIDs { + bs[i] = p + } + return bs +} diff --git a/deployment/keystone/changeset/update_don_test.go b/deployment/keystone/changeset/update_don_test.go index 2e8c2ce1262..f270f54a2f0 100644 --- a/deployment/keystone/changeset/update_don_test.go +++ b/deployment/keystone/changeset/update_don_test.go @@ -40,22 +40,19 @@ func TestUpdateDon(t *testing.T) { require.NoError(t, err) t.Run("no mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) // contract set is already deployed with capabilities // we have to keep track of the existing capabilities to add to the new ones - var p2pIDs []p2pkey.PeerID + p2pIDs := te.GetP2PIDs("wfDon") newCapabilities := make(map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) - for id := range te.WFNodes { - k, err := p2pkey.MakePeerID(id) - require.NoError(t, err) - p2pIDs = append(p2pIDs, k) - newCapabilities[k] = caps + for _, id := range p2pIDs { + newCapabilities[id] = caps } t.Run("succeeds if update sets new and existing capabilities", func(t *testing.T) { @@ -81,22 +78,17 @@ func TestUpdateDon(t *testing.T) { }) }) t.Run("with mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) // contract set is already deployed with capabilities // we have to keep track of the existing capabilities to add to the new ones - var p2pIDs []p2pkey.PeerID - for id := range te.WFNodes { - k, err := p2pkey.MakePeerID(id) - require.NoError(t, err) - p2pIDs = append(p2pIDs, k) - } + p2pIDs := te.GetP2PIDs("wfDon") cfg := changeset.UpdateDonRequest{ RegistryChainSel: te.RegistrySelector, diff --git a/deployment/keystone/changeset/update_node_capabilities_test.go b/deployment/keystone/changeset/update_node_capabilities_test.go index fc51399910c..b96f32f716d 100644 --- a/deployment/keystone/changeset/update_node_capabilities_test.go +++ b/deployment/keystone/changeset/update_node_capabilities_test.go @@ -5,7 +5,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -31,22 +30,19 @@ func TestUpdateNodeCapabilities(t *testing.T) { caps = []kcr.CapabilitiesRegistryCapability{capA, capB} ) t.Run("no mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) // contract set is already deployed with capabilities // we have to keep track of the existing capabilities to add to the new ones - var p2pIDs []p2pkey.PeerID + p2pIDs := te.GetP2PIDs("wfDon") newCapabilities := make(map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) - for id := range te.WFNodes { - k, err := p2pkey.MakePeerID(id) - require.NoError(t, err) - p2pIDs = append(p2pIDs, k) - newCapabilities[k] = caps + for _, id := range p2pIDs { + newCapabilities[id] = caps } t.Run("fails if update drops existing capabilities", func(t *testing.T) { @@ -80,23 +76,20 @@ func TestUpdateNodeCapabilities(t *testing.T) { }) }) t.Run("with mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) // contract set is already deployed with capabilities // we have to keep track of the existing capabilities to add to the new ones - var p2pIDs []p2pkey.PeerID + p2pIDs := te.GetP2PIDs("wfDon") newCapabilities := make(map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) - for id := range te.WFNodes { - k, err := p2pkey.MakePeerID(id) - require.NoError(t, err) - p2pIDs = append(p2pIDs, k) - newCapabilities[k] = caps + for _, id := range p2pIDs { + newCapabilities[id] = caps } existing := getNodeCapabilities(te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry, p2pIDs) @@ -139,9 +132,9 @@ func TestUpdateNodeCapabilities(t *testing.T) { } // validateUpdate checks reads nodes from the registry and checks they have the expected updates -func validateCapabilityUpdates(t *testing.T, te test.TestEnv, expected map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) { +func validateCapabilityUpdates(t *testing.T, te test.EnvWrapper, expected map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) { registry := te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry - wfP2PIDs := p2pIDs(t, maps.Keys(te.WFNodes)) + wfP2PIDs := te.GetP2PIDs("wfDon").Bytes32() nodes, err := registry.GetNodesByP2PIds(nil, wfP2PIDs) require.NoError(t, err) require.Len(t, nodes, len(wfP2PIDs)) diff --git a/deployment/keystone/changeset/update_nodes_test.go b/deployment/keystone/changeset/update_nodes_test.go index 498fd6d33f7..aa921821b84 100644 --- a/deployment/keystone/changeset/update_nodes_test.go +++ b/deployment/keystone/changeset/update_nodes_test.go @@ -6,7 +6,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "golang.org/x/exp/maps" "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" @@ -20,22 +19,20 @@ func TestUpdateNodes(t *testing.T) { t.Parallel() t.Run("no mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, }) updates := make(map[p2pkey.PeerID]changeset.NodeUpdate) i := uint8(0) - for id := range te.WFNodes { - k, err := p2pkey.MakePeerID(id) - require.NoError(t, err) + for _, id := range te.GetP2PIDs("wfDon") { pubKey := [32]byte{31: i + 1} // don't set capabilities or nop b/c those must already exist in the contract // those ops must be a different proposal when using MCMS - updates[k] = changeset.NodeUpdate{ + updates[id] = changeset.NodeUpdate{ EncryptionPublicKey: hex.EncodeToString(pubKey[:]), Signer: [32]byte{0: i + 1}, } @@ -56,23 +53,21 @@ func TestUpdateNodes(t *testing.T) { }) t.Run("with mcms", func(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) updates := make(map[p2pkey.PeerID]changeset.NodeUpdate) i := uint8(0) - for id := range te.WFNodes { - k, err := p2pkey.MakePeerID(id) - require.NoError(t, err) + for _, id := range te.GetP2PIDs("wfDon") { pubKey := [32]byte{31: i + 1} // don't set capabilities or nop b/c those must already exist in the contract // those ops must be a different proposal when using MCMS - updates[k] = changeset.NodeUpdate{ + updates[id] = changeset.NodeUpdate{ EncryptionPublicKey: hex.EncodeToString(pubKey[:]), Signer: [32]byte{0: i + 1}, } @@ -115,9 +110,9 @@ func TestUpdateNodes(t *testing.T) { } // validateUpdate checks reads nodes from the registry and checks they have the expected updates -func validateUpdate(t *testing.T, te test.TestEnv, expected map[p2pkey.PeerID]changeset.NodeUpdate) { +func validateUpdate(t *testing.T, te test.EnvWrapper, expected map[p2pkey.PeerID]changeset.NodeUpdate) { registry := te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry - wfP2PIDs := p2pIDs(t, maps.Keys(te.WFNodes)) + wfP2PIDs := te.GetP2PIDs("wfDon").Bytes32() nodes, err := registry.GetNodesByP2PIds(nil, wfP2PIDs) require.NoError(t, err) require.Len(t, nodes, len(wfP2PIDs)) diff --git a/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go b/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go index 172205dab1d..dfac7e418a3 100644 --- a/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go +++ b/deployment/keystone/changeset/workflowregistry/update_allowed_dons_test.go @@ -72,10 +72,10 @@ func TestUpdateAllowedDons(t *testing.T) { } func Test_UpdateAllowedDons_WithMCMS(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) diff --git a/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go b/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go index 1f937ce30dd..694e59811bd 100644 --- a/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go +++ b/deployment/keystone/changeset/workflowregistry/update_authorized_addresses_test.go @@ -74,10 +74,10 @@ func TestUpdateAuthorizedAddresses(t *testing.T) { } func Test_UpdateAuthorizedAddresses_WithMCMS(t *testing.T) { - te := test.SetupTestEnv(t, test.TestConfig{ - WFDonConfig: test.DonConfig{N: 4}, - AssetDonConfig: test.DonConfig{N: 4}, - WriterDonConfig: test.DonConfig{N: 4}, + te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ + WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, + AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, + WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, UseMCMS: true, }) From 1c20a04df3ea25a5a90ad71b3f70b5f7eda47b81 Mon Sep 17 00:00:00 2001 From: Adam Hamrick Date: Thu, 13 Feb 2025 16:11:28 -0500 Subject: [PATCH 65/83] Ignores disconnection logs (#16400) --- .../docker/test_env/test_env_builder.go | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/integration-tests/docker/test_env/test_env_builder.go b/integration-tests/docker/test_env/test_env_builder.go index e11a3c96095..5691d740b55 100644 --- a/integration-tests/docker/test_env/test_env_builder.go +++ b/integration-tests/docker/test_env/test_env_builder.go @@ -66,6 +66,12 @@ type CLTestEnvBuilder struct { var DefaultAllowedMessages = []testreporters.AllowedLogMessage{ testreporters.NewAllowedLogMessage("Failed to get LINK balance", "Happens only when we deploy LINK token for test purposes. Harmless.", zapcore.ErrorLevel, testreporters.WarnAboutAllowedMsgs_No), testreporters.NewAllowedLogMessage("Error stopping job service", "It's a known issue with lifecycle. There's ongoing work that will fix it.", zapcore.DPanicLevel, testreporters.WarnAboutAllowedMsgs_No), + testreporters.NewAllowedLogMessage( + "No live RPC nodes available", + "Networking or infra issues can cause brief disconnections from the node to RPC nodes, especially at startup. This isn't a concern as long as the test passes otherwise", + zapcore.DPanicLevel, + testreporters.WarnAboutAllowedMsgs_Yes, + ), } var DefaultChainlinkNodeLogScannerSettings = ChainlinkNodeLogScannerSettings{ @@ -295,17 +301,24 @@ func (b *CLTestEnvBuilder) Build() (*CLClusterTestEnv, error) { for _, f := range logFiles { file := f verifyLogsGroup.Go(func() error { - verifyErr := testreporters.VerifyLogFile(file, b.chainlinkNodeLogScannerSettings.FailingLogLevel, b.chainlinkNodeLogScannerSettings.Threshold, b.chainlinkNodeLogScannerSettings.AllowedMessages...) + verifyErr := testreporters.VerifyLogFile( + file, + b.chainlinkNodeLogScannerSettings.FailingLogLevel, + b.chainlinkNodeLogScannerSettings.Threshold, + b.chainlinkNodeLogScannerSettings.AllowedMessages..., + ) _ = file.Close() // ignore processing errors - if verifyErr != nil && !strings.Contains(verifyErr.Error(), testreporters.MultipleLogsAtLogLevelErr) && !strings.Contains(verifyErr.Error(), testreporters.OneLogAtLogLevelErr) { + if verifyErr != nil && !strings.Contains(verifyErr.Error(), testreporters.MultipleLogsAtLogLevelErr) && + !strings.Contains(verifyErr.Error(), testreporters.OneLogAtLogLevelErr) { b.l.Error().Err(verifyErr).Msg("Error processing CL node logs") return nil // if it's not a processing error, we want to fail the test; we also can stop processing logs all together at this point - } else if verifyErr != nil && (strings.Contains(verifyErr.Error(), testreporters.MultipleLogsAtLogLevelErr) || strings.Contains(verifyErr.Error(), testreporters.OneLogAtLogLevelErr)) { - + } else if verifyErr != nil && + (strings.Contains(verifyErr.Error(), testreporters.MultipleLogsAtLogLevelErr) || + strings.Contains(verifyErr.Error(), testreporters.OneLogAtLogLevelErr)) { return verifyErr } return nil From 571f72fdfbc2f8861f7d6ba10b6d0f20d799a3db Mon Sep 17 00:00:00 2001 From: chainchad <96362174+chainchad@users.noreply.github.com> Date: Thu, 13 Feb 2025 16:28:31 -0500 Subject: [PATCH 66/83] Install foundry in solidity publish jobs (#16394) * Install foundry in jobs (cherry picked from commit cfa16025480312d44760fcdf870ce8125d0751ed) * Fix paths and cwd --- .github/workflows/solidity.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/solidity.yml b/.github/workflows/solidity.yml index 79afb8c1d59..099fab122f6 100644 --- a/.github/workflows/solidity.yml +++ b/.github/workflows/solidity.yml @@ -217,6 +217,9 @@ jobs: - name: Setup NodeJS uses: ./.github/actions/setup-nodejs + - name: Install Foundry + uses: ./.github/actions/install-solidity-foundry + - name: Version package.json working-directory: contracts shell: bash @@ -263,6 +266,9 @@ jobs: - name: Setup NodeJS uses: ./.github/actions/setup-nodejs + - name: Install Foundry + uses: ./.github/actions/install-solidity-foundry + - name: Validate version working-directory: contracts shell: bash From b3c50ff73148c7521036ad8da3e713fedc17ab8d Mon Sep 17 00:00:00 2001 From: Silas Lenihan <32529249+silaslenihan@users.noreply.github.com> Date: Thu, 13 Feb 2025 16:37:56 -0500 Subject: [PATCH 67/83] Updated ChainWriter config to be in line with changes enabling serialization (#16367) * Updated ChainWriter config to be in line with changes enabling serialization * Fixed linting * Fixed go.mod * Pinned latest chainlink-solana commit * Updated chainlink-solana dependency * Updated chainlink-solana dependency * Fixed TokenAdminRegistry lookup table config * Added ATA Config --------- Co-authored-by: amit-momin --- .../ccip/configs/solana/chain_writer.go | 297 ++++++++++-------- .../ccip/configs/solana/chain_writer_test.go | 15 +- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- deployment/go.mod | 2 +- deployment/go.sum | 4 +- go.mod | 2 +- go.sum | 4 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- 12 files changed, 191 insertions(+), 151 deletions(-) diff --git a/core/capabilities/ccip/configs/solana/chain_writer.go b/core/capabilities/ccip/configs/solana/chain_writer.go index 29e6f4a59ed..80470a42f09 100644 --- a/core/capabilities/ccip/configs/solana/chain_writer.go +++ b/core/capabilities/ccip/configs/solana/chain_writer.go @@ -23,6 +23,7 @@ const ( sourceChainSelectorPath = "Info.AbstractReports.Messages.Header.SourceChainSelector" destChainSelectorPath = "Info.AbstractReports.Messages.Header.DestChainSelector" destTokenAddress = "Info.AbstractReports.Messages.TokenAmounts.DestTokenAddress" + receiverAddress = "Info.AbstractReports.Messages.Receiver" merkleRootSourceChainSelector = "Info.MerkleRoots.ChainSel" merkleRoot = "Info.MerkleRoots.MerkleRoot" ) @@ -45,36 +46,47 @@ func getCommitMethodConfig(fromAddress string, offrampProgramAddress string, des getCommonAddressLookupTableConfig(offrampProgramAddress), }, }, + ATAs: []chainwriter.ATALookup{ + { + Location: destTokenAddress, + WalletAddress: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: receiverAddress}}, + TokenProgram: chainwriter.Lookup{AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ + LookupTableName: "PoolLookupTable", + IncludeIndexes: []int{6}, + }}, + MintAddress: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}, + }, + }, Accounts: []chainwriter.Lookup{ getOfframpAccountConfig(offrampProgramAddress), getReferenceAddressesConfig(offrampProgramAddress), - chainwriter.PDALookups{ + {PDALookups: &chainwriter.PDALookups{ Name: "SourceChainState", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("source_chain_state")}, - {Dynamic: chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}}, }, IsSigner: false, IsWritable: true, - }, - chainwriter.PDALookups{ + }}, + {PDALookups: &chainwriter.PDALookups{ Name: "CommitReport", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("commit_report")}, - {Dynamic: chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}, - {Dynamic: chainwriter.AccountLookup{Location: merkleRoot}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRoot}}}, }, IsSigner: false, IsWritable: true, - }, + }}, getAuthorityAccountConstant(fromAddress), getSystemProgramConstant(), getSysVarInstructionConstant(), getFeeBillingSignerConfig(offrampProgramAddress), getFeeQuoterConfig(offrampProgramAddress), - chainwriter.PDALookups{ + {PDALookups: &chainwriter.PDALookups{ Name: "FeeQuoterAllowedPriceUpdater", // Fetch fee quoter public key to use as program ID for PDA PublicKey: getFeeQuoterConfig(offrampProgramAddress), @@ -84,8 +96,8 @@ func getCommitMethodConfig(fromAddress string, offrampProgramAddress string, des }, IsSigner: false, IsWritable: false, - }, - chainwriter.PDALookups{ + }}, + {PDALookups: &chainwriter.PDALookups{ Name: "FeeQuoterConfig", // Fetch fee quoter public key to use as program ID for PDA PublicKey: getFeeQuoterConfig(offrampProgramAddress), @@ -94,38 +106,44 @@ func getCommitMethodConfig(fromAddress string, offrampProgramAddress string, des }, IsSigner: false, IsWritable: false, - }, - chainwriter.PDALookups{ - Name: "GlobalState", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("state")}, + }}, + { + PDALookups: &chainwriter.PDALookups{ + Name: "GlobalState", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("state")}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - LookupOpts: chainwriter.LookupOpts{Optional: true}, + Optional: true, }, - chainwriter.PDALookups{ - Name: "BillingTokenConfig", - PublicKey: getFeeQuoterConfig(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("fee_billing_token_config")}, - {Dynamic: chainwriter.AccountLookup{Location: "Info.TokenPrices.TokenID"}}, + { + PDALookups: &chainwriter.PDALookups{ + Name: "BillingTokenConfig", + PublicKey: getFeeQuoterConfig(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("fee_billing_token_config")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: "Info.TokenPrices.TokenID"}}}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - LookupOpts: chainwriter.LookupOpts{Optional: true}, + Optional: true, }, - chainwriter.PDALookups{ - Name: "ChainConfigGasPrice", - PublicKey: getFeeQuoterConfig(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("dest_chain")}, - {Static: destChainSelectorBytes}, + { + PDALookups: &chainwriter.PDALookups{ + Name: "ChainConfigGasPrice", + PublicKey: getFeeQuoterConfig(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("dest_chain")}, + {Static: destChainSelectorBytes}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - LookupOpts: chainwriter.LookupOpts{Optional: true}, + Optional: true, }, }, DebugIDLocation: "", @@ -149,11 +167,12 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch DerivedLookupTables: []chainwriter.DerivedLookupTable{ { Name: "PoolLookupTable", - Accounts: chainwriter.PDALookups{ + Accounts: chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ Name: "TokenAdminRegistry", - PublicKey: getAddressConstant(offrampProgramAddress), + PublicKey: getRouterConfig(offrampProgramAddress), Seeds: []chainwriter.Seed{ - {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, + {Static: []byte("token_admin_registry")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}}, }, IsSigner: false, IsWritable: false, @@ -163,7 +182,7 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch // TokenAdminRegistry is in the router program so need to provide the router's IDL IDL: ccipRouterIDL, }, - }, + }}, }, getCommonAddressLookupTableConfig(offrampProgramAddress), }, @@ -171,43 +190,43 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch Accounts: []chainwriter.Lookup{ getOfframpAccountConfig(offrampProgramAddress), getReferenceAddressesConfig(offrampProgramAddress), - chainwriter.PDALookups{ + {PDALookups: &chainwriter.PDALookups{ Name: "SourceChainState", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("source_chain_state")}, - {Dynamic: chainwriter.AccountLookup{Location: sourceChainSelectorPath}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, }, IsSigner: false, IsWritable: false, - }, - chainwriter.PDALookups{ + }}, + {PDALookups: &chainwriter.PDALookups{ Name: "CommitReport", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("commit_report")}, - {Dynamic: chainwriter.AccountLookup{Location: sourceChainSelectorPath}}, - {Dynamic: chainwriter.AccountLookup{ + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{ // The seed is the merkle root of the report, as passed into the input params. Location: merkleRoot, - }}, + }}}, }, IsSigner: false, IsWritable: true, - }, + }}, getAddressConstant(offrampProgramAddress), - chainwriter.PDALookups{ + {PDALookups: &chainwriter.PDALookups{ Name: "AllowedOfframp", PublicKey: getRouterConfig(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("allowed_offramp")}, - {Dynamic: chainwriter.AccountLookup{Location: sourceChainSelectorPath}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, {Dynamic: getAddressConstant(offrampProgramAddress)}, }, IsSigner: false, IsWritable: false, - }, - chainwriter.PDALookups{ + }}, + {PDALookups: &chainwriter.PDALookups{ Name: "ExternalExecutionConfig", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ @@ -215,11 +234,11 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch }, IsSigner: false, IsWritable: false, - }, + }}, getAuthorityAccountConstant(fromAddress), getSystemProgramConstant(), getSysVarInstructionConstant(), - chainwriter.PDALookups{ + {PDALookups: &chainwriter.PDALookups{ Name: "ExternalTokenPoolsSigner", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ @@ -227,63 +246,73 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch }, IsSigner: false, IsWritable: false, + }}, + { + AccountLookup: &chainwriter.AccountLookup{ + Name: "UserAccounts", + Location: "Info.AbstractReports.Message.ExtraArgsDecoded.Accounts", + IsWritable: chainwriter.MetaBool{BitmapLocation: "Info.AbstractReports.Message.ExtraArgsDecoded.IsWritableBitmap"}, + IsSigner: chainwriter.MetaBool{Value: false}, + }, + Optional: true, }, - chainwriter.AccountLookup{ - Name: "UserAccounts", - Location: "Info.AbstractReports.Message.ExtraArgsDecoded.Accounts", - IsWritable: chainwriter.MetaBool{BitmapLocation: "Info.AbstractReports.Message.ExtraArgsDecoded.IsWritableBitmap"}, - IsSigner: chainwriter.MetaBool{Value: false}, - LookupOpts: chainwriter.LookupOpts{Optional: true}, + { + PDALookups: &chainwriter.PDALookups{ + Name: "ReceiverAssociatedTokenAccount", + PublicKey: chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ + Address: solana.SPLAssociatedTokenAccountProgramID.String(), + }}, + Seeds: []chainwriter.Seed{ + {Static: []byte(fromAddress)}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: "Info.AbstractReports.Messages.Receiver"}}}, + {Dynamic: chainwriter.Lookup{AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ + LookupTableName: "PoolLookupTable", + IncludeIndexes: []int{6}, + }}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}}, + }, + IsSigner: false, + IsWritable: false, + }, + Optional: true, }, - chainwriter.PDALookups{ - Name: "ReceiverAssociatedTokenAccount", - PublicKey: chainwriter.AccountConstant{ - Address: solana.SPLAssociatedTokenAccountProgramID.String(), + { + PDALookups: &chainwriter.PDALookups{ + Name: "PerChainTokenConfig", + PublicKey: getFeeQuoterConfig(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("per_chain_per_token_config")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destChainSelectorPath}}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}}, + }, + IsSigner: false, + IsWritable: false, }, - Seeds: []chainwriter.Seed{ - {Static: []byte(fromAddress)}, - {Dynamic: chainwriter.AccountLookup{Location: "Info.AbstractReports.Messages.Receiver"}}, - {Dynamic: chainwriter.AccountsFromLookupTable{ + Optional: true, + }, + { + PDALookups: &chainwriter.PDALookups{ + Name: "PoolChainConfig", + PublicKey: chainwriter.Lookup{AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ LookupTableName: "PoolLookupTable", - IncludeIndexes: []int{6}, + IncludeIndexes: []int{2}, }}, - {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, - }, - IsSigner: false, - IsWritable: false, - LookupOpts: chainwriter.LookupOpts{Optional: true}, - }, - chainwriter.PDALookups{ - Name: "PerChainTokenConfig", - PublicKey: getFeeQuoterConfig(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("per_chain_per_token_config")}, - {Dynamic: chainwriter.AccountLookup{Location: destChainSelectorPath}}, - {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, + Seeds: []chainwriter.Seed{ + {Static: []byte("ccip_tokenpool_chainconfig")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destChainSelectorPath}}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - LookupOpts: chainwriter.LookupOpts{Optional: true}, + Optional: true, }, - chainwriter.PDALookups{ - Name: "PoolChainConfig", - PublicKey: chainwriter.AccountsFromLookupTable{ + { + AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ LookupTableName: "PoolLookupTable", - IncludeIndexes: []int{2}, - }, - Seeds: []chainwriter.Seed{ - {Static: []byte("ccip_tokenpool_chainconfig")}, - {Dynamic: chainwriter.AccountLookup{Location: destChainSelectorPath}}, - {Dynamic: chainwriter.AccountLookup{Location: destTokenAddress}}, + IncludeIndexes: []int{}, }, - IsSigner: false, - IsWritable: false, - LookupOpts: chainwriter.LookupOpts{Optional: true}, - }, - chainwriter.AccountsFromLookupTable{ - LookupTableName: "PoolLookupTable", - IncludeIndexes: []int{}, - LookupOpts: chainwriter.LookupOpts{Optional: true}, + Optional: true, }, }, DebugIDLocation: "Info.AbstractReports.Messages.Header.MessageID", @@ -330,30 +359,30 @@ func GetSolanaChainWriterConfig(offrampProgramAddress string, fromAddress string return solConfig, nil } -func getOfframpAccountConfig(offrampProgramAddress string) chainwriter.PDALookups { - return chainwriter.PDALookups{ +func getOfframpAccountConfig(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ Name: "OfframpAccountConfig", - PublicKey: chainwriter.AccountConstant{ + PublicKey: chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ Address: offrampProgramAddress, - }, + }}, Seeds: []chainwriter.Seed{ {Static: []byte("config")}, }, IsSigner: false, IsWritable: false, - } + }} } -func getAddressConstant(address string) chainwriter.AccountConstant { - return chainwriter.AccountConstant{ +func getAddressConstant(address string) chainwriter.Lookup { + return chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ Address: address, IsSigner: false, IsWritable: false, - } + }} } -func getFeeQuoterConfig(offrampProgramAddress string) chainwriter.PDALookups { - return chainwriter.PDALookups{ +func getFeeQuoterConfig(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ Name: ccipconsts.ContractNameFeeQuoter, PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ @@ -367,11 +396,11 @@ func getFeeQuoterConfig(offrampProgramAddress string) chainwriter.PDALookups { Location: "FeeQuoter", IDL: ccipOfframpIDL, }, - } + }} } -func getRouterConfig(offrampProgramAddress string) chainwriter.PDALookups { - return chainwriter.PDALookups{ +func getRouterConfig(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ Name: ccipconsts.ContractNameRouter, PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ @@ -385,11 +414,11 @@ func getRouterConfig(offrampProgramAddress string) chainwriter.PDALookups { Location: "Router", IDL: ccipOfframpIDL, }, - } + }} } -func getReferenceAddressesConfig(offrampProgramAddress string) chainwriter.PDALookups { - return chainwriter.PDALookups{ +func getReferenceAddressesConfig(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ Name: "ReferenceAddresses", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ @@ -397,11 +426,11 @@ func getReferenceAddressesConfig(offrampProgramAddress string) chainwriter.PDALo }, IsSigner: false, IsWritable: false, - } + }} } -func getFeeBillingSignerConfig(offrampProgramAddress string) chainwriter.PDALookups { - return chainwriter.PDALookups{ +func getFeeBillingSignerConfig(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ Name: "FeeBillingSigner", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ @@ -409,7 +438,7 @@ func getFeeBillingSignerConfig(offrampProgramAddress string) chainwriter.PDALook }, IsSigner: false, IsWritable: false, - } + }} } // getCommonAddressLookupTableConfig returns the lookup table config that fetches the lookup table address from a PDA on-chain @@ -417,7 +446,7 @@ func getFeeBillingSignerConfig(offrampProgramAddress string) chainwriter.PDALook func getCommonAddressLookupTableConfig(offrampProgramAddress string) chainwriter.DerivedLookupTable { return chainwriter.DerivedLookupTable{ Name: "CommonAddressLookupTable", - Accounts: chainwriter.PDALookups{ + Accounts: chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ Name: "OfframpLookupTable", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ @@ -428,33 +457,33 @@ func getCommonAddressLookupTableConfig(offrampProgramAddress string) chainwriter Location: "OfframpLookupTable", IDL: ccipOfframpIDL, }, - }, + }}, } } -func getAuthorityAccountConstant(fromAddress string) chainwriter.AccountConstant { - return chainwriter.AccountConstant{ +func getAuthorityAccountConstant(fromAddress string) chainwriter.Lookup { + return chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ Name: "Authority", Address: fromAddress, IsSigner: true, IsWritable: true, - } + }} } -func getSystemProgramConstant() chainwriter.AccountConstant { - return chainwriter.AccountConstant{ +func getSystemProgramConstant() chainwriter.Lookup { + return chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ Name: "SystemProgram", Address: solana.SystemProgramID.String(), IsSigner: false, IsWritable: false, - } + }} } -func getSysVarInstructionConstant() chainwriter.AccountConstant { - return chainwriter.AccountConstant{ +func getSysVarInstructionConstant() chainwriter.Lookup { + return chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ Name: "SysvarInstructions", Address: solana.SysVarInstructionsPubkey.String(), IsSigner: false, IsWritable: false, - } + }} } diff --git a/core/capabilities/ccip/configs/solana/chain_writer_test.go b/core/capabilities/ccip/configs/solana/chain_writer_test.go index e47837e9b6a..34b53f9b186 100644 --- a/core/capabilities/ccip/configs/solana/chain_writer_test.go +++ b/core/capabilities/ccip/configs/solana/chain_writer_test.go @@ -1,9 +1,13 @@ package solana import ( + "encoding/json" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-solana/pkg/solana/chainwriter" ) func TestChainWriterConfigRaw(t *testing.T) { @@ -26,11 +30,18 @@ func TestChainWriterConfigRaw(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - _, err := GetSolanaChainWriterConfig("4Nn9dsYBcSTzRbK9hg9kzCUdrCSkMZq1UR6Vw1Tkaf6H", tt.fromAddress, 0) + config, err := GetSolanaChainWriterConfig("4Nn9dsYBcSTzRbK9hg9kzCUdrCSkMZq1UR6Vw1Tkaf6H", tt.fromAddress, 0) if tt.expectedError != "" { assert.EqualError(t, err, tt.expectedError) } else { - assert.NoError(t, err) + require.NoError(t, err) + + raw, err := json.Marshal(config) + require.NoError(t, err) + var result chainwriter.ChainWriterConfig + err = json.Unmarshal(raw, &result) + require.NoError(t, err) + require.EqualValues(t, config, result) } }) } diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 555a6318011..5a77114d195 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -314,7 +314,7 @@ require ( github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index a7817f25d0c..47ec501044c 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1147,8 +1147,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVoZN8VwJb/kAZsbDjW+6cgZPgNTcQHJUH9JrA= diff --git a/deployment/go.mod b/deployment/go.mod index c76f91166ec..777de01737b 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -37,7 +37,7 @@ require ( github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 diff --git a/deployment/go.sum b/deployment/go.sum index 2b92b0fd544..9feab77a445 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1150,8 +1150,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 h1:E7k5Sym9WnMOc4X40lLnQb6BMosxi8DfUBU9pBJjHOQ= github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 h1:W3doYLVoZN8VwJb/kAZsbDjW+6cgZPgNTcQHJUH9JrA= diff --git a/go.mod b/go.mod index 05f5a2540e4..602369b7cb9 100644 --- a/go.mod +++ b/go.mod @@ -87,7 +87,7 @@ require ( github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20241009055228-33d0c0bf38de diff --git a/go.sum b/go.sum index 21b28af3a3c..8e15d690905 100644 --- a/go.sum +++ b/go.sum @@ -1032,8 +1032,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 h1:12ijqMM9tvYVEm+nR826WsrNi6zCKpwBhuApq127wHs= github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7/go.mod h1:FX7/bVdoep147QQhsOPkYsPEXhGZjeYx6lBSaSXtZOA= github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 h1:IpGoPTXpvllN38kT2z2j13sifJMz4nbHglidvop7mfg= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 634f52f745f..1b57426b5e0 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -435,7 +435,7 @@ require ( github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/smartcontractkit/mcms v0.10.0 // indirect github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20241009055228-33d0c0bf38de // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 3f4ccc6c3fd..15b0608549a 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1402,8 +1402,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 h1:ywpcisqGbSqW2t+BwiBNLFlIuEHBFeJfXRmaB/2/wYI= github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 33bf319133e..37a21c6d028 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -423,7 +423,7 @@ require ( github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 // indirect github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 // indirect - github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 // indirect + github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a // indirect github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 // indirect github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 // indirect github.com/smartcontractkit/chainlink-testing-framework/lib/grafana v1.50.0 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 4decd4ff1ff..fa5e66b9b2d 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1385,8 +1385,8 @@ github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-1 github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6/go.mod h1:FRwzI3hGj4CJclNS733gfcffmqQ62ONCkbGi49s658w= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112 h1:c77Gi/APraqwbBO8fbd/5JY2wW+MSIpYg8Uma9MEZFE= github.com/smartcontractkit/chainlink-protos/svr v0.0.0-20250123084029-58cce9b32112/go.mod h1:TcOliTQU6r59DwG4lo3U+mFM9WWyBHGuFkkxQpvSujo= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5 h1:fvXy2UGCaFWxufcq9OTcdrmxjPxav6hN7CXvT8Jwm+Q= -github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250211201734-3ea6680f8db5/go.mod h1:8vwwY6hz++9D0rdmmc9HoyF1noI1pX6Grgz9yvhzUvQ= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a h1:C+XavZQ0rBOpOrh45LUhdOsvtI8OQ0XZKI5pi+GP6h4= +github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a/go.mod h1:aFm1QC/n99mVeBDtv0SE0co56+IECY6Y1fR3OfNYy3c= github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 h1:ywpcisqGbSqW2t+BwiBNLFlIuEHBFeJfXRmaB/2/wYI= github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0/go.mod h1:WYxCxAWpeXEHfhB0GaiV2sj21Ooh9r/Nf7tzmJgAibs= github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 h1:GDGrC5OGiV0RyM1znYWehSQXyZQWTOzrEeJRYmysPCE= From 2724ef8937488de77b320e4e9692ed0dcb3a165a Mon Sep 17 00:00:00 2001 From: Justin Kaseman Date: Thu, 13 Feb 2025 14:00:00 -0800 Subject: [PATCH 68/83] (feat): Add BalanceReader deployment (#16211) * (feat): Add BalanceReader deployment * Add contract changeset --- contracts/.changeset/warm-bobcats-breathe.md | 7 + .../scripts/native_solc_compile_all_keystone | 1 + contracts/src/v0.8/keystone/BalanceReader.sol | 6 +- .../balance_reader/balance_reader.go | 226 ++++++++++++++++++ ...rapper-dependency-versions-do-not-edit.txt | 1 + core/gethwrappers/keystone/go_generate.go | 1 + .../changeset/deploy_balance_reader.go | 41 ++++ .../changeset/deploy_balance_reader_test.go | 46 ++++ .../internal/balancereader_deployer.go | 59 +++++ .../changeset/internal/contract_set.go | 18 ++ 10 files changed, 405 insertions(+), 1 deletion(-) create mode 100644 contracts/.changeset/warm-bobcats-breathe.md create mode 100644 core/gethwrappers/keystone/generated/balance_reader/balance_reader.go create mode 100644 deployment/keystone/changeset/deploy_balance_reader.go create mode 100644 deployment/keystone/changeset/deploy_balance_reader_test.go create mode 100644 deployment/keystone/changeset/internal/balancereader_deployer.go diff --git a/contracts/.changeset/warm-bobcats-breathe.md b/contracts/.changeset/warm-bobcats-breathe.md new file mode 100644 index 00000000000..3fc07307105 --- /dev/null +++ b/contracts/.changeset/warm-bobcats-breathe.md @@ -0,0 +1,7 @@ +--- +'@chainlink/contracts': minor +--- + +Add typeAndVersion to Keystone BalanceReader + +PR issue : CAPPL-509 diff --git a/contracts/scripts/native_solc_compile_all_keystone b/contracts/scripts/native_solc_compile_all_keystone index a42b06b8f67..3de5f969df4 100755 --- a/contracts/scripts/native_solc_compile_all_keystone +++ b/contracts/scripts/native_solc_compile_all_keystone @@ -33,3 +33,4 @@ compileContract keystone/CapabilitiesRegistry.sol compileContract keystone/KeystoneForwarder.sol compileContract keystone/OCR3Capability.sol compileContract keystone/KeystoneFeedsConsumer.sol +compileContract keystone/BalanceReader.sol diff --git a/contracts/src/v0.8/keystone/BalanceReader.sol b/contracts/src/v0.8/keystone/BalanceReader.sol index 2efd6a84605..8d72e9ddadb 100644 --- a/contracts/src/v0.8/keystone/BalanceReader.sol +++ b/contracts/src/v0.8/keystone/BalanceReader.sol @@ -1,9 +1,13 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.24; +import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol"; + /// @notice BalanceReader is used to read native currency balances from one or more accounts /// using a contract method instead of an RPC "eth_getBalance" call. -contract BalanceReader { +contract BalanceReader is ITypeAndVersion { + string public constant override typeAndVersion = "BalanceReader 1.0.0"; + function getNativeBalances(address[] memory addresses) public view returns (uint256[] memory) { uint256[] memory balances = new uint256[](addresses.length); for (uint256 i = 0; i < addresses.length; ++i) { diff --git a/core/gethwrappers/keystone/generated/balance_reader/balance_reader.go b/core/gethwrappers/keystone/generated/balance_reader/balance_reader.go new file mode 100644 index 00000000000..d9bd96db92d --- /dev/null +++ b/core/gethwrappers/keystone/generated/balance_reader/balance_reader.go @@ -0,0 +1,226 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package balance_reader + +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" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +var BalanceReaderMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"}],\"name\":\"getNativeBalances\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b50610388806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063181f5a771461003b5780634c04bf991461008d575b600080fd5b6100776040518060400160405280601381526020017f42616c616e636552656164657220312e302e300000000000000000000000000081525081565b6040516100849190610160565b60405180910390f35b6100a061009b366004610225565b6100ad565b6040516100849190610308565b60606000825167ffffffffffffffff8111156100cb576100cb6101cd565b6040519080825280602002602001820160405280156100f4578160200160208202803683370190505b50905060005b8351811015610159578381815181106101155761011561034c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16318282815181106101465761014661034c565b60209081029190910101526001016100fa565b5092915050565b60006020808352835180602085015260005b8181101561018e57858101830151858201604001528201610172565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461022057600080fd5b919050565b6000602080838503121561023857600080fd5b823567ffffffffffffffff8082111561025057600080fd5b818501915085601f83011261026457600080fd5b813581811115610276576102766101cd565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156102b9576102b96101cd565b6040529182528482019250838101850191888311156102d757600080fd5b938501935b828510156102fc576102ed856101fc565b845293850193928501926102dc565b98975050505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561034057835183529284019291840191600101610324565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea164736f6c6343000818000a", +} + +var BalanceReaderABI = BalanceReaderMetaData.ABI + +var BalanceReaderBin = BalanceReaderMetaData.Bin + +func DeployBalanceReader(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *BalanceReader, error) { + parsed, err := BalanceReaderMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(BalanceReaderBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &BalanceReader{address: address, abi: *parsed, BalanceReaderCaller: BalanceReaderCaller{contract: contract}, BalanceReaderTransactor: BalanceReaderTransactor{contract: contract}, BalanceReaderFilterer: BalanceReaderFilterer{contract: contract}}, nil +} + +type BalanceReader struct { + address common.Address + abi abi.ABI + BalanceReaderCaller + BalanceReaderTransactor + BalanceReaderFilterer +} + +type BalanceReaderCaller struct { + contract *bind.BoundContract +} + +type BalanceReaderTransactor struct { + contract *bind.BoundContract +} + +type BalanceReaderFilterer struct { + contract *bind.BoundContract +} + +type BalanceReaderSession struct { + Contract *BalanceReader + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type BalanceReaderCallerSession struct { + Contract *BalanceReaderCaller + CallOpts bind.CallOpts +} + +type BalanceReaderTransactorSession struct { + Contract *BalanceReaderTransactor + TransactOpts bind.TransactOpts +} + +type BalanceReaderRaw struct { + Contract *BalanceReader +} + +type BalanceReaderCallerRaw struct { + Contract *BalanceReaderCaller +} + +type BalanceReaderTransactorRaw struct { + Contract *BalanceReaderTransactor +} + +func NewBalanceReader(address common.Address, backend bind.ContractBackend) (*BalanceReader, error) { + abi, err := abi.JSON(strings.NewReader(BalanceReaderABI)) + if err != nil { + return nil, err + } + contract, err := bindBalanceReader(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &BalanceReader{address: address, abi: abi, BalanceReaderCaller: BalanceReaderCaller{contract: contract}, BalanceReaderTransactor: BalanceReaderTransactor{contract: contract}, BalanceReaderFilterer: BalanceReaderFilterer{contract: contract}}, nil +} + +func NewBalanceReaderCaller(address common.Address, caller bind.ContractCaller) (*BalanceReaderCaller, error) { + contract, err := bindBalanceReader(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &BalanceReaderCaller{contract: contract}, nil +} + +func NewBalanceReaderTransactor(address common.Address, transactor bind.ContractTransactor) (*BalanceReaderTransactor, error) { + contract, err := bindBalanceReader(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &BalanceReaderTransactor{contract: contract}, nil +} + +func NewBalanceReaderFilterer(address common.Address, filterer bind.ContractFilterer) (*BalanceReaderFilterer, error) { + contract, err := bindBalanceReader(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &BalanceReaderFilterer{contract: contract}, nil +} + +func bindBalanceReader(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := BalanceReaderMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_BalanceReader *BalanceReaderRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BalanceReader.Contract.BalanceReaderCaller.contract.Call(opts, result, method, params...) +} + +func (_BalanceReader *BalanceReaderRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BalanceReader.Contract.BalanceReaderTransactor.contract.Transfer(opts) +} + +func (_BalanceReader *BalanceReaderRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BalanceReader.Contract.BalanceReaderTransactor.contract.Transact(opts, method, params...) +} + +func (_BalanceReader *BalanceReaderCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _BalanceReader.Contract.contract.Call(opts, result, method, params...) +} + +func (_BalanceReader *BalanceReaderTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _BalanceReader.Contract.contract.Transfer(opts) +} + +func (_BalanceReader *BalanceReaderTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _BalanceReader.Contract.contract.Transact(opts, method, params...) +} + +func (_BalanceReader *BalanceReaderCaller) GetNativeBalances(opts *bind.CallOpts, addresses []common.Address) ([]*big.Int, error) { + var out []interface{} + err := _BalanceReader.contract.Call(opts, &out, "getNativeBalances", addresses) + + if err != nil { + return *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int) + + return out0, err + +} + +func (_BalanceReader *BalanceReaderSession) GetNativeBalances(addresses []common.Address) ([]*big.Int, error) { + return _BalanceReader.Contract.GetNativeBalances(&_BalanceReader.CallOpts, addresses) +} + +func (_BalanceReader *BalanceReaderCallerSession) GetNativeBalances(addresses []common.Address) ([]*big.Int, error) { + return _BalanceReader.Contract.GetNativeBalances(&_BalanceReader.CallOpts, addresses) +} + +func (_BalanceReader *BalanceReaderCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _BalanceReader.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_BalanceReader *BalanceReaderSession) TypeAndVersion() (string, error) { + return _BalanceReader.Contract.TypeAndVersion(&_BalanceReader.CallOpts) +} + +func (_BalanceReader *BalanceReaderCallerSession) TypeAndVersion() (string, error) { + return _BalanceReader.Contract.TypeAndVersion(&_BalanceReader.CallOpts) +} + +func (_BalanceReader *BalanceReader) Address() common.Address { + return _BalanceReader.address +} + +type BalanceReaderInterface interface { + GetNativeBalances(opts *bind.CallOpts, addresses []common.Address) ([]*big.Int, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + Address() common.Address +} diff --git a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt index b48b29c2931..12a298dc2d5 100644 --- a/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/keystone/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -1,4 +1,5 @@ GETH_VERSION: 1.14.11 +balance_reader: ../../../contracts/solc/v0.8.24/BalanceReader/BalanceReader.abi ../../../contracts/solc/v0.8.24/BalanceReader/BalanceReader.bin 8824fe0d750f400e5dc8c5fd367bd0d8b335ea24500c38323bdec987e8ac4827 capabilities_registry: ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.abi ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.bin 07e0115065e833b29352017fe808dd149952b0b7fe73d0af87020966d2ece57c feeds_consumer: ../../../contracts/solc/v0.8.24/KeystoneFeedsConsumer/KeystoneFeedsConsumer.abi ../../../contracts/solc/v0.8.24/KeystoneFeedsConsumer/KeystoneFeedsConsumer.bin 6ac5b12eff3b022a35c3c40d5ed0285bf9bfec0e3669a4b12307332a216048ca forwarder: ../../../contracts/solc/v0.8.24/KeystoneForwarder/KeystoneForwarder.abi ../../../contracts/solc/v0.8.24/KeystoneForwarder/KeystoneForwarder.bin cb728d316f6392ae0d07e6ad94ec93897a4706f6ced7120f79f7e61282ef8152 diff --git a/core/gethwrappers/keystone/go_generate.go b/core/gethwrappers/keystone/go_generate.go index 79f49264b39..76dc8818618 100644 --- a/core/gethwrappers/keystone/go_generate.go +++ b/core/gethwrappers/keystone/go_generate.go @@ -8,3 +8,4 @@ package gethwrappers //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/OCR3Capability/OCR3Capability.abi ../../../contracts/solc/v0.8.24/OCR3Capability/OCR3Capability.bin OCR3Capability ocr3_capability //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.abi ../../../contracts/solc/v0.8.24/CapabilitiesRegistry/CapabilitiesRegistry.bin CapabilitiesRegistry capabilities_registry //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/KeystoneFeedsConsumer/KeystoneFeedsConsumer.abi ../../../contracts/solc/v0.8.24/KeystoneFeedsConsumer/KeystoneFeedsConsumer.bin KeystoneFeedsConsumer feeds_consumer +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.24/BalanceReader/BalanceReader.abi ../../../contracts/solc/v0.8.24/BalanceReader/BalanceReader.bin BalanceReader balance_reader diff --git a/deployment/keystone/changeset/deploy_balance_reader.go b/deployment/keystone/changeset/deploy_balance_reader.go new file mode 100644 index 00000000000..738823d7200 --- /dev/null +++ b/deployment/keystone/changeset/deploy_balance_reader.go @@ -0,0 +1,41 @@ +package changeset + +import ( + "fmt" + "maps" + "slices" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" +) + +var _ deployment.ChangeSet[DeployBalanceReaderRequest] = DeployBalanceReader + +type DeployBalanceReaderRequest struct { + ChainSelectors []uint64 // filter to only deploy to these chains; if empty, deploy to all chains +} + +// DeployBalanceReader deploys the BalanceReader contract to all chains in the environment +// callers must merge the output addressbook with the existing one +func DeployBalanceReader(env deployment.Environment, cfg DeployBalanceReaderRequest) (deployment.ChangesetOutput, error) { + lggr := env.Logger + ab := deployment.NewMemoryAddressBook() + selectors := cfg.ChainSelectors + if len(selectors) == 0 { + selectors = slices.Collect(maps.Keys(env.Chains)) + } + for _, sel := range selectors { + chain, ok := env.Chains[sel] + if !ok { + return deployment.ChangesetOutput{}, fmt.Errorf("chain with selector %d not found", sel) + } + lggr.Infow("deploying balancereader", "chainSelector", chain.Selector) + balanceReaderResp, err := internal.DeployBalanceReader(chain, ab) + if err != nil { + return deployment.ChangesetOutput{}, fmt.Errorf("failed to deploy BalanceReader to chain selector %d: %w", chain.Selector, err) + } + lggr.Infof("Deployed %s chain selector %d addr %s", balanceReaderResp.Tv.String(), chain.Selector, balanceReaderResp.Address.String()) + } + + return deployment.ChangesetOutput{AddressBook: ab}, nil +} diff --git a/deployment/keystone/changeset/deploy_balance_reader_test.go b/deployment/keystone/changeset/deploy_balance_reader_test.go new file mode 100644 index 00000000000..949dcc6a7ab --- /dev/null +++ b/deployment/keystone/changeset/deploy_balance_reader_test.go @@ -0,0 +1,46 @@ +package changeset_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" +) + +func TestDeployBalanceReader(t *testing.T) { + t.Parallel() + + lggr := logger.Test(t) + cfg := memory.MemoryEnvironmentConfig{ + Nodes: 1, // nodes unused but required in config + Chains: 2, + } + env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) + + registrySel := env.AllChainSelectors()[0] + + t.Run("should deploy balancereader", func(t *testing.T) { + ab := deployment.NewMemoryAddressBook() + + // deploy balancereader + env.ExistingAddresses = ab + resp, err := changeset.DeployBalanceReader(env, changeset.DeployBalanceReaderRequest{}) + require.NoError(t, err) + require.NotNil(t, resp) + // registry, ocr3, balancereader should be deployed on registry chain + addrs, err := resp.AddressBook.AddressesForChain(registrySel) + require.NoError(t, err) + require.Len(t, addrs, 1) + + // only balancereader on chain 1 + require.NotEqual(t, registrySel, env.AllChainSelectors()[1]) + oaddrs, err := resp.AddressBook.AddressesForChain(env.AllChainSelectors()[1]) + require.NoError(t, err) + require.Len(t, oaddrs, 1) + }) +} diff --git a/deployment/keystone/changeset/internal/balancereader_deployer.go b/deployment/keystone/changeset/internal/balancereader_deployer.go new file mode 100644 index 00000000000..c8a8b80bb21 --- /dev/null +++ b/deployment/keystone/changeset/internal/balancereader_deployer.go @@ -0,0 +1,59 @@ +package internal + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/balance_reader" +) + +type BalanceReaderDeployer struct { + lggr logger.Logger + contract *balance_reader.BalanceReader +} + +func NewBalanceReaderDeployer() (*BalanceReaderDeployer, error) { + lggr, err := logger.New() + if err != nil { + return nil, err + } + return &BalanceReaderDeployer{lggr: lggr}, nil +} +func (c *BalanceReaderDeployer) deploy(req DeployRequest) (*DeployResponse, error) { + est, err := estimateDeploymentGas(req.Chain.Client, balance_reader.BalanceReaderABI) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + c.lggr.Debugf("BalanceReader estimated gas: %d", est) + + balReaderAddr, tx, balReader, err := balance_reader.DeployBalanceReader( + req.Chain.DeployerKey, + req.Chain.Client) + if err != nil { + return nil, fmt.Errorf("failed to deploy BalanceReader: %w", err) + } + + _, err = req.Chain.Confirm(tx) + if err != nil { + return nil, fmt.Errorf("failed to confirm and save BalanceReader: %w", err) + } + tvStr, err := balReader.TypeAndVersion(&bind.CallOpts{}) + if err != nil { + return nil, fmt.Errorf("failed to get type and version: %w", err) + } + tv, err := deployment.TypeAndVersionFromString(tvStr) + if err != nil { + return nil, fmt.Errorf("failed to parse type and version from %s: %w", tvStr, err) + } + resp := &DeployResponse{ + Address: balReaderAddr, + Tx: tx.Hash(), + Tv: tv, + } + c.contract = balReader + return resp, nil +} diff --git a/deployment/keystone/changeset/internal/contract_set.go b/deployment/keystone/changeset/internal/contract_set.go index 540ab80097b..deef48cda0a 100644 --- a/deployment/keystone/changeset/internal/contract_set.go +++ b/deployment/keystone/changeset/internal/contract_set.go @@ -112,3 +112,21 @@ func DeployFeedsConsumer(chain deployment.Chain, ab deployment.AddressBook) (*De } return consumerResp, nil } + +// DeployForwarder deploys the BalanceReader contract to the chain +// and saves the address in the address book. This mutates the address book. +func DeployBalanceReader(chain deployment.Chain, ab deployment.AddressBook) (*DeployResponse, error) { + balanceReaderDeployer, err := NewBalanceReaderDeployer() + if err != nil { + return nil, fmt.Errorf("failed to create BalanceReaderDeployer: %w", err) + } + balanceReaderResp, err := balanceReaderDeployer.deploy(DeployRequest{Chain: chain}) + if err != nil { + return nil, fmt.Errorf("failed to deploy BalanceReader: %w", err) + } + err = ab.Save(chain.Selector, balanceReaderResp.Address.String(), balanceReaderResp.Tv) + if err != nil { + return nil, fmt.Errorf("failed to save BalanceReader: %w", err) + } + return balanceReaderResp, nil +} From 4704eb51ddea9f2e79de1a50695190e702ac2b24 Mon Sep 17 00:00:00 2001 From: Street <5597260+MStreet3@users.noreply.github.com> Date: Fri, 14 Feb 2025 05:11:16 -0500 Subject: [PATCH 69/83] fix(services/feeds): only check for standard cap spec by ext job id (#16366) * fix(services/feeds): only check for standard cap spec by ext job id * adds changeset --- .changeset/pink-singers-greet.md | 5 +++++ core/services/feeds/service.go | 8 ++------ 2 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 .changeset/pink-singers-greet.md diff --git a/.changeset/pink-singers-greet.md b/.changeset/pink-singers-greet.md new file mode 100644 index 00000000000..01633f09345 --- /dev/null +++ b/.changeset/pink-singers-greet.md @@ -0,0 +1,5 @@ +--- +"chainlink": patch +--- + +fixes inability to approve multiple jobs with same command for standard capabilities diff --git a/core/services/feeds/service.go b/core/services/feeds/service.go index d7b3d82c71e..99bbb2e0cbb 100644 --- a/core/services/feeds/service.go +++ b/core/services/feeds/service.go @@ -894,12 +894,8 @@ func (s *service) ApproveSpec(ctx context.Context, id int64, force bool) error { return fmt.Errorf("failed while checking for existing ccip job: %w", txerr) } case job.StandardCapabilities: - existingJobID, txerr = tx.jobORM.FindStandardCapabilityJobID(ctx, *j.StandardCapabilitiesSpec) - // Return an error if the repository errors. If there is a not found - // error we want to continue with approving the job. - if txerr != nil && !errors.Is(txerr, sql.ErrNoRows) { - return fmt.Errorf("failed while checking for existing standard capabilities job: %w", txerr) - } + // Only possible to match standard capabilities by external job id + // no-op case job.Gateway: existingJobID, txerr = tx.jobORM.FindGatewayJobID(ctx, *j.GatewaySpec) // Return an error if the repository errors. If there is a not found From 6fe4499187603310b283053ff3a1ba0cd093336e Mon Sep 17 00:00:00 2001 From: krehermann <16602512+krehermann@users.noreply.github.com> Date: Fri, 14 Feb 2025 03:12:30 -0700 Subject: [PATCH 70/83] fix(cre-278): forbid wf don update (#16404) * forbid wf don update; tests * fix tests --- .../keystone/changeset/add_nodes_test.go | 39 ++-- .../keystone/changeset/internal/update_don.go | 8 + .../keystone/changeset/update_don_test.go | 205 ++++++++++-------- 3 files changed, 142 insertions(+), 110 deletions(-) diff --git a/deployment/keystone/changeset/add_nodes_test.go b/deployment/keystone/changeset/add_nodes_test.go index fca2a0318af..75bf8eeacf6 100644 --- a/deployment/keystone/changeset/add_nodes_test.go +++ b/deployment/keystone/changeset/add_nodes_test.go @@ -16,6 +16,11 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" ) +type mcmsTestCase struct { + name string + mcmsConfig *changeset.MCMSConfig +} + func TestAddNodes(t *testing.T) { t.Parallel() @@ -29,21 +34,25 @@ func TestAddNodes(t *testing.T) { input input checkErr func(t *testing.T, useMCMS bool, err error) } - // run the same tests for both mcms and non-mcms - var mcmsConfigs = []*changeset.MCMSConfig{nil, {MinDuration: 0}} - for _, mc := range mcmsConfigs { - prefix := "no mcms" - if mc != nil { - prefix = "with mcms" - } - t.Run(prefix, func(t *testing.T) { + type mcmsCase struct { + name string + mcmsConfig *changeset.MCMSConfig + } + + var mcCases = []mcmsCase{ + {name: "no mcms", mcmsConfig: nil}, + {name: "with mcms", mcmsConfig: &changeset.MCMSConfig{MinDuration: 0}}, + } + for _, mcCase := range mcCases { + mcmsConfig := mcCase.mcmsConfig + t.Run(mcCase.name, func(t *testing.T) { te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, - UseMCMS: mc != nil, + UseMCMS: mcmsConfig != nil, }) var cases = []testCase{ @@ -61,7 +70,7 @@ func TestAddNodes(t *testing.T) { P2PID: testPeerID(t, "test-peer-id"), }, }, - MCMSConfig: mc, + MCMSConfig: mcmsConfig, }, checkErr: func(t *testing.T, useMCMS bool, err error) { require.Error(t, err) @@ -89,7 +98,7 @@ func TestAddNodes(t *testing.T) { }, }, }, - MCMSConfig: mc, + MCMSConfig: mcmsConfig, }, checkErr: func(t *testing.T, useMCMS bool, err error) { require.Error(t, err) @@ -117,7 +126,7 @@ func TestAddNodes(t *testing.T) { }, }, }, - MCMSConfig: mc, + MCMSConfig: mcmsConfig, }, }, { @@ -148,7 +157,7 @@ func TestAddNodes(t *testing.T) { }, }, }, - MCMSConfig: mc, + MCMSConfig: mcmsConfig, }, }, @@ -180,7 +189,7 @@ func TestAddNodes(t *testing.T) { }, }, }, - MCMSConfig: mc, + MCMSConfig: mcmsConfig, }, checkErr: func(t *testing.T, useMCMS bool, err error) { require.Error(t, err) @@ -216,7 +225,7 @@ func TestAddNodes(t *testing.T) { }, }, }, - MCMSConfig: mc, + MCMSConfig: mcmsConfig, }, checkErr: func(t *testing.T, useMCMS bool, err error) { require.Error(t, err) diff --git a/deployment/keystone/changeset/internal/update_don.go b/deployment/keystone/changeset/internal/update_don.go index 965f926da31..92529a939dd 100644 --- a/deployment/keystone/changeset/internal/update_don.go +++ b/deployment/keystone/changeset/internal/update_don.go @@ -86,6 +86,14 @@ func UpdateDon(_ logger.Logger, req *UpdateDonRequest) (*UpdateDonResponse, erro if err != nil { return nil, fmt.Errorf("failed to lookup don by p2pIDs: %w", err) } + + if don.AcceptsWorkflows { + // TODO: CRE-277 ensure forwarders are support the next DON version + // https://github.com/smartcontractkit/chainlink/blob/4fc61bb156fe57bfd939b836c02c413ad1209ebb/contracts/src/v0.8/keystone/CapabilitiesRegistry.sol#L812 + // and + // https://github.com/smartcontractkit/chainlink/blob/4fc61bb156fe57bfd939b836c02c413ad1209ebb/contracts/src/v0.8/keystone/KeystoneForwarder.sol#L274 + return nil, fmt.Errorf("refusing to update workflow don %d at config version %d because we cannot validate that all forwarder contracts are ready to accept the new configure version", don.Id, don.ConfigCount) + } cfgs, err := computeConfigs(registry, req.CapabilityConfigs) if err != nil { return nil, fmt.Errorf("failed to compute configs: %w", err) diff --git a/deployment/keystone/changeset/update_don_test.go b/deployment/keystone/changeset/update_don_test.go index f270f54a2f0..ca037c45058 100644 --- a/deployment/keystone/changeset/update_don_test.go +++ b/deployment/keystone/changeset/update_don_test.go @@ -9,7 +9,6 @@ import ( "github.com/smartcontractkit/chainlink/deployment" commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" - "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset" "github.com/smartcontractkit/chainlink/deployment/keystone/changeset/internal" @@ -18,119 +17,135 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey" ) +var ( + capA = kcr.CapabilitiesRegistryCapability{ + LabelledName: "capA", + Version: "0.4.2", + } + capB = kcr.CapabilitiesRegistryCapability{ + LabelledName: "capB", + Version: "3.16.0", + } + caps = []kcr.CapabilitiesRegistryCapability{capA, capB} +) + func TestUpdateDon(t *testing.T) { t.Parallel() - var ( - capA = kcr.CapabilitiesRegistryCapability{ - LabelledName: "capA", - Version: "0.4.2", - } - capB = kcr.CapabilitiesRegistryCapability{ - LabelledName: "capB", - Version: "3.16.0", - } - caps = []kcr.CapabilitiesRegistryCapability{capA, capB} - ) - capACfg := test.GetDefaultCapConfig(t, capA) - capACfgB, err := proto.Marshal(capACfg) - require.NoError(t, err) - capBCfg := test.GetDefaultCapConfig(t, capB) - capBCfgB, err := proto.Marshal(capBCfg) + capACfg, err := proto.Marshal(test.GetDefaultCapConfig(t, capA)) require.NoError(t, err) - t.Run("no mcms", func(t *testing.T) { - te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ - WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, - AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, - WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, - NumChains: 1, - }) - - // contract set is already deployed with capabilities - // we have to keep track of the existing capabilities to add to the new ones - p2pIDs := te.GetP2PIDs("wfDon") - newCapabilities := make(map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) - for _, id := range p2pIDs { - newCapabilities[id] = caps - } + capBCfg, err := proto.Marshal(test.GetDefaultCapConfig(t, capB)) + require.NoError(t, err) - t.Run("succeeds if update sets new and existing capabilities", func(t *testing.T) { - cfg := changeset.UpdateDonRequest{ - RegistryChainSel: te.RegistrySelector, - P2PIDs: p2pIDs, - CapabilityConfigs: []changeset.CapabilityConfig{ - { - Capability: capA, Config: capACfgB, - }, - { - Capability: capB, Config: capBCfgB, - }, - }, - } + type input struct { + te test.EnvWrapper + nodeSetToUpdate []p2pkey.PeerID + mcmsConfig *changeset.MCMSConfig + } + type testCase struct { + name string + input input + checkErr func(t *testing.T, useMCMS bool, err error) + } - csOut, err := changeset.UpdateDon(te.Env, &cfg) - require.NoError(t, err) - require.Empty(t, csOut.Proposals) - require.Nil(t, csOut.AddressBook) + var mcmsCases = []mcmsTestCase{ + {name: "no mcms", mcmsConfig: nil}, + {name: "with mcms", mcmsConfig: &changeset.MCMSConfig{MinDuration: 0}}, + } - assertDonContainsCapabilities(t, te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry, caps, p2pIDs) - }) - }) - t.Run("with mcms", func(t *testing.T) { + for _, mc := range mcmsCases { te := test.SetupContractTestEnv(t, test.EnvWrapperConfig{ WFDonConfig: test.DonConfig{Name: "wfDon", N: 4}, AssetDonConfig: test.DonConfig{Name: "assetDon", N: 4}, WriterDonConfig: test.DonConfig{Name: "writerDon", N: 4}, NumChains: 1, - UseMCMS: true, + UseMCMS: mc.mcmsConfig != nil, }) - // contract set is already deployed with capabilities - // we have to keep track of the existing capabilities to add to the new ones - p2pIDs := te.GetP2PIDs("wfDon") - - cfg := changeset.UpdateDonRequest{ - RegistryChainSel: te.RegistrySelector, - P2PIDs: p2pIDs, - CapabilityConfigs: []changeset.CapabilityConfig{ + t.Run(mc.name, func(t *testing.T) { + var cases = []testCase{ { - Capability: capA, - Config: capACfgB, + name: "forbid wf update", + input: input{ + nodeSetToUpdate: te.GetP2PIDs("wfDon"), + mcmsConfig: mc.mcmsConfig, + te: te, + }, + checkErr: func(t *testing.T, useMCMS bool, err error) { + // this error is independent of mcms because it is a pre-txn check + assert.ErrorContains(t, err, "refusing to update workflow don") + }, }, { - Capability: capB, - Config: capBCfgB, + name: "writer don update ok", + input: input{ + te: te, + nodeSetToUpdate: te.GetP2PIDs("writerDon"), + mcmsConfig: mc.mcmsConfig, + }, }, - }, - MCMSConfig: &changeset.MCMSConfig{MinDuration: 0}, - } - - csOut, err := changeset.UpdateDon(te.Env, &cfg) - require.NoError(t, err) - - require.Len(t, csOut.Proposals, 1) - require.Len(t, csOut.Proposals[0].Transactions, 1) // append node capabilties cs, update don - require.Len(t, csOut.Proposals[0].Transactions[0].Batch, 3) // add capabilities, update nodes, update don - require.Nil(t, csOut.AddressBook) - - // now apply the changeset such that the proposal is signed and execed - contracts := te.ContractSets()[te.RegistrySelector] - timelockContracts := map[uint64]*proposalutils.TimelockExecutionContracts{ - te.RegistrySelector: { - Timelock: contracts.Timelock, - CallProxy: contracts.CallProxy, - }, - } - _, err = commonchangeset.Apply(t, te.Env, timelockContracts, - commonchangeset.Configure( - deployment.CreateLegacyChangeSet(changeset.UpdateDon), - &cfg, - ), - ) - require.NoError(t, err) - assertDonContainsCapabilities(t, te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry, caps, p2pIDs) - }) + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // contract set is already deployed with capabilities + // we have to keep track of the existing capabilities to add to the new ones + p2pIDs := tc.input.nodeSetToUpdate + newCapabilities := make(map[p2pkey.PeerID][]kcr.CapabilitiesRegistryCapability) + for _, id := range p2pIDs { + newCapabilities[id] = caps + } + + cfg := changeset.UpdateDonRequest{ + RegistryChainSel: te.RegistrySelector, + P2PIDs: p2pIDs, + CapabilityConfigs: []changeset.CapabilityConfig{ + { + Capability: capA, Config: capACfg, + }, + { + Capability: capB, Config: capBCfg, + }, + }, + MCMSConfig: tc.input.mcmsConfig, + } + + csOut, err := changeset.UpdateDon(te.Env, &cfg) + if err != nil && tc.checkErr == nil { + t.Errorf("non nil err from UpdateDon %v but no checkErr func defined", err) + } + useMCMS := cfg.MCMSConfig != nil + if !useMCMS { + if tc.checkErr != nil { + tc.checkErr(t, useMCMS, err) + return + } + } else { + // when using mcms there are two kinds of errors: + // those from creating the proposal and those executing the proposal + // if we have a non-nil err here, its from creating the proposal + // so check it and do not proceed to applying the proposal + if err != nil { + tc.checkErr(t, useMCMS, err) + return + } + require.NotNil(t, csOut.Proposals) //nolint:staticcheck //SA1019 ignoring deprecated field for compatibility; we don't have tools to generate the new field + require.Len(t, csOut.Proposals, 1) //nolint:staticcheck //SA1019 ignoring deprecated field for compatibility; we don't have tools to generate the new field + applyErr := applyProposal(t, te, commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateDon), + &cfg, + )) + if tc.checkErr != nil { + tc.checkErr(t, useMCMS, applyErr) + return + } + } + + assertDonContainsCapabilities(t, te.ContractSets()[te.RegistrySelector].CapabilitiesRegistry, caps, p2pIDs) + }) + } + }) + } } func assertDonContainsCapabilities(t *testing.T, registry *kcr.CapabilitiesRegistry, want []kcr.CapabilitiesRegistryCapability, p2pIDs []p2pkey.PeerID) { From 4d6b129e87cff56c6d774c4e278d3940ddf549c3 Mon Sep 17 00:00:00 2001 From: Mateusz Sekara Date: Fri, 14 Feb 2025 13:58:34 +0100 Subject: [PATCH 71/83] Bumping Chainlink CCIP to the latest develop (#16407) --- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 ++-- deployment/go.mod | 2 +- deployment/go.sum | 4 ++-- go.mod | 2 +- go.sum | 4 ++-- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 ++-- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 5a77114d195..3b72c7d34eb 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -305,7 +305,7 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee // indirect github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 47ec501044c..21c10b9433d 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1123,8 +1123,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/deployment/go.mod b/deployment/go.mod index 777de01737b..5ec2a4ce4bb 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -31,7 +31,7 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb diff --git a/deployment/go.sum b/deployment/go.sum index 9feab77a445..357dfb9842e 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1126,8 +1126,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/go.mod b/go.mod index 602369b7cb9..8da12ade374 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 diff --git a/go.sum b/go.sum index 8e15d690905..755367b409a 100644 --- a/go.sum +++ b/go.sum @@ -1010,8 +1010,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 1b57426b5e0..2fe7c407d26 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 15b0608549a..668d04578b5 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1378,8 +1378,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 37a21c6d028..622a9826ca1 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index fa5e66b9b2d..02e91c52135 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1361,8 +1361,8 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d h1:XPFkOtqPtkODbFoTUP7RIb7txPAP6qjPanrRy2PD8Bc= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250213125400-54af1d244d4d/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= From f5ec35a23b5505ac049bab698518f82b88d19749 Mon Sep 17 00:00:00 2001 From: Jordan Krage Date: Fri, 14 Feb 2025 07:46:28 -0600 Subject: [PATCH 72/83] extract evm/logpoller (#16373) --- .mockery.yaml | 6 +- GNUmakefile | 4 + .../integrationhelpers/integration_helpers.go | 4 +- .../usdcreader/usdcreader_test.go | 6 +- .../ocrimpls/contract_transmitter_test.go | 4 +- .../evm/forwarders/forwarder_manager.go | 2 +- .../evm/forwarders/forwarder_manager_test.go | 8 +- core/chains/evm/logpoller/disabled.go | 131 - core/chains/evm/logpoller/doc.go | 22 - core/chains/evm/logpoller/helper_test.go | 184 -- core/chains/evm/logpoller/log_poller.go | 1740 ------------ .../evm/logpoller/log_poller_internal_test.go | 804 ------ core/chains/evm/logpoller/log_poller_test.go | 2110 -------------- core/chains/evm/logpoller/mocks/log_poller.go | 44 +- core/chains/evm/logpoller/models.go | 58 - core/chains/evm/logpoller/observability.go | 348 --- .../evm/logpoller/observability_test.go | 202 -- core/chains/evm/logpoller/orm.go | 1163 -------- core/chains/evm/logpoller/orm_test.go | 2447 ----------------- core/chains/evm/logpoller/parser.go | 564 ---- core/chains/evm/logpoller/parser_test.go | 369 --- core/chains/evm/logpoller/query.go | 206 -- core/chains/evm/logpoller/query_test.go | 82 - core/chains/evm/txmgr/builder.go | 2 +- core/chains/evm/txmgr/txmgr_test.go | 4 +- core/chains/legacyevm/chain.go | 4 +- core/chains/legacyevm/evm_txm.go | 2 +- core/chains/legacyevm/mocks/chain.go | 2 +- core/internal/mocks/application.go | 16 +- core/internal/testutils/evmtest/evmtest.go | 2 +- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- core/services/blockhashstore/coordinators.go | 2 +- core/services/blockhashstore/delegate_test.go | 4 +- core/services/blockhashstore/feeder.go | 2 +- core/services/blockhashstore/feeder_test.go | 8 +- core/services/chainlink/application.go | 6 +- .../headreporter/prometheus_reporter_test.go | 4 +- .../llo/channel_definition_cache_factory.go | 2 +- .../llo/onchain_channel_definition_cache.go | 4 +- .../onchain_channel_definition_cache_test.go | 8 +- .../ocr2/plugins/ccip/exportinternal.go | 2 +- .../plugins/ccip/internal/cache/autosync.go | 2 +- .../ccip/internal/cache/autosync_test.go | 4 +- .../ccip/internal/cache/commit_roots_test.go | 24 +- .../ccip/internal/ccipcommon/shortcuts.go | 2 +- .../ccipdata/ccipdataprovider/provider.go | 2 +- .../ccipdata/commit_store_reader_test.go | 4 +- .../internal/ccipdata/factory/commit_store.go | 2 +- .../ccipdata/factory/commit_store_test.go | 2 +- .../ccip/internal/ccipdata/factory/offramp.go | 2 +- .../internal/ccipdata/factory/offramp_test.go | 2 +- .../ccip/internal/ccipdata/factory/onramp.go | 2 +- .../internal/ccipdata/factory/onramp_test.go | 2 +- .../ccipdata/factory/price_registry.go | 2 +- .../ccipdata/factory/price_registry_test.go | 2 +- .../internal/ccipdata/offramp_reader_test.go | 4 +- .../internal/ccipdata/onramp_reader_test.go | 4 +- .../ccipdata/price_registry_reader_test.go | 4 +- .../plugins/ccip/internal/ccipdata/reader.go | 2 +- .../ccip/internal/ccipdata/reader_test.go | 2 +- .../ccip/internal/ccipdata/usdc_reader.go | 2 +- .../ccipdata/usdc_reader_internal_test.go | 4 +- .../internal/ccipdata/v1_2_0/commit_store.go | 2 +- .../ccip/internal/ccipdata/v1_2_0/offramp.go | 2 +- .../v1_2_0/offramp_reader_unit_test.go | 6 +- .../ccip/internal/ccipdata/v1_2_0/onramp.go | 2 +- .../internal/ccipdata/v1_2_0/onramp_test.go | 2 +- .../ccipdata/v1_2_0/price_registry.go | 2 +- .../internal/ccipdata/v1_5_0/commit_store.go | 2 +- .../ccip/internal/ccipdata/v1_5_0/offramp.go | 2 +- .../ccip/internal/ccipdata/v1_5_0/onramp.go | 2 +- .../internal/ccipdata/v1_5_0/onramp_test.go | 2 +- .../ccip/internal/logpollerutil/filters.go | 2 +- .../internal/logpollerutil/filters_test.go | 2 +- .../ccip/testhelpers/ccip_contracts.go | 2 +- .../ccip/testhelpers/integration/chainlink.go | 2 +- .../testhelpers_1_4_0/ccip_contracts_1_4_0.go | 11 +- .../testhelpers_1_4_0/chainlink.go | 2 +- ...annel_definition_cache_integration_test.go | 4 +- .../evmregistry/v20/log_provider.go | 2 +- .../ocr2keeper/evmregistry/v20/registry.go | 4 +- .../evmregistry/v20/registry_test.go | 8 +- .../autotelemetry21/custom_telemetry_test.go | 2 +- .../evmregistry/v21/block_subscriber.go | 2 +- .../evmregistry/v21/block_subscriber_test.go | 12 +- .../evmregistry/v21/logprovider/block_time.go | 2 +- .../v21/logprovider/block_time_test.go | 8 +- .../evmregistry/v21/logprovider/buffer_v1.go | 2 +- .../v21/logprovider/buffer_v1_test.go | 2 +- .../evmregistry/v21/logprovider/factory.go | 2 +- .../evmregistry/v21/logprovider/filter.go | 2 +- .../v21/logprovider/filter_test.go | 2 +- .../v21/logprovider/integration_test.go | 8 +- .../evmregistry/v21/logprovider/log.go | 2 +- .../evmregistry/v21/logprovider/log_packer.go | 2 +- .../evmregistry/v21/logprovider/log_test.go | 2 +- .../evmregistry/v21/logprovider/provider.go | 2 +- .../v21/logprovider/provider_life_cycle.go | 2 +- .../logprovider/provider_life_cycle_test.go | 10 +- .../v21/logprovider/provider_test.go | 7 +- .../evmregistry/v21/logprovider/recoverer.go | 2 +- .../v21/logprovider/recoverer_test.go | 14 +- .../ocr2keeper/evmregistry/v21/registry.go | 4 +- .../v21/registry_check_pipeline_test.go | 22 +- .../evmregistry/v21/registry_test.go | 8 +- .../evmregistry/v21/transmit/encoding.go | 2 +- .../evmregistry/v21/transmit/encoding_test.go | 5 +- .../v21/transmit/event_provider.go | 2 +- .../v21/transmit/event_provider_test.go | 4 +- .../evmregistry/v21/upkeep_provider.go | 2 +- .../evmregistry/v21/upkeep_provider_test.go | 2 +- .../evmregistry/v21/upkeepstate/scanner.go | 2 +- .../v21/upkeepstate/scanner_test.go | 2 +- .../plugins/ocr2keeper/integration_21_test.go | 2 +- .../plugins/ocr2keeper/integration_test.go | 2 +- core/services/registrysyncer/syncer_test.go | 4 +- .../evm/capabilities/testutils/backend.go | 4 +- core/services/relay/evm/ccip.go | 2 +- .../relay/evm/chain_components_test.go | 4 +- core/services/relay/evm/chain_reader.go | 2 +- ...n_reader_historical_client_wrapper_test.go | 2 +- core/services/relay/evm/commit_provider.go | 2 +- core/services/relay/evm/config_poller.go | 2 +- core/services/relay/evm/config_poller_test.go | 4 +- .../relay/evm/contract_transmitter.go | 2 +- .../relay/evm/contract_transmitter_test.go | 2 +- .../relay/evm/dual_contract_transmitter.go | 2 +- .../evm/dual_contract_transmitter_test.go | 2 +- .../chain_components_interface_tester.go | 2 +- core/services/relay/evm/exec_provider.go | 2 +- .../relay/evm/functions/config_poller.go | 2 +- .../relay/evm/functions/config_poller_test.go | 4 +- .../evm/functions/contract_transmitter.go | 2 +- .../relay/evm/functions/logpoller_wrapper.go | 2 +- .../evm/functions/logpoller_wrapper_test.go | 8 +- core/services/relay/evm/llo/config_poller.go | 4 +- .../relay/evm/llo/config_poller_test.go | 6 +- .../relay/evm/llo/should_retire_cache.go | 2 +- .../relay/evm/llo/should_retire_cache_test.go | 2 +- core/services/relay/evm/llo_provider.go | 13 +- .../relay/evm/mercury/config_poller.go | 2 +- .../relay/evm/mercury/helpers_test.go | 4 +- core/services/relay/evm/read/bindings.go | 2 +- core/services/relay/evm/read/bindings_test.go | 2 +- core/services/relay/evm/read/contract.go | 2 +- core/services/relay/evm/read/errors.go | 2 +- core/services/relay/evm/read/event.go | 2 +- core/services/relay/evm/read/filter.go | 2 +- core/services/relay/evm/read/method.go | 2 +- .../relay/evm/read/mocks/registrar.go | 2 +- .../services/relay/evm/read/multieventtype.go | 2 +- core/services/relay/evm/types/types.go | 2 +- core/services/vrf/v2/listener_v2.go | 4 +- .../vrf/v2/listener_v2_log_listener.go | 2 +- .../vrf/v2/listener_v2_log_listener_test.go | 18 +- core/store/migrate/migrate_test.go | 8 +- core/web/evm_forwarders_controller.go | 5 +- deployment/go.mod | 2 +- deployment/go.sum | 4 +- go.mod | 2 +- go.sum | 4 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- .../smoke/ccip/ccip_reader_test.go | 16 +- .../universal/log_poller/helpers.go | 2 +- 168 files changed, 316 insertions(+), 10745 deletions(-) delete mode 100644 core/chains/evm/logpoller/disabled.go delete mode 100644 core/chains/evm/logpoller/doc.go delete mode 100644 core/chains/evm/logpoller/helper_test.go delete mode 100644 core/chains/evm/logpoller/log_poller.go delete mode 100644 core/chains/evm/logpoller/log_poller_internal_test.go delete mode 100644 core/chains/evm/logpoller/log_poller_test.go delete mode 100644 core/chains/evm/logpoller/models.go delete mode 100644 core/chains/evm/logpoller/observability.go delete mode 100644 core/chains/evm/logpoller/observability_test.go delete mode 100644 core/chains/evm/logpoller/orm.go delete mode 100644 core/chains/evm/logpoller/orm_test.go delete mode 100644 core/chains/evm/logpoller/parser.go delete mode 100644 core/chains/evm/logpoller/parser_test.go delete mode 100644 core/chains/evm/logpoller/query.go delete mode 100644 core/chains/evm/logpoller/query_test.go diff --git a/.mockery.yaml b/.mockery.yaml index 96a0276b2ca..8b7d9988ab9 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -6,13 +6,11 @@ packages: github.com/smartcontractkit/chainlink-framework/chains/txmgr: config: dir: common/txmgr/mocks - outpkg: mocks interfaces: TxManager: github.com/smartcontractkit/chainlink-framework/chains/txmgr/types: config: dir: common/txmgr/types/mocks - outpkg: mocks interfaces: ReaperChainConfig: config: @@ -41,7 +39,9 @@ packages: Broadcaster: Broadcast: AbigenContract: - github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller: + github.com/smartcontractkit/chainlink-integrations/evm/logpoller: + config: + dir: core/chains/evm/logpoller/mocks interfaces: LogPoller: github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm: diff --git a/GNUmakefile b/GNUmakefile index 552b263ec15..3cba92653c2 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -31,6 +31,10 @@ gomod: ## Ensure chainlink's go dependencies are installed. gomodtidy: gomods ## Run go mod tidy on all modules. gomods tidy +.PHONY: tidy +tidy: gomodtidy ## Tidy all modules and add to git. + git add '**go.*' + .PHONY: docs docs: ## Install and run pkgsite to view Go docs go install golang.org/x/pkgsite/cmd/pkgsite@latest diff --git a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go index 279d838b47b..bb3cb86c832 100644 --- a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go +++ b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go @@ -28,10 +28,10 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" configsevm "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_home" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/rmn_home" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" @@ -126,7 +126,7 @@ func NewTestUniverse(ctx context.Context, t *testing.T, lggr logger.Logger) Test PollPeriod: time.Millisecond, FinalityDepth: 0, BackfillBatchSize: 10, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, backend, big.NewInt(chainID)) diff --git a/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go b/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go index da81dae42aa..d63303be12c 100644 --- a/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go +++ b/core/capabilities/ccip/ccip_integration_tests/usdcreader/usdcreader_test.go @@ -28,11 +28,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" evmconfig "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/usdc_reader_tester" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -305,7 +305,7 @@ func populateDatabase(b *testing.B, // Create log entry logs = append(logs, logpoller.Log{ - EvmChainId: ubig.New(new(big.Int).SetUint64(uint64(source))), + EVMChainID: ubig.New(new(big.Int).SetUint64(uint64(source))), LogIndex: int64(i + 1), BlockHash: utils.NewHash(), BlockNumber: int64(i + 1), @@ -413,7 +413,7 @@ func testSetup(ctx context.Context, t testing.TB, readerChain cciptypes.ChainSel PollPeriod: time.Millisecond, FinalityDepth: int64(depth), BackfillBatchSize: 10, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, simulatedBackend, big.NewInt(0).SetUint64(uint64(readerChain))) diff --git a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go index f1fdc01dad6..637f51962fc 100644 --- a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go +++ b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go @@ -30,11 +30,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink-integrations/evm/keystore" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ocrimpls" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/config" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/multi_ocr3_helper" @@ -421,7 +421,7 @@ func makeTestEvmTxm( PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } diff --git a/core/chains/evm/forwarders/forwarder_manager.go b/core/chains/evm/forwarders/forwarder_manager.go index 77297e779e7..6dd66644043 100644 --- a/core/chains/evm/forwarders/forwarder_manager.go +++ b/core/chains/evm/forwarders/forwarder_manager.go @@ -17,9 +17,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" + evmlogpoller "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - evmlogpoller "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/authorized_forwarder" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/authorized_receiver" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/offchain_aggregator_wrapper" diff --git a/core/chains/evm/forwarders/forwarder_manager_test.go b/core/chains/evm/forwarders/forwarder_manager_test.go index 97ec51d9062..dc35bb2eac8 100644 --- a/core/chains/evm/forwarders/forwarder_manager_test.go +++ b/core/chains/evm/forwarders/forwarder_manager_test.go @@ -23,11 +23,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/config/configtest" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/authorized_forwarder" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/operator_wrapper" ) @@ -64,7 +64,7 @@ func TestFwdMgr_MaybeForwardTransaction(t *testing.T) { PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) @@ -125,7 +125,7 @@ func TestFwdMgr_AccountUnauthorizedToForward_SkipsForwarding(t *testing.T) { PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) @@ -190,7 +190,7 @@ func TestFwdMgr_InvalidForwarderForOCR2FeedsStates(t *testing.T) { PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(evmClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/chains/evm/logpoller/disabled.go b/core/chains/evm/logpoller/disabled.go deleted file mode 100644 index f50ba803e98..00000000000 --- a/core/chains/evm/logpoller/disabled.go +++ /dev/null @@ -1,131 +0,0 @@ -package logpoller - -import ( - "context" - "time" - - "github.com/ethereum/go-ethereum/common" - pkgerrors "github.com/pkg/errors" - - "github.com/smartcontractkit/chainlink-common/pkg/types/query" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -var ( - ErrDisabled = pkgerrors.New("log poller disabled") - LogPollerDisabled LogPoller = disabled{} -) - -type disabled struct{} - -func (disabled) Name() string { return "disabledLogPoller" } - -func (disabled) Start(ctx context.Context) error { return ErrDisabled } - -func (disabled) Close() error { return ErrDisabled } - -func (disabled) Healthy() error { - return ErrDisabled -} - -func (disabled) Ready() error { return ErrDisabled } - -func (disabled) HealthReport() map[string]error { - return map[string]error{"disabledLogPoller": ErrDisabled} -} - -func (disabled) Replay(ctx context.Context, fromBlock int64) error { return ErrDisabled } - -func (disabled) ReplayAsync(fromBlock int64) {} - -func (disabled) RegisterFilter(ctx context.Context, filter Filter) error { return ErrDisabled } - -func (disabled) UnregisterFilter(ctx context.Context, name string) error { return ErrDisabled } - -func (disabled) HasFilter(name string) bool { return false } - -func (disabled) GetFilters() map[string]Filter { return nil } - -func (disabled) LatestBlock(ctx context.Context) (LogPollerBlock, error) { - return LogPollerBlock{}, ErrDisabled -} - -func (disabled) GetBlocksRange(ctx context.Context, numbers []uint64) ([]LogPollerBlock, error) { - return nil, ErrDisabled -} - -func (disabled) Logs(ctx context.Context, start, end int64, eventSig common.Hash, address common.Address) ([]Log, error) { - return nil, ErrDisabled -} - -func (disabled) LogsWithSigs(ctx context.Context, start, end int64, eventSigs []common.Hash, address common.Address) ([]Log, error) { - return nil, ErrDisabled -} - -func (disabled) LatestLogByEventSigWithConfs(ctx context.Context, eventSig common.Hash, address common.Address, confs evmtypes.Confirmations) (*Log, error) { - return nil, ErrDisabled -} - -func (disabled) LatestLogEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (disabled) IndexedLogs(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (disabled) IndexedLogsByBlockRange(ctx context.Context, start, end int64, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash) ([]Log, error) { - return nil, ErrDisabled -} - -func (d disabled) IndexedLogsByTxHash(ctx context.Context, eventSig common.Hash, address common.Address, txHash common.Hash) ([]Log, error) { - return nil, ErrDisabled -} - -func (disabled) IndexedLogsTopicGreaterThan(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (disabled) IndexedLogsTopicRange(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValueMin common.Hash, topicValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (disabled) LogsDataWordRange(ctx context.Context, eventSig common.Hash, address common.Address, wordIndex int, wordValueMin, wordValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (disabled) LogsDataWordGreaterThan(ctx context.Context, eventSig common.Hash, address common.Address, wordIndex int, wordValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (d disabled) IndexedLogsWithSigsExcluding(ctx context.Context, address common.Address, eventSigA, eventSigB common.Hash, topicIndex int, fromBlock, toBlock int64, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (d disabled) LogsCreatedAfter(ctx context.Context, eventSig common.Hash, address common.Address, time time.Time, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (d disabled) IndexedLogsCreatedAfter(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (d disabled) LatestBlockByEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) (int64, error) { - return 0, ErrDisabled -} - -func (d disabled) LogsDataWordBetween(ctx context.Context, eventSig common.Hash, address common.Address, wordIndexMin, wordIndexMax int, wordValue common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return nil, ErrDisabled -} - -func (d disabled) FilteredLogs(_ context.Context, _ []query.Expression, _ query.LimitAndSort, _ string) ([]Log, error) { - return nil, ErrDisabled -} - -func (d disabled) FindLCA(ctx context.Context) (*LogPollerBlock, error) { - return nil, ErrDisabled -} - -func (d disabled) DeleteLogsAndBlocksAfter(ctx context.Context, start int64) error { - return ErrDisabled -} diff --git a/core/chains/evm/logpoller/doc.go b/core/chains/evm/logpoller/doc.go deleted file mode 100644 index 81c6cecf4a9..00000000000 --- a/core/chains/evm/logpoller/doc.go +++ /dev/null @@ -1,22 +0,0 @@ -// Package logpoller is a service for querying EVM log data. -// -// It can be thought of as a more performant and sophisticated version -// of eth_getLogs https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs. -// Having a local table of relevant, continually canonical logs allows us to 2 main advantages: -// - Have hundreds of jobs/clients querying for logs without overloading the underlying RPC provider. -// - Do more sophisticated querying (filter by confirmations/time/log contents, efficiently join between the logs table -// and other tables on the node, etc.) -// -// Guarantees provided by the poller: -// - Queries always return the logs from the _current_ canonical chain (same as eth_getLogs). In particular -// that means that querying unfinalized logs may change between queries but finalized logs remain stable. -// The threshold between unfinalized and finalized logs is the finalityDepth parameter, chosen such that with -// exceedingly high probability logs finalityDepth deep cannot be reorged. -// - After calling RegisterFilter with a particular event, it will never miss logs for that event -// despite node crashes and reorgs. The granularity of the filter is always at least one block (more when backfilling). -// - Old logs stored in the db will only be deleted if all filters matching them have explicit retention periods set, and all -// of them have expired. Default retention of 0 on any matching filter guarantees permanent retention. -// - After calling Replay(fromBlock), all blocks including that one to the latest chain tip will be polled -// with the current filter. This can be used on first time job add to specify a start block from which you wish to capture -// existing logs. -package logpoller diff --git a/core/chains/evm/logpoller/helper_test.go b/core/chains/evm/logpoller/helper_test.go deleted file mode 100644 index 985e86ff707..00000000000 --- a/core/chains/evm/logpoller/helper_test.go +++ /dev/null @@ -1,184 +0,0 @@ -package logpoller_test - -import ( - "context" - "database/sql" - "math/big" - "strings" - "testing" - "time" - - pkgerrors "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient/simulated" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - - "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink-integrations/evm/config/chaintype" - "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/log_emitter" -) - -var ( - EmitterABI, _ = abi.JSON(strings.NewReader(log_emitter.LogEmitterABI)) -) - -type Backend struct { - *simulated.Backend - t testing.TB - expectPending bool -} - -// SetExpectPending sets whether the backend should expect txes to be pending -// after a Fork. We do this to avoid breaking the existing evmtypes.Backend interface (by -// for example passing in a pending bool to Fork). -func (b *Backend) SetExpectPending(pending bool) { - b.expectPending = pending -} - -// Fork as an override exists to maintain the same behaviour as the old -// simulated backend. Description of the changed behaviour -// here https://github.com/ethereum/go-ethereum/pull/30465#issuecomment-2362967508 -// Basically the new simulated backend (post 1.14) will automatically -// put forked txes back in the mempool whereas the old one didn't -// so they would just remain on the fork. -func (b *Backend) Fork(parentHash common.Hash) error { - if err := b.Backend.Fork(parentHash); err != nil { - return err - } - // TODO: Fairly sure we need to upstream a tx pool sync like this: - // func (c *SimulatedBeacon) Rollback() { - // // Flush all transactions from the transaction pools - // + c.eth.TxPool().Sync() - // maxUint256 := new(big.Int).Sub(new(big.Int).Lsh(common.Big1, 256), common.Big1) - // Otherwise its possible the fork adds the txes to the pool - // _after_ we Rollback so the rollback is ineffective. - // In the meantime we can just wait for the txes to be pending as workaround. - require.Eventually(b.t, func() bool { - p, err := b.Backend.Client().PendingTransactionCount(context.Background()) - if err != nil { - return false - } - b.t.Logf("waiting for forked txes to be pending, have %v, want %v\n", p, b.expectPending) - return p > 0 == b.expectPending - }, testutils.DefaultWaitTimeout, 500*time.Millisecond) - b.Rollback() - return nil -} - -type TestHarness struct { - Lggr logger.Logger - // Chain2/ORM2 is just a dummy second chain, doesn't have a client. - ChainID, ChainID2 *big.Int - ORM, ORM2 logpoller.ORM - LogPoller logpoller.LogPollerTest - Client *client.SimulatedBackendClient - Backend evmtypes.Backend - Owner *bind.TransactOpts - Emitter1, Emitter2 *log_emitter.LogEmitter - EmitterAddress1, EmitterAddress2 common.Address -} - -func SetupTH(t testing.TB, opts logpoller.Opts) TestHarness { - lggr := logger.Test(t) - chainID := testutils.NewRandomEVMChainID() - chainID2 := testutils.NewRandomEVMChainID() - db := testutils.NewSqlxDB(t) - - o := logpoller.NewORM(chainID, db, lggr) - o2 := logpoller.NewORM(chainID2, db, lggr) - owner := testutils.MustNewSimTransactor(t) - // Needed for the new sim if you are using Rollback - owner.GasTipCap = big.NewInt(1000000000) - - backend := simulated.NewBackend(types.GenesisAlloc{ - owner.From: { - Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), - }, - }, simulated.WithBlockGasLimit(10e6)) - - // Poll period doesn't matter, we intend to call poll and save logs directly in the test. - // Set it to some insanely high value to not interfere with any tests. - - esc := client.NewSimulatedBackendClient(t, backend, chainID) - - headTracker := headstest.NewSimulatedHeadTracker(esc, opts.UseFinalityTag, opts.FinalityDepth) - if opts.PollPeriod == 0 { - opts.PollPeriod = 1 * time.Hour - } - lp := logpoller.NewLogPoller(o, esc, lggr, headTracker, opts) - - pendingNonce, err := backend.Client().PendingNonceAt(testutils.Context(t), owner.From) - require.NoError(t, err) - - owner.Nonce = big.NewInt(0).SetUint64(pendingNonce) - emitterAddress1, _, emitter1, err := log_emitter.DeployLogEmitter(owner, backend.Client()) - require.NoError(t, err) - - owner.Nonce.Add(owner.Nonce, big.NewInt(1)) // Avoid race where DeployLogEmitter returns before PendingNonce has been incremented - emitterAddress2, _, emitter2, err := log_emitter.DeployLogEmitter(owner, backend.Client()) - require.NoError(t, err) - backend.Commit() - owner.Nonce = nil // Just use pending nonce after this - - return TestHarness{ - Lggr: lggr, - ChainID: chainID, - ChainID2: chainID2, - ORM: o, - ORM2: o2, - LogPoller: lp, - Client: esc, - Backend: &Backend{t: t, Backend: backend, expectPending: true}, - Owner: owner, - Emitter1: emitter1, - Emitter2: emitter2, - EmitterAddress1: emitterAddress1, - EmitterAddress2: emitterAddress2, - } -} - -func (th *TestHarness) PollAndSaveLogs(ctx context.Context, currentBlockNumber int64) int64 { - th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber) - latest, _ := th.LogPoller.LatestBlock(ctx) - return latest.BlockNumber + 1 -} - -func (th *TestHarness) assertDontHave(t *testing.T, start, end int) { - for i := start; i < end; i++ { - _, err := th.ORM.SelectBlockByNumber(testutils.Context(t), int64(i)) - assert.True(t, pkgerrors.Is(err, sql.ErrNoRows)) - } -} - -func (th *TestHarness) assertHaveCanonical(t *testing.T, start, end int) { - for i := start; i < end; i++ { - blk, err := th.ORM.SelectBlockByNumber(testutils.Context(t), int64(i)) - require.NoError(t, err, "block %v", i) - chainBlk, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(int64(i))) - require.NoError(t, err) - assert.Equal(t, chainBlk.Hash().Bytes(), blk.BlockHash.Bytes(), "block %v", i) - } -} - -// Simulates an RPC failover event to an alternate rpc server. This can also be used to -// simulate switching back to the primary rpc after it recovers. -func (th *TestHarness) SetActiveClient(backend evmtypes.Backend, chainType chaintype.ChainType) { - th.Backend = backend - th.Client.SetBackend(backend, chainType) -} - -func (th *TestHarness) finalizeThroughBlock(t *testing.T, blockNumber int64) { - client.FinalizeThroughBlock(t, th.Backend, th.Client, blockNumber) -} diff --git a/core/chains/evm/logpoller/log_poller.go b/core/chains/evm/logpoller/log_poller.go deleted file mode 100644 index f2209168720..00000000000 --- a/core/chains/evm/logpoller/log_poller.go +++ /dev/null @@ -1,1740 +0,0 @@ -package logpoller - -import ( - "bytes" - "context" - "database/sql" - "encoding/binary" - "errors" - "fmt" - "math/big" - "math/rand/v2" - "sort" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/rpc" - pkgerrors "github.com/pkg/errors" - "golang.org/x/exp/maps" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/services" - "github.com/smartcontractkit/chainlink-common/pkg/timeutil" - commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" - "github.com/smartcontractkit/chainlink-common/pkg/types/query" - "github.com/smartcontractkit/chainlink-common/pkg/utils/mathutil" - - "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink-integrations/evm/config" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" -) - -type LogPoller interface { - services.Service - Healthy() error - Replay(ctx context.Context, fromBlock int64) error - ReplayAsync(fromBlock int64) - RegisterFilter(ctx context.Context, filter Filter) error - UnregisterFilter(ctx context.Context, name string) error - HasFilter(name string) bool - GetFilters() map[string]Filter - LatestBlock(ctx context.Context) (LogPollerBlock, error) - GetBlocksRange(ctx context.Context, numbers []uint64) ([]LogPollerBlock, error) - FindLCA(ctx context.Context) (*LogPollerBlock, error) - DeleteLogsAndBlocksAfter(ctx context.Context, start int64) error - - // General querying - Logs(ctx context.Context, start, end int64, eventSig common.Hash, address common.Address) ([]Log, error) - LogsWithSigs(ctx context.Context, start, end int64, eventSigs []common.Hash, address common.Address) ([]Log, error) - LogsCreatedAfter(ctx context.Context, eventSig common.Hash, address common.Address, time time.Time, confs evmtypes.Confirmations) ([]Log, error) - LatestLogByEventSigWithConfs(ctx context.Context, eventSig common.Hash, address common.Address, confs evmtypes.Confirmations) (*Log, error) - LatestLogEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) ([]Log, error) - LatestBlockByEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) (int64, error) - - // Content based querying - IndexedLogs(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash, confs evmtypes.Confirmations) ([]Log, error) - IndexedLogsByBlockRange(ctx context.Context, start, end int64, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash) ([]Log, error) - IndexedLogsCreatedAfter(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) - IndexedLogsByTxHash(ctx context.Context, eventSig common.Hash, address common.Address, txHash common.Hash) ([]Log, error) - IndexedLogsTopicGreaterThan(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) - IndexedLogsTopicRange(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValueMin common.Hash, topicValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) - IndexedLogsWithSigsExcluding(ctx context.Context, address common.Address, eventSigA, eventSigB common.Hash, topicIndex int, fromBlock, toBlock int64, confs evmtypes.Confirmations) ([]Log, error) - LogsDataWordRange(ctx context.Context, eventSig common.Hash, address common.Address, wordIndex int, wordValueMin, wordValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) - LogsDataWordGreaterThan(ctx context.Context, eventSig common.Hash, address common.Address, wordIndex int, wordValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) - LogsDataWordBetween(ctx context.Context, eventSig common.Hash, address common.Address, wordIndexMin, wordIndexMax int, wordValue common.Hash, confs evmtypes.Confirmations) ([]Log, error) - - // chainlink-common query filtering - FilteredLogs(ctx context.Context, filter []query.Expression, limitAndSort query.LimitAndSort, queryName string) ([]Log, error) -} - -type LogPollerTest interface { - LogPoller - PollAndSaveLogs(ctx context.Context, currentBlockNumber int64) - BackupPollAndSaveLogs(ctx context.Context) error - Filter(from, to *big.Int, bh *common.Hash) ethereum.FilterQuery - GetReplayFromBlock(ctx context.Context, requested int64) (int64, error) - PruneOldBlocks(ctx context.Context) (bool, error) -} - -type Client interface { - HeadByNumber(ctx context.Context, n *big.Int) (*evmtypes.Head, error) - HeadByHash(ctx context.Context, n common.Hash) (*evmtypes.Head, error) - BatchCallContext(ctx context.Context, b []rpc.BatchElem) error - FilterLogs(ctx context.Context, q ethereum.FilterQuery) ([]types.Log, error) - ConfiguredChainID() *big.Int -} - -type HeadTracker interface { - services.Service - LatestAndFinalizedBlock(ctx context.Context) (latest, finalized *evmtypes.Head, err error) -} - -var ( - _ LogPollerTest = &logPoller{} - ErrReplayRequestAborted = pkgerrors.New("aborted, replay request cancelled") - ErrReplayInProgress = pkgerrors.New("replay request cancelled, but replay is already in progress") - ErrLogPollerShutdown = pkgerrors.New("replay aborted due to log poller shutdown") -) - -type logPoller struct { - services.StateMachine - ec Client - orm ORM - headTracker HeadTracker - lggr logger.SugaredLogger - pollPeriod time.Duration // poll period set by block production rate - useFinalityTag bool // indicates whether logPoller should use chain's finality or pick a fixed depth for finality - finalityDepth int64 // finality depth is taken to mean that block (head - finality) is finalized. If `useFinalityTag` is set to true, this value is ignored, because finalityDepth is fetched from chain - keepFinalizedBlocksDepth int64 // the number of blocks behind the last finalized block we keep in database - backfillBatchSize int64 // batch size to use when backfilling finalized logs - rpcBatchSize int64 // batch size to use for fallback RPC calls made in GetBlocks - logPrunePageSize int64 - clientErrors config.ClientErrors - backupPollerNextBlock int64 // next block to be processed by Backup LogPoller - backupPollerBlockDelay int64 // how far behind regular LogPoller should BackupLogPoller run. 0 = disabled - - filterMu sync.RWMutex - filters map[string]Filter - filterDirty bool - cachedAddresses []common.Address - cachedEventSigs []common.Hash - - replayStart chan int64 - replayComplete chan error - stopCh services.StopChan - wg sync.WaitGroup - // This flag is raised whenever the log poller detects that the chain's finality has been violated. - // It can happen when reorg is deeper than the latest finalized block that LogPoller saw in a previous PollAndSave tick. - // Usually the only way to recover is to manually remove the offending logs and block from the database. - // LogPoller keeps running in infinite loop, so whenever the invalid state is removed from the database it should - // recover automatically without needing to restart the LogPoller. - finalityViolated atomic.Bool - countBasedLogPruningActive atomic.Bool -} - -type Opts struct { - PollPeriod time.Duration - UseFinalityTag bool - FinalityDepth int64 - BackfillBatchSize int64 - RpcBatchSize int64 - KeepFinalizedBlocksDepth int64 - BackupPollerBlockDelay int64 - LogPrunePageSize int64 - ClientErrors config.ClientErrors -} - -// NewLogPoller creates a log poller. Note there is an assumption -// that blocks can be processed faster than they are produced for the given chain, or the poller will fall behind. -// Block processing involves the following calls in steady state (without reorgs): -// - eth_getBlockByNumber - headers only (transaction hashes, not full transaction objects), -// - eth_getLogs - get the logs for the block -// - 1 db read latest block - for checking reorgs -// - 1 db tx including block write and logs write to logs. -// -// How fast that can be done depends largely on network speed and DB, but even for the fastest -// support chain, polygon, which has 2s block times, we need RPCs roughly with <= 500ms latency -func NewLogPoller(orm ORM, ec Client, lggr logger.Logger, headTracker HeadTracker, opts Opts) *logPoller { - return &logPoller{ - stopCh: make(chan struct{}), - ec: ec, - orm: orm, - headTracker: headTracker, - lggr: logger.Sugared(logger.Named(lggr, "LogPoller")), - replayStart: make(chan int64), - replayComplete: make(chan error), - pollPeriod: opts.PollPeriod, - backupPollerBlockDelay: opts.BackupPollerBlockDelay, - finalityDepth: opts.FinalityDepth, - useFinalityTag: opts.UseFinalityTag, - backfillBatchSize: opts.BackfillBatchSize, - rpcBatchSize: opts.RpcBatchSize, - keepFinalizedBlocksDepth: opts.KeepFinalizedBlocksDepth, - logPrunePageSize: opts.LogPrunePageSize, - clientErrors: opts.ClientErrors, - filters: make(map[string]Filter), - filterDirty: true, // Always build Filter on first call to cache an empty filter if nothing registered yet. - } -} - -type Filter struct { - Name string // see FilterName(id, args) below - Addresses evmtypes.AddressArray - EventSigs evmtypes.HashArray // list of possible values for eventsig (aka topic1) - Topic2 evmtypes.HashArray // list of possible values for topic2 - Topic3 evmtypes.HashArray // list of possible values for topic3 - Topic4 evmtypes.HashArray // list of possible values for topic4 - Retention time.Duration // maximum amount of time to retain logs - MaxLogsKept uint64 // maximum number of logs to retain ( 0 = unlimited ) - LogsPerBlock uint64 // rate limit ( maximum # of logs per block, 0 = unlimited ) -} - -// FilterName is a suggested convenience function for clients to construct unique filter names -// to populate Name field of struct Filter -func FilterName(id string, args ...any) string { - if len(args) == 0 { - return id - } - s := &strings.Builder{} - s.WriteString(id) - s.WriteString(" - ") - fmt.Fprintf(s, "%s", args[0]) - for _, a := range args[1:] { - fmt.Fprintf(s, ":%s", a) - } - return s.String() -} - -// Contains returns true if this filter already fully Contains a -// filter passed to it. -func (filter *Filter) Contains(other *Filter) bool { - if other == nil { - return true - } - if other.Retention != filter.Retention { - return false - } - if other.MaxLogsKept != filter.MaxLogsKept { - return false - } - addresses := make(map[common.Address]interface{}) - for _, addr := range filter.Addresses { - addresses[addr] = struct{}{} - } - events := make(map[common.Hash]interface{}) - for _, ev := range filter.EventSigs { - events[ev] = struct{}{} - } - - for _, addr := range other.Addresses { - if _, ok := addresses[addr]; !ok { - return false - } - } - for _, ev := range other.EventSigs { - if _, ok := events[ev]; !ok { - return false - } - } - return true -} - -// RegisterFilter adds the provided EventSigs and Addresses to the log poller's log filter query. -// If any eventSig is emitted from any address, it will be captured by the log poller. -// If an event matching any of the given event signatures is emitted from any of the provided Addresses, -// the log poller will pick those up and save them. For topic specific queries see content based querying. -// Clients may choose to MergeFilter and then Replay in order to ensure desired logs are present. -// NOTE: due to constraints of the eth filter, there is "leakage" between successive MergeFilter calls, for example -// -// RegisterFilter(event1, addr1) -// RegisterFilter(event2, addr2) -// -// will result in the poller saving (event1, addr2) or (event2, addr1) as well, should it exist. -// Generally speaking this is harmless. We enforce that EventSigs and Addresses are non-empty, -// which means that anonymous events are not supported and log.Topics >= 1 always (log.Topics[0] is the event signature). -// The filter may be unregistered later by Filter.Name -// Warnings/debug information is keyed by filter name. -func (lp *logPoller) RegisterFilter(ctx context.Context, filter Filter) error { - if len(filter.Addresses) == 0 { - return pkgerrors.Errorf("at least one address must be specified") - } - if len(filter.EventSigs) == 0 { - return pkgerrors.Errorf("at least one event must be specified") - } - - for _, eventSig := range filter.EventSigs { - if eventSig == [common.HashLength]byte{} { - return pkgerrors.Errorf("empty event sig") - } - } - for _, addr := range filter.Addresses { - if addr == [common.AddressLength]byte{} { - return pkgerrors.Errorf("empty address") - } - } - - lp.filterMu.Lock() - defer lp.filterMu.Unlock() - - if existingFilter, ok := lp.filters[filter.Name]; ok { - if existingFilter.Contains(&filter) { - // Nothing new in this Filter - lp.lggr.Warnw("Filter already present, no-op", "name", filter.Name, "filter", filter) - return nil - } - lp.lggr.Warnw("Updating existing filter", "name", filter.Name, "filter", filter) - } - - if err := lp.orm.InsertFilter(ctx, filter); err != nil { - return pkgerrors.Wrap(err, "error inserting filter") - } - lp.filters[filter.Name] = filter - lp.filterDirty = true - if filter.MaxLogsKept > 0 { - lp.countBasedLogPruningActive.Store(true) - } - return nil -} - -// UnregisterFilter will remove the filter with the given name. -// If the name does not exist, it will log an error but not return an error. -// Warnings/debug information is keyed by filter name. -func (lp *logPoller) UnregisterFilter(ctx context.Context, name string) error { - lp.filterMu.Lock() - defer lp.filterMu.Unlock() - - _, ok := lp.filters[name] - if !ok { - lp.lggr.Warnw("Filter not found", "name", name) - return nil - } - - if err := lp.orm.DeleteFilter(ctx, name); err != nil { - return pkgerrors.Wrap(err, "error deleting filter") - } - delete(lp.filters, name) - lp.filterDirty = true - return nil -} - -// HasFilter returns true if the log poller has an active filter with the given name. -func (lp *logPoller) HasFilter(name string) bool { - lp.filterMu.RLock() - defer lp.filterMu.RUnlock() - - _, ok := lp.filters[name] - return ok -} - -// GetFilters returns a deep copy of the filters map. -func (lp *logPoller) GetFilters() map[string]Filter { - lp.filterMu.RLock() - defer lp.filterMu.RUnlock() - - filters := make(map[string]Filter) - for k, v := range lp.filters { - deepCopyFilter := Filter{ - Name: v.Name, - Addresses: make(evmtypes.AddressArray, len(v.Addresses)), - EventSigs: make(evmtypes.HashArray, len(v.EventSigs)), - Topic2: make(evmtypes.HashArray, len(v.Topic2)), - Topic3: make(evmtypes.HashArray, len(v.Topic3)), - Topic4: make(evmtypes.HashArray, len(v.Topic4)), - Retention: v.Retention, - MaxLogsKept: v.MaxLogsKept, - LogsPerBlock: v.LogsPerBlock, - } - copy(deepCopyFilter.Addresses, v.Addresses) - copy(deepCopyFilter.EventSigs, v.EventSigs) - copy(deepCopyFilter.Topic2, v.Topic2) - copy(deepCopyFilter.Topic3, v.Topic3) - copy(deepCopyFilter.Topic4, v.Topic4) - - filters[k] = deepCopyFilter - } - return filters -} - -func (lp *logPoller) Filter(from, to *big.Int, bh *common.Hash) ethereum.FilterQuery { - lp.filterMu.Lock() - defer lp.filterMu.Unlock() - if !lp.filterDirty { - return ethereum.FilterQuery{FromBlock: from, ToBlock: to, BlockHash: bh, Topics: [][]common.Hash{lp.cachedEventSigs}, Addresses: lp.cachedAddresses} - } - var ( - addresses []common.Address - eventSigs []common.Hash - addressMp = make(map[common.Address]struct{}) - eventSigMp = make(map[common.Hash]struct{}) - ) - // Merge filters. - for _, filter := range lp.filters { - for _, addr := range filter.Addresses { - addressMp[addr] = struct{}{} - } - for _, eventSig := range filter.EventSigs { - eventSigMp[eventSig] = struct{}{} - } - } - for addr := range addressMp { - addresses = append(addresses, addr) - } - sort.Slice(addresses, func(i, j int) bool { - return bytes.Compare(addresses[i][:], addresses[j][:]) < 0 - }) - for eventSig := range eventSigMp { - eventSigs = append(eventSigs, eventSig) - } - sort.Slice(eventSigs, func(i, j int) bool { - return bytes.Compare(eventSigs[i][:], eventSigs[j][:]) < 0 - }) - if len(eventSigs) == 0 && len(addresses) == 0 { - // If no filter specified, ignore everything. - // This allows us to keep the log poller up and running with no filters present (e.g. no jobs on the node), - // then as jobs are added dynamically start using their filters. - addresses = []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000000")} - eventSigs = []common.Hash{} - } - lp.cachedAddresses = addresses - lp.cachedEventSigs = eventSigs - lp.filterDirty = false - return ethereum.FilterQuery{FromBlock: from, ToBlock: to, BlockHash: bh, Topics: [][]common.Hash{eventSigs}, Addresses: addresses} -} - -// Replay signals that the poller should resume from a new block. -// Blocks until the replay is complete. -// Replay can be used to ensure that filter modification has been applied for all blocks from "fromBlock" up to latest. -// If ctx is cancelled before the replay request has been initiated, ErrReplayRequestAborted is returned. If the replay -// is already in progress, the replay will continue and ErrReplayInProgress will be returned. If the client needs a -// guarantee that the replay is complete before proceeding, it should either avoid cancelling or retry until nil is returned -func (lp *logPoller) Replay(ctx context.Context, fromBlock int64) (err error) { - defer func() { - if errors.Is(err, context.Canceled) { - err = ErrReplayRequestAborted - } else if errors.Is(err, commontypes.ErrFinalityViolated) { - // Replay only declares finality violation and does not resolve it, as it's possible that [fromBlock, savedFinalizedBlockNumber] - // does not contain the violation. - lp.lggr.Criticalw("Replay failed due to finality violation", "fromBlock", fromBlock, "err", err) - lp.finalityViolated.Store(true) - lp.SvcErrBuffer.Append(err) - } - }() - - lp.lggr.Debugf("Replaying from block %d", fromBlock) - latest, err := lp.ec.HeadByNumber(ctx, nil) - if err != nil { - return err - } - if fromBlock < 1 || fromBlock > latest.Number { - return pkgerrors.Errorf("Invalid replay block number %v, acceptable range [1, %v]", fromBlock, latest.Number) - } - - // Backfill all logs up to the latest saved finalized block outside the LogPoller's main loop. - // This is safe, because chain cannot be rewinded deeper than that, so there must not be any race conditions. - savedFinalizedBlockNumber, err := lp.savedFinalizedBlockNumber(ctx) - if err != nil { - return err - } - if fromBlock <= savedFinalizedBlockNumber { - err = lp.backfill(ctx, fromBlock, savedFinalizedBlockNumber) - if err != nil { - return err - } - } - - // Poll everything after latest finalized block in main loop to avoid concurrent writes during reorg - // We assume that number of logs between saved finalized block and current head is small enough to be processed in main loop - fromBlock = mathutil.Max(fromBlock, savedFinalizedBlockNumber+1) - // Don't continue if latest block number is the same as saved finalized block number - if fromBlock > latest.Number { - return nil - } - // Block until replay notification accepted or cancelled. - select { - case lp.replayStart <- fromBlock: - case <-ctx.Done(): - return pkgerrors.Wrap(ErrReplayRequestAborted, ctx.Err().Error()) - } - // Block until replay complete or cancelled. - select { - case err = <-lp.replayComplete: - return err - case <-ctx.Done(): - // Note: this will not abort the actual replay, it just means the client gave up on waiting for it to complete - lp.wg.Add(1) - go lp.recvReplayComplete() - return ErrReplayInProgress - } -} - -// savedFinalizedBlockNumber returns the FinalizedBlockNumber saved with the last processed block in the db -// (latestFinalizedBlock at the time the last processed block was saved) -// If this is the first poll and no blocks are in the db, it returns 0 -func (lp *logPoller) savedFinalizedBlockNumber(ctx context.Context) (int64, error) { - latestProcessed, err := lp.LatestBlock(ctx) - if err == nil { - return latestProcessed.FinalizedBlockNumber, nil - } - if errors.Is(err, sql.ErrNoRows) { - return 0, nil - } - return 0, err -} - -func (lp *logPoller) recvReplayComplete() { - defer lp.wg.Done() - err := <-lp.replayComplete - if err != nil { - lp.lggr.Error(err) - } -} - -// Asynchronous wrapper for Replay() -func (lp *logPoller) ReplayAsync(fromBlock int64) { - lp.wg.Add(1) - go func() { - defer lp.wg.Done() - ctx, cancel := lp.stopCh.NewCtx() - defer cancel() - if err := lp.Replay(ctx, fromBlock); err != nil { - lp.lggr.Error(err) - } - }() -} - -func (lp *logPoller) Start(context.Context) error { - return lp.StartOnce("LogPoller", func() error { - lp.wg.Add(2) - go lp.run() - go lp.backgroundWorkerRun() - return nil - }) -} - -func (lp *logPoller) Close() error { - return lp.StopOnce("LogPoller", func() error { - select { - case lp.replayComplete <- ErrLogPollerShutdown: - default: - } - close(lp.stopCh) - lp.wg.Wait() - return nil - }) -} - -func (lp *logPoller) Healthy() error { - if lp.finalityViolated.Load() { - return commontypes.ErrFinalityViolated - } - return nil -} - -func (lp *logPoller) Name() string { - return lp.lggr.Name() -} - -func (lp *logPoller) HealthReport() map[string]error { - return map[string]error{lp.Name(): lp.Healthy()} -} - -func (lp *logPoller) GetReplayFromBlock(ctx context.Context, requested int64) (int64, error) { - lastProcessed, err := lp.orm.SelectLatestBlock(ctx) - if err != nil { - if !pkgerrors.Is(err, sql.ErrNoRows) { - // Real DB error - return 0, err - } - // Nothing in db, use requested - return requested, nil - } - // We have lastProcessed, take min(requested, lastProcessed). - // This is to avoid replaying from a block later than what we have in the DB - // and skipping blocks. - return mathutil.Min(requested, lastProcessed.BlockNumber), nil -} - -// loadFilters loads the filters from db, and activates count-based Log Pruning -// if required by any of the filters -func (lp *logPoller) loadFilters(ctx context.Context) error { - filters, err := lp.lockAndLoadFilters(ctx) - if err != nil { - return pkgerrors.Wrapf(err, "Failed to load initial filters from db, retrying") - } - if lp.countBasedLogPruningActive.Load() { - return nil - } - for _, filter := range filters { - if filter.MaxLogsKept != 0 { - lp.countBasedLogPruningActive.Store(true) - return nil - } - } - return nil -} - -// lockAndLoadFilters is the part of loadFilters() requiring a filterMu lock -func (lp *logPoller) lockAndLoadFilters(ctx context.Context) (filters map[string]Filter, err error) { - lp.filterMu.Lock() - defer lp.filterMu.Unlock() - - filters, err = lp.orm.LoadFilters(ctx) - if err != nil { - return filters, err - } - - lp.filters = filters - lp.filterDirty = true - return filters, nil -} - -// tickStaggeredDelay chooses a uniformly random amount of time to delay between minDelay and minDelay + period -func tickStaggeredDelay(minDelay time.Duration, period time.Duration) <-chan time.Time { - return time.After(minDelay + timeutil.JitterPct(1.0).Apply(period/2)) -} - -func tickWithDefaultJitter(interval time.Duration) <-chan time.Time { - return time.After(services.DefaultJitter.Apply(interval)) -} - -func (lp *logPoller) run() { - defer lp.wg.Done() - ctx, cancel := lp.stopCh.NewCtx() - defer cancel() - logPollTicker := services.NewTicker(lp.pollPeriod) - defer logPollTicker.Stop() - // stagger these somewhat, so they don't all run back-to-back - backupLogPollTicker := services.TickerConfig{ - Initial: 100 * time.Millisecond, - JitterPct: services.DefaultJitter, - }.NewTicker(time.Duration(lp.backupPollerBlockDelay) * lp.pollPeriod) - defer backupLogPollTicker.Stop() - filtersLoaded := false - - for { - select { - case <-ctx.Done(): - return - case fromBlockReq := <-lp.replayStart: - lp.handleReplayRequest(ctx, fromBlockReq, filtersLoaded) - case <-logPollTicker.C: - if !filtersLoaded { - if err := lp.loadFilters(ctx); err != nil { - lp.lggr.Errorw("Failed loading filters in main logpoller loop, retrying later", "err", err) - continue - } - filtersLoaded = true - } - - // Always start from the latest block in the db. - var start int64 - lastProcessed, err := lp.orm.SelectLatestBlock(ctx) - if err != nil { - if !pkgerrors.Is(err, sql.ErrNoRows) { - // Assume transient db reading issue, retry forever. - lp.lggr.Errorw("unable to get starting block", "err", err) - continue - } - // Otherwise this is the first poll _ever_ on a new chain. - // Only safe thing to do is to start at the first finalized block. - _, latestFinalizedBlockNumber, err := lp.latestBlocks(ctx) - if err != nil { - lp.lggr.Warnw("Unable to get latest for first poll", "err", err) - continue - } - // Starting at the first finalized block. We do not backfill the first finalized block. - start = latestFinalizedBlockNumber - } else { - start = lastProcessed.BlockNumber + 1 - } - lp.PollAndSaveLogs(ctx, start) - case <-backupLogPollTicker.C: - if lp.backupPollerBlockDelay == 0 { - continue // backup poller is disabled - } - // Backup log poller: this serves as an emergency backup to protect against eventual-consistency behavior - // of an rpc node (seen occasionally on optimism, but possibly could happen on other chains?). If the first - // time we request a block, no logs or incomplete logs come back, this ensures that every log is eventually - // re-requested after it is finalized. This doesn't add much overhead, because we can request all of them - // in one shot, since we don't need to worry about re-orgs after finality depth, and it runs far less - // frequently than the primary log poller (instead of roughly once per block it runs once roughly once every - // lp.backupPollerDelay blocks--with default settings about 100x less frequently). - - if !filtersLoaded { - lp.lggr.Warnw("Backup log poller ran before filters loaded, skipping") - continue - } - err := lp.BackupPollAndSaveLogs(ctx) - switch { - case errors.Is(err, commontypes.ErrFinalityViolated): - // BackupPoll only declares finality violation and does not resolve it, as it's possible that processed range - // does not contain the violation. - lp.lggr.Criticalw("Backup poll failed due to finality violation", "err", err) - lp.finalityViolated.Store(true) - lp.SvcErrBuffer.Append(err) - case err != nil: - lp.lggr.Errorw("Backup poller failed, retrying later", "err", err) - } - } - } -} - -func (lp *logPoller) backgroundWorkerRun() { - defer lp.wg.Done() - ctx, cancel := lp.stopCh.NewCtx() - defer cancel() - - blockPruneShortInterval := lp.pollPeriod * 100 - blockPruneInterval := blockPruneShortInterval * 10 - logPruneShortInterval := lp.pollPeriod * 241 // no common factors with 100 - logPruneInterval := logPruneShortInterval * 10 - - // Avoid putting too much pressure on the database by staggering the pruning of old blocks and logs. - // Usually, node after restart will have some work to boot the plugins and other services. - // Deferring first prune by at least 5 mins reduces risk of putting too much pressure on the database. - blockPruneTick := tickStaggeredDelay(5*time.Minute, blockPruneInterval) - logPruneTick := tickStaggeredDelay(5*time.Minute, logPruneInterval) - - // Start initial prune of unmatched logs after 5-15 successful expired log prunes, so that not all chains start - // around the same time. After that, every 20 successful expired log prunes. - successfulExpiredLogPrunes := 5 + rand.IntN(10) //nolint:gosec // G404 - - for { - select { - case <-ctx.Done(): - return - case <-blockPruneTick: - lp.lggr.Infow("pruning old blocks") - blockPruneTick = tickWithDefaultJitter(blockPruneInterval) - if allRemoved, err := lp.PruneOldBlocks(ctx); err != nil { - lp.lggr.Errorw("unable to prune old blocks", "err", err) - } else if !allRemoved { - // Tick faster when cleanup can't keep up with the pace of new blocks - blockPruneTick = tickWithDefaultJitter(blockPruneShortInterval) - lp.lggr.Warnw("reached page limit while pruning old blocks") - } else { - lp.lggr.Debugw("finished pruning old blocks") - } - case <-logPruneTick: - logPruneTick = tickWithDefaultJitter(logPruneInterval) - lp.lggr.Infof("pruning expired logs") - if allRemoved, err := lp.PruneExpiredLogs(ctx); err != nil { - lp.lggr.Errorw("unable to prune expired logs", "err", err) - } else if !allRemoved { - lp.lggr.Warnw("reached page limit while pruning expired logs") - // Tick faster when cleanup can't keep up with the pace of new logs - logPruneTick = tickWithDefaultJitter(logPruneShortInterval) - } else if successfulExpiredLogPrunes >= 20 { - // Only prune unmatched logs if we've successfully pruned all expired logs at least 20 times - // since the last time unmatched logs were pruned - lp.lggr.Infof("finished pruning expired logs: pruning unmatched logs") - if allRemoved, err := lp.PruneUnmatchedLogs(ctx); err != nil { - lp.lggr.Errorw("unable to prune unmatched logs", "err", err) - } else if !allRemoved { - lp.lggr.Warnw("reached page limit while pruning unmatched logs") - logPruneTick = tickWithDefaultJitter(logPruneShortInterval) - } else { - lp.lggr.Debugw("finished pruning unmatched logs") - successfulExpiredLogPrunes = 0 - } - } else { - lp.lggr.Debugw("finished pruning expired logs") - successfulExpiredLogPrunes++ - } - } - } -} - -func (lp *logPoller) handleReplayRequest(ctx context.Context, fromBlockReq int64, filtersLoaded bool) { - fromBlock, err := lp.GetReplayFromBlock(ctx, fromBlockReq) - if err == nil { - if !filtersLoaded { - lp.lggr.Warnw("Received replayReq before filters loaded", "fromBlock", fromBlock, "requested", fromBlockReq) - if err = lp.loadFilters(ctx); err != nil { - lp.lggr.Errorw("Failed loading filters during Replay", "err", err, "fromBlock", fromBlock) - } - } - if err == nil { - // Serially process replay requests. - lp.lggr.Infow("Executing replay", "fromBlock", fromBlock, "requested", fromBlockReq) - lp.PollAndSaveLogs(ctx, fromBlock) - lp.lggr.Infow("Executing replay finished", "fromBlock", fromBlock, "requested", fromBlockReq) - } - } else { - lp.lggr.Errorw("Error executing replay, could not get fromBlock", "err", err) - } - select { - case <-ctx.Done(): - // We're shutting down, notify client and exit - select { - case lp.replayComplete <- ErrReplayRequestAborted: - default: - } - return - case lp.replayComplete <- err: - } -} - -func (lp *logPoller) BackupPollAndSaveLogs(ctx context.Context) error { - if lp.backupPollerNextBlock == 0 { - lastProcessed, err := lp.orm.SelectLatestBlock(ctx) - if err != nil { - if pkgerrors.Is(err, sql.ErrNoRows) { - lp.lggr.Warnw("Backup log poller ran before first successful log poller run, skipping") - return nil - } - - return fmt.Errorf("unable to get starting block: %w", err) - } - // If this is our first run, start from block min(lastProcessed.FinalizedBlockNumber, lastProcessed.BlockNumber-backupPollerBlockDelay) - backupStartBlock := mathutil.Min(lastProcessed.FinalizedBlockNumber, lastProcessed.BlockNumber-lp.backupPollerBlockDelay) - // (or at block 0 if whole blockchain is too short) - lp.backupPollerNextBlock = mathutil.Max(backupStartBlock, 0) - } - - _, latestFinalizedBlockNumber, err := lp.latestBlocks(ctx) - if err != nil { - lp.lggr.Warnw("Backup logpoller failed to get latest block", "err", err) - return nil - } - - lastSafeBackfillBlock := latestFinalizedBlockNumber - 1 - if lastSafeBackfillBlock >= lp.backupPollerNextBlock { - lp.lggr.Infow("Backup poller started backfilling logs", "start", lp.backupPollerNextBlock, "end", lastSafeBackfillBlock) - if err = lp.backfill(ctx, lp.backupPollerNextBlock, lastSafeBackfillBlock); err != nil { - // If there's an error backfilling, we can just return and retry from the last block saved - // since we don't save any blocks on backfilling. We may re-insert the same logs but thats ok. - return fmt.Errorf("backfill failed: %w", err) - } - lp.lggr.Infow("Backup poller finished backfilling", "start", lp.backupPollerNextBlock, "end", lastSafeBackfillBlock) - lp.backupPollerNextBlock = lastSafeBackfillBlock + 1 - } - - return nil -} - -// convertLogs converts an array of geth logs ([]type.Log) to an array of logpoller logs ([]Log) -// -// Block timestamps are extracted from blocks param. If len(blocks) == 1, the same timestamp from this block -// will be used for all logs. If len(blocks) == len(logs) then the block number of each block is used for the -// corresponding log. Any other length for blocks is invalid. -func convertLogs(logs []types.Log, blocks []LogPollerBlock, lggr logger.Logger, chainID *big.Int) []Log { - var lgs []Log - blockTimestamp := time.Now() - if len(logs) == 0 { - return lgs - } - if len(blocks) != 1 && len(blocks) != len(logs) { - lggr.Errorf("AssumptionViolation: invalid params passed to convertLogs, length of blocks must either be 1 or match length of logs") - return lgs - } - - for i, l := range logs { - if i == 0 || len(blocks) == len(logs) { - blockTimestamp = blocks[i].BlockTimestamp - } - lgs = append(lgs, Log{ - EvmChainId: ubig.New(chainID), - LogIndex: int64(l.Index), - BlockHash: l.BlockHash, - // We assume block numbers fit in int64 - // in many places. - BlockNumber: int64(l.BlockNumber), - BlockTimestamp: blockTimestamp, - EventSig: l.Topics[0], // First topic is always event signature. - Topics: convertTopics(l.Topics), - Address: l.Address, - TxHash: l.TxHash, - Data: l.Data, - }) - } - return lgs -} - -func convertTopics(topics []common.Hash) [][]byte { - var topicsForDB [][]byte - for _, t := range topics { - topicsForDB = append(topicsForDB, t.Bytes()) - } - return topicsForDB -} - -// blocksFromFinalizedLogs fetches all of the blocks associated with a given list of logs. It will also unconditionally fetch endBlockNumber, -// whether or not there are any logs in the list from that block -func (lp *logPoller) blocksFromFinalizedLogs(ctx context.Context, logs []types.Log, endBlockNumber uint64) (blocks []LogPollerBlock, err error) { - numbers := make([]uint64, 0, len(logs)) - for _, log := range logs { - numbers = append(numbers, log.BlockNumber) - } - if numbers[len(numbers)-1] != endBlockNumber { - numbers = append(numbers, endBlockNumber) - } - blocks, err = lp.GetBlocksRange(ctx, numbers) - if err != nil { - return nil, err - } - - for i, log := range logs { - if log.BlockHash != blocks[i].BlockHash { - return nil, fmt.Errorf("finalized log produced by tx %s has block hash %s that does not match fetched block's hash %s: %w", log.TxHash, log.BlockHash, blocks[i].BlockHash, commontypes.ErrFinalityViolated) - } - } - - return blocks, nil -} - -// backfill will query FilterLogs in batches for logs in the -// block range [start, end] and save them to the db. -func (lp *logPoller) backfill(ctx context.Context, start, end int64) error { - batchSize := lp.backfillBatchSize - for from := start; from <= end; from += batchSize { - to := mathutil.Min(from+batchSize-1, end) - - gethLogs, err := lp.ec.FilterLogs(ctx, lp.Filter(big.NewInt(from), big.NewInt(to), nil)) - if err != nil { - if !client.IsTooManyResults(err, lp.clientErrors) { - lp.lggr.Errorw("Unable to query for logs", "err", err, "from", from, "to", to) - return err - } - - if batchSize == 1 { - lp.lggr.Criticalw("Too many log results in a single block, failed to retrieve logs! Node may be running in a degraded state.", "err", err, "from", from, "to", to, "LogBackfillBatchSize", lp.backfillBatchSize) - return err - } - batchSize /= 2 - lp.lggr.Warnw("Too many log results, halving block range batch size. Consider increasing LogBackfillBatchSize if this happens frequently", "err", err, "from", from, "to", to, "newBatchSize", batchSize, "LogBackfillBatchSize", lp.backfillBatchSize) - from -= batchSize // counteract +=batchSize on next loop iteration, so starting block does not change - continue - } - if len(gethLogs) == 0 { - continue - } - blocks, err := lp.blocksFromFinalizedLogs(ctx, gethLogs, uint64(to)) //nolint:gosec // G115 - if err != nil { - return err - } - - endblock := blocks[len(blocks)-1] - if gethLogs[len(gethLogs)-1].BlockNumber != uint64(to) { - // Pop endblock if there were no logs for it, so that length of blocks & gethLogs are the same to pass to convertLogs - blocks = blocks[:len(blocks)-1] - } - - lp.lggr.Debugw("Backfill found logs", "from", from, "to", to, "logs", len(gethLogs), "blocks", blocks) - err = lp.orm.InsertLogsWithBlock(ctx, convertLogs(gethLogs, blocks, lp.lggr, lp.ec.ConfiguredChainID()), endblock) - if err != nil { - lp.lggr.Warnw("Unable to insert logs, retrying", "err", err, "from", from, "to", to) - return err - } - } - return nil -} - -// getCurrentBlockMaybeHandleReorg accepts a block number -// and will return that block if its parent points to our last saved block. -// One can optionally pass the block header if it has already been queried to avoid an extra RPC call. -// If its parent does not point to our last saved block we know a reorg has occurred, -// so we: -// 1. Find the LCA by following parent hashes. -// 2. Delete all logs and blocks after the LCA -// 3. Return the LCA+1, i.e. our new current (unprocessed) block. -func (lp *logPoller) getCurrentBlockMaybeHandleReorg(ctx context.Context, currentBlockNumber int64, currentBlock *evmtypes.Head) (head *evmtypes.Head, err error) { - - var err1 error - if currentBlock == nil { - // If we don't have the current block already, lets get it. - currentBlock, err1 = lp.ec.HeadByNumber(ctx, big.NewInt(currentBlockNumber)) - if err1 != nil { - lp.lggr.Warnw("Unable to get currentBlock", "err", err1, "currentBlockNumber", currentBlockNumber) - return nil, err1 - } - // Additional sanity checks, don't necessarily trust the RPC. - if currentBlock == nil { - lp.lggr.Errorw("Unexpected nil block from RPC", "currentBlockNumber", currentBlockNumber) - return nil, pkgerrors.Errorf("Got nil block for %d", currentBlockNumber) - } - if currentBlock.Number != currentBlockNumber { - lp.lggr.Warnw("Unable to get currentBlock, rpc returned incorrect block", "currentBlockNumber", currentBlockNumber, "got", currentBlock.Number) - return nil, pkgerrors.Errorf("Block mismatch have %d want %d", currentBlock.Number, currentBlockNumber) - } - } - // Does this currentBlock point to the same parent that we have saved? - // If not, there was a reorg, so we need to rewind. - expectedParent, err1 := lp.orm.SelectBlockByNumber(ctx, currentBlockNumber-1) - if err1 != nil && !pkgerrors.Is(err1, sql.ErrNoRows) { - // If err is not a 'no rows' error, assume transient db issue and retry - lp.lggr.Warnw("Unable to read latestBlockNumber currentBlock saved", "err", err1, "currentBlockNumber", currentBlockNumber) - return nil, pkgerrors.New("Unable to read latestBlockNumber currentBlock saved") - } - // We will not have the previous currentBlock on initial poll. - havePreviousBlock := err1 == nil - if !havePreviousBlock { - lp.lggr.Infow("Do not have previous block, first poll ever on new chain", "currentBlockNumber", currentBlockNumber) - return currentBlock, nil - } - // Check for reorg. - if currentBlock.ParentHash != expectedParent.BlockHash { - // There can be another reorg while we're finding the LCA. - // That is ok, since we'll detect it on the next iteration. - // Since we go currentBlock by currentBlock for unfinalized logs, the mismatch starts at currentBlockNumber - 1. - blockAfterLCA, err2 := lp.findBlockAfterLCA(ctx, currentBlock, expectedParent.FinalizedBlockNumber) - if err2 != nil { - return nil, fmt.Errorf("unable to find LCA after reorg: %w", err2) - } - - lp.lggr.Infow("Reorg detected", "blockAfterLCA", blockAfterLCA.Number, "currentBlockNumber", currentBlockNumber) - // We truncate all the blocks and logs after the LCA. - // We could preserve the logs for forensics, since its possible - // that applications see them and take action upon it, however that - // results in significantly slower reads since we must then compute - // the canonical set per read. Typically, if an application took action on a log - // it would be saved elsewhere e.g. evm.txes, so it seems better to just support the fast reads. - // Its also nicely analogous to reading from the chain itself. - err2 = lp.orm.DeleteLogsAndBlocksAfter(ctx, blockAfterLCA.Number) - if err2 != nil { - // If we error on db commit, we can't know if the tx went through or not. - // We return an error here which will cause us to restart polling from lastBlockSaved + 1 - return nil, err2 - } - return blockAfterLCA, nil - } - // No reorg, return current block. - return currentBlock, nil -} - -// PollAndSaveLogs On startup/crash current is the first block after the last processed block. -// currentBlockNumber is the block from where new logs are to be polled & saved. Under normal -// conditions this would be equal to lastProcessed.BlockNumber + 1. -func (lp *logPoller) PollAndSaveLogs(ctx context.Context, currentBlockNumber int64) { - err := lp.pollAndSaveLogs(ctx, currentBlockNumber) - if errors.Is(err, commontypes.ErrFinalityViolated) { - lp.lggr.Criticalw("Failed to poll and save logs due to finality violation, retrying later", "err", err) - lp.finalityViolated.Store(true) - lp.SvcErrBuffer.Append(err) - return - } - - if err != nil { - lp.lggr.Errorw("Failed to poll and save logs, retrying later", "err", err) - return - } - - if lp.finalityViolated.Load() { - lp.lggr.Info("PollAndSaveLogs completed successfully - removing finality violation flag") - lp.finalityViolated.Store(false) - } -} - -func (lp *logPoller) pollAndSaveLogs(ctx context.Context, currentBlockNumber int64) (err error) { - lp.lggr.Debugw("Polling for logs", "currentBlockNumber", currentBlockNumber) - // Intentionally not using logPoller.finalityDepth directly but the latestFinalizedBlockNumber returned from lp.latestBlocks() - // latestBlocks knows how to pick a proper latestFinalizedBlockNumber based on the logPoller's configuration - latestBlock, latestFinalizedBlockNumber, err := lp.latestBlocks(ctx) - if err != nil { - lp.lggr.Warnw("Unable to get latestBlockNumber block", "err", err, "currentBlockNumber", currentBlockNumber) - return nil - } - latestBlockNumber := latestBlock.Number - if currentBlockNumber > latestBlockNumber { - // Note there can also be a reorg "shortening" i.e. chain height decreases but TDD increases. In that case - // we also just wait until the new tip is longer and then detect the reorg. - lp.lggr.Debugw("No new blocks since last poll", "currentBlockNumber", currentBlockNumber, "latestBlockNumber", latestBlockNumber) - return nil - } - var currentBlock *evmtypes.Head - if currentBlockNumber == latestBlockNumber { - // Can re-use our currentBlock and avoid an extra RPC call. - currentBlock = latestBlock - } - // Possibly handle a reorg. For example if we crash, we'll be in the middle of processing unfinalized blocks. - // Returns (currentBlock || LCA+1 if reorg detected, error) - currentBlock, err = lp.getCurrentBlockMaybeHandleReorg(ctx, currentBlockNumber, currentBlock) - if err != nil { - // If there's an error handling the reorg, we can't be sure what state the db was left in. - // Resume from the latest block saved and retry. - return fmt.Errorf("unable to get current block: %w", err) - } - currentBlockNumber = currentBlock.Number - - // backfill finalized blocks if we can for performance. If we crash during backfill, we - // may reprocess logs. Log insertion is idempotent so this is ok. - // E.g. 1<-2<-3(currentBlockNumber)<-4<-5<-6<-7(latestBlockNumber), finality is 2. So 3,4 can be batched. - // Although 5 is finalized, we still need to save it to the db for reorg detection if 6 is a reorg. - // start = currentBlockNumber = 3, end = latestBlockNumber - finality - 1 = 7-2-1 = 4 (inclusive range). - lastSafeBackfillBlock := latestFinalizedBlockNumber - 1 - if lastSafeBackfillBlock >= currentBlockNumber { - lp.lggr.Infow("Backfilling logs", "start", currentBlockNumber, "end", lastSafeBackfillBlock) - if err = lp.backfill(ctx, currentBlockNumber, lastSafeBackfillBlock); err != nil { - // If there's an error backfilling, we can just return and retry from the last block saved - // since we don't save any blocks on backfilling. We may re-insert the same logs but thats ok. - return fmt.Errorf("failed to backfill finalized logs: %w", err) - } - currentBlockNumber = lastSafeBackfillBlock + 1 - } - - for { - if currentBlockNumber > currentBlock.Number { - currentBlock, err = lp.getCurrentBlockMaybeHandleReorg(ctx, currentBlockNumber, nil) - if err != nil { - // If there's an error handling the reorg, we can't be sure what state the db was left in. - // Resume from the latest block saved. - return fmt.Errorf("failed to get current block: %w", err) - } - currentBlockNumber = currentBlock.Number - } - - h := currentBlock.Hash - var logs []types.Log - logs, err = lp.ec.FilterLogs(ctx, lp.Filter(nil, nil, &h)) - if err != nil { - lp.lggr.Warnw("Unable to query for logs, retrying", "err", err, "block", currentBlockNumber) - return nil - } - lp.lggr.Debugw("Unfinalized log query", "logs", len(logs), "currentBlockNumber", currentBlockNumber, "blockHash", currentBlock.Hash, "timestamp", currentBlock.Timestamp) - block := LogPollerBlock{ - BlockHash: h, - BlockNumber: currentBlockNumber, - BlockTimestamp: currentBlock.Timestamp, - FinalizedBlockNumber: latestFinalizedBlockNumber, - } - err = lp.orm.InsertLogsWithBlock( - ctx, - convertLogs(logs, []LogPollerBlock{block}, lp.lggr, lp.ec.ConfiguredChainID()), - block, - ) - if err != nil { - lp.lggr.Warnw("Unable to save logs resuming from last saved block + 1", "err", err, "block", currentBlockNumber) - return nil - } - // Update current block. - // Same reorg detection on unfinalized blocks. - currentBlockNumber++ - if currentBlockNumber > latestBlockNumber { - break - } - } - - return nil -} - -// Returns information about latestBlock, latestFinalizedBlockNumber provided by HeadTracker -func (lp *logPoller) latestBlocks(ctx context.Context) (*evmtypes.Head, int64, error) { - latest, finalized, err := lp.headTracker.LatestAndFinalizedBlock(ctx) - if err != nil { - return nil, 0, fmt.Errorf("failed to get latest and latest finalized block from HeadTracker: %w", err) - } - - finalizedBN := finalized.BlockNumber() - // This is a dirty trick that allows LogPoller to function properly in tests where chain needs significant time to - // reach finality depth. An alternative to this one-liner is a database migration that drops restriction - // LogPollerBlock.FinalizedBlockNumber > 0 (which we actually want to keep to spot cases when FinalizedBlockNumber was simply not populated) - // and refactoring of queries that assume that restriction still holds. - if finalizedBN == 0 { - finalizedBN = 1 - } - lp.lggr.Debugw("Latest blocks read from chain", "latest", latest.Number, "finalized", finalizedBN) - return latest, finalizedBN, nil -} - -// Find the first place where our chain and their chain have the same block, -// that block number is the LCA. Return the block after that, where we want to resume polling. -func (lp *logPoller) findBlockAfterLCA(ctx context.Context, current *evmtypes.Head, latestFinalizedBlockNumber int64) (*evmtypes.Head, error) { - // Current is where the mismatch starts. - // Check its parent to see if its the same as ours saved. - parent, err := lp.ec.HeadByHash(ctx, current.ParentHash) - if err != nil { - return nil, err - } - blockAfterLCA := current - // We expect reorgs up to the block after latestFinalizedBlock - // We loop via parent instead of current so current always holds the LCA+1. - // If the parent block number becomes < the first finalized block our reorg is too deep. - // This can happen only if finalityTag is not enabled and fixed finalityDepth is provided via config. - var ourParentBlockHash common.Hash - for parent.Number >= latestFinalizedBlockNumber { - outParentBlock, err := lp.orm.SelectBlockByNumber(ctx, parent.Number) - if err != nil { - return nil, err - } - ourParentBlockHash = outParentBlock.BlockHash - if parent.Hash == ourParentBlockHash { - // If we do have the blockhash, return blockAfterLCA - return blockAfterLCA, nil - } - // Otherwise get a new parent and update blockAfterLCA. - blockAfterLCA = parent - parent, err = lp.ec.HeadByHash(ctx, parent.ParentHash) - if err != nil { - return nil, err - } - } - - lp.lggr.Criticalw("Reorg greater than finality depth detected", "finalityTag", lp.useFinalityTag, "current", current.Number, "latestFinalized", latestFinalizedBlockNumber) - return nil, fmt.Errorf("%w: finalized block hash %s does not match RPC's %s at height %d", commontypes.ErrFinalityViolated, ourParentBlockHash, blockAfterLCA.Hash, blockAfterLCA.Number) -} - -// PruneOldBlocks removes blocks that are > lp.keepFinalizedBlocksDepth behind the latest finalized block. -// Returns whether all blocks eligible for pruning were removed. If logPrunePageSize is set to 0, then it -// will always return true unless there is an actual error. -func (lp *logPoller) PruneOldBlocks(ctx context.Context) (bool, error) { - latestBlock, err := lp.orm.SelectLatestBlock(ctx) - if err != nil { - return false, err - } - if latestBlock == nil { - // No blocks saved yet. - return true, nil - } - if latestBlock.FinalizedBlockNumber <= lp.keepFinalizedBlocksDepth { - // No-op, keep all blocks - return true, nil - } - // 1-2-3-4-5(finalized)-6-7(latest), keepFinalizedBlocksDepth=3 - // Remove <= 2 - rowsRemoved, err := lp.orm.DeleteBlocksBefore( - ctx, - latestBlock.FinalizedBlockNumber-lp.keepFinalizedBlocksDepth, - lp.logPrunePageSize, - ) - return lp.logPrunePageSize == 0 || rowsRemoved < lp.logPrunePageSize, err -} - -// PruneExpiredLogs will attempt to remove any logs which have passed their retention period. Returns whether all expired -// logs were removed. If logPrunePageSize is set to 0, it will always return true unless an actual error is encountered -func (lp *logPoller) PruneExpiredLogs(ctx context.Context) (bool, error) { - done := true - - rowsRemoved, err := lp.orm.DeleteExpiredLogs(ctx, lp.logPrunePageSize) - if err != nil { - lp.lggr.Errorw("Unable to find excess logs for pruning", "err", err) - return false, err - } else if lp.logPrunePageSize != 0 && rowsRemoved == lp.logPrunePageSize { - done = false - } - - if !lp.countBasedLogPruningActive.Load() { - return done, err - } - - rowIDs, err := lp.orm.SelectExcessLogIDs(ctx, lp.logPrunePageSize) - if err != nil { - lp.lggr.Errorw("Unable to find excess logs for pruning", "err", err) - return false, err - } - rowsRemoved, err = lp.orm.DeleteLogsByRowID(ctx, rowIDs) - if err != nil { - lp.lggr.Errorw("Unable to prune excess logs", "err", err) - } else if lp.logPrunePageSize != 0 && rowsRemoved == lp.logPrunePageSize { - done = false - } - return done, err -} - -// PruneUnmatchedLogs will attempt to remove any logs which no longer match a registered filter. Returns whether all unmatched -// logs were removed. If logPrunePageSize is set to 0, it will always return true unless an actual error is encountered -func (lp *logPoller) PruneUnmatchedLogs(ctx context.Context) (bool, error) { - ids, err := lp.orm.SelectUnmatchedLogIDs(ctx, lp.logPrunePageSize) - if err != nil { - return false, err - } - rowsRemoved, err := lp.orm.DeleteLogsByRowID(ctx, ids) - - return lp.logPrunePageSize == 0 || rowsRemoved < lp.logPrunePageSize, err -} - -// Logs returns logs matching topics and address (exactly) in the given block range, -// which are canonical at time of query. -func (lp *logPoller) Logs(ctx context.Context, start, end int64, eventSig common.Hash, address common.Address) ([]Log, error) { - return lp.orm.SelectLogs(ctx, start, end, address, eventSig) -} - -func (lp *logPoller) LogsWithSigs(ctx context.Context, start, end int64, eventSigs []common.Hash, address common.Address) ([]Log, error) { - return lp.orm.SelectLogsWithSigs(ctx, start, end, address, eventSigs) -} - -func (lp *logPoller) LogsCreatedAfter(ctx context.Context, eventSig common.Hash, address common.Address, after time.Time, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectLogsCreatedAfter(ctx, address, eventSig, after, confs) -} - -// IndexedLogs finds all the logs that have a topic value in topicValues at index topicIndex. -func (lp *logPoller) IndexedLogs(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectIndexedLogs(ctx, address, eventSig, topicIndex, topicValues, confs) -} - -// IndexedLogsByBlockRange finds all the logs that have a topic value in topicValues at index topicIndex within the block range -func (lp *logPoller) IndexedLogsByBlockRange(ctx context.Context, start, end int64, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash) ([]Log, error) { - return lp.orm.SelectIndexedLogsByBlockRange(ctx, start, end, address, eventSig, topicIndex, topicValues) -} - -func (lp *logPoller) IndexedLogsCreatedAfter(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectIndexedLogsCreatedAfter(ctx, address, eventSig, topicIndex, topicValues, after, confs) -} - -func (lp *logPoller) IndexedLogsByTxHash(ctx context.Context, eventSig common.Hash, address common.Address, txHash common.Hash) ([]Log, error) { - return lp.orm.SelectIndexedLogsByTxHash(ctx, address, eventSig, txHash) -} - -// LogsDataWordGreaterThan note index is 0 based. -func (lp *logPoller) LogsDataWordGreaterThan(ctx context.Context, eventSig common.Hash, address common.Address, wordIndex int, wordValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectLogsDataWordGreaterThan(ctx, address, eventSig, wordIndex, wordValueMin, confs) -} - -// LogsDataWordRange note index is 0 based. -func (lp *logPoller) LogsDataWordRange(ctx context.Context, eventSig common.Hash, address common.Address, wordIndex int, wordValueMin, wordValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectLogsDataWordRange(ctx, address, eventSig, wordIndex, wordValueMin, wordValueMax, confs) -} - -// IndexedLogsTopicGreaterThan finds all the logs that have a topic value greater than topicValueMin at index topicIndex. -// Only works for integer topics. -func (lp *logPoller) IndexedLogsTopicGreaterThan(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectIndexedLogsTopicGreaterThan(ctx, address, eventSig, topicIndex, topicValueMin, confs) -} - -func (lp *logPoller) IndexedLogsTopicRange(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValueMin common.Hash, topicValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectIndexedLogsTopicRange(ctx, address, eventSig, topicIndex, topicValueMin, topicValueMax, confs) -} - -// LatestBlock returns the latest block the log poller is on. It tracks blocks to be able -// to detect reorgs. -func (lp *logPoller) LatestBlock(ctx context.Context) (LogPollerBlock, error) { - b, err := lp.orm.SelectLatestBlock(ctx) - if err != nil { - return LogPollerBlock{}, err - } - - return *b, nil -} - -func (lp *logPoller) BlockByNumber(ctx context.Context, n int64) (*LogPollerBlock, error) { - return lp.orm.SelectBlockByNumber(ctx, n) -} - -// LatestLogByEventSigWithConfs finds the latest log that has confs number of blocks on top of the log. -func (lp *logPoller) LatestLogByEventSigWithConfs(ctx context.Context, eventSig common.Hash, address common.Address, confs evmtypes.Confirmations) (*Log, error) { - return lp.orm.SelectLatestLogByEventSigWithConfs(ctx, eventSig, address, confs) -} - -func (lp *logPoller) LatestLogEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectLatestLogEventSigsAddrsWithConfs(ctx, fromBlock, addresses, eventSigs, confs) -} - -func (lp *logPoller) LatestBlockByEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) (int64, error) { - return lp.orm.SelectLatestBlockByEventSigsAddrsWithConfs(ctx, fromBlock, eventSigs, addresses, confs) -} - -// LogsDataWordBetween retrieves a slice of Log records that match specific criteria. -// Besides generic filters like eventSig, address and confs, it also verifies data content against wordValue -// data[wordIndexMin] <= wordValue <= data[wordIndexMax]. -// -// Passing the same value for wordIndexMin and wordIndexMax will check the equality of the wordValue at that index. -// Leading to returning logs matching: data[wordIndexMin] == wordValue. -// -// This function is particularly useful for filtering logs by data word values and their positions within the event data. -// It returns an empty slice if no logs match the provided criteria. -func (lp *logPoller) LogsDataWordBetween(ctx context.Context, eventSig common.Hash, address common.Address, wordIndexMin, wordIndexMax int, wordValue common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectLogsDataWordBetween(ctx, address, eventSig, wordIndexMin, wordIndexMax, wordValue, confs) -} - -// GetBlocksRange tries to get the specified block numbers from the log pollers -// blocks table. It falls back to the RPC for any unfulfilled requested blocks. -func (lp *logPoller) GetBlocksRange(ctx context.Context, numbers []uint64) ([]LogPollerBlock, error) { - var blocks []LogPollerBlock - - // Do nothing if no blocks are requested. - if len(numbers) == 0 { - return blocks, nil - } - - // Assign the requested blocks to a mapping. - blocksRequested := make(map[uint64]struct{}) - for _, b := range numbers { - blocksRequested[b] = struct{}{} - } - - // Retrieve all blocks within this range from the log poller. - blocksFound := make(map[uint64]LogPollerBlock) - minRequestedBlock := int64(mathutil.Min(numbers[0], numbers[1:]...)) - maxRequestedBlock := int64(mathutil.Max(numbers[0], numbers[1:]...)) - lpBlocks, err := lp.orm.GetBlocksRange(ctx, minRequestedBlock, maxRequestedBlock) - if err != nil { - lp.lggr.Warnw("Error while retrieving blocks from log pollers blocks table. Falling back to RPC...", "requestedBlocks", numbers, "err", err) - } else { - for _, b := range lpBlocks { - if _, ok := blocksRequested[uint64(b.BlockNumber)]; ok { - // Only fill requested blocks. - blocksFound[uint64(b.BlockNumber)] = b - } - } - lp.lggr.Debugw("Got blocks from log poller", "blockNumbers", maps.Keys(blocksFound)) - } - - // Fill any remaining blocks from the client. - blocksFoundFromRPC, err := lp.fillRemainingBlocksFromRPC(ctx, blocksRequested, blocksFound) - if err != nil { - return nil, err - } - for num, b := range blocksFoundFromRPC { - blocksFound[num] = b - } - - var blocksNotFound []uint64 - for _, num := range numbers { - b, ok := blocksFound[num] - if !ok { - blocksNotFound = append(blocksNotFound, num) - } - blocks = append(blocks, b) - } - - if len(blocksNotFound) > 0 { - return nil, pkgerrors.Errorf("blocks were not found in db or RPC call: %v", blocksNotFound) - } - - return blocks, nil -} - -// fillRemainingBlocksFromRPC sends a batch request for each block in blocksRequested, and converts them from -// geth blocks into LogPollerBlock structs. This is only intended to be used for requesting finalized blocks, -// if any of the blocks coming back are not finalized, an error will be returned -func (lp *logPoller) fillRemainingBlocksFromRPC( - ctx context.Context, - blocksRequested map[uint64]struct{}, - blocksFound map[uint64]LogPollerBlock, -) (map[uint64]LogPollerBlock, error) { - remainingBlocks := make([]uint64, 0, len(blocksRequested)) - for num := range blocksRequested { - if _, ok := blocksFound[num]; !ok { - remainingBlocks = append(remainingBlocks, num) - } - } - - if len(remainingBlocks) > 0 { - lp.lggr.Debugw("Falling back to RPC for blocks not found in log poller blocks table", - "remainingBlocks", remainingBlocks) - } - - return lp.batchFetchBlocks(ctx, remainingBlocks, lp.rpcBatchSize) -} - -// newBlockReq constructs an eth_getBlockByNumber request for particular block number -func newBlockReq(num string) rpc.BatchElem { - return rpc.BatchElem{ - Method: "eth_getBlockByNumber", - Args: []interface{}{num, false}, - Result: &evmtypes.Head{}, - } -} - -type blockValidationType string - -var ( - latestBlock blockValidationType = blockValidationType(rpc.LatestBlockNumber.String()) - finalizedBlock blockValidationType = blockValidationType(rpc.FinalizedBlockNumber.String()) -) - -// fetchBlocks fetches a list of blocks in a single batch. finalityValidationReq is the string to use for the -// additional validation request (either the "finalized" or "latest" string defined in rpc module), which -// will be used to validate the finality of the other blocks. -// chainReference - is used to verify that fetched blocks belong to the same chain as referenced head. -func (lp *logPoller) fetchBlocks(ctx context.Context, blocksRequested []uint64, finalityValidationReq blockValidationType, chainReference *LogPollerBlock) (blocks map[uint64]*evmtypes.Head, err error) { - n := len(blocksRequested) - blocks = make(map[uint64]*evmtypes.Head, n+2) - reqs := make([]rpc.BatchElem, 0, n+2) - - for _, num := range blocksRequested { - reqs = append(reqs, newBlockReq(hexutil.EncodeBig(big.NewInt(0).SetUint64(num)))) - } - - reqs = append(reqs, newBlockReq(string(finalityValidationReq))) - - if chainReference != nil { - reqs = append(reqs, newBlockReq(hexutil.EncodeBig(big.NewInt(chainReference.BlockNumber)))) - } - - err = lp.ec.BatchCallContext(ctx, reqs) - if err != nil { - return nil, err - } - - // ensure that requested blocks belong to the same chain as referenced head - if chainReference != nil { - var rpcChainReference *evmtypes.Head - rpcChainReference, err = validateBlockResponse(reqs[len(reqs)-1]) - if err != nil { - return nil, err - } - - if rpcChainReference.Hash != chainReference.BlockHash { - return nil, fmt.Errorf("expected RPC's finalized block hash at hegiht %d to be %s but got %s: %w", - chainReference.BlockNumber, chainReference.BlockHash, rpcChainReference.Hash, commontypes.ErrFinalityViolated) - } - - reqs = reqs[:len(reqs)-1] // no need to include chain reference into results - } - - latestFinalized, err := validateBlockResponse(reqs[len(reqs)-1]) - if err != nil { - return nil, err - } - latestFinalizedBlockNumber := latestFinalized.Number - if finalityValidationReq == latestBlock { - // subtract finalityDepth from "latest" to get finalized, when useFinalityTags = false - latestFinalizedBlockNumber = mathutil.Max(latestFinalizedBlockNumber-lp.finalityDepth, 0) - } - - reqs = reqs[:len(reqs)-1] // no need to include finality validation request into results - - for i, r := range reqs { - block, err := validateBlockResponse(r) - if err != nil { - return nil, err - } - - blockRequested := r.Args[0].(string) - if blockRequested != string(latestBlock) && block.Number > latestFinalizedBlockNumber { - return nil, fmt.Errorf( - "received unfinalized block %d while expecting finalized block (latestFinalizedBlockNumber = %d)", - block.Number, latestFinalizedBlockNumber) - } - - blocks[blocksRequested[i]] = block - } - return blocks, nil -} - -func (lp *logPoller) batchFetchBlocks(ctx context.Context, blocksRequested []uint64, batchSize int64) (map[uint64]LogPollerBlock, error) { - validationReq := finalizedBlock - if !lp.useFinalityTag { - validationReq = latestBlock - } - - chainValidationHead, err := lp.orm.SelectLatestFinalizedBlock(ctx) - if err != nil && !errors.Is(err, sql.ErrNoRows) { - return nil, fmt.Errorf("failed to fetch latest finalized block from db: %w", err) - } - - var logPollerBlocks = make(map[uint64]LogPollerBlock, len(blocksRequested)) - for i := 0; i < len(blocksRequested); i += int(batchSize) { - j := i + int(batchSize) - if j > len(blocksRequested) { - j = len(blocksRequested) - } - - // As batch requests are not atomic, there is a chance that some of the blocks were replaced due to a reorg once we've observed them. - // Example: - // 1. RPC's chain is 1,2',3',4',5' (latest finalized is 1). - // 2. Batch request reads blocks 1,2'. - // 3. RPC updates its state to 1,2,3,4,5 (latest finalized is 5). - // 4. Batch request reads 4,5. - // As a result, we'll treat block 2' as finalized. To address that, we have to fetch all blocks twice and verify that the results are identical. - fetched1, err := lp.fetchBlocks(ctx, blocksRequested[i:j], validationReq, chainValidationHead) - if err != nil { - return nil, err - } - - fetched2, err := lp.fetchBlocks(ctx, blocksRequested[i:j], validationReq, chainValidationHead) - if err != nil { - return nil, err - } - - err = ensureIdenticalBlocksBatches(fetched1, fetched2) - if err != nil { - return nil, err - } - - for _, head := range fetched1 { - lpBlock := LogPollerBlock{ - EvmChainId: head.EVMChainID, - BlockHash: head.Hash, - BlockNumber: head.Number, - BlockTimestamp: head.Timestamp, - FinalizedBlockNumber: head.Number, // always finalized; only matters if this block is returned by LatestBlock() - CreatedAt: head.CreatedAt, - } - logPollerBlocks[uint64(head.Number)] = lpBlock //nolint:gosec // G115 - if chainValidationHead == nil || chainValidationHead.BlockNumber < lpBlock.BlockNumber { - chainValidationHead = &lpBlock - } - } - } - - return logPollerBlocks, nil -} - -func ensureIdenticalBlocksBatches(fetched1, fetched2 map[uint64]*evmtypes.Head) error { - if len(fetched1) != len(fetched2) { - return fmt.Errorf("invariant violation: expected size of batches to be identical. Fetched1: %d, Fetched2: %d", len(fetched1), len(fetched2)) - } - - for num, head1 := range fetched1 { - head2, ok := fetched2[num] - if !ok { - return fmt.Errorf("invariant violation: expected fetched1 to contain same blocks as fetched2, but %d is missing from fetched2", num) - } - - if head1.Hash != head2.Hash { - return fmt.Errorf("expected block %d to be finalized but got different hashes %s and %s from RPC: %w", num, head1.Hash, head2.Hash, commontypes.ErrFinalityViolated) - } - } - - return nil -} - -func validateBlockResponse(r rpc.BatchElem) (*evmtypes.Head, error) { - block, is := r.Result.(*evmtypes.Head) - - if !is { - return nil, pkgerrors.Errorf("expected result to be a %T, got %T", &evmtypes.Head{}, r.Result) - } - if block == nil { - return nil, pkgerrors.New("invariant violation: got nil block") - } - if block.Hash == (common.Hash{}) { - return nil, pkgerrors.Errorf("missing block hash for block number: %d", block.Number) - } - if block.Number < 0 { - return nil, pkgerrors.Errorf("expected block number to be >= to 0, got %d", block.Number) - } - return block, nil -} - -// IndexedLogsWithSigsExcluding returns the set difference(A-B) of logs with signature sigA and sigB, matching is done on the topics index -// -// For example, query to retrieve unfulfilled requests by querying request log events without matching fulfillment log events. -// The order of events is not significant. Both logs must be inside the block range and have the minimum number of confirmations -func (lp *logPoller) IndexedLogsWithSigsExcluding(ctx context.Context, address common.Address, eventSigA, eventSigB common.Hash, topicIndex int, fromBlock, toBlock int64, confs evmtypes.Confirmations) ([]Log, error) { - return lp.orm.SelectIndexedLogsWithSigsExcluding(ctx, eventSigA, eventSigB, topicIndex, address, fromBlock, toBlock, confs) -} - -// DeleteLogsAndBlocksAfter - removes blocks and logs starting from the specified block -func (lp *logPoller) DeleteLogsAndBlocksAfter(ctx context.Context, start int64) error { - return lp.orm.DeleteLogsAndBlocksAfter(ctx, start) -} - -func (lp *logPoller) FindLCA(ctx context.Context) (*LogPollerBlock, error) { - latest, err := lp.orm.SelectLatestBlock(ctx) - if err != nil { - return nil, fmt.Errorf("failed to select the latest block: %w", err) - } - - oldest, err := lp.orm.SelectOldestBlock(ctx, 0) - if err != nil { - return nil, fmt.Errorf("failed to select the oldest block: %w", err) - } - - if latest == nil || oldest == nil { - return nil, fmt.Errorf("expected at least one block to be present in DB") - } - - lp.lggr.Debugf("Received request to find LCA. Searching in range [%d, %d]", oldest.BlockNumber, latest.BlockNumber) - - // Find the largest block number for which block hash stored in the DB matches one that we get from the RPC. - // `sort.Find` expects slice of following format s = [1, 0, -1] and returns smallest index i for which s[i] = 0. - // To utilise `sort.Find` we represent range of blocks as slice [latestBlock, latestBlock-1, ..., olderBlock+1, oldestBlock] - // and return 1 if DB block was reorged or 0 if it's still present on chain. - lcaI, found := sort.Find(int(latest.BlockNumber-oldest.BlockNumber)+1, func(i int) int { - const notFound = 1 - const found = 0 - // if there is an error - stop the search - if err != nil { - return notFound - } - - // canceled search - if ctx.Err() != nil { - err = fmt.Errorf("aborted, FindLCA request cancelled: %w", ctx.Err()) - return notFound - } - iBlockNumber := latest.BlockNumber - int64(i) - var dbBlock *LogPollerBlock - // Block with specified block number might not exist in the database, to address that we check closest child - // of the iBlockNumber. If the child is present on chain, it's safe to assume that iBlockNumber is present too - dbBlock, err = lp.orm.SelectOldestBlock(ctx, iBlockNumber) - if err != nil { - err = fmt.Errorf("failed to select block %d by number: %w", iBlockNumber, err) - return notFound - } - - if dbBlock == nil { - err = fmt.Errorf("expected block to exist with blockNumber >= %d as observed block with number %d", iBlockNumber, latest.BlockNumber) - return notFound - } - - lp.lggr.Debugf("Looking for matching block on chain blockNumber: %d blockHash: %s", - dbBlock.BlockNumber, dbBlock.BlockHash) - var chainBlock *evmtypes.Head - chainBlock, err = lp.ec.HeadByHash(ctx, dbBlock.BlockHash) - // our block in DB does not exist on chain - if (chainBlock == nil && err == nil) || errors.Is(err, ethereum.NotFound) { - err = nil - return notFound - } - if err != nil { - err = fmt.Errorf("failed to get block %s from RPC: %w", dbBlock.BlockHash, err) - return notFound - } - - if chainBlock.BlockNumber() != dbBlock.BlockNumber { - err = fmt.Errorf("expected block numbers to match (db: %d, chain: %d), if block hashes match "+ - "(db: %s, chain: %s)", dbBlock.BlockNumber, chainBlock.BlockNumber(), dbBlock.BlockHash, chainBlock.Hash) - return notFound - } - - return found - }) - if err != nil { - return nil, fmt.Errorf("failed to find: %w", err) - } - - if !found { - return nil, fmt.Errorf("failed to find LCA, this means that whole database LogPoller state was reorged out of chain or RPC/Core node is misconfigured") - } - - lcaBlockNumber := latest.BlockNumber - int64(lcaI) - lca, err := lp.orm.SelectBlockByNumber(ctx, lcaBlockNumber) - if err != nil { - return nil, fmt.Errorf("failed to select lca from db: %w", err) - } - - if lca == nil { - return nil, fmt.Errorf("expected lca (blockNum: %d) to exist in DB", lcaBlockNumber) - } - - return lca, nil -} - -func EvmWord(i uint64) common.Hash { - var b = make([]byte, 8) - binary.BigEndian.PutUint64(b, i) - return common.BytesToHash(b) -} - -func (lp *logPoller) FilteredLogs(ctx context.Context, queryFilter []query.Expression, limitAndSort query.LimitAndSort, queryName string) ([]Log, error) { - return lp.orm.FilteredLogs(ctx, queryFilter, limitAndSort, queryName) -} - -// Where is a query.Where wrapper that ignores the Key and returns a slice of query.Expression rather than query.KeyFilter. -// If no expressions are provided, or an error occurs, an empty slice is returned. -func Where(expressions ...query.Expression) ([]query.Expression, error) { - filter, err := query.Where( - "", - expressions..., - ) - - if err != nil { - return []query.Expression{}, err - } - - if filter.Expressions == nil { - return []query.Expression{}, nil - } - - return filter.Expressions, nil -} diff --git a/core/chains/evm/logpoller/log_poller_internal_test.go b/core/chains/evm/logpoller/log_poller_internal_test.go deleted file mode 100644 index 6fbea360b05..00000000000 --- a/core/chains/evm/logpoller/log_poller_internal_test.go +++ /dev/null @@ -1,804 +0,0 @@ -package logpoller - -import ( - "context" - "errors" - "fmt" - "math/big" - "strings" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/rpc" - pkgerrors "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "go.uber.org/zap/zapcore" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/services" - "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" - commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" - - "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/log_emitter" -) - -var ( - EmitterABI, _ = abi.JSON(strings.NewReader(log_emitter.LogEmitterABI)) -) - -// Validate that filters stored in log_filters_table match the filters stored in memory -func validateFiltersTable(t *testing.T, lp *logPoller, orm ORM) { - ctx := testutils.Context(t) - filters, err := orm.LoadFilters(ctx) - require.NoError(t, err) - require.Equal(t, len(filters), len(lp.filters)) - for name, dbFilter := range filters { - dbFilter := dbFilter - memFilter, ok := lp.filters[name] - require.True(t, ok) - assert.Truef(t, memFilter.Contains(&dbFilter), - "in-memory Filter %s is missing some addresses or events from db Filter table", name) - assert.Truef(t, dbFilter.Contains(&memFilter), "db Filter table %s is missing some addresses or events from in-memory Filter", name) - } -} - -func TestLogPoller_RegisterFilter(t *testing.T) { - t.Parallel() - a1 := common.HexToAddress("0x2ab9a2dc53736b361b72d900cdf9f78f9406fbbb") - a2 := common.HexToAddress("0x2ab9a2dc53736b361b72d900cdf9f78f9406fbbc") - - lggr, observedLogs := logger.TestObserved(t, zapcore.WarnLevel) - chainID := testutils.NewRandomEVMChainID() - db := testutils.NewSqlxDB(t) - ctx := testutils.Context(t) - - orm := NewORM(chainID, db, lggr) - - // Set up a test chain with a log emitting contract deployed. - lpOpts := Opts{ - PollPeriod: time.Hour, - BackfillBatchSize: 1, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - lp := NewLogPoller(orm, nil, lggr, nil, lpOpts) - - // We expect a zero Filter if nothing registered yet. - f := lp.Filter(nil, nil, nil) - require.Equal(t, 1, len(f.Addresses)) - assert.Equal(t, common.HexToAddress("0x0000000000000000000000000000000000000000"), f.Addresses[0]) - - err := lp.RegisterFilter(ctx, Filter{Name: "Emitter Log 1", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{a1}}) - require.NoError(t, err) - assert.Equal(t, []common.Address{a1}, lp.Filter(nil, nil, nil).Addresses) - assert.Equal(t, [][]common.Hash{{EmitterABI.Events["Log1"].ID}}, lp.Filter(nil, nil, nil).Topics) - validateFiltersTable(t, lp, orm) - - // Should de-dupe EventSigs - err = lp.RegisterFilter(ctx, Filter{Name: "Emitter Log 1 + 2", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{a2}}) - require.NoError(t, err) - assert.Equal(t, []common.Address{a1, a2}, lp.Filter(nil, nil, nil).Addresses) - assert.Equal(t, [][]common.Hash{{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}}, lp.Filter(nil, nil, nil).Topics) - validateFiltersTable(t, lp, orm) - - // Should de-dupe Addresses - err = lp.RegisterFilter(ctx, Filter{Name: "Emitter Log 1 + 2 dupe", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, Addresses: []common.Address{a2}}) - require.NoError(t, err) - assert.Equal(t, []common.Address{a1, a2}, lp.Filter(nil, nil, nil).Addresses) - assert.Equal(t, [][]common.Hash{{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}}, lp.Filter(nil, nil, nil).Topics) - validateFiltersTable(t, lp, orm) - - // Address required. - err = lp.RegisterFilter(ctx, Filter{Name: "no address", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}}) - require.Error(t, err) - // Event required - err = lp.RegisterFilter(ctx, Filter{Name: "No event", Addresses: []common.Address{a1}}) - require.Error(t, err) - validateFiltersTable(t, lp, orm) - - // Removing non-existence Filter should log error but return nil - err = lp.UnregisterFilter(ctx, "Filter doesn't exist") - require.NoError(t, err) - require.Equal(t, observedLogs.Len(), 1) - require.Contains(t, observedLogs.TakeAll()[0].Entry.Message, "not found") - - // Check that all filters are still there - _, ok := lp.filters["Emitter Log 1"] - require.True(t, ok, "'Emitter Log 1 Filter' missing") - _, ok = lp.filters["Emitter Log 1 + 2"] - require.True(t, ok, "'Emitter Log 1 + 2' Filter missing") - _, ok = lp.filters["Emitter Log 1 + 2 dupe"] - require.True(t, ok, "'Emitter Log 1 + 2 dupe' Filter missing") - - // Removing an existing Filter should remove it from both memory and db - err = lp.UnregisterFilter(ctx, "Emitter Log 1 + 2") - require.NoError(t, err) - _, ok = lp.filters["Emitter Log 1 + 2"] - require.False(t, ok, "'Emitter Log 1 Filter' should have been removed by UnregisterFilter()") - require.Len(t, lp.filters, 2) - validateFiltersTable(t, lp, orm) - - err = lp.UnregisterFilter(ctx, "Emitter Log 1 + 2 dupe") - require.NoError(t, err) - err = lp.UnregisterFilter(ctx, "Emitter Log 1") - require.NoError(t, err) - assert.Len(t, lp.filters, 0) - filters, err := lp.orm.LoadFilters(ctx) - require.NoError(t, err) - assert.Len(t, filters, 0) - - // Make sure cache was invalidated - assert.Len(t, lp.Filter(nil, nil, nil).Addresses, 1) - assert.Equal(t, lp.Filter(nil, nil, nil).Addresses[0], common.HexToAddress("0x0000000000000000000000000000000000000000")) - assert.Len(t, lp.Filter(nil, nil, nil).Topics, 1) - assert.Len(t, lp.Filter(nil, nil, nil).Topics[0], 0) -} - -func TestLogPoller_ConvertLogs(t *testing.T) { - t.Parallel() - lggr := logger.Test(t) - - topics := []common.Hash{EmitterABI.Events["Log1"].ID} - - var cases = []struct { - name string - logs []types.Log - blocks []LogPollerBlock - expected int - }{ - {"SingleBlock", - []types.Log{{Topics: topics}, {Topics: topics}}, - []LogPollerBlock{{BlockTimestamp: time.Now()}}, - 2}, - {"BlockList", - []types.Log{{Topics: topics}, {Topics: topics}, {Topics: topics}}, - []LogPollerBlock{{BlockTimestamp: time.Now()}}, - 3}, - {"EmptyList", - []types.Log{}, - []LogPollerBlock{}, - 0}, - {"TooManyBlocks", - []types.Log{{}}, - []LogPollerBlock{{}, {}}, - 0}, - {"TooFewBlocks", - []types.Log{{}, {}, {}}, - []LogPollerBlock{{}, {}}, - 0}, - } - - for _, c := range cases { - t.Run(c.name, func(t *testing.T) { - logs := convertLogs(c.logs, c.blocks, lggr, big.NewInt(53)) - require.Len(t, logs, c.expected) - for i := 0; i < c.expected; i++ { - if len(c.blocks) == 1 { - assert.Equal(t, c.blocks[0].BlockTimestamp, logs[i].BlockTimestamp) - } else { - assert.Equal(t, logs[i].BlockTimestamp, c.blocks[i].BlockTimestamp) - } - } - }) - } -} - -func TestFilterName(t *testing.T) { - t.Parallel() - assert.Equal(t, "a - b:c:d", FilterName("a", "b", "c", "d")) - assert.Equal(t, "empty args test", FilterName("empty args test")) -} - -func TestLogPoller_BackupPollerStartup(t *testing.T) { - addr := common.HexToAddress("0x2ab9a2dc53736b361b72d900cdf9f78f9406fbbc") - lggr, observedLogs := logger.TestObserved(t, zapcore.WarnLevel) - chainID := testutils.FixtureChainID - db := testutils.NewSqlxDB(t) - orm := NewORM(chainID, db, lggr) - latestBlock := int64(4) - const finalityDepth = 2 - - head := &evmtypes.Head{Number: latestBlock} - finalizedHead := &evmtypes.Head{Number: latestBlock - finalityDepth} - events := []common.Hash{EmitterABI.Events["Log1"].ID} - log1 := types.Log{ - Index: 0, - BlockHash: common.Hash{}, - BlockNumber: uint64(latestBlock), - Topics: events, - Address: addr, - TxHash: common.HexToHash("0x1234"), - Data: EvmWord(uint64(300)).Bytes(), - } - - ec := clienttest.NewClient(t) - ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) - ec.On("ConfiguredChainID").Return(chainID, nil) - - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(head, finalizedHead, nil) - - ctx := testutils.Context(t) - lpOpts := Opts{ - PollPeriod: time.Hour, - FinalityDepth: finalityDepth, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - BackupPollerBlockDelay: 0, - } - lp := NewLogPoller(orm, ec, lggr, headTracker, lpOpts) - require.NoError(t, lp.BackupPollAndSaveLogs(ctx)) - assert.Equal(t, int64(0), lp.backupPollerNextBlock) - assert.Equal(t, 1, observedLogs.FilterMessageSnippet("ran before first successful log poller run").Len()) - - lp.PollAndSaveLogs(ctx, latestBlock) - - lastProcessed, err := lp.orm.SelectLatestBlock(ctx) - require.NoError(t, err) - require.Equal(t, latestBlock, lastProcessed.BlockNumber) - - require.NoError(t, lp.BackupPollAndSaveLogs(ctx)) - assert.Equal(t, int64(2), lp.backupPollerNextBlock) -} - -func mockBatchCallContext(t *testing.T, ec *clienttest.Client) { - mockBatchCallContextWithHead(t, ec, newHeadVal) -} - -func newHeadVal(num int64) evmtypes.Head { - return evmtypes.Head{ - Number: num, - Hash: common.BigToHash(big.NewInt(num)), - ParentHash: common.BigToHash(big.NewInt(num - 1)), - } -} - -func newHead(num int64) *evmtypes.Head { - r := newHeadVal(num) - return &r -} - -func mockBatchCallContextWithHead(t *testing.T, ec *clienttest.Client, newHead func(num int64) evmtypes.Head) { - ec.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { - elems := args.Get(1).([]rpc.BatchElem) - for _, e := range elems { - var num int64 - block := e.Args[0].(string) - switch block { - case "latest": - num = 8 - case "finalized": - num = 5 - default: - n, err := hexutil.DecodeUint64(block) - require.NoError(t, err) - num = int64(n) - } - result := e.Result.(*evmtypes.Head) - *result = newHead(num) - } - }) -} - -func TestLogPoller_Replay(t *testing.T) { - t.Parallel() - addr := common.HexToAddress("0x2ab9a2dc53736b361b72d900cdf9f78f9406fbbc") - - lggr, observedLogs := logger.TestObserved(t, zapcore.ErrorLevel) - chainID := testutils.FixtureChainID - db := testutils.NewSqlxDB(t) - orm := NewORM(chainID, db, lggr) - - var head atomic.Pointer[evmtypes.Head] - head.Store(newHead(4)) - - events := []common.Hash{EmitterABI.Events["Log1"].ID} - log1 := types.Log{ - Index: 0, - BlockHash: common.BigToHash(big.NewInt(head.Load().Number)), - BlockNumber: uint64(head.Load().Number), - Topics: events, - Address: addr, - TxHash: common.HexToHash("0x1234"), - Data: EvmWord(uint64(300)).Bytes(), - } - - ec := clienttest.NewClient(t) - ec.EXPECT().HeadByHash(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, hash common.Hash) (*evmtypes.Head, error) { - return &evmtypes.Head{Number: hash.Big().Int64(), Hash: hash}, nil - }).Maybe() - ec.On("HeadByNumber", mock.Anything, mock.Anything).Return(func(context.Context, *big.Int) (*evmtypes.Head, error) { - return head.Load(), nil - }) - ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Once() - ec.On("ConfiguredChainID").Return(chainID, nil) - - lpOpts := Opts{ - PollPeriod: time.Second, - FinalityDepth: 3, - BackfillBatchSize: 3, - RpcBatchSize: 3, - KeepFinalizedBlocksDepth: 20, - BackupPollerBlockDelay: 0, - } - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - - headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(func(ctx context.Context) (*evmtypes.Head, *evmtypes.Head, error) { - h := head.Load() - finalized := newHead(h.Number - lpOpts.FinalityDepth) - return h, finalized, nil - }) - lp := NewLogPoller(orm, ec, lggr, headTracker, lpOpts) - - { - ctx := testutils.Context(t) - // process 1 log in block 3 - lp.PollAndSaveLogs(ctx, 4) - latest, err := lp.LatestBlock(ctx) - require.NoError(t, err) - require.Equal(t, int64(4), latest.BlockNumber) - require.Equal(t, int64(1), latest.FinalizedBlockNumber) - } - - t.Run("abort before replayStart received", func(t *testing.T) { - // Replay() should abort immediately if caller's context is cancelled before request signal is read - cancelCtx, cancel := context.WithCancel(testutils.Context(t)) - cancel() - err := lp.Replay(cancelCtx, 3) - assert.ErrorIs(t, err, ErrReplayRequestAborted) - }) - - recvStartReplay := func(ctx context.Context, block int64) { - select { - case fromBlock := <-lp.replayStart: - assert.Equal(t, block, fromBlock) - case <-ctx.Done(): - assert.NoError(t, ctx.Err(), "Timed out waiting to receive replay request from lp.replayStart") - } - } - - // Replay() should return error code received from replayComplete - t.Run("returns error code on replay complete", func(t *testing.T) { - ctx := testutils.Context(t) - ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Once() - mockBatchCallContext(t, ec) - anyErr := pkgerrors.New("any error") - done := make(chan struct{}) - go func() { - defer close(done) - recvStartReplay(ctx, 2) - lp.replayComplete <- anyErr - }() - assert.ErrorIs(t, lp.Replay(ctx, 1), anyErr) - <-done - }) - - // Replay() should return ErrReplayInProgress if caller's context is cancelled after replay has begun - t.Run("late abort returns ErrReplayInProgress", func(t *testing.T) { - cancelCtx, cancel := context.WithTimeout(testutils.Context(t), time.Second) // Intentionally abort replay after 1s - done := make(chan struct{}) - go func() { - defer close(done) - recvStartReplay(cancelCtx, 4) - cancel() - }() - assert.ErrorIs(t, lp.Replay(cancelCtx, 4), ErrReplayInProgress) - <-done - lp.replayComplete <- nil - lp.wg.Wait() - }) - - // Main lp.run() loop shouldn't get stuck if client aborts - t.Run("client abort doesnt hang run loop", func(t *testing.T) { - ctx := testutils.Context(t) - lp.backupPollerNextBlock = 0 - - pass := make(chan struct{}) - cancelled := make(chan struct{}) - - rctx, rcancel := context.WithCancel(testutils.Context(t)) - var wg sync.WaitGroup - defer func() { wg.Wait() }() - ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { - head.Store(&evmtypes.Head{Number: 4}) - wg.Add(1) - go func() { - defer wg.Done() - assert.ErrorIs(t, lp.Replay(rctx, 4), ErrReplayInProgress) - close(cancelled) - }() - }) - ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { - rcancel() - wg.Add(1) - go func() { - defer wg.Done() - select { - case lp.replayStart <- 4: - close(pass) - case <-ctx.Done(): - return - } - }() - // We cannot return until we're sure that Replay() received the cancellation signal, - // otherwise replayComplete<- might be sent first - <-cancelled - }) - - ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil).Maybe() // in case task gets delayed by >= 100ms - - head.Store(newHead(5)) - t.Cleanup(lp.reset) - servicetest.Run(t, lp) - - select { - case <-ctx.Done(): - t.Errorf("timed out waiting for lp.run() to respond to second replay event") - case <-pass: - } - }) - - // remove Maybe expectation from prior subtest, as it will override all expected calls in future subtests - ec.On("FilterLogs", mock.Anything, mock.Anything).Unset() - - // run() should abort if log poller shuts down while replay is in progress - t.Run("shutdown during replay", func(t *testing.T) { - ctx := testutils.Context(t) - lp.backupPollerNextBlock = 0 - - pass := make(chan struct{}) - done := make(chan struct{}) - defer func() { <-done }() - - ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { - go func() { - defer close(done) - - head.Store(newHead(4)) // Restore latest block to 4, so this matches the fromBlock requested - select { - case lp.replayStart <- 4: - case <-ctx.Done(): - } - }() - }) - ec.On("FilterLogs", mock.Anything, mock.Anything).Once().Return([]types.Log{log1}, nil).Run(func(args mock.Arguments) { - go func() { - assert.NoError(t, lp.Close()) - - // prevent double close - lp.reset() - assert.NoError(t, lp.Start(ctx)) - - close(pass) - }() - }) - ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) - - t.Cleanup(lp.reset) - head.Store(newHead(6)) // Latest block must be > lastProcessed in order for SaveAndPollLogs() to call FilterLogs() - servicetest.Run(t, lp) - - select { - case <-ctx.Done(): - t.Error("timed out waiting for lp.run() to respond to shutdown event during replay") - case <-pass: - } - }) - - // ReplayAsync should return as soon as replayStart is received - t.Run("ReplayAsync success", func(t *testing.T) { - t.Cleanup(lp.reset) - - head.Store(&evmtypes.Head{Number: 5}) - ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) - mockBatchCallContext(t, ec) - servicetest.Run(t, lp) - - lp.ReplayAsync(1) - - recvStartReplay(testutils.Context(t), 4) - }) - - t.Run("ReplayAsync error", func(t *testing.T) { - ctx := testutils.Context(t) - t.Cleanup(lp.reset) - servicetest.Run(t, lp) - head.Store(&evmtypes.Head{Number: 4}) - - anyErr := pkgerrors.New("async error") - observedLogs.TakeAll() - - lp.ReplayAsync(4) - recvStartReplay(testutils.Context(t), 4) - - select { - case lp.replayComplete <- anyErr: - time.Sleep(2 * time.Second) - case <-ctx.Done(): - t.Error("timed out waiting to send replaceComplete") - } - require.Equal(t, 1, observedLogs.Len()) - assert.Equal(t, observedLogs.All()[0].Message, anyErr.Error()) - }) - - t.Run("run regular replay when there are not blocks in db", func(t *testing.T) { - ctx := testutils.Context(t) - err := lp.orm.DeleteLogsAndBlocksAfter(ctx, 0) - require.NoError(t, err) - - lp.ReplayAsync(1) - recvStartReplay(testutils.Context(t), 1) - }) - - t.Run("run only backfill when everything is finalized", func(t *testing.T) { - ctx := testutils.Context(t) - err := lp.orm.DeleteLogsAndBlocksAfter(ctx, 0) - require.NoError(t, err) - - h := head.Load() - err = lp.orm.InsertBlock(ctx, common.BigToHash(big.NewInt(h.Number)), h.Number, h.Timestamp, h.Number) - require.NoError(t, err) - - ec.On("FilterLogs", mock.Anything, mock.Anything).Return([]types.Log{log1}, nil) - mockBatchCallContext(t, ec) - - err = lp.Replay(ctx, 1) - require.NoError(t, err) - }) -} - -func (lp *logPoller) reset() { - lp.StateMachine = services.StateMachine{} - lp.stopCh = make(chan struct{}) -} - -func Test_latestBlockAndFinalityDepth(t *testing.T) { - lggr := logger.Test(t) - - lpOpts := Opts{ - PollPeriod: time.Hour, - BackfillBatchSize: 3, - RpcBatchSize: 3, - KeepFinalizedBlocksDepth: 20, - } - - t.Run("headTracker returns an error", func(t *testing.T) { - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - const expectedError = "finalized block is not available yet" - headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(&evmtypes.Head{}, &evmtypes.Head{}, fmt.Errorf(expectedError)) - - lp := NewLogPoller(nil, nil, lggr, headTracker, lpOpts) - _, _, err := lp.latestBlocks(tests.Context(t)) - require.ErrorContains(t, err, expectedError) - }) - t.Run("headTracker returns valid chain", func(t *testing.T) { - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - finalizedBlock := &evmtypes.Head{Number: 2} - finalizedBlock.IsFinalized.Store(true) - head := &evmtypes.Head{Number: 10} - headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(head, finalizedBlock, nil) - - lp := NewLogPoller(nil, nil, lggr, headTracker, lpOpts) - latestBlock, finalizedBlockNumber, err := lp.latestBlocks(tests.Context(t)) - require.NoError(t, err) - require.NotNil(t, latestBlock) - assert.Equal(t, head.BlockNumber(), latestBlock.BlockNumber()) - assert.Equal(t, finalizedBlock.Number, finalizedBlockNumber) - }) -} - -func Test_FetchBlocks(t *testing.T) { - lggr := logger.Test(t) - chainID := testutils.FixtureChainID - db := testutils.NewSqlxDB(t) - orm := NewORM(chainID, db, lggr) - ctx := testutils.Context(t) - - lpOpts := Opts{ - PollPeriod: time.Hour, - BackfillBatchSize: 2, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 50, - FinalityDepth: 3, - } - - ec := clienttest.NewClient(t) - mockBatchCallContext(t, ec) // This will return 5 for "finalized" and 8 for "latest" - - cases := []struct { - name string - blocksRequested []uint64 - chainReference *LogPollerBlock - expectedErr error - }{ - { - "All blocks are finalized from RPC's perspective, no reference", - []uint64{2, 5, 3, 4}, - nil, - nil, - }, - { - "RPC's latest finalized is lower than request, no reference", - []uint64{8, 2}, - nil, - errors.New("received unfinalized block 8 while expecting finalized block (latestFinalizedBlockNumber = 5)"), - }, - { - "All blocks are finalized, but chain reference does not match", - []uint64{2, 5, 3, 4}, - &LogPollerBlock{BlockNumber: 1, BlockHash: common.BigToHash(big.NewInt(2))}, - errors.New("expected RPC's finalized block hash at hegiht 1 to be 0x0000000000000000000000000000000000000000000000000000000000000002 but got 0x0000000000000000000000000000000000000000000000000000000000000001: finality violated"), - }, - { - "All blocks are finalized and chain reference matches", - []uint64{2, 5, 3, 4}, - &LogPollerBlock{BlockNumber: 1, BlockHash: common.BigToHash(big.NewInt(1))}, - nil, - }, - } - - lp := NewLogPoller(orm, ec, lggr, nil, lpOpts) - for _, tc := range cases { - for _, lp.useFinalityTag = range []bool{false, true} { - blockValidationReq := latestBlock - if lp.useFinalityTag { - blockValidationReq = finalizedBlock - } - t.Run(fmt.Sprintf("%s where useFinalityTag=%t", tc.name, lp.useFinalityTag), func(t *testing.T) { - blocks, err := lp.fetchBlocks(ctx, tc.blocksRequested, blockValidationReq, tc.chainReference) - if tc.expectedErr != nil { - require.Equal(t, err.Error(), tc.expectedErr.Error()) - return // PASS - } - require.NoError(t, err) - for _, blockRequested := range tc.blocksRequested { - assert.Equal(t, blockRequested, uint64(blocks[blockRequested].Number)) //nolint:gosec // G115 - } - }) - } - } -} - -func Test_PollAndSaveLogs_BackfillFinalityViolation(t *testing.T) { - t.Parallel() - - db := testutils.NewSqlxDB(t) - lpOpts := Opts{ - PollPeriod: time.Second, - FinalityDepth: 3, - BackfillBatchSize: 3, - RpcBatchSize: 3, - KeepFinalizedBlocksDepth: 20, - BackupPollerBlockDelay: 0, - } - t.Run("Finalized DB block is not present in RPC's chain", func(t *testing.T) { - lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) - orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - finalized := newHead(5) - latest := newHead(16) - headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).RunAndReturn(func(ctx context.Context) (*evmtypes.Head, *evmtypes.Head, error) { - return latest, finalized, nil - }).Once() - ec := clienttest.NewClient(t) - ec.EXPECT().HeadByNumber(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, number *big.Int) (*evmtypes.Head, error) { - return newHead(number.Int64()), nil - }) - ec.EXPECT().FilterLogs(mock.Anything, mock.Anything).Return([]types.Log{{BlockNumber: 5}}, nil).Once() - mockBatchCallContext(t, ec) - // insert finalized block with different hash than in RPC - require.NoError(t, orm.InsertBlock(tests.Context(t), common.HexToHash("0x123"), 2, time.Unix(10, 0), 2)) - lp := NewLogPoller(orm, ec, lggr, headTracker, lpOpts) - lp.PollAndSaveLogs(tests.Context(t), 4) - require.ErrorIs(t, lp.HealthReport()[lp.Name()], commontypes.ErrFinalityViolated) - }) - t.Run("RPCs contradict each other and return different finalized blocks", func(t *testing.T) { - lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) - orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - finalized := newHead(5) - latest := newHead(16) - headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() - ec := clienttest.NewClient(t) - ec.EXPECT().HeadByNumber(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, number *big.Int) (*evmtypes.Head, error) { - return newHead(number.Int64()), nil - }) - ec.EXPECT().FilterLogs(mock.Anything, mock.Anything).Return([]types.Log{{BlockNumber: 5}}, nil).Once() - mockBatchCallContextWithHead(t, ec, func(num int64) evmtypes.Head { - // return new hash for every call - return evmtypes.Head{Number: num, Hash: utils.NewHash()} - }) - lp := NewLogPoller(orm, ec, lggr, headTracker, lpOpts) - lp.PollAndSaveLogs(tests.Context(t), 4) - require.ErrorIs(t, lp.HealthReport()[lp.Name()], commontypes.ErrFinalityViolated) - }) - t.Run("Log's hash does not match block's", func(t *testing.T) { - lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) - orm := NewORM(testutils.NewRandomEVMChainID(), db, lggr) - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - finalized := newHead(5) - latest := newHead(16) - headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() - ec := clienttest.NewClient(t) - ec.EXPECT().HeadByNumber(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, number *big.Int) (*evmtypes.Head, error) { - return newHead(number.Int64()), nil - }) - ec.EXPECT().FilterLogs(mock.Anything, mock.Anything).Return([]types.Log{{BlockNumber: 5, BlockHash: common.HexToHash("0x123")}}, nil).Once() - mockBatchCallContext(t, ec) - lp := NewLogPoller(orm, ec, lggr, headTracker, lpOpts) - lp.PollAndSaveLogs(tests.Context(t), 4) - require.ErrorIs(t, lp.HealthReport()[lp.Name()], commontypes.ErrFinalityViolated) - }) - t.Run("Happy path", func(t *testing.T) { - lggr, _ := logger.TestObserved(t, zapcore.ErrorLevel) - chainID := testutils.NewRandomEVMChainID() - orm := NewORM(chainID, db, lggr) - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - finalized := newHead(5) - latest := newHead(16) - headTracker.EXPECT().LatestAndFinalizedBlock(mock.Anything).Return(latest, finalized, nil).Once() - ec := clienttest.NewClient(t) - ec.EXPECT().ConfiguredChainID().Return(chainID) - ec.EXPECT().HeadByNumber(mock.Anything, mock.Anything).RunAndReturn(func(ctx context.Context, number *big.Int) (*evmtypes.Head, error) { - return newHead(number.Int64()), nil - }) - ec.EXPECT().FilterLogs(mock.Anything, mock.Anything).Return([]types.Log{{BlockNumber: 5, BlockHash: common.BigToHash(big.NewInt(5)), Topics: []common.Hash{{}}}}, nil).Once() - mockBatchCallContext(t, ec) - lp := NewLogPoller(orm, ec, lggr, headTracker, lpOpts) - lp.PollAndSaveLogs(tests.Context(t), 4) - require.NoError(t, lp.HealthReport()[lp.Name()]) - }) -} - -func benchmarkFilter(b *testing.B, nFilters, nAddresses, nEvents int) { - lggr := logger.Test(b) - lpOpts := Opts{ - PollPeriod: time.Hour, - FinalityDepth: 2, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - lp := NewLogPoller(nil, nil, lggr, nil, lpOpts) - for i := 0; i < nFilters; i++ { - var addresses []common.Address - var events []common.Hash - for j := 0; j < nAddresses; j++ { - addresses = append(addresses, common.BigToAddress(big.NewInt(int64(j+1)))) - } - for j := 0; j < nEvents; j++ { - events = append(events, common.BigToHash(big.NewInt(int64(j+1)))) - } - err := lp.RegisterFilter(testutils.Context(b), Filter{Name: "my Filter", EventSigs: events, Addresses: addresses}) - require.NoError(b, err) - } - b.ResetTimer() - for n := 0; n < b.N; n++ { - lp.Filter(nil, nil, nil) - } -} - -func BenchmarkFilter10_1(b *testing.B) { - benchmarkFilter(b, 10, 1, 1) -} -func BenchmarkFilter100_10(b *testing.B) { - benchmarkFilter(b, 100, 10, 10) -} -func BenchmarkFilter1000_100(b *testing.B) { - benchmarkFilter(b, 1000, 100, 100) -} diff --git a/core/chains/evm/logpoller/log_poller_test.go b/core/chains/evm/logpoller/log_poller_test.go deleted file mode 100644 index d73e2f3b98e..00000000000 --- a/core/chains/evm/logpoller/log_poller_test.go +++ /dev/null @@ -1,2110 +0,0 @@ -package logpoller_test - -import ( - "context" - "fmt" - "math" - "math/big" - "testing" - "time" - - "github.com/cometbft/cometbft/libs/rand" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/ethclient/simulated" - "github.com/leanovate/gopter" - "github.com/leanovate/gopter/gen" - "github.com/leanovate/gopter/prop" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - "go.uber.org/zap/zapcore" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" - "github.com/smartcontractkit/chainlink-common/pkg/types/query" - "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" - commonutils "github.com/smartcontractkit/chainlink-common/pkg/utils" - "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" - - "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink-integrations/evm/config/chaintype" - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/log_emitter" -) - -func logRuntime(t testing.TB, start time.Time) { - t.Log("runtime", time.Since(start)) -} - -func populateDatabase(t testing.TB, o logpoller.ORM, chainID *big.Int) (common.Hash, common.Address, common.Address) { - event1 := EmitterABI.Events["Log1"].ID - address1 := common.HexToAddress("0x2ab9a2Dc53736b361b72d900CdF9F78F9406fbbb") - address2 := common.HexToAddress("0x6E225058950f237371261C985Db6bDe26df2200E") - startDate := time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC) - ctx := testutils.Context(t) - - for j := 1; j < 100; j++ { - var logs []logpoller.Log - // Max we can insert per batch - for i := 0; i < 1000; i++ { - addr := address1 - if (i+(1000*j))%2 == 0 { - addr = address2 - } - blockNumber := int64(i + (1000 * j)) - blockTimestamp := startDate.Add(time.Duration(j*1000) * time.Hour) - - logs = append(logs, logpoller.Log{ - EvmChainId: ubig.New(chainID), - LogIndex: 1, - BlockHash: common.HexToHash(fmt.Sprintf("0x%d", i+(1000*j))), - BlockNumber: blockNumber, - BlockTimestamp: blockTimestamp, - EventSig: event1, - Topics: [][]byte{event1[:], logpoller.EvmWord(uint64(i + 1000*j)).Bytes()}, - Address: addr, - TxHash: utils.RandomHash(), - Data: logpoller.EvmWord(uint64(i + 1000*j)).Bytes(), - CreatedAt: blockTimestamp, - }) - } - require.NoError(t, o.InsertLogs(ctx, logs)) - require.NoError(t, o.InsertBlock(ctx, utils.RandomHash(), int64((j+1)*1000-1), startDate.Add(time.Duration(j*1000)*time.Hour), 0)) - } - - return event1, address1, address2 -} - -func BenchmarkSelectLogsCreatedAfter(b *testing.B) { - chainId := big.NewInt(137) - ctx := testutils.Context(b) - db := testutils.NewIndependentSqlxDB(b) - o := logpoller.NewORM(chainId, db, logger.Test(b)) - event, address, _ := populateDatabase(b, o, chainId) - - // Setting searchDate to pick around 5k logs - searchDate := time.Date(2020, 1, 1, 12, 12, 12, 0, time.UTC) - - b.ResetTimer() - - for i := 0; i < b.N; i++ { - logs, err := o.SelectLogsCreatedAfter(ctx, address, event, searchDate, 500) - require.NotZero(b, len(logs)) - require.NoError(b, err) - } -} - -func TestPopulateLoadedDB(t *testing.T) { - t.Skip("Only for local load testing and query analysis") - db := testutils.NewIndependentSqlxDB(t) - ctx := testutils.Context(t) - chainID := big.NewInt(137) - - o := logpoller.NewORM(big.NewInt(137), db, logger.Test(t)) - event1, address1, address2 := populateDatabase(t, o, chainID) - - func() { - defer logRuntime(t, time.Now()) - _, err1 := o.SelectLogs(ctx, 750000, 800000, address1, event1) - require.NoError(t, err1) - }() - func() { - defer logRuntime(t, time.Now()) - _, err1 := o.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0, []common.Address{address1}, []common.Hash{event1}, 0) - require.NoError(t, err1) - }() - - // Confirm all the logs. - require.NoError(t, o.InsertBlock(ctx, common.HexToHash("0x10"), 1000000, time.Now(), 0)) - func() { - defer logRuntime(t, time.Now()) - lgs, err1 := o.SelectLogsDataWordRange(ctx, address1, event1, 0, logpoller.EvmWord(50000), logpoller.EvmWord(50020), 0) - require.NoError(t, err1) - // 10 since every other log is for address1 - require.Equal(t, 10, len(lgs)) - }() - - func() { - defer logRuntime(t, time.Now()) - lgs, err1 := o.SelectIndexedLogs(ctx, address2, event1, 1, []common.Hash{logpoller.EvmWord(50000), logpoller.EvmWord(50020)}, 0) - require.NoError(t, err1) - require.Equal(t, 2, len(lgs)) - }() - - func() { - defer logRuntime(t, time.Now()) - lgs, err1 := o.SelectIndexedLogsTopicRange(ctx, address1, event1, 1, logpoller.EvmWord(50000), logpoller.EvmWord(50020), 0) - require.NoError(t, err1) - require.Equal(t, 10, len(lgs)) - }() -} - -func TestLogPoller_Integration(t *testing.T) { - lpOpts := logpoller.Opts{ - FinalityDepth: 2, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - BackupPollerBlockDelay: 100, - } - th := SetupTH(t, lpOpts) - th.Backend.Commit() // Block 2. Ensure we have finality number of blocks - ctx := testutils.Context(t) - - require.NoError(t, th.LogPoller.RegisterFilter(ctx, logpoller.Filter{Name: "Integration test", EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, Addresses: []common.Address{th.EmitterAddress1}})) - require.Len(t, th.LogPoller.Filter(nil, nil, nil).Addresses, 1) - require.Len(t, th.LogPoller.Filter(nil, nil, nil).Topics, 1) - - require.Len(t, th.LogPoller.Filter(nil, nil, nil).Addresses, 1) - require.Len(t, th.LogPoller.Filter(nil, nil, nil).Topics, 1) - - // Emit some logs in blocks 3->7. - for i := 0; i < 5; i++ { - _, err1 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err1) - _, err1 = th.Emitter1.EmitLog2(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err1) - th.Backend.Commit() - } - // Calling Start() after RegisterFilter() simulates a node restart after job creation, should reload Filter from db. - require.NoError(t, th.LogPoller.Start(testutils.Context(t))) - - // The poller starts on a new chain at latest-finality (5 in this case), - // Replaying from block 4 should guarantee we have block 4 immediately. (We will also get - // block 3 once the backup poller runs, since it always starts 100 blocks behind.) - require.NoError(t, th.LogPoller.Replay(testutils.Context(t), 4)) - - // We should immediately have at least logs 4-7 - logs, err := th.LogPoller.Logs(ctx, 4, 7, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) - require.NoError(t, err) - require.Equal(t, 4, len(logs)) - - // Once the backup poller runs we should also have the log from block 3 - testutils.RequireEventually(t, func() bool { - l, err2 := th.LogPoller.Logs(ctx, 3, 3, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) - require.NoError(t, err2) - return len(l) == 1 - }) - - // Now let's update the Filter and replay to get Log2 logs. - err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ - Name: "Emitter - log2", - EventSigs: []common.Hash{EmitterABI.Events["Log2"].ID}, - Addresses: []common.Address{th.EmitterAddress1}, - }) - require.NoError(t, err) - // Replay an invalid block should error - assert.Error(t, th.LogPoller.Replay(testutils.Context(t), 0)) - assert.Error(t, th.LogPoller.Replay(testutils.Context(t), 20)) - - // Still shouldn't have any Log2 logs yet - logs, err = th.LogPoller.Logs(ctx, 2, 7, EmitterABI.Events["Log2"].ID, th.EmitterAddress1) - require.NoError(t, err) - require.Len(t, logs, 0) - - // Replay only from block 4, so we should see logs in block 4,5,6,7 (4 logs) - require.NoError(t, th.LogPoller.Replay(testutils.Context(t), 4)) - - // We should immediately see 4 logs2 logs. - logs, err = th.LogPoller.Logs(ctx, 2, 7, EmitterABI.Events["Log2"].ID, th.EmitterAddress1) - require.NoError(t, err) - assert.Equal(t, 4, len(logs)) - - assert.NoError(t, th.LogPoller.Close()) - - // Cancelling a replay should return an error synchronously. - ctx, cancel := context.WithCancel(testutils.Context(t)) - cancel() - assert.ErrorIs(t, th.LogPoller.Replay(ctx, 4), logpoller.ErrReplayRequestAborted) -} - -// Simulate an rpc failover event on optimism, where logs are requested from a block hash which doesn't -// exist on the new rpc server, but a successful error code is returned. This is bad/buggy behavior on the -// part of the rpc server, but we should be able to handle this without missing any logs, as -// long as the logs returned for finalized blocks are consistent. -func Test_BackupLogPoller(t *testing.T) { - tests := []struct { - name string - finalityDepth int64 - finalityTag bool - }{ - { - name: "fixed finality depth without finality tag", - finalityDepth: 2, - finalityTag: false, - }, - { - name: "chain finality in use", - finalityDepth: 0, - finalityTag: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - th := SetupTH(t, - logpoller.Opts{ - UseFinalityTag: tt.finalityTag, - FinalityDepth: tt.finalityDepth, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - BackupPollerBlockDelay: 100, - }, - ) - - ctx := testutils.Context(t) - - filter1 := logpoller.Filter{ - Name: "filter1", - EventSigs: []common.Hash{ - EmitterABI.Events["Log1"].ID, - EmitterABI.Events["Log2"].ID}, - Addresses: []common.Address{th.EmitterAddress1}, - } - err := th.LogPoller.RegisterFilter(ctx, filter1) - require.NoError(t, err) - - filters, err := th.ORM.LoadFilters(ctx) - require.NoError(t, err) - require.Equal(t, 1, len(filters)) - require.Equal(t, filter1, filters["filter1"]) - - err = th.LogPoller.RegisterFilter(ctx, - logpoller.Filter{ - Name: "filter2", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{th.EmitterAddress2}, - }) - require.NoError(t, err) - - defer func() { - assert.NoError(t, th.LogPoller.UnregisterFilter(ctx, "filter1")) - }() - defer func() { - assert.NoError(t, th.LogPoller.UnregisterFilter(ctx, "filter2")) - }() - - for n := 1; n < 31; n++ { - h := th.Backend.Commit() - require.Len(t, h, 32) - } - - // generate some tx's with logs - tx1, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) - require.NoError(t, err) - require.NotNil(t, tx1) - - tx2, err := th.Emitter1.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)}) - require.NoError(t, err) - require.NotNil(t, tx2) - - tx3, err := th.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) - require.NoError(t, err) - require.NotNil(t, tx3) - - th.Backend.Commit() // commit block 32 with 3 tx's included - - block32, err := th.Client.BlockByNumber(ctx, nil) - require.NoError(t, err) - require.Equal(t, uint64(32), block32.Number().Uint64()) - - // Ensure that the logs have been included in this rpc server's view of the blockchain - txs := block32.Body().Transactions - require.Len(t, txs, 3) - receipt, err := th.Client.TransactionReceipt(ctx, txs[0].Hash()) - require.NoError(t, err) - require.NotZero(t, receipt) - require.Len(t, receipt.Logs, 1) - - // Simulate an optimism rpc server, which is behind and still syncing - backupRPC := simulated.NewBackend(types.GenesisAlloc{ - th.Owner.From: { - Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), - }, - }, simulated.WithBlockGasLimit(10e6)) - - primaryRPC := th.Backend // save primaryRPC for later - - // Failover to simulated optimism rpc on block 30 - th.Client.RegisterHeadByNumberCallback(func(ctx context.Context, c *client.SimulatedBackendClient, n *big.Int) error { - if n.Int64() != 32 { - return nil - } - th.SetActiveClient(backupRPC, chaintype.ChainOptimismBedrock) - return nil - }) - - currentBlockNumber := th.PollAndSaveLogs(ctx, 1) - require.Equal(t, int64(33), currentBlockNumber) - - // logs shouldn't show up yet - logs, err := th.LogPoller.Logs(ctx, 32, 32, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) - require.NoError(t, err) - require.Empty(t, logs) - - th.finalizeThroughBlock(t, 32) - - b, ok := primaryRPC.(*Backend) - require.True(t, ok) - th.SetActiveClient(b, chaintype.ChainOptimismBedrock) // restore primary rpc - - // Run ordinary poller + backup poller at least once - require.NoError(t, err) - currentBlockNumber = th.PollAndSaveLogs(ctx, currentBlockNumber) - require.Equal(t, int64(33), currentBlockNumber) - th.LogPoller.BackupPollAndSaveLogs(ctx) - latestBlock, err := th.LogPoller.LatestBlock(ctx) - require.NoError(t, err) - require.Equal(t, currentBlockNumber-1, latestBlock.BlockNumber) // shouldn't change - - // logs still shouldn't show up, because we don't want to backfill the last finalized log - // to help with reorg detection - logs, err = th.LogPoller.Logs(ctx, 32, 32, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) - require.NoError(t, err) - require.Empty(t, logs) - th.Backend.Commit() - th.finalizeThroughBlock(t, 64) - - // Run ordinary poller + backup poller at least once more - th.LogPoller.PollAndSaveLogs(ctx, currentBlockNumber) - th.LogPoller.BackupPollAndSaveLogs(ctx) - currentBlock, err := th.LogPoller.LatestBlock(ctx) - require.NoError(t, err) - - require.Equal(t, int64(64), currentBlock.BlockNumber) - - // all 3 logs in block 34 should show up now, thanks to backup logger - logs, err = th.LogPoller.Logs(ctx, 30, 37, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) - require.NoError(t, err) - assert.Len(t, logs, 1) - logs, err = th.LogPoller.Logs(ctx, 32, 32, EmitterABI.Events["Log2"].ID, th.EmitterAddress1) - require.NoError(t, err) - assert.Len(t, logs, 1) - logs, err = th.LogPoller.Logs(ctx, 32, 36, EmitterABI.Events["Log1"].ID, th.EmitterAddress2) - require.NoError(t, err) - assert.Len(t, logs, 1) - }) - } -} - -func TestLogPoller_BackupPollAndSaveLogsWithPollerNotWorking(t *testing.T) { - emittedLogs := 40 - // Intentionally use very low backupLogPollerDelay to verify if finality is used properly - ctx := testutils.Context(t) - lpOpts := logpoller.Opts{ - UseFinalityTag: true, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - BackupPollerBlockDelay: 1, - } - th := SetupTH(t, lpOpts) - - // Emit some logs in blocks - for i := 0; i < emittedLogs; i++ { - if i == 30 { - // Call PollAndSave with no filters are registered. We call it on block 31, so that - // it misses the logs for blocks 2 - 31 but marks block 0 as finalized (rather than 32) - currentBlock := th.PollAndSaveLogs(ctx, 1) - // currentBlock should be blockChain start + number of emitted logs + 1 - assert.Equal(t, int64(32), currentBlock) - } - - _, err2 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err2) - th.Backend.Commit() - } - - // LogPoller not working, but chain in the meantime has progressed - // 0 -> 1 -> 2 -> ... -> 32 (finalized) -> .. -> 42 (currentBlock) - - err := th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ - Name: "Test Emitter", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{th.EmitterAddress1}, - }) - require.NoError(t, err) - - // LogPoller should backfill starting from the last finalized block stored in db (genesis block) - // till the latest finalized block reported by chain. - th.LogPoller.BackupPollAndSaveLogs(ctx) - require.NoError(t, err) - - logs, err := th.LogPoller.Logs( - ctx, - 0, - 42, - EmitterABI.Events["Log1"].ID, - th.EmitterAddress1, - ) - require.NoError(t, err) - require.Len(t, logs, emittedLogs-10) - - // Finalize the rest of the logs emitted, after which Backup Poller should pick them up - th.finalizeThroughBlock(t, 42) - th.LogPoller.BackupPollAndSaveLogs(ctx) - - // All emitted logs should be backfilled - logs, err = th.LogPoller.Logs( - ctx, - 0, - 43, - EmitterABI.Events["Log1"].ID, - th.EmitterAddress1, - ) - require.NoError(t, err) - require.Len(t, logs, emittedLogs) -} - -func TestLogPoller_BackupPollAndSaveLogsWithDeepBlockDelay(t *testing.T) { - emittedLogs := 30 - ctx := testutils.Context(t) - lpOpts := logpoller.Opts{ - UseFinalityTag: true, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - BackupPollerBlockDelay: int64(emittedLogs), - } - th := SetupTH(t, lpOpts) - - // Emit some logs in blocks - for i := 0; i < emittedLogs; i++ { - _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err) - th.Backend.Commit() - } - // Emit one more empty block - th.Backend.Commit() - - header, err := th.Client.HeaderByNumber(ctx, nil) - require.NoError(t, err) - - // First PollAndSave, no filters are registered, but finalization is the same as the latest block - // 1 -> 2 -> ... - th.PollAndSaveLogs(ctx, 1) - - // Check that latest block has the same properties as the head - latestBlock, err := th.LogPoller.LatestBlock(ctx) - require.NoError(t, err) - assert.Equal(t, latestBlock.BlockNumber, header.Number.Int64()) - assert.Equal(t, latestBlock.FinalizedBlockNumber, header.Number.Int64()) - assert.Equal(t, latestBlock.BlockHash, header.Hash()) - - // Register filter - err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ - Name: "Test Emitter", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{th.EmitterAddress1}, - }) - require.NoError(t, err) - - // Should fallback to the backupPollerBlockDelay when finalization was very high in a previous PollAndSave - th.LogPoller.BackupPollAndSaveLogs(ctx) - require.NoError(t, err) - - // All emitted logs should be backfilled - logs, err := th.LogPoller.Logs( - ctx, - 0, - header.Number.Int64()+1, - EmitterABI.Events["Log1"].ID, - th.EmitterAddress1, - ) - require.NoError(t, err) - require.Len(t, logs, emittedLogs) -} - -func TestLogPoller_BackupPollAndSaveLogsSkippingLogsThatAreTooOld(t *testing.T) { - logsBatch := 10 - // Intentionally use very low backupLogPollerDelay to verify if finality is used properly - ctx := testutils.Context(t) - lpOpts := logpoller.Opts{ - UseFinalityTag: true, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - BackupPollerBlockDelay: 1, - } - th := SetupTH(t, lpOpts) - - // Emit some logs in blocks - for i := 1; i <= logsBatch; i++ { - _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(0x100 + i))}) - require.NoError(t, err) - th.Backend.Commit() - } - - // First PollAndSave, no filters are registered, but finalization is the same as the latest block - // 1 -> 2 -> ... -> firstBatchBlock - firstBatchBlock := th.PollAndSaveLogs(ctx, 1) - 1 - - // Mark all blocks from first batch of emitted logs as finalized - th.finalizeThroughBlock(t, firstBatchBlock) - - // Emit 2nd batch of block - for i := 1; i <= logsBatch; i++ { - _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(0x200 + i))}) - require.NoError(t, err) - th.Backend.Commit() - } - - // 1 -> 2 -> ... -> firstBatchBlock (finalized) -> .. -> firstBatchBlock + logsBatch - secondBatchBlock := th.PollAndSaveLogs(ctx, firstBatchBlock) - 1 - - // Mark all blocks from second batch of emitted logs as finalized - th.finalizeThroughBlock(t, secondBatchBlock) - - // Register filter - err := th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ - Name: "Test Emitter", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{th.EmitterAddress1}, - }) - require.NoError(t, err) - - // Should pick logs starting from one block behind the latest finalized block - th.LogPoller.BackupPollAndSaveLogs(ctx) - require.NoError(t, err) - - // Only the 2nd batch should be backfilled, because we perform backfill starting from one - // behind the latest finalized block - logs, err := th.LogPoller.Logs( - ctx, - 0, - secondBatchBlock, - EmitterABI.Events["Log1"].ID, - th.EmitterAddress1, - ) - require.NoError(t, err) - require.Len(t, logs, logsBatch) - require.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000201`), logs[0].Data) // 0x201 = 1st log from 2nd batch -} - -func TestLogPoller_BlockTimestamps(t *testing.T) { - t.Parallel() - ctx := testutils.Context(t) - lpOpts := logpoller.Opts{ - FinalityDepth: 2, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - th := SetupTH(t, lpOpts) - - addresses := []common.Address{th.EmitterAddress1, th.EmitterAddress2} - events := []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID} - - err := th.LogPoller.RegisterFilter(ctx, logpoller.Filter{Name: "convertLogs", EventSigs: events, Addresses: addresses}) - require.NoError(t, err) - - blk, err := th.Client.BlockByNumber(ctx, nil) - require.NoError(t, err) - require.Equal(t, big.NewInt(1), blk.Number()) - start := blk.Time() - - // There is automatically a 1ns delay between each block. To make sure it's including the correct block timestamps, - // we introduce irregularities by inserting two additional block delays. We can't control the block times for - // blocks produced by the log emitter, but we can adjust the time on empty blocks in between. Simulated time - // sequence: [ #1 ] ..(1ns + delay1).. [ #2 ] ..1ns.. [ #3 (LOG1) ] ..(1ns + delay2).. [ #4 ] ..1ns.. [ #5 (LOG2) ] - const delay1 = 589 * time.Second - const delay2 = 643 * time.Second - time1 := start + 1 + uint64(589) - time2 := time1 + 1 + uint64(643) - - require.NoError(t, th.Backend.AdjustTime(delay1)) - - blk, err = th.Client.BlockByNumber(ctx, nil) - require.NoError(t, err) - require.Equal(t, big.NewInt(2), blk.Number()) - assert.Equal(t, time1-1, blk.Time()) - - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) - require.NoError(t, err) - hash := th.Backend.Commit() - - blk, err = th.Client.BlockByHash(ctx, hash) - require.NoError(t, err) - require.Equal(t, big.NewInt(3), blk.Number()) - assert.Equal(t, time1, blk.Time()) - - require.NoError(t, th.Backend.AdjustTime(delay2)) - _, err = th.Emitter2.EmitLog2(th.Owner, []*big.Int{big.NewInt(2)}) - require.NoError(t, err) - th.Client.Commit() - - blk, err = th.Client.BlockByNumber(ctx, nil) - require.NoError(t, err) - require.Equal(t, big.NewInt(5), blk.Number()) - assert.Equal(t, time2, blk.Time()) - - query := ethereum.FilterQuery{ - FromBlock: big.NewInt(2), - ToBlock: big.NewInt(5), - Topics: [][]common.Hash{events}, - Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}} - - gethLogs, err := th.Client.FilterLogs(ctx, query) - require.NoError(t, err) - require.Len(t, gethLogs, 2) - - lb, _ := th.LogPoller.LatestBlock(ctx) - th.PollAndSaveLogs(ctx, lb.BlockNumber+1) - lg1, err := th.LogPoller.Logs(ctx, 0, 20, EmitterABI.Events["Log1"].ID, th.EmitterAddress1) - require.NoError(t, err) - lg2, err := th.LogPoller.Logs(ctx, 0, 20, EmitterABI.Events["Log2"].ID, th.EmitterAddress2) - require.NoError(t, err) - - // Logs should have correct timestamps - require.NotZero(t, len(lg1)) - b, _ := th.Client.BlockByHash(ctx, lg1[0].BlockHash) - t.Log(len(lg1), lg1[0].BlockTimestamp.String()) - assert.Equal(t, int64(b.Time()), lg1[0].BlockTimestamp.UTC().Unix(), time1) - b2, _ := th.Client.BlockByHash(ctx, lg2[0].BlockHash) - assert.Equal(t, int64(b2.Time()), lg2[0].BlockTimestamp.UTC().Unix(), time2) -} - -func TestLogPoller_SynchronizedWithGeth(t *testing.T) { - t.Parallel() - // The log poller's blocks table should remain synchronized - // with the canonical chain of geth's despite arbitrary mixes of mining and reorgs. - testParams := gopter.DefaultTestParameters() - testParams.MinSuccessfulTests = 100 - p := gopter.NewProperties(testParams) - numChainInserts := 3 - finalityDepth := 5 - lggr := logger.Test(t) - db := testutils.NewSqlxDB(t) - - owner := testutils.MustNewSimTransactor(t) - owner.GasPrice = big.NewInt(10e9) - p.Property("synchronized with geth", prop.ForAll(func(mineOrReorg []uint64) bool { - // After the set of reorgs, we should have the same canonical blocks that geth does. - t.Log("Starting test", mineOrReorg) - chainID := testutils.NewRandomEVMChainID() - // Set up a test chain with a log emitting contract deployed. - orm := logpoller.NewORM(chainID, db, lggr) - // Note this property test is run concurrently and the sim is not threadsafe. - backend := simulated.NewBackend(types.GenesisAlloc{ - owner.From: { - Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), - }, - }, simulated.WithBlockGasLimit(10e6)) - ec := backend.Client() - _, _, emitter1, err := log_emitter.DeployLogEmitter(owner, ec) - require.NoError(t, err) - - lpOpts := logpoller.Opts{ - PollPeriod: 15 * time.Second, - FinalityDepth: int64(finalityDepth), - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - simulatedClient := client.NewSimulatedBackendClient(t, backend, chainID) - ht := headstest.NewSimulatedHeadTracker(simulatedClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) - lp := logpoller.NewLogPoller(orm, simulatedClient, lggr, ht, lpOpts) - for i := 0; i < finalityDepth; i++ { // Have enough blocks that we could reorg the full finalityDepth-1. - backend.Commit() - } - currentBlockNumber := int64(1) - lp.PollAndSaveLogs(testutils.Context(t), currentBlockNumber) - currentBlock, err := lp.LatestBlock(testutils.Context(t)) - require.NoError(t, err) - matchesGeth := func() bool { - // Check every block is identical - latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) - require.NoError(t, err1) - for i := 1; i < int(latest.NumberU64()); i++ { - ourBlock, err1 := lp.BlockByNumber(testutils.Context(t), int64(i)) - require.NoError(t, err1) - gethBlock, err1 := ec.BlockByNumber(testutils.Context(t), big.NewInt(int64(i))) - require.NoError(t, err1) - if ourBlock.BlockHash != gethBlock.Hash() { - t.Logf("Initial poll our block differs at height %d got %x want %x\n", i, ourBlock.BlockHash, gethBlock.Hash()) - return false - } - } - return true - } - if !matchesGeth() { - return false - } - // Randomly pick to mine or reorg - for i := 0; i < numChainInserts; i++ { - if rand.Bool() { - // Mine blocks - for j := 0; j < int(mineOrReorg[i]); j++ { - backend.Commit() - latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) - require.NoError(t, err1) - t.Log("mined block", latest.Hash()) - } - } else { - // Reorg blocks - latest, err1 := ec.BlockByNumber(testutils.Context(t), nil) - require.NoError(t, err1) - reorgedBlock := big.NewInt(0).Sub(latest.Number(), big.NewInt(int64(mineOrReorg[i]))) - reorg, err1 := ec.BlockByNumber(testutils.Context(t), reorgedBlock) - require.NoError(t, err1) - require.NoError(t, backend.Fork(reorg.Hash())) - - t.Logf("Reorging from (%v, %x) back to (%v, %x)\n", latest.NumberU64(), latest.Hash(), reorgedBlock.Uint64(), reorg.Hash()) - // Actually need to change the block here to trigger the reorg. - _, err1 = emitter1.EmitLog1(owner, []*big.Int{big.NewInt(1)}) - require.NoError(t, err1) - for j := 0; j < int(mineOrReorg[i]+1); j++ { // Need +1 to make it actually longer height so we detect it. - backend.Commit() - } - latest, err1 = ec.BlockByNumber(testutils.Context(t), nil) - require.NoError(t, err1) - t.Logf("New latest (%v, %x), latest parent %x)\n", latest.NumberU64(), latest.Hash(), latest.ParentHash()) - } - lp.PollAndSaveLogs(testutils.Context(t), currentBlock.BlockNumber) - currentBlock, err = lp.LatestBlock(testutils.Context(t)) - require.NoError(t, err) - } - return matchesGeth() - }, gen.SliceOfN(numChainInserts, gen.UInt64Range(1, uint64(finalityDepth-1))))) // Max reorg depth is finality depth - 1 - p.TestingRun(t) -} - -func TestLogPoller_PollAndSaveLogs(t *testing.T) { - t.Parallel() - - tests := []struct { - name string - finalityDepth int64 - finalityTag bool - }{ - { - name: "fixed finality depth without finality tag", - finalityDepth: 3, - finalityTag: false, - }, - { - name: "chain finality in use", - finalityDepth: 0, - finalityTag: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - lpOpts := logpoller.Opts{ - UseFinalityTag: tt.finalityTag, - FinalityDepth: tt.finalityDepth, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - th := SetupTH(t, lpOpts) - - // Set up a log poller listening for log emitter logs. - err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ - Name: "Test Emitter 1 & 2", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, - Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, - }) - require.NoError(t, err) - - b, err := th.Client.BlockByNumber(testutils.Context(t), nil) - require.NoError(t, err) - require.Equal(t, uint64(1), b.NumberU64()) - - // Test scenario: single block in chain, no logs. - // Chain genesis <- 1 - // DB: empty - newStart := th.PollAndSaveLogs(testutils.Context(t), 1) - assert.Equal(t, int64(2), newStart) - - // We expect to have saved block 1. - lpb, err := th.ORM.SelectBlockByNumber(testutils.Context(t), 1) - require.NoError(t, err) - assert.Equal(t, lpb.BlockHash, b.Hash()) - assert.Equal(t, lpb.BlockNumber, int64(b.NumberU64())) - assert.Equal(t, int64(1), int64(b.NumberU64())) - - // No logs. - lgs, err := th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 1) - require.NoError(t, err) - assert.Equal(t, 0, len(lgs)) - th.assertHaveCanonical(t, 1, 1) - - // Polling again should be a noop, since we are at the latest. - newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(2), newStart) - latest, err := th.ORM.SelectLatestBlock(testutils.Context(t)) - require.NoError(t, err) - assert.Equal(t, int64(1), latest.BlockNumber) - th.assertHaveCanonical(t, 1, 1) - - // Test scenario: one log 2 block chain. - // Chain gen <- 1 <- 2 (L1) - // DB: 1 - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) - require.NoError(t, err) - th.Backend.Commit() - - // Polling should get us the L1 log. - newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(3), newStart) - latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) - require.NoError(t, err) - assert.Equal(t, int64(2), latest.BlockNumber) - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - assert.Equal(t, th.EmitterAddress1, lgs[0].Address) - assert.Equal(t, latest.BlockHash, lgs[0].BlockHash) - assert.Equal(t, latest.BlockTimestamp, lgs[0].BlockTimestamp) - assert.Equal(t, hexutil.Encode(lgs[0].Topics[0]), EmitterABI.Events["Log1"].ID.String()) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), - lgs[0].Data) - - // Test scenario: single block reorg with log. - // Chain gen <- 1 <- 2 (L1_1) - // \ 2'(L1_2) <- 3 - // DB: 1, 2 - // - Detect a reorg, - // - Update the block 2's hash - // - Save L1_2 - // - L1_1 deleted - lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) - require.NoError(t, err) - require.NoError(t, th.Backend.Fork(lca.Hash())) - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) - require.NoError(t, err) - // Create 2' - th.Backend.Commit() - // Create 3 (we need a new block for us to do any polling and detect the reorg). - th.Backend.Commit() - - newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(4), newStart) - latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) - require.NoError(t, err) - assert.Equal(t, int64(3), latest.BlockNumber) - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000002`), lgs[0].Data) - th.assertHaveCanonical(t, 1, 3) - - parent, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) - require.NoError(t, err) - - // Test scenario: reorg back to a chain that looks similar to the original chain. (simulated geth used to allow - // re-org'ing back to exactly the same chain--now the best we can do is re-emit the same logs on a new one to simulate that) - // Chain gen <- 1 <- 2 (L1_1) - // \ 2' (L1_2) <- 3 - // \ 2''(L1_1) <- 3' <- 4 - require.NoError(t, th.Backend.Fork(parent.Hash())) - // Re-emit L1 to make 2'' tip look like original 2 tip - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) - require.NoError(t, err) - th.Backend.Commit() - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) - require.NoError(t, err) - // Create 3' - th.Backend.Commit() - // Create 4 - th.Backend.Commit() - - newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(5), newStart) - latest, err = th.ORM.SelectLatestBlock(testutils.Context(t)) - require.NoError(t, err) - assert.Equal(t, int64(4), latest.BlockNumber) - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 1, 3) - require.NoError(t, err) - - require.Len(t, lgs, 2) - assert.Equal(t, int64(2), lgs[0].BlockNumber) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) - assert.Equal(t, int64(3), lgs[1].BlockNumber) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000003`), lgs[1].Data) - th.assertHaveCanonical(t, 1, 1) - th.assertHaveCanonical(t, 3, 4) - th.assertDontHave(t, 2, 2) // 2 gets backfilled - - // Test scenario: multiple logs per block for many blocks (also after reorg). - // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) - // \ 2'(L1_2) <- 3 - // DB: 1, 2', 3' - // - Should save 4, 5, 6 blocks - // - Should obtain logs L1_3, L2_5, L1_6 - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(4)}) - require.NoError(t, err) - _, err = th.Emitter2.EmitLog1(th.Owner, []*big.Int{big.NewInt(5)}) - require.NoError(t, err) - // Create 4 - th.Backend.Commit() - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(6)}) - require.NoError(t, err) - // Create 5 - th.Backend.Commit() - - newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(7), newStart) - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 4, 6) - require.NoError(t, err) - require.Equal(t, 3, len(lgs)) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000004`), lgs[0].Data) - assert.Equal(t, th.EmitterAddress1, lgs[0].Address) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000005`), lgs[1].Data) - assert.Equal(t, th.EmitterAddress2, lgs[1].Address) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000006`), lgs[2].Data) - assert.Equal(t, th.EmitterAddress1, lgs[2].Address) - th.assertHaveCanonical(t, 1, 1) - th.assertDontHave(t, 2, 2) // 2 gets backfilled - th.assertHaveCanonical(t, 3, 6) - - // Test scenario: node down for exactly finality + 2 blocks - // Note we only backfill up to finalized - 1 blocks, because we need to save the - // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) <- 7 (L1_7) <- 8 (L1_8) <- 9 (L1_9) <- 10 (L1_10) - // \ 2'(L1_2) <- 3 - // DB: 1, 2, 3, 4, 5, 6 - // - We expect block 7 to backfilled (treated as finalized) - // - Then block 8-10 to be handled block by block (treated as unfinalized). - for i := 7; i < 11; i++ { - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err) - th.Backend.Commit() - } - - newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(11), newStart) - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 7, 9) - require.NoError(t, err) - require.Equal(t, 3, len(lgs)) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000007`), lgs[0].Data) - assert.Equal(t, int64(7), lgs[0].BlockNumber) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000008`), lgs[1].Data) - assert.Equal(t, int64(8), lgs[1].BlockNumber) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000009`), lgs[2].Data) - assert.Equal(t, int64(9), lgs[2].BlockNumber) - th.assertHaveCanonical(t, 8, 10) - - // Test scenario large backfill (multiple batches) - // Chain gen <- 1 <- 2 (L1_1) <- 3' L1_3 <- 4 <- 5 (L1_4, L2_5) <- 6 (L1_6) <- 7 (L1_7) <- 8 (L1_8) <- 9 (L1_9) <- 10..32 - // \ 2'(L1_2) <- 3 - // DB: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 - // - 11 - 13 backfilled in batch 1 - // - 14 - 16 backfilled in batch 2 - // ... - // - 33, 34, 35 to be treated as unfinalized - for i := 11; i < 36; i++ { - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err) - th.Backend.Commit() - } - - newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(36), newStart) - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 11, 36) - require.NoError(t, err) - assert.Len(t, lgs, 25) - th.assertHaveCanonical(t, 32, 36) // Should have last finalized block plus unfinalized blocks - th.assertDontHave(t, 11, 13) // Should not have older finalized blocks - th.assertDontHave(t, 14, 16) // Should not have older finalized blocks - - // Verify that a custom block timestamp will get written to db correctly also - b, err = th.Client.BlockByNumber(testutils.Context(t), nil) - require.NoError(t, err) - require.Equal(t, uint64(35), b.NumberU64()) - blockTimestamp := b.Time() - require.NoError(t, th.Backend.AdjustTime(time.Hour)) - th.Backend.Commit() - - b, err = th.Client.BlockByNumber(testutils.Context(t), nil) - require.NoError(t, err) - require.Equal(t, blockTimestamp+uint64(time.Hour/time.Second)+1, b.Time()) - }) - } -} - -func TestLogPoller_ReorgDeeperThanFinality(t *testing.T) { - tests := []struct { - name string - finalityDepth int64 - finalityTag bool - }{ - { - name: "fixed finality depth without finality tag", - finalityDepth: 1, - finalityTag: false, - }, - { - name: "chain finality in use", - finalityDepth: 0, - finalityTag: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - th := SetupTH(t, logpoller.Opts{ - UseFinalityTag: tt.finalityTag, - FinalityDepth: tt.finalityDepth, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - BackupPollerBlockDelay: 100, - }) - // Set up a log poller listening for log emitter logs. - err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ - Name: "Test Emitter", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{th.EmitterAddress1}, - }) - require.NoError(t, err) - - // Test scenario - // Chain gen <- 1 <- 2 <- ... <- 32 (finalized) <- 33 (L1_1) - th.finalizeThroughBlock(t, 32) - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) - require.NoError(t, err) - th.Backend.Commit() - - // Polling should get us the L1 log. - firstPoll := th.PollAndSaveLogs(testutils.Context(t), 1) - assert.Equal(t, int64(34), firstPoll) - assert.NoError(t, th.LogPoller.Healthy()) - - // Fork deeper than finality depth - // Chain gen <- 1 <- 2 <- 3 <- ... <- 32 (finalized) <- 33 (L1_1) - // \ <- 3' <- ... <- 31' <- 32' (finalized) <- 33' <- 34' (L1_2) - lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(2)) - require.NoError(t, err) - require.NoError(t, th.Backend.Fork(lca.Hash())) - - // Create 3' - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(3)}) - require.NoError(t, err) - th.Backend.Commit() - - th.finalizeThroughBlock(t, 32) - - // Create 33' - 34' - for i := 33; i < 35; i++ { - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err) - th.Backend.Commit() - } - - secondPoll := th.PollAndSaveLogs(testutils.Context(t), firstPoll) - assert.Equal(t, firstPoll, secondPoll) - require.Equal(t, commontypes.ErrFinalityViolated, th.LogPoller.Healthy()) - require.Equal(t, commontypes.ErrFinalityViolated, th.LogPoller.HealthReport()[th.LogPoller.Name()]) - - // Manually remove re-org'd chain from the log poller to bring it back to life - // LogPoller should be healthy again after first poll - // Chain gen <- 1 <- 2 - // \ <- 3' <- 4' <- 5' <- 32' (finalized) <- 33' <- 34' (L1_2) - require.NoError(t, th.ORM.DeleteLogsAndBlocksAfter(testutils.Context(t), 3)) - // Poll from latest - recoveryPoll := th.PollAndSaveLogs(testutils.Context(t), 1) - assert.Equal(t, int64(35), recoveryPoll) - require.NoError(t, th.LogPoller.Healthy()) - require.NoError(t, th.LogPoller.HealthReport()[th.LogPoller.Name()]) - }) - } -} - -func TestLogPoller_PollAndSaveLogsDeepReorg(t *testing.T) { - t.Parallel() - - tests := []struct { - name string - finalityDepth int64 - finalityTag bool - }{ - { - name: "fixed finality depth without finality tag", - finalityDepth: 3, - finalityTag: false, - }, - { - name: "chain finality in use", - finalityDepth: 0, - finalityTag: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - lpOpts := logpoller.Opts{ - UseFinalityTag: tt.finalityTag, - FinalityDepth: tt.finalityDepth, - BackfillBatchSize: 50, - RpcBatchSize: 50, - KeepFinalizedBlocksDepth: 1000, - } - th := SetupTH(t, lpOpts) - // Set up a log poller listening for log emitter logs. - err := th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ - Name: "Test Emitter", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{th.EmitterAddress1}, - }) - require.NoError(t, err) - - // Test scenario: one log 2 block chain. - // Chain gen <- 1 <- 2 (L1_1) - // DB: 1 - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) - require.NoError(t, err) - th.Backend.Commit() - - // Polling should get us the L1 log. - newStart := th.PollAndSaveLogs(testutils.Context(t), 1) - assert.NoError(t, th.LogPoller.Healthy()) - assert.Equal(t, int64(3), newStart) - // Check that L1_1 has a proper data payload - lgs, err := th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 2) - require.NoError(t, err) - require.NotZero(t, len(lgs)) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000001`), lgs[0].Data) - - // Single block reorg and log poller not working for a while, mine blocks and progress with finalization - // Chain gen <- 1 <- 2 (L1_1) - // \ 2'(L1_2) <- 3' <- 4' <- ... <- 32' (finalized on chain) <- 33' <- 34' <- 35' - lca, err := th.Client.BlockByNumber(testutils.Context(t), big.NewInt(1)) - require.NoError(t, err) - require.NoError(t, th.Backend.Fork(lca.Hash())) - // Create 2' - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) - require.NoError(t, err) - th.Backend.Commit() - // Create 3-35 - for i := 3; i <= 35; i++ { - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err) - th.Backend.Commit() - } - th.finalizeThroughBlock(t, 32) - - newStart = th.PollAndSaveLogs(testutils.Context(t), newStart) - assert.Equal(t, int64(36), newStart) - assert.NoError(t, th.LogPoller.Healthy()) - - // Expect L1_2 to be properly updated - lgs, err = th.ORM.SelectLogsByBlockRange(testutils.Context(t), 2, 31) - require.NoError(t, err) - require.Len(t, lgs, 30) - assert.Equal(t, hexutil.MustDecode(`0x0000000000000000000000000000000000000000000000000000000000000002`), lgs[0].Data) - th.assertHaveCanonical(t, 1, 2) - th.assertDontHave(t, 2, 31) // These blocks are backfilled - th.assertHaveCanonical(t, 32, 36) - }) - } -} - -func TestLogPoller_LoadFilters(t *testing.T) { - t.Parallel() - - lpOpts := logpoller.Opts{ - UseFinalityTag: false, - FinalityDepth: 2, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - th := SetupTH(t, lpOpts) - - filter1 := logpoller.Filter{ - Name: "first Filter", - EventSigs: []common.Hash{ - EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, - Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, - } - filter2 := logpoller.Filter{ - Name: "second Filter", - EventSigs: []common.Hash{EmitterABI.Events["Log2"].ID, EmitterABI.Events["Log3"].ID}, - Addresses: []common.Address{th.EmitterAddress2}, - } - filter3 := logpoller.Filter{ - Name: "third Filter", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, - } - - assert.True(t, filter1.Contains(nil)) - assert.False(t, filter1.Contains(&filter2)) - assert.False(t, filter2.Contains(&filter1)) - assert.True(t, filter1.Contains(&filter3)) - - err := th.LogPoller.RegisterFilter(testutils.Context(t), filter1) - require.NoError(t, err) - err = th.LogPoller.RegisterFilter(testutils.Context(t), filter2) - require.NoError(t, err) - err = th.LogPoller.RegisterFilter(testutils.Context(t), filter3) - require.NoError(t, err) - - filters, err := th.ORM.LoadFilters(testutils.Context(t)) - require.NoError(t, err) - require.NotNil(t, filters) - require.Len(t, filters, 3) - - filter, ok := filters["first Filter"] - require.True(t, ok) - assert.True(t, filter.Contains(&filter1)) - assert.True(t, filter1.Contains(&filter)) - - filter, ok = filters["second Filter"] - require.True(t, ok) - assert.True(t, filter.Contains(&filter2)) - assert.True(t, filter2.Contains(&filter)) - - filter, ok = filters["third Filter"] - require.True(t, ok) - assert.True(t, filter.Contains(&filter3)) - assert.True(t, filter3.Contains(&filter)) - - t.Run("HasFilter", func(t *testing.T) { - assert.True(t, th.LogPoller.HasFilter("first Filter")) - assert.True(t, th.LogPoller.HasFilter("second Filter")) - assert.True(t, th.LogPoller.HasFilter("third Filter")) - assert.False(t, th.LogPoller.HasFilter("fourth Filter")) - }) - - t.Run("GetFilters", func(t *testing.T) { - filters := th.LogPoller.GetFilters() - assert.Equal(t, 3, len(filters)) - assert.Equal(t, filters["first Filter"].Name, "first Filter") - assert.Equal(t, filters["first Filter"].EventSigs, filter1.EventSigs) - assert.Equal(t, filters["first Filter"].Addresses, filter1.Addresses) - assert.Equal(t, filters["second Filter"].Name, "second Filter") - assert.Equal(t, filters["second Filter"].EventSigs, filter2.EventSigs) - assert.Equal(t, filters["second Filter"].Addresses, filter2.Addresses) - assert.Equal(t, filters["third Filter"].Name, "third Filter") - assert.Equal(t, filters["third Filter"].EventSigs, filter3.EventSigs) - assert.Equal(t, filters["third Filter"].Addresses, filter3.Addresses) - }) -} - -func TestLogPoller_GetBlocks_Range(t *testing.T) { - t.Parallel() - - lpOpts := logpoller.Opts{ - UseFinalityTag: false, - FinalityDepth: 2, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - th := SetupTH(t, lpOpts) - - _, err := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(1)}) - require.NoError(t, err) - th.Backend.Commit() // Commit block #2 with log in it - - _, err = th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(2)}) - require.NoError(t, err) - th.Backend.Commit() // Commit block #3 with a different log - - err = th.LogPoller.RegisterFilter(testutils.Context(t), logpoller.Filter{ - Name: "GetBlocks Test", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID, EmitterABI.Events["Log2"].ID}, - Addresses: []common.Address{th.EmitterAddress1, th.EmitterAddress2}, - }) - require.NoError(t, err) - - // LP retrieves 0 blocks - blockNums := []uint64{} - blocks, err := th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums) - require.NoError(t, err) - assert.Equal(t, 0, len(blocks)) - - // LP retrieves block 1 - blockNums = []uint64{1} - blocks, err = th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums) - require.NoError(t, err) - assert.Equal(t, 1, len(blocks)) - assert.Equal(t, 1, int(blocks[0].BlockNumber)) - assert.Equal(t, 1, int(blocks[0].FinalizedBlockNumber)) - - // LP fails to return block 2 because it hasn't been finalized yet - blockNums = []uint64{2} - _, err = th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums) - require.Error(t, err) - assert.Equal(t, "received unfinalized block 2 while expecting finalized block (latestFinalizedBlockNumber = 1)", err.Error()) - - th.Backend.Commit() // Commit block #4, so that block #2 is finalized - - // Assert block 2 is not yet in DB - _, err = th.ORM.SelectBlockByNumber(testutils.Context(t), 2) - require.Error(t, err) - - // getBlocksRange is able to retrieve block 2 by calling RPC - rpcBlocks, err := th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums) - require.NoError(t, err) - assert.Equal(t, 1, len(rpcBlocks)) - assert.Equal(t, 2, int(rpcBlocks[0].BlockNumber)) - assert.Equal(t, 2, int(rpcBlocks[0].FinalizedBlockNumber)) - - th.Backend.Commit() // commit block #5 so that #3 becomes finalized - - // Assert block 3 is not yet in DB - _, err = th.ORM.SelectBlockByNumber(testutils.Context(t), 3) - require.Error(t, err) - - // getBlocksRange is able to retrieve blocks 1 and 3, without retrieving block 2 - blockNums2 := []uint64{1, 3} - rpcBlocks2, err := th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums2) - require.NoError(t, err) - assert.Equal(t, 2, len(rpcBlocks2)) - assert.Equal(t, 1, int(rpcBlocks2[0].BlockNumber)) - assert.Equal(t, 3, int(rpcBlocks2[1].BlockNumber)) - assert.Equal(t, 3, int(rpcBlocks2[1].FinalizedBlockNumber)) - - // after calling PollAndSaveLogs, block 3 (latest finalized block) is persisted in DB - th.LogPoller.PollAndSaveLogs(testutils.Context(t), 1) - block, err := th.ORM.SelectBlockByNumber(testutils.Context(t), 3) - require.NoError(t, err) - assert.Equal(t, 3, int(block.BlockNumber)) - - // getBlocksRange should still be able to return block 2 by fetching from DB - lpBlocks, err := th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums) - require.NoError(t, err) - assert.Equal(t, 1, len(lpBlocks)) - assert.Equal(t, rpcBlocks[0].BlockNumber, lpBlocks[0].BlockNumber) - assert.Equal(t, rpcBlocks[0].BlockHash, lpBlocks[0].BlockHash) - assert.Equal(t, rpcBlocks[0].FinalizedBlockNumber, lpBlocks[0].FinalizedBlockNumber) - - // getBlocksRange return multiple blocks - blockNums = []uint64{1, 2} - blocks, err = th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums) - require.NoError(t, err) - assert.Equal(t, 1, int(blocks[0].BlockNumber)) - assert.NotEmpty(t, blocks[0].BlockHash) - assert.Equal(t, 2, int(blocks[1].BlockNumber)) - assert.NotEmpty(t, blocks[1].BlockHash) - assert.Equal(t, 2, int(blocks[1].FinalizedBlockNumber)) - - // getBlocksRange return blocks in requested order - blockNums = []uint64{2, 1} - reversedBlocks, err := th.LogPoller.GetBlocksRange(testutils.Context(t), blockNums) - require.NoError(t, err) - assert.Equal(t, blocks[0].BlockNumber, reversedBlocks[1].BlockNumber) - assert.Equal(t, blocks[0].BlockHash, reversedBlocks[1].BlockHash) - assert.Equal(t, blocks[1].BlockNumber, reversedBlocks[0].BlockNumber) - assert.Equal(t, blocks[1].BlockHash, reversedBlocks[0].BlockHash) - - // test RPC context cancellation - ctx, cancel := context.WithCancel(testutils.Context(t)) - cancel() - _, err = th.LogPoller.GetBlocksRange(ctx, blockNums) - require.Error(t, err) - assert.Contains(t, err.Error(), "context canceled") -} - -func TestGetReplayFromBlock(t *testing.T) { - t.Parallel() - lpOpts := logpoller.Opts{ - UseFinalityTag: false, - FinalityDepth: 2, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - th := SetupTH(t, lpOpts) - // Commit a few blocks - for i := 0; i < 10; i++ { - th.Backend.Commit() - } - - // Nothing in the DB yet, should use whatever we specify. - requested := int64(5) - fromBlock, err := th.LogPoller.GetReplayFromBlock(testutils.Context(t), requested) - require.NoError(t, err) - assert.Equal(t, requested, fromBlock) - - // Do a poll, then we should have up to block 11 (blocks 0 & 1 are contract deployments, 2-10 logs). - nextBlock := th.PollAndSaveLogs(testutils.Context(t), 1) - require.Equal(t, int64(12), nextBlock) - - // Commit a few more so chain is ahead. - for i := 0; i < 3; i++ { - th.Backend.Commit() - } - // Should take min(latest, requested), in this case latest. - requested = int64(15) - fromBlock, err = th.LogPoller.GetReplayFromBlock(testutils.Context(t), requested) - require.NoError(t, err) - latest, err := th.LogPoller.LatestBlock(testutils.Context(t)) - require.NoError(t, err) - assert.Equal(t, latest.BlockNumber, fromBlock) - - // Should take min(latest, requested) in this case requested. - requested = int64(7) - fromBlock, err = th.LogPoller.GetReplayFromBlock(testutils.Context(t), requested) - require.NoError(t, err) - assert.Equal(t, requested, fromBlock) -} - -func TestLogPoller_DBErrorHandling(t *testing.T) { - t.Parallel() - ctx := testutils.Context(t) - lggr, observedLogs := logger.TestObserved(t, zapcore.WarnLevel) - chainID1 := testutils.NewRandomEVMChainID() - chainID2 := testutils.NewRandomEVMChainID() - db := testutils.NewSqlxDB(t) - o := logpoller.NewORM(chainID1, db, lggr) - - owner := testutils.MustNewSimTransactor(t) - backend := simulated.NewBackend(types.GenesisAlloc{ - owner.From: { - Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), - }, - }, simulated.WithBlockGasLimit(10e6)) - ec := backend.Client() - _, _, emitter, err := log_emitter.DeployLogEmitter(owner, ec) - require.NoError(t, err) - _, err = emitter.EmitLog1(owner, []*big.Int{big.NewInt(9)}) - require.NoError(t, err) - _, err = emitter.EmitLog1(owner, []*big.Int{big.NewInt(7)}) - require.NoError(t, err) - backend.Commit() - backend.Commit() - backend.Commit() - - lpOpts := logpoller.Opts{ - PollPeriod: time.Hour, - FinalityDepth: 2, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - lp := logpoller.NewLogPoller(o, client.NewSimulatedBackendClient(t, backend, chainID2), lggr, nil, lpOpts) - - err = lp.Replay(ctx, 5) // block number too high - require.ErrorContains(t, err, "Invalid replay block number") - - // Force a db error while loading the filters (tx aborted, already rolled back) - require.Error(t, commonutils.JustError(db.Exec(`invalid query`))) - go func() { - err = lp.Replay(ctx, 2) - assert.ErrorContains(t, err, "current transaction is aborted") - }() - - time.Sleep(100 * time.Millisecond) - require.NoError(t, lp.Start(ctx)) - testutils.RequireEventually(t, func() bool { - return observedLogs.Len() >= 1 - }) - err = lp.Close() - require.NoError(t, err) - - logMsgs := make(map[string]int) - for _, obs := range observedLogs.All() { - _, ok := logMsgs[obs.Entry.Message] - if ok { - logMsgs[(obs.Entry.Message)] = 1 - } else { - logMsgs[(obs.Entry.Message)]++ - } - } - - assert.Contains(t, logMsgs, "Failed loading filters in main logpoller loop, retrying later") -} - -type getLogErrData struct { - From string - To string - Limit int -} - -func TestTooManyLogResults(t *testing.T) { - t.Parallel() - - ctx := testutils.Context(t) - ec := clienttest.NewClientWithDefaultChainID(t) - lggr, obs := logger.TestObserved(t, zapcore.DebugLevel) - chainID := testutils.NewRandomEVMChainID() - db := testutils.NewSqlxDB(t) - - o := logpoller.NewORM(chainID, db, lggr) - - lpOpts := logpoller.Opts{ - PollPeriod: time.Hour, - FinalityDepth: 2, - BackfillBatchSize: 20, - RpcBatchSize: 10, - KeepFinalizedBlocksDepth: 1000, - } - headTracker := headstest.NewTracker[*evmtypes.Head, common.Hash](t) - lp := logpoller.NewLogPoller(o, ec, lggr, headTracker, lpOpts) - expected := []int64{10, 5, 2, 1} - - tooLargeErr := client.JsonError{ - Code: -32005, - Data: getLogErrData{"0x100E698", "0x100E6D4", 10000}, - Message: "query returned more than 10000 results. Try with this block range [0x100E698, 0x100E6D4].", - } - - var filterLogsCall *mock.Call - head := &evmtypes.Head{} - finalized := &evmtypes.Head{} - - ec.On("HeadByNumber", mock.Anything, mock.Anything).Return(func(ctx context.Context, blockNumber *big.Int) (*evmtypes.Head, error) { - if blockNumber == nil { - require.FailNow(t, "unexpected call to get current head") - } - return &evmtypes.Head{Number: blockNumber.Int64()}, nil - }) - - t.Run("halves size until small enough, then succeeds", func(t *testing.T) { - // Simulate currentBlock = 300 - head.Number = 300 - finalized.Number = head.Number - lpOpts.FinalityDepth - headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(head, finalized, nil).Once() - - filterLogsCall = ec.On("FilterLogs", mock.Anything, mock.Anything).Return(func(ctx context.Context, fq ethereum.FilterQuery) (logs []types.Log, err error) { - if fq.BlockHash != nil { - return []types.Log{}, nil // succeed when single block requested - } - from := fq.FromBlock.Uint64() - to := fq.ToBlock.Uint64() - if to-from >= 8 { - return []types.Log{}, context.DeadlineExceeded // simulate RPC client timeout as a "too many results" scenario - } - if to-from >= 4 { - return []types.Log{}, tooLargeErr // return "too many results" error if block range spans 4 or more blocks - } - return logs, err - }) - - addr := testutils.NewAddress() - err := lp.RegisterFilter(ctx, logpoller.Filter{ - Name: "Integration test", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{addr}, - }) - require.NoError(t, err) - lp.PollAndSaveLogs(ctx, 5) - block, err2 := o.SelectLatestBlock(ctx) - require.NoError(t, err2) - assert.Equal(t, int64(298), block.BlockNumber) - - logs := obs.FilterLevelExact(zapcore.WarnLevel).FilterMessageSnippet("halving block range batch size").FilterFieldKey("newBatchSize").All() - // Should have tried again 3 times--first reducing batch size to 10, then 5, then 2 - require.Len(t, logs, 3) - for i, s := range expected[:3] { - assert.Equal(t, s, logs[i].ContextMap()["newBatchSize"]) - } - filterLogsCall.Unset() - }) - - t.Run("Halves size until single block, then reports critical error", func(t *testing.T) { - obs.TakeAll() - - // Now jump to block 500, but return error no matter how small the block range gets. - // Should exit the loop with a critical error instead of hanging. - head.Number = 500 - finalized.Number = head.Number - lpOpts.FinalityDepth - headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(head, finalized, nil).Once() - filterLogsCall = ec.On("FilterLogs", mock.Anything, mock.Anything).Return(func(ctx context.Context, fq ethereum.FilterQuery) (logs []types.Log, err error) { - if fq.BlockHash != nil { - return []types.Log{}, nil // succeed when single block requested - } - return []types.Log{}, tooLargeErr // return "too many results" error if block range spans 4 or more blocks - }) - - lp.PollAndSaveLogs(ctx, 298) - block, err := o.SelectLatestBlock(ctx) - if err != nil { - assert.ErrorContains(t, err, "no rows") // In case this subtest is run by itself - } else { - assert.Equal(t, int64(298), block.BlockNumber) - } - warns := obs.FilterMessageSnippet("halving block range").FilterLevelExact(zapcore.WarnLevel).All() - crit := obs.FilterMessageSnippet("failed to retrieve logs").FilterLevelExact(zapcore.DPanicLevel).All() - require.Len(t, warns, 4) - for i, s := range expected { - assert.Equal(t, s, warns[i].ContextMap()["newBatchSize"]) - } - - require.Len(t, crit, 1) - assert.Contains(t, crit[0].Message, "Too many log results in a single block") - filterLogsCall.Unset() - }) - - t.Run("Unrelated error are retried without adjusting size", func(t *testing.T) { - unrelatedError := fmt.Errorf("Unrelated to the size of the request") - head.Number = 500 - finalized.Number = head.Number - lpOpts.FinalityDepth - - obs.TakeAll() - filterLogsCall = ec.On("FilterLogs", mock.Anything, mock.Anything).Return(func(ctx context.Context, fq ethereum.FilterQuery) (logs []types.Log, err error) { - if fq.BlockHash != nil { - return []types.Log{}, nil // succeed when single block requested - } - return []types.Log{}, unrelatedError // return an unrelated error that should just be retried with same size - }) - headTracker.On("LatestAndFinalizedBlock", mock.Anything).Return(head, finalized, nil).Once() - - lp.PollAndSaveLogs(ctx, 298) - block, err := o.SelectLatestBlock(ctx) - if err != nil { - assert.ErrorContains(t, err, "no rows") // In case this subtest is run by itself - } else { - assert.Equal(t, int64(298), block.BlockNumber) - } - crit := obs.FilterLevelExact(zapcore.DPanicLevel).All() - errors := obs.FilterLevelExact(zapcore.ErrorLevel).All() - warns := obs.FilterLevelExact(zapcore.WarnLevel).All() - assert.Empty(t, crit) - require.Len(t, errors, 2) - assert.Contains(t, errors[0].Message, "Unable to query for logs") - assert.Contains(t, errors[1].Message, "Failed to poll and save logs, retrying later") - require.Empty(t, warns) - }) -} - -func Test_PollAndQueryFinalizedBlocks(t *testing.T) { - t.Parallel() - ctx := testutils.Context(t) - firstBatchLen := 3 - secondBatchLen := 5 - - lpOpts := logpoller.Opts{ - UseFinalityTag: true, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - th := SetupTH(t, lpOpts) - - eventSig := EmitterABI.Events["Log1"].ID - err := th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ - Name: "GetBlocks Test", - EventSigs: []common.Hash{eventSig}, - Addresses: []common.Address{th.EmitterAddress1}}, - ) - require.NoError(t, err) - - // Generate block that will be finalized - for i := 0; i < firstBatchLen; i++ { - _, err1 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err1) - th.Backend.Commit() - } - - // Mark current head as finalized - - h, err := th.Client.HeaderByNumber(ctx, nil) - require.NoError(t, err) - assert.NotNil(t, h) - th.finalizeThroughBlock(t, h.Number.Int64()) - - // Generate next blocks, not marked as finalized - for i := 0; i < secondBatchLen; i++ { - _, err1 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err1) - th.Backend.Commit() - } - - currentBlock := th.PollAndSaveLogs(ctx, 1) - require.Equal(t, 32+secondBatchLen+1, int(currentBlock)) - - finalizedLogs, err := th.LogPoller.LogsDataWordGreaterThan( - ctx, - eventSig, - th.EmitterAddress1, - 0, - common.Hash{}, - evmtypes.Finalized, - ) - require.NoError(t, err) - require.Len(t, finalizedLogs, firstBatchLen, fmt.Sprintf("len(finalizedLogs) = %d, should have been %d", len(finalizedLogs), firstBatchLen)) - - numberOfConfirmations := 1 - logsByConfs, err := th.LogPoller.LogsDataWordGreaterThan( - ctx, - eventSig, - th.EmitterAddress1, - 0, - common.Hash{}, - evmtypes.Confirmations(numberOfConfirmations), - ) - require.NoError(t, err) - require.Len(t, logsByConfs, firstBatchLen+secondBatchLen-numberOfConfirmations) -} - -func Test_PollAndSavePersistsFinalityInBlocks(t *testing.T) { - ctx := testutils.Context(t) - numberOfBlocks := 37 // must be greater than 1 epoch - - tests := []struct { - name string - useFinalityTag bool - finalityDepth int64 - expectedFinalizedBlock int64 - }{ - { - name: "using fixed finality depth", - useFinalityTag: false, - finalityDepth: 2, - expectedFinalizedBlock: int64(numberOfBlocks - 2), - }, - { - name: "setting last finalized block number to 0 if finality is too deep", - useFinalityTag: false, - finalityDepth: 40, - expectedFinalizedBlock: 1, - }, - { - name: "using finality from chain", - useFinalityTag: true, - finalityDepth: 0, - expectedFinalizedBlock: 32, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - lpOpts := logpoller.Opts{ - UseFinalityTag: tt.useFinalityTag, - FinalityDepth: tt.finalityDepth, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - } - th := SetupTH(t, lpOpts) - // Should return error before the first poll and save - _, err := th.LogPoller.LatestBlock(ctx) - require.Error(t, err) - - // Create a couple of blocks - for i := 0; i < numberOfBlocks-1; i++ { - th.Backend.Commit() - } - - if tt.useFinalityTag { - th.finalizeThroughBlock(t, tt.expectedFinalizedBlock) - } - - th.PollAndSaveLogs(ctx, 1) - - latestBlock, err := th.LogPoller.LatestBlock(ctx) - require.NoError(t, err) - require.Equal(t, int64(numberOfBlocks), latestBlock.BlockNumber) - require.Equal(t, tt.expectedFinalizedBlock, latestBlock.FinalizedBlockNumber) - }) - } -} - -func Test_CreatedAfterQueriesWithBackfill(t *testing.T) { - emittedLogs := 60 - ctx := testutils.Context(t) - - tests := []struct { - name string - finalityDepth int64 - finalityTag bool - }{ - { - name: "fixed finality depth without finality tag", - finalityDepth: 10, - finalityTag: false, - }, - { - name: "chain finality in use", - finalityDepth: 0, - finalityTag: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - lpOpts := logpoller.Opts{ - UseFinalityTag: tt.finalityTag, - FinalityDepth: tt.finalityDepth, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, - BackupPollerBlockDelay: 100, - } - th := SetupTH(t, lpOpts) - - header, err := th.Client.HeaderByNumber(ctx, nil) - require.NoError(t, err) - require.LessOrEqual(t, header.Time, uint64(math.MaxInt64)) - genesisBlockTime := time.Unix(int64(header.Time), 0) //nolint:gosec // G115 false positive - - // Emit some logs in blocks - for i := 0; i < emittedLogs; i++ { - _, err2 := th.Emitter1.EmitLog1(th.Owner, []*big.Int{big.NewInt(int64(i))}) - require.NoError(t, err2) - th.Backend.Commit() - } - - // First PollAndSave, no filters are registered - currentBlock := th.PollAndSaveLogs(ctx, 1) - - err = th.LogPoller.RegisterFilter(ctx, logpoller.Filter{ - Name: "Test Emitter", - EventSigs: []common.Hash{EmitterABI.Events["Log1"].ID}, - Addresses: []common.Address{th.EmitterAddress1}, - }) - require.NoError(t, err) - - // Finalize current block, because backup always backfill up to one block before last finalized - if tt.finalityTag { - th.finalizeThroughBlock(t, currentBlock) - } else { - for i := 0; i < int(tt.finalityDepth)+1; i++ { - th.Backend.Commit() - } - } - - // LogPoller should backfill entire history - th.LogPoller.BackupPollAndSaveLogs(ctx) - require.NoError(t, err) - - // Make sure that all logs are backfilled - logs, err := th.LogPoller.Logs( - ctx, - 0, - currentBlock, - EmitterABI.Events["Log1"].ID, - th.EmitterAddress1, - ) - require.NoError(t, err) - require.Len(t, logs, emittedLogs) - - // We should get all the logs by the block_timestamp - logs, err = th.LogPoller.LogsCreatedAfter( - ctx, - EmitterABI.Events["Log1"].ID, - th.EmitterAddress1, - genesisBlockTime, - 0, - ) - require.NoError(t, err) - require.Len(t, logs, emittedLogs) - }) - } -} - -func Test_PruneOldBlocks(t *testing.T) { - ctx := testutils.Context(t) - - tests := []struct { - name string - keepFinalizedBlocksDepth int64 - blockToCreate int - blocksLeft int - wantErr bool - }{ - { - name: "returns error if no blocks yet", - keepFinalizedBlocksDepth: 10, - blockToCreate: 0, - wantErr: true, - }, - { - name: "returns if there is not enough blocks in the db", - keepFinalizedBlocksDepth: 11, - blockToCreate: 10, - blocksLeft: 10, - }, - { - name: "prunes matching blocks", - keepFinalizedBlocksDepth: 1000, - blockToCreate: 2000, - blocksLeft: 1010, // last finalized block is 10 block behind - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - lpOpts := logpoller.Opts{ - UseFinalityTag: true, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: tt.keepFinalizedBlocksDepth, - } - th := SetupTH(t, lpOpts) - - for i := 1; i <= tt.blockToCreate; i++ { - err := th.ORM.InsertBlock(ctx, utils.RandomBytes32(), int64(i+10), time.Now(), int64(i)) - require.NoError(t, err) - } - - if tt.wantErr { - _, err := th.LogPoller.PruneOldBlocks(ctx) - require.Error(t, err) - return - } - - allDeleted, err := th.LogPoller.PruneOldBlocks(ctx) - require.NoError(t, err) - assert.True(t, allDeleted) - blocks, err := th.ORM.GetBlocksRange(ctx, 0, math.MaxInt64) - require.NoError(t, err) - assert.Len(t, blocks, tt.blocksLeft) - }) - } -} - -func TestFindLCA(t *testing.T) { - ctx := testutils.Context(t) - ec := clienttest.NewClientWithDefaultChainID(t) - lggr := logger.Test(t) - chainID := testutils.NewRandomEVMChainID() - db := testutils.NewSqlxDB(t) - - orm := logpoller.NewORM(chainID, db, lggr) - - lpOpts := logpoller.Opts{ - PollPeriod: time.Hour, - FinalityDepth: 2, - BackfillBatchSize: 20, - RpcBatchSize: 10, - KeepFinalizedBlocksDepth: 1000, - } - - lp := logpoller.NewLogPoller(orm, ec, lggr, nil, lpOpts) - t.Run("Fails, if failed to select oldest block", func(t *testing.T) { - _, err := lp.FindLCA(ctx) - require.ErrorContains(t, err, "failed to select the latest block") - }) - // oldest - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x123"), 10, time.Now(), 0)) - // latest - latestBlockHash := common.HexToHash("0x124") - require.NoError(t, orm.InsertBlock(ctx, latestBlockHash, 16, time.Now(), 0)) - t.Run("Fails, if caller's context canceled", func(t *testing.T) { - lCtx, cancel := context.WithCancel(ctx) - ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(nil, nil).Run(func(_ mock.Arguments) { - cancel() - }).Once() - _, err := lp.FindLCA(lCtx) - require.ErrorContains(t, err, "aborted, FindLCA request cancelled") - }) - t.Run("Fails, if RPC returns an error", func(t *testing.T) { - expectedError := fmt.Errorf("failed to call RPC") - ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(nil, expectedError).Once() - _, err := lp.FindLCA(ctx) - require.ErrorContains(t, err, expectedError.Error()) - }) - t.Run("Fails, if block numbers do not match", func(t *testing.T) { - ec.On("HeadByHash", mock.Anything, latestBlockHash).Return(&evmtypes.Head{ - Number: 123, - }, nil).Once() - _, err := lp.FindLCA(ctx) - require.ErrorContains(t, err, "expected block numbers to match") - }) - t.Run("Fails, if none of the blocks in db matches on chain", func(t *testing.T) { - ec.On("HeadByHash", mock.Anything, mock.Anything).Return(nil, nil).Times(3) - _, err := lp.FindLCA(ctx) - require.ErrorContains(t, err, "failed to find LCA, this means that whole database LogPoller state was reorged out of chain or RPC/Core node is misconfigured") - }) - - type block struct { - BN int - Exists bool - } - testCases := []struct { - Name string - Blocks []block - ExpectedBlockNumber int - ExpectedError error - }{ - { - Name: "All of the blocks are present on chain - returns the latest", - Blocks: []block{{BN: 1, Exists: true}, {BN: 2, Exists: true}, {BN: 3, Exists: true}, {BN: 4, Exists: true}}, - ExpectedBlockNumber: 4, - }, - { - Name: "None of the blocks exists on chain - returns an erro", - Blocks: []block{{BN: 1, Exists: false}, {BN: 2, Exists: false}, {BN: 3, Exists: false}, {BN: 4, Exists: false}}, - ExpectedBlockNumber: 0, - ExpectedError: fmt.Errorf("failed to find LCA, this means that whole database LogPoller state was reorged out of chain or RPC/Core node is misconfigured"), - }, - { - Name: "Only latest block does not exist", - Blocks: []block{{BN: 1, Exists: true}, {BN: 2, Exists: true}, {BN: 3, Exists: true}, {BN: 4, Exists: false}}, - ExpectedBlockNumber: 3, - }, - { - Name: "Only oldest block exists on chain", - Blocks: []block{{BN: 1, Exists: true}, {BN: 2, Exists: false}, {BN: 3, Exists: false}, {BN: 4, Exists: false}}, - ExpectedBlockNumber: 1, - }, - } - - blockHashI := int64(0) - for _, tc := range testCases { - t.Run(tc.Name, func(t *testing.T) { - // reset the database - require.NoError(t, orm.DeleteLogsAndBlocksAfter(ctx, 0)) - for _, b := range tc.Blocks { - blockHashI++ - hash := common.BigToHash(big.NewInt(blockHashI)) - require.NoError(t, orm.InsertBlock(ctx, hash, int64(b.BN), time.Now(), 0)) - // Hashes are unique for all test cases - var onChainBlock *evmtypes.Head - if b.Exists { - onChainBlock = &evmtypes.Head{Number: int64(b.BN)} - } - ec.On("HeadByHash", mock.Anything, hash).Return(onChainBlock, nil).Maybe() - } - - result, err := lp.FindLCA(ctx) - if tc.ExpectedError != nil { - require.ErrorContains(t, err, tc.ExpectedError.Error()) - } else { - require.NotNil(t, result) - require.Equal(t, result.BlockNumber, int64(tc.ExpectedBlockNumber), "expected block numbers to match") - } - }) - } -} - -func TestWhere(t *testing.T) { - address := common.HexToAddress("0x1234567890abcdef1234567890abcdef12345678") - eventSig := common.HexToHash("0xabcdef1234567890abcdef1234567890abcdef1234") - ts := time.Now() - - expr1 := logpoller.NewAddressFilter(address) - expr2 := logpoller.NewEventSigFilter(eventSig) - expr3 := query.Timestamp(uint64(ts.Unix()), primitives.Gte) - expr4 := logpoller.NewConfirmationsFilter(evmtypes.Confirmations(0)) - - t.Run("Valid combination of filters", func(t *testing.T) { - result, err := logpoller.Where(expr1, expr2, expr3, expr4) - assert.NoError(t, err) - assert.Equal(t, []query.Expression{expr1, expr2, expr3, expr4}, result) - }) - - t.Run("No expressions (should return empty slice)", func(t *testing.T) { - result, err := logpoller.Where() - assert.NoError(t, err) - assert.Equal(t, []query.Expression{}, result) - }) - - t.Run("Invalid boolean expression", func(t *testing.T) { - invalidExpr := query.Expression{ - BoolExpression: query.BoolExpression{ - Expressions: []query.Expression{}, - }, - } - - result, err := logpoller.Where(invalidExpr) - assert.Error(t, err) - assert.EqualError(t, err, "all boolean expressions should have at least 2 expressions") - assert.Equal(t, []query.Expression{}, result) - }) -} diff --git a/core/chains/evm/logpoller/mocks/log_poller.go b/core/chains/evm/logpoller/mocks/log_poller.go index 97672d457fc..f4865555b6e 100644 --- a/core/chains/evm/logpoller/mocks/log_poller.go +++ b/core/chains/evm/logpoller/mocks/log_poller.go @@ -7,7 +7,7 @@ import ( common "github.com/ethereum/go-ethereum/common" - logpoller "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + logpoller "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" mock "github.com/stretchr/testify/mock" @@ -185,23 +185,23 @@ func (_c *LogPoller_FilteredLogs_Call) RunAndReturn(run func(context.Context, [] } // FindLCA provides a mock function with given fields: ctx -func (_m *LogPoller) FindLCA(ctx context.Context) (*logpoller.LogPollerBlock, error) { +func (_m *LogPoller) FindLCA(ctx context.Context) (*logpoller.Block, error) { ret := _m.Called(ctx) if len(ret) == 0 { panic("no return value specified for FindLCA") } - var r0 *logpoller.LogPollerBlock + var r0 *logpoller.Block var r1 error - if rf, ok := ret.Get(0).(func(context.Context) (*logpoller.LogPollerBlock, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context) (*logpoller.Block, error)); ok { return rf(ctx) } - if rf, ok := ret.Get(0).(func(context.Context) *logpoller.LogPollerBlock); ok { + if rf, ok := ret.Get(0).(func(context.Context) *logpoller.Block); ok { r0 = rf(ctx) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*logpoller.LogPollerBlock) + r0 = ret.Get(0).(*logpoller.Block) } } @@ -232,34 +232,34 @@ func (_c *LogPoller_FindLCA_Call) Run(run func(ctx context.Context)) *LogPoller_ return _c } -func (_c *LogPoller_FindLCA_Call) Return(_a0 *logpoller.LogPollerBlock, _a1 error) *LogPoller_FindLCA_Call { +func (_c *LogPoller_FindLCA_Call) Return(_a0 *logpoller.Block, _a1 error) *LogPoller_FindLCA_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *LogPoller_FindLCA_Call) RunAndReturn(run func(context.Context) (*logpoller.LogPollerBlock, error)) *LogPoller_FindLCA_Call { +func (_c *LogPoller_FindLCA_Call) RunAndReturn(run func(context.Context) (*logpoller.Block, error)) *LogPoller_FindLCA_Call { _c.Call.Return(run) return _c } // GetBlocksRange provides a mock function with given fields: ctx, numbers -func (_m *LogPoller) GetBlocksRange(ctx context.Context, numbers []uint64) ([]logpoller.LogPollerBlock, error) { +func (_m *LogPoller) GetBlocksRange(ctx context.Context, numbers []uint64) ([]logpoller.Block, error) { ret := _m.Called(ctx, numbers) if len(ret) == 0 { panic("no return value specified for GetBlocksRange") } - var r0 []logpoller.LogPollerBlock + var r0 []logpoller.Block var r1 error - if rf, ok := ret.Get(0).(func(context.Context, []uint64) ([]logpoller.LogPollerBlock, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, []uint64) ([]logpoller.Block, error)); ok { return rf(ctx, numbers) } - if rf, ok := ret.Get(0).(func(context.Context, []uint64) []logpoller.LogPollerBlock); ok { + if rf, ok := ret.Get(0).(func(context.Context, []uint64) []logpoller.Block); ok { r0 = rf(ctx, numbers) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]logpoller.LogPollerBlock) + r0 = ret.Get(0).([]logpoller.Block) } } @@ -291,12 +291,12 @@ func (_c *LogPoller_GetBlocksRange_Call) Run(run func(ctx context.Context, numbe return _c } -func (_c *LogPoller_GetBlocksRange_Call) Return(_a0 []logpoller.LogPollerBlock, _a1 error) *LogPoller_GetBlocksRange_Call { +func (_c *LogPoller_GetBlocksRange_Call) Return(_a0 []logpoller.Block, _a1 error) *LogPoller_GetBlocksRange_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *LogPoller_GetBlocksRange_Call) RunAndReturn(run func(context.Context, []uint64) ([]logpoller.LogPollerBlock, error)) *LogPoller_GetBlocksRange_Call { +func (_c *LogPoller_GetBlocksRange_Call) RunAndReturn(run func(context.Context, []uint64) ([]logpoller.Block, error)) *LogPoller_GetBlocksRange_Call { _c.Call.Return(run) return _c } @@ -931,22 +931,22 @@ func (_c *LogPoller_IndexedLogsWithSigsExcluding_Call) RunAndReturn(run func(con } // LatestBlock provides a mock function with given fields: ctx -func (_m *LogPoller) LatestBlock(ctx context.Context) (logpoller.LogPollerBlock, error) { +func (_m *LogPoller) LatestBlock(ctx context.Context) (logpoller.Block, error) { ret := _m.Called(ctx) if len(ret) == 0 { panic("no return value specified for LatestBlock") } - var r0 logpoller.LogPollerBlock + var r0 logpoller.Block var r1 error - if rf, ok := ret.Get(0).(func(context.Context) (logpoller.LogPollerBlock, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context) (logpoller.Block, error)); ok { return rf(ctx) } - if rf, ok := ret.Get(0).(func(context.Context) logpoller.LogPollerBlock); ok { + if rf, ok := ret.Get(0).(func(context.Context) logpoller.Block); ok { r0 = rf(ctx) } else { - r0 = ret.Get(0).(logpoller.LogPollerBlock) + r0 = ret.Get(0).(logpoller.Block) } if rf, ok := ret.Get(1).(func(context.Context) error); ok { @@ -976,12 +976,12 @@ func (_c *LogPoller_LatestBlock_Call) Run(run func(ctx context.Context)) *LogPol return _c } -func (_c *LogPoller_LatestBlock_Call) Return(_a0 logpoller.LogPollerBlock, _a1 error) *LogPoller_LatestBlock_Call { +func (_c *LogPoller_LatestBlock_Call) Return(_a0 logpoller.Block, _a1 error) *LogPoller_LatestBlock_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *LogPoller_LatestBlock_Call) RunAndReturn(run func(context.Context) (logpoller.LogPollerBlock, error)) *LogPoller_LatestBlock_Call { +func (_c *LogPoller_LatestBlock_Call) RunAndReturn(run func(context.Context) (logpoller.Block, error)) *LogPoller_LatestBlock_Call { _c.Call.Return(run) return _c } diff --git a/core/chains/evm/logpoller/models.go b/core/chains/evm/logpoller/models.go deleted file mode 100644 index c07da369af1..00000000000 --- a/core/chains/evm/logpoller/models.go +++ /dev/null @@ -1,58 +0,0 @@ -package logpoller - -import ( - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/core/types" - "github.com/lib/pq" - - "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" -) - -// LogPollerBlock represents an unfinalized block -// used for reorg detection when polling. -type LogPollerBlock struct { - EvmChainId *big.Big - BlockHash common.Hash - // Note geth uses int64 internally https://github.com/ethereum/go-ethereum/blob/f66f1a16b3c480d3a43ac7e8a09ab3e362e96ae4/eth/filters/api.go#L340 - BlockNumber int64 - BlockTimestamp time.Time - FinalizedBlockNumber int64 - CreatedAt time.Time -} - -// Log represents an EVM log. -type Log struct { - EvmChainId *big.Big - LogIndex int64 - BlockHash common.Hash - BlockNumber int64 - BlockTimestamp time.Time - Topics pq.ByteaArray - EventSig common.Hash - Address common.Address - TxHash common.Hash - Data []byte - CreatedAt time.Time -} - -func (l *Log) GetTopics() []common.Hash { - var tps []common.Hash - for _, topic := range l.Topics { - tps = append(tps, common.BytesToHash(topic)) - } - return tps -} - -func (l *Log) ToGethLog() types.Log { - return types.Log{ - Data: l.Data, - Address: l.Address, - BlockHash: l.BlockHash, - BlockNumber: uint64(l.BlockNumber), - Topics: l.GetTopics(), - TxHash: l.TxHash, - Index: uint(l.LogIndex), - } -} diff --git a/core/chains/evm/logpoller/observability.go b/core/chains/evm/logpoller/observability.go deleted file mode 100644 index 98a8750f44c..00000000000 --- a/core/chains/evm/logpoller/observability.go +++ /dev/null @@ -1,348 +0,0 @@ -package logpoller - -import ( - "context" - "math/big" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" - - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - "github.com/smartcontractkit/chainlink-common/pkg/types/query" -) - -type queryType string - -const ( - create queryType = "create" - read queryType = "read" - del queryType = "delete" -) - -var ( - sqlLatencyBuckets = []float64{ - float64(1 * time.Millisecond), - float64(5 * time.Millisecond), - float64(10 * time.Millisecond), - float64(20 * time.Millisecond), - float64(30 * time.Millisecond), - float64(40 * time.Millisecond), - float64(50 * time.Millisecond), - float64(60 * time.Millisecond), - float64(70 * time.Millisecond), - float64(80 * time.Millisecond), - float64(90 * time.Millisecond), - float64(100 * time.Millisecond), - float64(200 * time.Millisecond), - float64(300 * time.Millisecond), - float64(400 * time.Millisecond), - float64(500 * time.Millisecond), - float64(750 * time.Millisecond), - float64(1 * time.Second), - float64(2 * time.Second), - float64(5 * time.Second), - } - lpQueryDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{ - Name: "log_poller_query_duration", - Help: "Measures duration of Log Poller's queries fetching logs", - Buckets: sqlLatencyBuckets, - }, []string{"evmChainID", "query", "type"}) - lpQueryDataSets = promauto.NewGaugeVec(prometheus.GaugeOpts{ - Name: "log_poller_query_dataset_size", - Help: "Measures size of the datasets returned by Log Poller's queries", - }, []string{"evmChainID", "query", "type"}) - lpLogsInserted = promauto.NewCounterVec(prometheus.CounterOpts{ - Name: "log_poller_logs_inserted", - Help: "Counter to track number of logs inserted by Log Poller", - }, []string{"evmChainID"}) - lpBlockInserted = promauto.NewCounterVec(prometheus.CounterOpts{ - Name: "log_poller_blocks_inserted", - Help: "Counter to track number of blocks inserted by Log Poller", - }, []string{"evmChainID"}) -) - -// ObservedORM is a decorator layer for ORM used by LogPoller, responsible for pushing Prometheus metrics reporting duration and size of result set for the queries. -// It doesn't change internal logic, because all calls are delegated to the origin ORM -type ObservedORM struct { - ORM - queryDuration *prometheus.HistogramVec - datasetSize *prometheus.GaugeVec - logsInserted *prometheus.CounterVec - blocksInserted *prometheus.CounterVec - chainId string -} - -// NewObservedORM creates an observed version of log poller's ORM created by NewORM -// Please see ObservedLogPoller for more details on how latencies are measured -func NewObservedORM(chainID *big.Int, ds sqlutil.DataSource, lggr logger.Logger) *ObservedORM { - return &ObservedORM{ - ORM: NewORM(chainID, ds, lggr), - queryDuration: lpQueryDuration, - datasetSize: lpQueryDataSets, - logsInserted: lpLogsInserted, - blocksInserted: lpBlockInserted, - chainId: chainID.String(), - } -} - -func (o *ObservedORM) InsertLogs(ctx context.Context, logs []Log) error { - err := withObservedExec(o, "InsertLogs", create, func() error { - return o.ORM.InsertLogs(ctx, logs) - }) - trackInsertedLogsAndBlock(o, logs, nil, err) - return err -} - -func (o *ObservedORM) InsertLogsWithBlock(ctx context.Context, logs []Log, block LogPollerBlock) error { - err := withObservedExec(o, "InsertLogsWithBlock", create, func() error { - return o.ORM.InsertLogsWithBlock(ctx, logs, block) - }) - trackInsertedLogsAndBlock(o, logs, &block, err) - return err -} - -func (o *ObservedORM) InsertFilter(ctx context.Context, filter Filter) error { - return withObservedExec(o, "InsertFilter", create, func() error { - return o.ORM.InsertFilter(ctx, filter) - }) -} - -func (o *ObservedORM) LoadFilters(ctx context.Context) (map[string]Filter, error) { - return withObservedQuery(o, "LoadFilters", func() (map[string]Filter, error) { - return o.ORM.LoadFilters(ctx) - }) -} - -func (o *ObservedORM) DeleteFilter(ctx context.Context, name string) error { - return withObservedExec(o, "DeleteFilter", del, func() error { - return o.ORM.DeleteFilter(ctx, name) - }) -} - -func (o *ObservedORM) DeleteBlocksBefore(ctx context.Context, end int64, limit int64) (int64, error) { - return withObservedExecAndRowsAffected(o, "DeleteBlocksBefore", del, func() (int64, error) { - return o.ORM.DeleteBlocksBefore(ctx, end, limit) - }) -} - -func (o *ObservedORM) DeleteLogsAndBlocksAfter(ctx context.Context, start int64) error { - return withObservedExec(o, "DeleteLogsAndBlocksAfter", del, func() error { - return o.ORM.DeleteLogsAndBlocksAfter(ctx, start) - }) -} - -func (o *ObservedORM) DeleteExpiredLogs(ctx context.Context, limit int64) (int64, error) { - return withObservedExecAndRowsAffected(o, "DeleteExpiredLogs", del, func() (int64, error) { - return o.ORM.DeleteExpiredLogs(ctx, limit) - }) -} - -func (o *ObservedORM) SelectUnmatchedLogIDs(ctx context.Context, limit int64) (ids []uint64, err error) { - return withObservedQueryAndResults[uint64](o, "SelectUnmatchedLogIDs", func() ([]uint64, error) { - return o.ORM.SelectUnmatchedLogIDs(ctx, limit) - }) -} - -func (o *ObservedORM) SelectExcessLogIDs(ctx context.Context, limit int64) ([]uint64, error) { - return withObservedQueryAndResults[uint64](o, "SelectExcessLogIDs", func() ([]uint64, error) { - return o.ORM.SelectExcessLogIDs(ctx, limit) - }) -} - -func (o *ObservedORM) DeleteLogsByRowID(ctx context.Context, rowIDs []uint64) (int64, error) { - return withObservedExecAndRowsAffected(o, "DeleteLogsByRowID", del, func() (int64, error) { - return o.ORM.DeleteLogsByRowID(ctx, rowIDs) - }) -} - -func (o *ObservedORM) SelectBlockByNumber(ctx context.Context, n int64) (*LogPollerBlock, error) { - return withObservedQuery(o, "SelectBlockByNumber", func() (*LogPollerBlock, error) { - return o.ORM.SelectBlockByNumber(ctx, n) - }) -} - -func (o *ObservedORM) SelectLatestBlock(ctx context.Context) (*LogPollerBlock, error) { - return withObservedQuery(o, "SelectLatestBlock", func() (*LogPollerBlock, error) { - return o.ORM.SelectLatestBlock(ctx) - }) -} - -func (o *ObservedORM) SelectOldestBlock(ctx context.Context, minAllowedBlockNumber int64) (*LogPollerBlock, error) { - return withObservedQuery(o, "SelectOldestBlock", func() (*LogPollerBlock, error) { - return o.ORM.SelectOldestBlock(ctx, minAllowedBlockNumber) - }) -} - -func (o *ObservedORM) SelectLatestLogByEventSigWithConfs(ctx context.Context, eventSig common.Hash, address common.Address, confs evmtypes.Confirmations) (*Log, error) { - return withObservedQuery(o, "SelectLatestLogByEventSigWithConfs", func() (*Log, error) { - return o.ORM.SelectLatestLogByEventSigWithConfs(ctx, eventSig, address, confs) - }) -} - -func (o *ObservedORM) SelectLogsWithSigs(ctx context.Context, start, end int64, address common.Address, eventSigs []common.Hash) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectLogsWithSigs", func() ([]Log, error) { - return o.ORM.SelectLogsWithSigs(ctx, start, end, address, eventSigs) - }) -} - -func (o *ObservedORM) SelectLogsCreatedAfter(ctx context.Context, address common.Address, eventSig common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectLogsCreatedAfter", func() ([]Log, error) { - return o.ORM.SelectLogsCreatedAfter(ctx, address, eventSig, after, confs) - }) -} - -func (o *ObservedORM) SelectIndexedLogs(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectIndexedLogs", func() ([]Log, error) { - return o.ORM.SelectIndexedLogs(ctx, address, eventSig, topicIndex, topicValues, confs) - }) -} - -func (o *ObservedORM) SelectIndexedLogsByBlockRange(ctx context.Context, start, end int64, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectIndexedLogsByBlockRange", func() ([]Log, error) { - return o.ORM.SelectIndexedLogsByBlockRange(ctx, start, end, address, eventSig, topicIndex, topicValues) - }) -} - -func (o *ObservedORM) SelectIndexedLogsCreatedAfter(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectIndexedLogsCreatedAfter", func() ([]Log, error) { - return o.ORM.SelectIndexedLogsCreatedAfter(ctx, address, eventSig, topicIndex, topicValues, after, confs) - }) -} - -func (o *ObservedORM) SelectIndexedLogsWithSigsExcluding(ctx context.Context, sigA, sigB common.Hash, topicIndex int, address common.Address, startBlock, endBlock int64, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectIndexedLogsWithSigsExcluding", func() ([]Log, error) { - return o.ORM.SelectIndexedLogsWithSigsExcluding(ctx, sigA, sigB, topicIndex, address, startBlock, endBlock, confs) - }) -} - -func (o *ObservedORM) SelectLogs(ctx context.Context, start, end int64, address common.Address, eventSig common.Hash) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectLogs", func() ([]Log, error) { - return o.ORM.SelectLogs(ctx, start, end, address, eventSig) - }) -} - -func (o *ObservedORM) SelectIndexedLogsByTxHash(ctx context.Context, address common.Address, eventSig common.Hash, txHash common.Hash) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectIndexedLogsByTxHash", func() ([]Log, error) { - return o.ORM.SelectIndexedLogsByTxHash(ctx, address, eventSig, txHash) - }) -} - -func (o *ObservedORM) GetBlocksRange(ctx context.Context, start int64, end int64) ([]LogPollerBlock, error) { - return withObservedQueryAndResults(o, "GetBlocksRange", func() ([]LogPollerBlock, error) { - return o.ORM.GetBlocksRange(ctx, start, end) - }) -} - -func (o *ObservedORM) SelectLatestLogEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, addresses []common.Address, eventSigs []common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectLatestLogEventSigsAddrsWithConfs", func() ([]Log, error) { - return o.ORM.SelectLatestLogEventSigsAddrsWithConfs(ctx, fromBlock, addresses, eventSigs, confs) - }) -} - -func (o *ObservedORM) SelectLatestBlockByEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) (int64, error) { - return withObservedQuery(o, "SelectLatestBlockByEventSigsAddrsWithConfs", func() (int64, error) { - return o.ORM.SelectLatestBlockByEventSigsAddrsWithConfs(ctx, fromBlock, eventSigs, addresses, confs) - }) -} - -func (o *ObservedORM) SelectLogsDataWordRange(ctx context.Context, address common.Address, eventSig common.Hash, wordIndex int, wordValueMin, wordValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectLogsDataWordRange", func() ([]Log, error) { - return o.ORM.SelectLogsDataWordRange(ctx, address, eventSig, wordIndex, wordValueMin, wordValueMax, confs) - }) -} - -func (o *ObservedORM) SelectLogsDataWordGreaterThan(ctx context.Context, address common.Address, eventSig common.Hash, wordIndex int, wordValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectLogsDataWordGreaterThan", func() ([]Log, error) { - return o.ORM.SelectLogsDataWordGreaterThan(ctx, address, eventSig, wordIndex, wordValueMin, confs) - }) -} - -func (o *ObservedORM) SelectLogsDataWordBetween(ctx context.Context, address common.Address, eventSig common.Hash, wordIndexMin int, wordIndexMax int, wordValue common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectLogsDataWordBetween", func() ([]Log, error) { - return o.ORM.SelectLogsDataWordBetween(ctx, address, eventSig, wordIndexMin, wordIndexMax, wordValue, confs) - }) -} - -func (o *ObservedORM) SelectIndexedLogsTopicGreaterThan(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectIndexedLogsTopicGreaterThan", func() ([]Log, error) { - return o.ORM.SelectIndexedLogsTopicGreaterThan(ctx, address, eventSig, topicIndex, topicValueMin, confs) - }) -} - -func (o *ObservedORM) SelectIndexedLogsTopicRange(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValueMin, topicValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - return withObservedQueryAndResults(o, "SelectIndexedLogsTopicRange", func() ([]Log, error) { - return o.ORM.SelectIndexedLogsTopicRange(ctx, address, eventSig, topicIndex, topicValueMin, topicValueMax, confs) - }) -} - -func (o *ObservedORM) FilteredLogs(ctx context.Context, filter []query.Expression, limitAndSort query.LimitAndSort, queryName string) ([]Log, error) { - return withObservedQueryAndResults(o, queryName, func() ([]Log, error) { - return o.ORM.FilteredLogs(ctx, filter, limitAndSort, queryName) - }) -} - -func withObservedQueryAndResults[T any](o *ObservedORM, queryName string, query func() ([]T, error)) ([]T, error) { - results, err := withObservedQuery(o, queryName, query) - if err == nil { - o.datasetSize. - WithLabelValues(o.chainId, queryName, string(read)). - Set(float64(len(results))) - } - return results, err -} - -func withObservedExecAndRowsAffected(o *ObservedORM, queryName string, queryType queryType, exec func() (int64, error)) (int64, error) { - queryStarted := time.Now() - rowsAffected, err := exec() - o.queryDuration. - WithLabelValues(o.chainId, queryName, string(queryType)). - Observe(float64(time.Since(queryStarted))) - - if err == nil { - o.datasetSize. - WithLabelValues(o.chainId, queryName, string(queryType)). - Set(float64(rowsAffected)) - } - - return rowsAffected, err -} - -func withObservedQuery[T any](o *ObservedORM, queryName string, query func() (T, error)) (T, error) { - queryStarted := time.Now() - defer func() { - o.queryDuration. - WithLabelValues(o.chainId, queryName, string(read)). - Observe(float64(time.Since(queryStarted))) - }() - return query() -} - -func withObservedExec(o *ObservedORM, query string, queryType queryType, exec func() error) error { - queryStarted := time.Now() - defer func() { - o.queryDuration. - WithLabelValues(o.chainId, query, string(queryType)). - Observe(float64(time.Since(queryStarted))) - }() - return exec() -} - -func trackInsertedLogsAndBlock(o *ObservedORM, logs []Log, block *LogPollerBlock, err error) { - if err != nil { - return - } - o.logsInserted. - WithLabelValues(o.chainId). - Add(float64(len(logs))) - - if block != nil { - o.blocksInserted. - WithLabelValues(o.chainId). - Inc() - } -} diff --git a/core/chains/evm/logpoller/observability_test.go b/core/chains/evm/logpoller/observability_test.go deleted file mode 100644 index 2f0155e3a6a..00000000000 --- a/core/chains/evm/logpoller/observability_test.go +++ /dev/null @@ -1,202 +0,0 @@ -package logpoller - -import ( - "fmt" - "math/big" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/testutil" - io_prometheus_client "github.com/prometheus/client_model/go" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" -) - -func TestMultipleMetricsArePublished(t *testing.T) { - ctx := testutils.Context(t) - orm := createObservedORM(t, 100) - t.Cleanup(func() { resetMetrics(*orm) }) - require.Equal(t, 0, testutil.CollectAndCount(orm.queryDuration)) - - _, _ = orm.SelectIndexedLogs(ctx, common.Address{}, common.Hash{}, 1, []common.Hash{}, 1) - _, _ = orm.SelectIndexedLogsByBlockRange(ctx, 0, 1, common.Address{}, common.Hash{}, 1, []common.Hash{}) - _, _ = orm.SelectIndexedLogsTopicGreaterThan(ctx, common.Address{}, common.Hash{}, 1, common.Hash{}, 1) - _, _ = orm.SelectIndexedLogsTopicRange(ctx, common.Address{}, common.Hash{}, 1, common.Hash{}, common.Hash{}, 1) - _, _ = orm.SelectIndexedLogsWithSigsExcluding(ctx, common.Hash{}, common.Hash{}, 1, common.Address{}, 0, 1, 1) - _, _ = orm.SelectLogsDataWordRange(ctx, common.Address{}, common.Hash{}, 0, common.Hash{}, common.Hash{}, 1) - _, _ = orm.SelectLogsDataWordGreaterThan(ctx, common.Address{}, common.Hash{}, 0, common.Hash{}, 1) - _, _ = orm.SelectLogsCreatedAfter(ctx, common.Address{}, common.Hash{}, time.Now(), 0) - _, _ = orm.SelectLatestLogByEventSigWithConfs(ctx, common.Hash{}, common.Address{}, 0) - _, _ = orm.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0, []common.Address{{}}, []common.Hash{{}}, 1) - _, _ = orm.SelectIndexedLogsCreatedAfter(ctx, common.Address{}, common.Hash{}, 1, []common.Hash{}, time.Now(), 0) - _ = orm.InsertLogs(ctx, []Log{}) - _ = orm.InsertLogsWithBlock(ctx, []Log{}, LogPollerBlock{ - BlockNumber: 1, - BlockTimestamp: time.Now(), - }) - - require.Equal(t, 13, testutil.CollectAndCount(orm.queryDuration)) - require.Equal(t, 10, testutil.CollectAndCount(orm.datasetSize)) -} - -func TestShouldPublishDurationInCaseOfError(t *testing.T) { - ctx := testutils.Context(t) - orm := createObservedORM(t, 200) - t.Cleanup(func() { resetMetrics(*orm) }) - require.Equal(t, 0, testutil.CollectAndCount(orm.queryDuration)) - - _, err := orm.SelectLatestLogByEventSigWithConfs(ctx, common.Hash{}, common.Address{}, 0) - require.Error(t, err) - - require.Equal(t, 1, testutil.CollectAndCount(orm.queryDuration)) - require.Equal(t, 1, counterFromHistogramByLabels(t, orm.queryDuration, "200", "SelectLatestLogByEventSigWithConfs", "read")) -} - -func TestMetricsAreProperlyPopulatedWithLabels(t *testing.T) { - orm := createObservedORM(t, 420) - t.Cleanup(func() { resetMetrics(*orm) }) - expectedCount := 9 - expectedSize := 2 - - for i := 0; i < expectedCount; i++ { - _, err := withObservedQueryAndResults(orm, "query", func() ([]string, error) { return []string{"value1", "value2"}, nil }) - require.NoError(t, err) - } - - require.Equal(t, expectedCount, counterFromHistogramByLabels(t, orm.queryDuration, "420", "query", "read")) - require.Equal(t, expectedSize, counterFromGaugeByLabels(orm.datasetSize, "420", "query", "read")) - - require.Equal(t, 0, counterFromHistogramByLabels(t, orm.queryDuration, "420", "other_query", "read")) - require.Equal(t, 0, counterFromHistogramByLabels(t, orm.queryDuration, "5", "query", "read")) - - require.Equal(t, 0, counterFromGaugeByLabels(orm.datasetSize, "420", "other_query", "read")) - require.Equal(t, 0, counterFromGaugeByLabels(orm.datasetSize, "5", "query", "read")) -} - -func TestNotPublishingDatasetSizeInCaseOfError(t *testing.T) { - orm := createObservedORM(t, 420) - - _, err := withObservedQueryAndResults(orm, "errorQuery", func() ([]string, error) { return nil, fmt.Errorf("error") }) - require.Error(t, err) - - require.Equal(t, 1, counterFromHistogramByLabels(t, orm.queryDuration, "420", "errorQuery", "read")) - require.Equal(t, 0, counterFromGaugeByLabels(orm.datasetSize, "420", "errorQuery", "read")) -} - -func TestMetricsAreProperlyPopulatedForWrites(t *testing.T) { - orm := createObservedORM(t, 420) - require.NoError(t, withObservedExec(orm, "execQuery", create, func() error { return nil })) - require.Error(t, withObservedExec(orm, "execQuery", create, func() error { return fmt.Errorf("error") })) - - require.Equal(t, 2, counterFromHistogramByLabels(t, orm.queryDuration, "420", "execQuery", "create")) -} - -func TestCountersAreProperlyPopulatedForWrites(t *testing.T) { - ctx := testutils.Context(t) - orm := createObservedORM(t, 420) - logs := generateRandomLogs(420, 20) - - // First insert 10 logs - require.NoError(t, orm.InsertLogs(ctx, logs[:10])) - assert.Equal(t, float64(10), testutil.ToFloat64(orm.logsInserted.WithLabelValues("420"))) - - // Insert 5 more logs with block - require.NoError(t, orm.InsertLogsWithBlock(ctx, logs[10:15], LogPollerBlock{ - BlockHash: utils.RandomBytes32(), - BlockNumber: 10, - BlockTimestamp: time.Now(), - FinalizedBlockNumber: 5, - })) - assert.Equal(t, float64(15), testutil.ToFloat64(orm.logsInserted.WithLabelValues("420"))) - assert.Equal(t, float64(1), testutil.ToFloat64(orm.blocksInserted.WithLabelValues("420"))) - - // Insert 5 more logs with block - require.NoError(t, orm.InsertLogsWithBlock(ctx, logs[15:], LogPollerBlock{ - BlockHash: utils.RandomBytes32(), - BlockNumber: 15, - BlockTimestamp: time.Now(), - FinalizedBlockNumber: 5, - })) - assert.Equal(t, float64(20), testutil.ToFloat64(orm.logsInserted.WithLabelValues("420"))) - assert.Equal(t, float64(2), testutil.ToFloat64(orm.blocksInserted.WithLabelValues("420"))) - - rowsAffected, err := orm.DeleteExpiredLogs(ctx, 3) - require.NoError(t, err) - require.Equal(t, int64(0), rowsAffected) - assert.Equal(t, 0, counterFromGaugeByLabels(orm.datasetSize, "420", "DeleteExpiredLogs", "delete")) - - rowsAffected, err = orm.DeleteBlocksBefore(ctx, 30, 0) - require.NoError(t, err) - require.Equal(t, int64(2), rowsAffected) - assert.Equal(t, 2, counterFromGaugeByLabels(orm.datasetSize, "420", "DeleteBlocksBefore", "delete")) - - // Don't update counters in case of an error - require.Error(t, orm.InsertLogsWithBlock(ctx, logs, LogPollerBlock{ - BlockHash: utils.RandomBytes32(), - BlockTimestamp: time.Now(), - })) - assert.Equal(t, float64(20), testutil.ToFloat64(orm.logsInserted.WithLabelValues("420"))) - assert.Equal(t, float64(2), testutil.ToFloat64(orm.blocksInserted.WithLabelValues("420"))) -} - -func generateRandomLogs(chainId, count int) []Log { - logs := make([]Log, count) - for i := range logs { - logs[i] = Log{ - EvmChainId: ubig.NewI(int64(chainId)), - LogIndex: int64(i + 1), - BlockHash: utils.RandomBytes32(), - BlockNumber: int64(i + 1), - BlockTimestamp: time.Now(), - Topics: [][]byte{}, - EventSig: utils.RandomBytes32(), - Address: utils.RandomAddress(), - TxHash: utils.RandomBytes32(), - Data: []byte{}, - CreatedAt: time.Now(), - } - } - return logs -} - -func createObservedORM(t *testing.T, chainId int64) *ObservedORM { - lggr := logger.Test(t) - db := testutils.NewSqlxDB(t) - return NewObservedORM(big.NewInt(chainId), db, lggr) -} - -func resetMetrics(lp ObservedORM) { - lp.queryDuration.Reset() - lp.datasetSize.Reset() - lp.logsInserted.Reset() - lp.blocksInserted.Reset() -} - -func counterFromGaugeByLabels(gaugeVec *prometheus.GaugeVec, labels ...string) int { - value := testutil.ToFloat64(gaugeVec.WithLabelValues(labels...)) - return int(value) -} - -func counterFromHistogramByLabels(t *testing.T, histogramVec *prometheus.HistogramVec, labels ...string) int { - observer, err := histogramVec.GetMetricWithLabelValues(labels...) - require.NoError(t, err) - - metricCh := make(chan prometheus.Metric, 1) - observer.(prometheus.Histogram).Collect(metricCh) - close(metricCh) - - metric := <-metricCh - pb := &io_prometheus_client.Metric{} - err = metric.Write(pb) - require.NoError(t, err) - - return int(pb.GetHistogram().GetSampleCount()) -} diff --git a/core/chains/evm/logpoller/orm.go b/core/chains/evm/logpoller/orm.go deleted file mode 100644 index f77b495558a..00000000000 --- a/core/chains/evm/logpoller/orm.go +++ /dev/null @@ -1,1163 +0,0 @@ -package logpoller - -import ( - "context" - "database/sql" - "errors" - "fmt" - "math/big" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - pkgerrors "github.com/pkg/errors" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - "github.com/smartcontractkit/chainlink-common/pkg/types/query" - - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" -) - -// ORM represents the persistent data access layer used by the log poller. At this moment, it's a bit leaky abstraction, because -// it exposes some of the database implementation details (e.g. pg.Q). Ideally it should be agnostic and could be applied to any persistence layer. -// What is more, LogPoller should not be aware of the underlying database implementation and delegate all the queries to the ORM. -type ORM interface { - InsertLogs(ctx context.Context, logs []Log) error - InsertLogsWithBlock(ctx context.Context, logs []Log, block LogPollerBlock) error - InsertFilter(ctx context.Context, filter Filter) error - - LoadFilters(ctx context.Context) (map[string]Filter, error) - DeleteFilter(ctx context.Context, name string) error - - DeleteLogsByRowID(ctx context.Context, rowIDs []uint64) (int64, error) - InsertBlock(ctx context.Context, blockHash common.Hash, blockNumber int64, blockTimestamp time.Time, finalizedBlock int64) error - DeleteBlocksBefore(ctx context.Context, end int64, limit int64) (int64, error) - DeleteLogsAndBlocksAfter(ctx context.Context, start int64) error - SelectUnmatchedLogIDs(ctx context.Context, limit int64) (ids []uint64, err error) - DeleteExpiredLogs(ctx context.Context, limit int64) (int64, error) - SelectExcessLogIDs(ctx context.Context, limit int64) (rowIDs []uint64, err error) - - GetBlocksRange(ctx context.Context, start int64, end int64) ([]LogPollerBlock, error) - SelectBlockByNumber(ctx context.Context, blockNumber int64) (*LogPollerBlock, error) - SelectBlockByHash(ctx context.Context, hash common.Hash) (*LogPollerBlock, error) - SelectLatestBlock(ctx context.Context) (*LogPollerBlock, error) - SelectOldestBlock(ctx context.Context, minAllowedBlockNumber int64) (*LogPollerBlock, error) - SelectLatestFinalizedBlock(ctx context.Context) (*LogPollerBlock, error) - - SelectLogs(ctx context.Context, start, end int64, address common.Address, eventSig common.Hash) ([]Log, error) - SelectLogsWithSigs(ctx context.Context, start, end int64, address common.Address, eventSigs []common.Hash) ([]Log, error) - SelectLogsCreatedAfter(ctx context.Context, address common.Address, eventSig common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) - SelectLatestLogByEventSigWithConfs(ctx context.Context, eventSig common.Hash, address common.Address, confs evmtypes.Confirmations) (*Log, error) - SelectLatestLogEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, addresses []common.Address, eventSigs []common.Hash, confs evmtypes.Confirmations) ([]Log, error) - SelectLatestBlockByEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) (int64, error) - SelectLogsByBlockRange(ctx context.Context, start, end int64) ([]Log, error) - - SelectIndexedLogs(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash, confs evmtypes.Confirmations) ([]Log, error) - SelectIndexedLogsByBlockRange(ctx context.Context, start, end int64, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash) ([]Log, error) - SelectIndexedLogsCreatedAfter(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) - SelectIndexedLogsTopicGreaterThan(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) - SelectIndexedLogsTopicRange(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValueMin, topicValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) - SelectIndexedLogsWithSigsExcluding(ctx context.Context, sigA, sigB common.Hash, topicIndex int, address common.Address, startBlock, endBlock int64, confs evmtypes.Confirmations) ([]Log, error) - SelectIndexedLogsByTxHash(ctx context.Context, address common.Address, eventSig common.Hash, txHash common.Hash) ([]Log, error) - SelectLogsDataWordRange(ctx context.Context, address common.Address, eventSig common.Hash, wordIndex int, wordValueMin, wordValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) - SelectLogsDataWordGreaterThan(ctx context.Context, address common.Address, eventSig common.Hash, wordIndex int, wordValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) - SelectLogsDataWordBetween(ctx context.Context, address common.Address, eventSig common.Hash, wordIndexMin int, wordIndexMax int, wordValue common.Hash, confs evmtypes.Confirmations) ([]Log, error) - - // FilteredLogs accepts chainlink-common filtering DSL. - FilteredLogs(ctx context.Context, filter []query.Expression, limitAndSort query.LimitAndSort, queryName string) ([]Log, error) -} - -type DSORM struct { - chainID *big.Int - ds sqlutil.DataSource - lggr logger.Logger -} - -var _ ORM = &DSORM{} - -// NewORM creates an DSORM scoped to chainID. -func NewORM(chainID *big.Int, ds sqlutil.DataSource, lggr logger.Logger) *DSORM { - return &DSORM{ - chainID: chainID, - ds: ds, - lggr: lggr, - } -} - -func (o *DSORM) Transact(ctx context.Context, fn func(*DSORM) error) (err error) { - return sqlutil.Transact(ctx, o.new, o.ds, nil, fn) -} - -// new returns a NewORM like o, but backed by ds. -func (o *DSORM) new(ds sqlutil.DataSource) *DSORM { return NewORM(o.chainID, ds, o.lggr) } - -// InsertBlock is idempotent to support replays. -func (o *DSORM) InsertBlock(ctx context.Context, blockHash common.Hash, blockNumber int64, blockTimestamp time.Time, finalizedBlock int64) error { - args, err := newQueryArgs(o.chainID). - withField("block_hash", blockHash). - withField("block_number", blockNumber). - withField("block_timestamp", blockTimestamp). - withField("finalized_block_number", finalizedBlock). - toArgs() - if err != nil { - return err - } - query := `INSERT INTO evm.log_poller_blocks - (evm_chain_id, block_hash, block_number, block_timestamp, finalized_block_number, created_at) - VALUES (:evm_chain_id, :block_hash, :block_number, :block_timestamp, :finalized_block_number, NOW()) - ON CONFLICT DO NOTHING` - _, err = o.ds.NamedExecContext(ctx, query, args) - return err -} - -// InsertFilter is idempotent. -// -// Each address/event pair must have a unique job id, so it may be removed when the job is deleted. -// If a second job tries to overwrite the same pair, this should fail. -func (o *DSORM) InsertFilter(ctx context.Context, filter Filter) (err error) { - topicArrays := []evmtypes.HashArray{filter.Topic2, filter.Topic3, filter.Topic4} - args, err := newQueryArgs(o.chainID). - withField("name", filter.Name). - withRetention(filter.Retention). - withMaxLogsKept(filter.MaxLogsKept). - withLogsPerBlock(filter.LogsPerBlock). - withAddressArray(filter.Addresses). - withEventSigArray(filter.EventSigs). - withTopicArrays(filter.Topic2, filter.Topic3, filter.Topic4). - toArgs() - if err != nil { - return err - } - var topicsColumns, topicsSql strings.Builder - for n, topicValues := range topicArrays { - if len(topicValues) != 0 { - topicCol := fmt.Sprintf("topic%d", n+2) - fmt.Fprintf(&topicsColumns, ", %s", topicCol) - fmt.Fprintf(&topicsSql, ",\n(SELECT unnest(:%s ::::BYTEA[]) %s) t%d", topicCol, topicCol, n+2) - } - } - // '::' has to be escaped in the query string - // https://github.com/jmoiron/sqlx/issues/91, https://github.com/jmoiron/sqlx/issues/428 - query := fmt.Sprintf(` - INSERT INTO evm.log_poller_filters - (name, evm_chain_id, retention, max_logs_kept, logs_per_block, created_at, address, event %s) - SELECT * FROM - (SELECT :name, :evm_chain_id ::::NUMERIC, :retention ::::BIGINT, :max_logs_kept ::::NUMERIC, :logs_per_block ::::NUMERIC, NOW()) x, - (SELECT unnest(:address_array ::::BYTEA[]) addr) a, - (SELECT unnest(:event_sig_array ::::BYTEA[]) ev) e - %s - ON CONFLICT (evm.f_log_poller_filter_hash(name, evm_chain_id, address, event, topic2, topic3, topic4)) - DO UPDATE SET retention=:retention ::::BIGINT, max_logs_kept=:max_logs_kept ::::NUMERIC, logs_per_block=:logs_per_block ::::NUMERIC`, - topicsColumns.String(), - topicsSql.String()) - - _, err = o.ds.NamedExecContext(ctx, query, args) - return err -} - -// DeleteFilter removes all events,address pairs associated with the Filter -func (o *DSORM) DeleteFilter(ctx context.Context, name string) error { - _, err := o.ds.ExecContext(ctx, - `DELETE FROM evm.log_poller_filters WHERE name = $1 AND evm_chain_id = $2`, - name, ubig.New(o.chainID)) - return err -} - -// LoadFilters returns all filters for this chain -func (o *DSORM) LoadFilters(ctx context.Context) (map[string]Filter, error) { - query := `SELECT name, - ARRAY_AGG(DISTINCT address)::BYTEA[] AS addresses, - ARRAY_AGG(DISTINCT event)::BYTEA[] AS event_sigs, - ARRAY_AGG(DISTINCT topic2 ORDER BY topic2) FILTER(WHERE topic2 IS NOT NULL) AS topic2, - ARRAY_AGG(DISTINCT topic3 ORDER BY topic3) FILTER(WHERE topic3 IS NOT NULL) AS topic3, - ARRAY_AGG(DISTINCT topic4 ORDER BY topic4) FILTER(WHERE topic4 IS NOT NULL) AS topic4, - MAX(logs_per_block) AS logs_per_block, - MAX(retention) AS retention, - MAX(max_logs_kept) AS max_logs_kept - FROM evm.log_poller_filters WHERE evm_chain_id = $1 - GROUP BY name` - var rows []Filter - err := o.ds.SelectContext(ctx, &rows, query, ubig.New(o.chainID)) - filters := make(map[string]Filter) - for _, filter := range rows { - filters[filter.Name] = filter - } - return filters, err -} - -func blocksQuery(clause string) string { - return fmt.Sprintf(`SELECT %s FROM evm.log_poller_blocks %s`, strings.Join(blocksFields[:], ", "), clause) -} -func logsQuery(clause string) string { - return fmt.Sprintf(`SELECT %s FROM evm.logs %s`, strings.Join(logsFields[:], ", "), clause) -} - -func logsQueryWithTablePrefix(tableAlias string, clause string) string { - var s strings.Builder - for i, field := range logsFields { - if i > 0 { - s.WriteString(", ") - } - s.WriteString(fmt.Sprintf("%s.%s", tableAlias, field)) - } - return fmt.Sprintf(`SELECT %s FROM evm.logs AS %s %s`, s.String(), tableAlias, clause) -} - -func withConfs(query string, tableAlias string, confs evmtypes.Confirmations) string { - var lastConfirmedBlock string - - var tablePrefix string - if tableAlias != "" { - tablePrefix = tableAlias + "." - } - if confs == evmtypes.Finalized { - lastConfirmedBlock = `finalized_block_number` - } else { - lastConfirmedBlock = `block_number - :confs` - } - return fmt.Sprintf(`%s %sblock_number <= ( - SELECT %s - FROM evm.log_poller_blocks - WHERE evm_chain_id = :evm_chain_id - ORDER BY block_number DESC LIMIT 1)`, query, tablePrefix, lastConfirmedBlock) -} - -func logsQueryWithConfs(clause string, confs evmtypes.Confirmations) string { - return withConfs(logsQuery(clause), "", confs) -} - -func (o *DSORM) SelectBlockByHash(ctx context.Context, hash common.Hash) (*LogPollerBlock, error) { - var b LogPollerBlock - if err := o.ds.GetContext(ctx, &b, - blocksQuery(`WHERE block_hash = $1 AND evm_chain_id = $2`), - hash.Bytes(), ubig.New(o.chainID)); err != nil { - return nil, err - } - return &b, nil -} - -func (o *DSORM) SelectBlockByNumber(ctx context.Context, n int64) (*LogPollerBlock, error) { - var b LogPollerBlock - if err := o.ds.GetContext(ctx, &b, - blocksQuery(`WHERE block_number = $1 AND evm_chain_id = $2`), n, ubig.New(o.chainID), - ); err != nil { - return nil, err - } - return &b, nil -} - -func (o *DSORM) SelectLatestBlock(ctx context.Context) (*LogPollerBlock, error) { - var b LogPollerBlock - if err := o.ds.GetContext(ctx, &b, - blocksQuery(`WHERE evm_chain_id = $1 ORDER BY block_number DESC LIMIT 1`), ubig.New(o.chainID), - ); err != nil { - return nil, err - } - return &b, nil -} - -func (o *DSORM) SelectLatestFinalizedBlock(ctx context.Context) (*LogPollerBlock, error) { - var b LogPollerBlock - if err := o.ds.GetContext(ctx, &b, - blocksQuery(`WHERE evm_chain_id = $1 AND block_number <= ( - SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = $1 ORDER BY block_number DESC LIMIT 1 - ) ORDER BY block_number DESC LIMIT 1`), ubig.New(o.chainID), - ); err != nil { - return nil, err - } - return &b, nil -} - -func (o *DSORM) SelectOldestBlock(ctx context.Context, minAllowedBlockNumber int64) (*LogPollerBlock, error) { - var b LogPollerBlock - if err := o.ds.GetContext(ctx, &b, - blocksQuery(`WHERE evm_chain_id = $1 AND block_number >= $2 ORDER BY block_number ASC LIMIT 1`), - ubig.New(o.chainID), minAllowedBlockNumber, - ); err != nil { - return nil, err - } - return &b, nil -} - -func (o *DSORM) SelectLatestLogByEventSigWithConfs(ctx context.Context, eventSig common.Hash, address common.Address, confs evmtypes.Confirmations) (*Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - query := logsQueryWithConfs( - `WHERE evm_chain_id = :evm_chain_id - AND event_sig = :event_sig - AND address = :address AND `, confs) + - `ORDER BY block_number desc, log_index DESC LIMIT 1` - var l Log - - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - if err = o.ds.GetContext(ctx, &l, query, sqlArgs...); err != nil { - return nil, err - } - return &l, nil -} - -type RangeQueryer[T comparable] struct { - chainID *ubig.Big - ds sqlutil.DataSource - query func(ctx context.Context, r *RangeQueryer[T], lower, upper int64) (rowsAffected int64, err error) - acc []T -} - -func NewRangeQueryer[T comparable](evmChainID *big.Int, ds sqlutil.DataSource, query func(ctx context.Context, r *RangeQueryer[T], lower, upper int64) (rowsAffected int64, err error)) *RangeQueryer[T] { - return &RangeQueryer[T]{ - chainID: ubig.New(evmChainID), - ds: ds, - query: query, - } -} - -// ExecPagedQuery runs a query accepting an upper limit block (end) in a fast paged way. limit is the maximum number -// of results to be returned, but it is also used to break the query up into smaller queries restricted to limit # of blocks. -// The first range of blocks will be from MIN(block_number) to MIN(block_number) + limit. The iterative process ends either once -// the limit on results is reached or block_number = end. The query will never be executed on blocks where block_number > end, and -// it will never be executed on block_number = B unless it has also been executed on all blocks with block_number < B -// r.AddResults(moreResults []T) should be called if this is a query returning results (ie, SELECT). These will be accumulated in -// r.acc and can be retrieved later with r.AllResults() -func (r *RangeQueryer[T]) ExecPagedQuery(ctx context.Context, limit, end int64) (rowsAffected int64, err error) { - if limit == 0 { - return r.query(ctx, r, 0, end) - } - - var start int64 - err = r.ds.GetContext(ctx, &start, `SELECT MIN(block_number) FROM evm.log_poller_blocks - WHERE evm_chain_id = $1`, r.chainID) - if err != nil { - if errors.Is(err, sql.ErrNoRows) { - return 0, nil - } - return 0, err - } - - // Remove up to limit blocks at a time, until we've reached the limit or removed everything eligible for deletion - var upper int64 - for lower := start; rowsAffected < limit; lower = upper + 1 { - upper = lower + limit - 1 - if upper > end { - upper = end - } - - rows, err2 := r.query(ctx, r, lower, upper) - if err2 != nil { - return rowsAffected, err2 - } - rowsAffected += rows - - if upper >= end { - break - } - } - return rowsAffected, nil -} - -func (r *RangeQueryer[T]) AddResults(moreResults []T) { - r.acc = append(r.acc, moreResults...) -} - -func (r *RangeQueryer[T]) AllResults() []T { - return r.acc -} - -// DeleteBlocksBefore delete blocks before and including end. When limit is set, it will delete at most limit blocks. -// Otherwise, it will delete all blocks at once. -func (o *DSORM) DeleteBlocksBefore(ctx context.Context, end int64, limit int64) (int64, error) { - q := NewRangeQueryer[uint64](o.chainID, o.ds, func(ctx context.Context, r *RangeQueryer[uint64], lower, upper int64) (int64, error) { - result, err := r.ds.ExecContext(ctx, `DELETE FROM evm.log_poller_blocks WHERE evm_chain_id = $1 AND block_number >= $2 AND block_number <= $3`, - r.chainID, lower, upper) - if err != nil { - return 0, err - } - return result.RowsAffected() - }) - return q.ExecPagedQuery(ctx, limit, end) -} - -func (o *DSORM) DeleteLogsAndBlocksAfter(ctx context.Context, start int64) error { - // These deletes are bounded by reorg depth, so they are - // fast and should not slow down the log readers. - return o.Transact(ctx, func(orm *DSORM) error { - // Applying upper bound filter is critical for Postgres performance (especially for evm.logs table) - // because it allows the planner to properly estimate the number of rows to be scanned. - // If not applied, these queries can become very slow. After some critical number - // of logs, Postgres will try to scan all the logs in the index by block_number. - // Latency without upper bound filter can be orders of magnitude higher for large number of logs. - _, err := o.ds.ExecContext(ctx, `DELETE FROM evm.log_poller_blocks - WHERE evm_chain_id = $1 - AND block_number >= $2 - AND block_number <= (SELECT MAX(block_number) - FROM evm.log_poller_blocks - WHERE evm_chain_id = $1)`, - ubig.New(o.chainID), start) - if err != nil { - o.lggr.Warnw("Unable to clear reorged blocks, retrying", "err", err) - return err - } - - _, err = o.ds.ExecContext(ctx, `DELETE FROM evm.logs - WHERE evm_chain_id = $1 - AND block_number >= $2 - AND block_number <= (SELECT MAX(block_number) FROM evm.logs WHERE evm_chain_id = $1)`, - ubig.New(o.chainID), start) - if err != nil { - o.lggr.Warnw("Unable to clear reorged logs, retrying", "err", err) - return err - } - return nil - }) -} - -type Exp struct { - Address common.Address - EventSig common.Hash - Expiration time.Time - TimeNow time.Time - ShouldDelete bool -} - -func (o *DSORM) SelectUnmatchedLogIDs(ctx context.Context, limit int64) (ids []uint64, err error) { - batchLogsSubQuery := `SELECT id, evm_chain_id, address, event_sig FROM evm.logs - WHERE evm_chain_id = $1 AND block_number >= $2 AND block_number <= $3` - - query := fmt.Sprintf(` - SELECT l.id FROM (%s) l LEFT JOIN ( - SELECT evm_chain_id, address, event - FROM evm.log_poller_filters - WHERE evm_chain_id = $1 - GROUP BY evm_chain_id, address, event - ) r ON l.evm_chain_id = r.evm_chain_id AND l.address = r.address AND l.event_sig = r.event - WHERE l.evm_chain_id = $1 AND r.evm_chain_id IS NULL - `, batchLogsSubQuery) - - latestBlock, err := o.SelectLatestBlock(ctx) - if err != nil { - return ids, err - } - - r := NewRangeQueryer[uint64](o.chainID, o.ds, func(ctx context.Context, r *RangeQueryer[uint64], lower, upper int64) (int64, error) { - var rowIDs []uint64 - err2 := r.ds.SelectContext(ctx, &rowIDs, query, r.chainID, lower, upper) - if err2 != nil { - return 0, err2 - } - r.AddResults(rowIDs) - return int64(len(rowIDs)), nil - }) - - _, err = r.ExecPagedQuery(ctx, limit, latestBlock.FinalizedBlockNumber) - - return r.AllResults(), err -} - -// SelectExcessLogIDs finds any logs old enough that MaxLogsKept has been exceeded for every filter they match. -func (o *DSORM) SelectExcessLogIDs(ctx context.Context, limit int64) (results []uint64, err error) { - // Roll up the filter table into 1 row per filter - withSubQuery := ` - SELECT name, - ARRAY_AGG(address) AS addresses, ARRAY_AGG(event) AS events, - MAX(max_logs_kept) AS max_logs_kept -- Should all be the same, just need MAX for GROUP BY - FROM evm.log_poller_filters WHERE evm_chain_id=$1 - GROUP BY name` - - // Count logs matching each filter in reverse order, labeling anything after the filter.max_logs_kept'th with old=true - countLogsSubQuery := ` - SELECT l.id, block_number, log_index, max_logs_kept != 0 AND - ROW_NUMBER() OVER(PARTITION BY f.name ORDER BY block_number, log_index DESC) > max_logs_kept AS old - FROM filters f JOIN evm.logs l ON - l.address = ANY(f.addresses) AND l.event_sig = ANY(f.events) - WHERE evm_chain_id = $1 AND block_number >= $2 AND block_number <= $3 - ` - - // Return all logs considered "old" by every filter they match - query := fmt.Sprintf(`WITH filters AS ( %s ) SELECT id FROM ( %s ) x GROUP BY id, block_number, log_index HAVING BOOL_AND(old)`, - withSubQuery, countLogsSubQuery) - - latestBlock, err := o.SelectLatestBlock(ctx) - if err != nil { - return results, err - } - - r := NewRangeQueryer[uint64](o.chainID, o.ds, func(ctx context.Context, r *RangeQueryer[uint64], lower, upper int64) (int64, error) { - var rowIDs []uint64 - err = r.ds.SelectContext(ctx, &rowIDs, query, r.chainID, lower, upper) - if err != nil { - return 0, err - } - r.AddResults(rowIDs) - return int64(len(rowIDs)), err - }) - _, err = r.ExecPagedQuery(ctx, limit, latestBlock.FinalizedBlockNumber) - - return r.AllResults(), err -} - -// DeleteExpiredLogs removes any logs which either: -// - don't match any currently registered filters, or -// - have a timestamp older than any matching filter's retention, UNLESS there is at -// least one matching filter with retention=0 -func (o *DSORM) DeleteExpiredLogs(ctx context.Context, limit int64) (int64, error) { - limitClause := "" - if limit > 0 { - limitClause = fmt.Sprintf("LIMIT %d", limit) - } - - query := fmt.Sprintf(` - WITH rows_to_delete AS ( - SELECT l.id - FROM evm.logs l JOIN ( - SELECT evm_chain_id, address, event, MAX(retention) AS retention - FROM evm.log_poller_filters - WHERE evm_chain_id = $1 - GROUP BY evm_chain_id, address, event - HAVING MIN(retention) > 0 - ) r ON l.evm_chain_id = r.evm_chain_id AND l.address = r.address AND l.event_sig = r.event AND - l.block_timestamp <= STATEMENT_TIMESTAMP() - (r.retention / 10^9 * interval '1 second') %s - ) DELETE FROM evm.logs WHERE id IN (SELECT id FROM rows_to_delete)`, limitClause) - result, err := o.ds.ExecContext(ctx, query, ubig.New(o.chainID)) - if err != nil { - return 0, err - } - return result.RowsAffected() -} - -// InsertLogs is idempotent to support replays. -func (o *DSORM) InsertLogs(ctx context.Context, logs []Log) error { - if err := o.validateLogs(logs); err != nil { - return err - } - return o.Transact(ctx, func(orm *DSORM) error { - return orm.insertLogsWithinTx(ctx, logs, orm.ds) - }) -} - -func (o *DSORM) InsertLogsWithBlock(ctx context.Context, logs []Log, block LogPollerBlock) error { - // Optimization, don't open TX when there is only a block to be persisted - if len(logs) == 0 { - return o.InsertBlock(ctx, block.BlockHash, block.BlockNumber, block.BlockTimestamp, block.FinalizedBlockNumber) - } - - if err := o.validateLogs(logs); err != nil { - return err - } - - // Block and logs goes with the same TX to ensure atomicity - return o.Transact(ctx, func(orm *DSORM) error { - err := orm.InsertBlock(ctx, block.BlockHash, block.BlockNumber, block.BlockTimestamp, block.FinalizedBlockNumber) - if err != nil { - return err - } - return orm.insertLogsWithinTx(ctx, logs, orm.ds) - }) -} - -func (o *DSORM) insertLogsWithinTx(ctx context.Context, logs []Log, tx sqlutil.DataSource) error { - batchInsertSize := 4000 - for i := 0; i < len(logs); i += batchInsertSize { - start, end := i, i+batchInsertSize - if end > len(logs) { - end = len(logs) - } - - query := `INSERT INTO evm.logs - (evm_chain_id, log_index, block_hash, block_number, block_timestamp, address, event_sig, topics, tx_hash, data, created_at) - VALUES - (:evm_chain_id, :log_index, :block_hash, :block_number, :block_timestamp, :address, :event_sig, :topics, :tx_hash, :data, NOW()) - ON CONFLICT DO NOTHING` - - _, err := tx.NamedExecContext(ctx, query, logs[start:end]) - if err != nil { - if pkgerrors.Is(err, context.DeadlineExceeded) && batchInsertSize > 500 { - // In case of DB timeouts, try to insert again with a smaller batch upto a limit - batchInsertSize /= 2 - i -= batchInsertSize // counteract +=batchInsertSize on next loop iteration - continue - } - return err - } - } - return nil -} - -func (o *DSORM) validateLogs(logs []Log) error { - for _, log := range logs { - if o.chainID.Cmp(log.EvmChainId.ToInt()) != 0 { - return pkgerrors.Errorf("invalid chainID in log got %v want %v", log.EvmChainId.ToInt(), o.chainID) - } - } - return nil -} - -func (o *DSORM) SelectLogsByBlockRange(ctx context.Context, start, end int64) ([]Log, error) { - args, err := newQueryArgs(o.chainID). - withStartBlock(start). - withEndBlock(end). - toArgs() - if err != nil { - return nil, err - } - - query := logsQuery(` - WHERE evm_chain_id = :evm_chain_id - AND block_number >= :start_block - AND block_number <= :end_block - ORDER BY block_number, log_index`) - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - err = o.ds.SelectContext(ctx, &logs, query, sqlArgs...) - if err != nil { - return nil, err - } - return logs, nil -} - -// SelectLogs finds the logs in a given block range. -func (o *DSORM) SelectLogs(ctx context.Context, start, end int64, address common.Address, eventSig common.Hash) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withStartBlock(start). - withEndBlock(end). - toArgs() - if err != nil { - return nil, err - } - - query := logsQuery(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND block_number >= :start_block - AND block_number <= :end_block - ORDER BY block_number, log_index`) - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - err = o.ds.SelectContext(ctx, &logs, query, sqlArgs...) - if err != nil { - return nil, err - } - return logs, nil -} - -// SelectLogsCreatedAfter finds logs created after some timestamp. -func (o *DSORM) SelectLogsCreatedAfter(ctx context.Context, address common.Address, eventSig common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withBlockTimestampAfter(after). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs( - `WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND block_timestamp > :block_timestamp_after AND `, confs) + - `ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err = o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -// SelectLogsWithSigs finds the logs in the given block range with the given event signatures -// emitted from the given address. -func (o *DSORM) SelectLogsWithSigs(ctx context.Context, start, end int64, address common.Address, eventSigs []common.Hash) (logs []Log, err error) { - args, err := newQueryArgs(o.chainID). - withAddress(address). - withEventSigArray(eventSigs). - withStartBlock(start). - withEndBlock(end). - toArgs() - if err != nil { - return nil, err - } - - query := logsQuery(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = ANY(:event_sig_array) - AND block_number BETWEEN :start_block AND :end_block - ORDER BY block_number, log_index`) - - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - err = o.ds.SelectContext(ctx, &logs, query, sqlArgs...) - if pkgerrors.Is(err, sql.ErrNoRows) { - return nil, nil - } - return logs, err -} - -func (o *DSORM) GetBlocksRange(ctx context.Context, start int64, end int64) ([]LogPollerBlock, error) { - args, err := newQueryArgs(o.chainID). - withStartBlock(start). - withEndBlock(end). - toArgs() - if err != nil { - return nil, err - } - - query := blocksQuery(` - WHERE block_number >= :start_block - AND block_number <= :end_block - AND evm_chain_id = :evm_chain_id - ORDER BY block_number ASC`) - - var blocks []LogPollerBlock - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - err = o.ds.SelectContext(ctx, &blocks, query, sqlArgs...) - if err != nil { - return nil, err - } - return blocks, nil -} - -// SelectLatestLogEventSigsAddrsWithConfs finds the latest log by (address, event) combination that matches a list of Addresses and list of events -func (o *DSORM) SelectLatestLogEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, addresses []common.Address, eventSigs []common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgs(o.chainID). - withAddressArray(addresses). - withEventSigArray(eventSigs). - withStartBlock(fromBlock). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(`WHERE id IN ( - SELECT LAST_VALUE(id) OVER( - PARTITION BY evm_chain_id, address, event_sig - ORDER BY block_number, log_index - ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) FROM evm.logs - WHERE evm_chain_id = :evm_chain_id - AND event_sig = ANY(:event_sig_array) - AND address = ANY(:address_array) - AND block_number >= :start_block AND `, confs) + ` - )` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err = o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, pkgerrors.Wrap(err, "failed to execute query") - } - return logs, nil -} - -// SelectLatestBlockByEventSigsAddrsWithConfs finds the latest block number that matches a list of Addresses and list of events. It returns 0 if there is no matching block -func (o *DSORM) SelectLatestBlockByEventSigsAddrsWithConfs(ctx context.Context, fromBlock int64, eventSigs []common.Hash, addresses []common.Address, confs evmtypes.Confirmations) (int64, error) { - args, err := newQueryArgs(o.chainID). - withEventSigArray(eventSigs). - withAddressArray(addresses). - withStartBlock(fromBlock). - withConfs(confs). - toArgs() - if err != nil { - return 0, err - } - - query := withConfs(`SELECT COALESCE(MAX(block_number), 0) FROM evm.logs - WHERE evm_chain_id = :evm_chain_id - AND event_sig = ANY(:event_sig_array) - AND address = ANY(:address_array) - AND block_number >= :start_block AND `, "", confs) - - var blockNumber int64 - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return 0, err - } - - if err = o.ds.GetContext(ctx, &blockNumber, query, sqlArgs...); err != nil { - return 0, err - } - return blockNumber, nil -} - -func (o *DSORM) SelectLogsDataWordRange(ctx context.Context, address common.Address, eventSig common.Hash, wordIndex int, wordValueMin, wordValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withWordIndex(wordIndex). - withWordValueMin(wordValueMin). - withWordValueMax(wordValueMax). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(`WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND substring(data from 32*:word_index+1 for 32) >= :word_value_min - AND substring(data from 32*:word_index+1 for 32) <= :word_value_max AND `, confs) + - `ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err := o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -func (o *DSORM) SelectLogsDataWordGreaterThan(ctx context.Context, address common.Address, eventSig common.Hash, wordIndex int, wordValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withWordIndex(wordIndex). - withWordValueMin(wordValueMin). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND substring(data from 32*:word_index+1 for 32) >= :word_value_min AND `, confs) + - `ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err := o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -func (o *DSORM) SelectLogsDataWordBetween(ctx context.Context, address common.Address, eventSig common.Hash, wordIndexMin int, wordIndexMax int, wordValue common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withWordIndexMin(wordIndexMin). - withWordIndexMax(wordIndexMax). - withWordValue(wordValue). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND substring(data from 32*:word_index_min+1 for 32) <= :word_value - AND substring(data from 32*:word_index_max+1 for 32) >= :word_value AND `, confs) + - `ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err := o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -func (o *DSORM) SelectIndexedLogsTopicGreaterThan(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValueMin common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withTopicIndex(topicIndex). - withTopicValueMin(topicValueMin). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(`WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND topics[:topic_index] >= :topic_value_min AND `, confs) + - `ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err := o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -func (o *DSORM) SelectIndexedLogsTopicRange(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValueMin, topicValueMax common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withTopicIndex(topicIndex). - withTopicValueMin(topicValueMin). - withTopicValueMax(topicValueMax). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(`WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND topics[:topic_index] >= :topic_value_min - AND topics[:topic_index] <= :topic_value_max AND `, confs) + - `ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err := o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -func (o *DSORM) SelectIndexedLogs(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withTopicIndex(topicIndex). - withTopicValues(topicValues). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND topics[:topic_index] = ANY(:topic_values) AND `, confs) + - `ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err := o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -// SelectIndexedLogsByBlockRange finds the indexed logs in a given block range. -func (o *DSORM) SelectIndexedLogsByBlockRange(ctx context.Context, start, end int64, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withTopicIndex(topicIndex). - withTopicValues(topicValues). - withStartBlock(start). - withEndBlock(end). - toArgs() - if err != nil { - return nil, err - } - - query := logsQuery(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND topics[:topic_index] = ANY(:topic_values) - AND block_number >= :start_block - AND block_number <= :end_block - ORDER BY block_number, log_index`) - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - err = o.ds.SelectContext(ctx, &logs, query, sqlArgs...) - if err != nil { - return nil, err - } - return logs, nil -} - -func (o *DSORM) SelectIndexedLogsCreatedAfter(ctx context.Context, address common.Address, eventSig common.Hash, topicIndex int, topicValues []common.Hash, after time.Time, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgsForEvent(o.chainID, address, eventSig). - withBlockTimestampAfter(after). - withConfs(confs). - withTopicIndex(topicIndex). - withTopicValues(topicValues). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND topics[:topic_index] = ANY(:topic_values) - AND block_timestamp > :block_timestamp_after AND `, confs) + - `ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err := o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -func (o *DSORM) SelectIndexedLogsByTxHash(ctx context.Context, address common.Address, eventSig common.Hash, txHash common.Hash) ([]Log, error) { - args, err := newQueryArgs(o.chainID). - withTxHash(txHash). - withAddress(address). - withEventSig(eventSig). - toArgs() - if err != nil { - return nil, err - } - - query := logsQuery(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :event_sig - AND tx_hash = :tx_hash - ORDER BY block_number, log_index`) - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - err = o.ds.SelectContext(ctx, &logs, query, sqlArgs...) - if err != nil { - return nil, err - } - return logs, nil -} - -// SelectIndexedLogsWithSigsExcluding query's for logs that have signature A and exclude logs that have a corresponding signature B, matching is done based on the topic index both logs should be inside the block range and have the minimum number of evmtypes.Confirmations -func (o *DSORM) SelectIndexedLogsWithSigsExcluding(ctx context.Context, sigA, sigB common.Hash, topicIndex int, address common.Address, startBlock, endBlock int64, confs evmtypes.Confirmations) ([]Log, error) { - args, err := newQueryArgs(o.chainID). - withAddress(address). - withTopicIndex(topicIndex). - withStartBlock(startBlock). - withEndBlock(endBlock). - withField("sigA", sigA). - withField("sigB", sigB). - withConfs(confs). - toArgs() - if err != nil { - return nil, err - } - - query := logsQueryWithConfs(` - WHERE evm_chain_id = :evm_chain_id - AND address = :address - AND event_sig = :sigA - AND block_number BETWEEN :start_block AND :end_block AND `, confs) + - ` EXCEPT ` + - withConfs(logsQueryWithTablePrefix("a", ` - INNER JOIN evm.logs AS b - ON a.evm_chain_id = b.evm_chain_id - AND a.address = b.address - AND a.topics[:topic_index] = b.topics[:topic_index] - AND a.event_sig = :sigA - AND b.event_sig = :sigB - AND b.block_number BETWEEN :start_block AND :end_block - AND `), "b", confs) + - ` ORDER BY block_number, log_index` - - var logs []Log - query, sqlArgs, err := o.ds.BindNamed(query, args) - if err != nil { - return nil, err - } - - if err := o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - return logs, nil -} - -func (o *DSORM) FilteredLogs(ctx context.Context, filter []query.Expression, limitAndSort query.LimitAndSort, _ string) ([]Log, error) { - qs, args, err := (&pgDSLParser{}).buildQuery(o.chainID, filter, limitAndSort) - if err != nil { - return nil, err - } - - values, err := args.toArgs() - if err != nil { - return nil, err - } - - query, sqlArgs, err := o.ds.BindNamed(qs, values) - if err != nil { - return nil, err - } - - var logs []Log - if err = o.ds.SelectContext(ctx, &logs, query, sqlArgs...); err != nil { - return nil, err - } - - return logs, nil -} - -// DeleteLogsByRowID accepts a list of log row id's to delete -func (o *DSORM) DeleteLogsByRowID(ctx context.Context, rowIDs []uint64) (int64, error) { - result, err := o.ds.ExecContext(ctx, `DELETE FROM evm.logs WHERE id = ANY($1)`, rowIDs) - if err != nil { - return 0, err - } - return result.RowsAffected() -} diff --git a/core/chains/evm/logpoller/orm_test.go b/core/chains/evm/logpoller/orm_test.go deleted file mode 100644 index fc5b6502cc9..00000000000 --- a/core/chains/evm/logpoller/orm_test.go +++ /dev/null @@ -1,2447 +0,0 @@ -package logpoller_test - -import ( - "bytes" - "context" - "database/sql" - "errors" - "fmt" - "math" - "math/big" - "strconv" - "testing" - "time" - - "github.com/ethereum/go-ethereum/common" - pkgerrors "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink-common/pkg/types/query" - "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" - - "github.com/smartcontractkit/chainlink-integrations/evm/testutils" - "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" -) - -type block struct { - number int64 - hash common.Hash - timestamp int64 -} - -var lpOpts = logpoller.Opts{ - FinalityDepth: 2, - BackfillBatchSize: 3, - RpcBatchSize: 2, - KeepFinalizedBlocksDepth: 1000, -} - -func GenLog(chainID *big.Int, logIndex int64, blockNum int64, blockHash string, topic1 []byte, address common.Address) logpoller.Log { - return GenLogWithTimestamp(chainID, logIndex, blockNum, blockHash, topic1, address, time.Now()) -} - -func GenLogWithTimestamp(chainID *big.Int, logIndex int64, blockNum int64, blockHash string, topic1 []byte, address common.Address, blockTimestamp time.Time) logpoller.Log { - return logpoller.Log{ - EvmChainId: ubig.New(chainID), - LogIndex: logIndex, - BlockHash: common.HexToHash(blockHash), - BlockNumber: blockNum, - EventSig: common.BytesToHash(topic1), - Topics: [][]byte{topic1, topic1}, - Address: address, - TxHash: common.HexToHash("0x1234"), - Data: append([]byte("hello "), byte(blockNum)), - BlockTimestamp: blockTimestamp, - } -} - -func GenLogWithData(chainID *big.Int, address common.Address, eventSig common.Hash, logIndex int64, blockNum int64, data []byte) logpoller.Log { - return logpoller.Log{ - EvmChainId: ubig.New(chainID), - LogIndex: logIndex, - BlockHash: utils.RandomBytes32(), - BlockNumber: blockNum, - EventSig: eventSig, - Topics: [][]byte{}, - Address: address, - TxHash: utils.RandomBytes32(), - Data: data, - BlockTimestamp: time.Now(), - } -} - -func TestLogPoller_Batching(t *testing.T) { - t.Parallel() - ctx := testutils.Context(t) - th := SetupTH(t, lpOpts) - var logs []logpoller.Log - // Inserts are limited to 65535 parameters. A log being 10 parameters this results in - // a maximum of 6553 log inserts per tx. As inserting more than 6553 would result in - // an error without batching, this test makes sure batching is enabled. - for i := 0; i < 15000; i++ { - logs = append(logs, GenLog(th.ChainID, int64(i+1), 1, "0x3", EmitterABI.Events["Log1"].ID.Bytes(), th.EmitterAddress1)) - } - require.NoError(t, th.ORM.InsertLogs(ctx, logs)) - lgs, err := th.ORM.SelectLogsByBlockRange(ctx, 1, 1) - require.NoError(t, err) - // Make sure all logs are inserted - require.Equal(t, len(logs), len(lgs)) -} - -func TestORM_GetBlocks_From_Range(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - ctx := testutils.Context(t) - // Insert many blocks and read them back together - blocks := []block{ - { - number: 10, - hash: common.HexToHash("0x111"), - timestamp: 0, - }, - { - number: 11, - hash: common.HexToHash("0x112"), - timestamp: 10, - }, - { - number: 12, - hash: common.HexToHash("0x113"), - timestamp: 20, - }, - { - number: 13, - hash: common.HexToHash("0x114"), - timestamp: 30, - }, - { - number: 14, - hash: common.HexToHash("0x115"), - timestamp: 40, - }, - } - for _, b := range blocks { - require.NoError(t, o1.InsertBlock(ctx, b.hash, b.number, time.Unix(b.timestamp, 0).UTC(), 0)) - } - - var blockNumbers []int64 - for _, b := range blocks { - blockNumbers = append(blockNumbers, b.number) - } - - lpBlocks, err := o1.GetBlocksRange(ctx, blockNumbers[0], blockNumbers[len(blockNumbers)-1]) - require.NoError(t, err) - assert.Len(t, lpBlocks, len(blocks)) - - // Ignores non-existent block - lpBlocks2, err := o1.GetBlocksRange(ctx, blockNumbers[0], 15) - require.NoError(t, err) - assert.Len(t, lpBlocks2, len(blocks)) - - // Only non-existent blocks - lpBlocks3, err := o1.GetBlocksRange(ctx, 15, 15) - require.NoError(t, err) - assert.Len(t, lpBlocks3, 0) -} - -func TestORM_GetBlocks_From_Range_Recent_Blocks(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - ctx := testutils.Context(t) - // Insert many blocks and read them back together - var recentBlocks []block - for i := 1; i <= 256; i++ { - recentBlocks = append(recentBlocks, block{number: int64(i), hash: common.HexToHash(fmt.Sprintf("0x%d", i))}) - } - for _, b := range recentBlocks { - require.NoError(t, o1.InsertBlock(ctx, b.hash, b.number, time.Now(), 0)) - } - - var blockNumbers []int64 - for _, b := range recentBlocks { - blockNumbers = append(blockNumbers, b.number) - } - - lpBlocks, err := o1.GetBlocksRange(ctx, blockNumbers[0], blockNumbers[len(blockNumbers)-1]) - require.NoError(t, err) - assert.Len(t, lpBlocks, len(recentBlocks)) - - // Ignores non-existent block - lpBlocks2, err := o1.GetBlocksRange(ctx, blockNumbers[0], 257) - require.NoError(t, err) - assert.Len(t, lpBlocks2, len(recentBlocks)) - - // Only non-existent blocks - lpBlocks3, err := o1.GetBlocksRange(ctx, 257, 257) - require.NoError(t, err) - assert.Len(t, lpBlocks3, 0) -} - -func TestORM(t *testing.T) { - t.Parallel() - th := SetupTH(t, lpOpts) - o1 := th.ORM - o2 := th.ORM2 - ctx := testutils.Context(t) - // Insert and read back a block. - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1234"), 10, time.Now(), 0)) - b, err := o1.SelectBlockByHash(ctx, common.HexToHash("0x1234")) - require.NoError(t, err) - assert.Equal(t, b.BlockNumber, int64(10)) - assert.Equal(t, b.BlockHash.Bytes(), common.HexToHash("0x1234").Bytes()) - assert.Equal(t, b.EvmChainId.String(), th.ChainID.String()) - - // Insert blocks from a different chain - require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1234"), 11, time.Now(), 0)) - require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1235"), 12, time.Now(), 0)) - b2, err := o2.SelectBlockByHash(ctx, common.HexToHash("0x1234")) - require.NoError(t, err) - assert.Equal(t, b2.BlockNumber, int64(11)) - assert.Equal(t, b2.BlockHash.Bytes(), common.HexToHash("0x1234").Bytes()) - assert.Equal(t, b2.EvmChainId.String(), th.ChainID2.String()) - - latest, err := o1.SelectLatestBlock(ctx) - require.NoError(t, err) - assert.Equal(t, int64(10), latest.BlockNumber) - - latest, err = o2.SelectLatestBlock(ctx) - require.NoError(t, err) - assert.Equal(t, int64(12), latest.BlockNumber) - - // Delete a block (only 10 on chain). - require.NoError(t, o1.DeleteLogsAndBlocksAfter(ctx, 10)) - _, err = o1.SelectBlockByHash(ctx, common.HexToHash("0x1234")) - require.Error(t, err) - assert.True(t, pkgerrors.Is(err, sql.ErrNoRows)) - - // Delete blocks from another chain. - require.NoError(t, o2.DeleteLogsAndBlocksAfter(ctx, 11)) - _, err = o2.SelectBlockByHash(ctx, common.HexToHash("0x1234")) - require.Error(t, err) - assert.True(t, pkgerrors.Is(err, sql.ErrNoRows)) - // Delete blocks after should also delete block 12. - _, err = o2.SelectBlockByHash(ctx, common.HexToHash("0x1235")) - require.Error(t, err) - assert.True(t, pkgerrors.Is(err, sql.ErrNoRows)) - - // Should be able to insert and read back a log. - topic := common.HexToHash("0x1599") - topic2 := common.HexToHash("0x1600") - require.NoError(t, o1.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 1, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(10), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1234"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 2, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(11), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1234"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 3, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(12), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1235"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 4, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(13), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1235"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 5, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(14), - EventSig: topic2, - Topics: [][]byte{topic2[:]}, - Address: common.HexToAddress("0x1234"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello2"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 6, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(15), - EventSig: topic2, - Topics: [][]byte{topic2[:]}, - Address: common.HexToAddress("0x1235"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello2"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 7, - BlockHash: common.HexToHash("0x1237"), - BlockNumber: int64(16), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1236"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello short retention"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 7, - BlockHash: common.HexToHash("0x1239"), - BlockNumber: int64(17), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1236"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello2 short retention"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 8, - BlockHash: common.HexToHash("0x1239"), - BlockNumber: int64(17), - EventSig: topic2, - Topics: [][]byte{topic2[:]}, - Address: common.HexToAddress("0x1236"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello2 long retention"), - BlockTimestamp: time.Now(), - }, - })) - - // Insert a couple logs on a different chain, to make sure - // these aren't affected by any operations on the chain LogPoller - // is managing. - require.NoError(t, o2.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: ubig.New(th.ChainID2), - LogIndex: 8, - BlockHash: common.HexToHash("0x1238"), - BlockNumber: int64(17), - EventSig: topic2, - Topics: [][]byte{topic2[:]}, - Address: common.HexToAddress("0x1236"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("same log on unrelated chain"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID2), - LogIndex: 9, - BlockHash: common.HexToHash("0x1999"), - BlockNumber: int64(18), - EventSig: topic, - Topics: [][]byte{topic[:], topic2[:]}, - Address: common.HexToAddress("0x5555"), - TxHash: common.HexToHash("0x1543"), - Data: []byte("different log on unrelated chain"), - BlockTimestamp: time.Now(), - }, - })) - - logs, err := o1.SelectLogsByBlockRange(ctx, 1, 17) - require.NoError(t, err) - require.Len(t, logs, 9) - - logs, err = o1.SelectLogsByBlockRange(ctx, 10, 10) - require.NoError(t, err) - require.Equal(t, 1, len(logs)) - assert.Equal(t, []byte("hello"), logs[0].Data) - - logs, err = o1.SelectLogs(ctx, 1, 1, common.HexToAddress("0x1234"), topic) - require.NoError(t, err) - assert.Equal(t, 0, len(logs)) - logs, err = o1.SelectLogs(ctx, 10, 10, common.HexToAddress("0x1234"), topic) - require.NoError(t, err) - require.Equal(t, 1, len(logs)) - - // With no blocks, should be an error - _, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 0) - require.Error(t, err) - require.True(t, pkgerrors.Is(err, sql.ErrNoRows)) - // With block 10, only 0 confs should work - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1234"), 10, time.Now(), 0)) - log, err := o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 0) - require.NoError(t, err) - assert.Equal(t, int64(10), log.BlockNumber) - _, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 1) - require.Error(t, err) - assert.True(t, pkgerrors.Is(err, sql.ErrNoRows)) - // With block 12, anything <=2 should work - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1234"), 11, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1235"), 12, time.Now(), 0)) - _, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 0) - require.NoError(t, err) - _, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 1) - require.NoError(t, err) - _, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 2) - require.NoError(t, err) - _, err = o1.SelectLatestLogByEventSigWithConfs(ctx, topic, common.HexToAddress("0x1234"), 3) - require.Error(t, err) - assert.True(t, pkgerrors.Is(err, sql.ErrNoRows)) - - // Required for confirmations to work - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1234"), 13, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1235"), 14, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1236"), 15, time.Now(), 0)) - - // Latest log for topic for addr "0x1234" is @ block 11 - lgs, err := o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234")}, []common.Hash{topic}, 0) - require.NoError(t, err) - - require.Equal(t, 1, len(lgs)) - require.Equal(t, int64(11), lgs[0].BlockNumber) - - // should return two entries one for each address with the latest update - lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic}, 0) - require.NoError(t, err) - require.Equal(t, 2, len(lgs)) - - // should return two entries one for each topic for addr 0x1234 - lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234")}, []common.Hash{topic, topic2}, 0) - require.NoError(t, err) - require.Equal(t, 2, len(lgs)) - - // should return 4 entries one for each (address,topic) combination - lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 0) - require.NoError(t, err) - require.Equal(t, 4, len(lgs)) - - // should return 3 entries of logs with atleast 1 confirmation - lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 1) - require.NoError(t, err) - require.Equal(t, 3, len(lgs)) - - // should return 2 entries of logs with atleast 2 confirmation - lgs, err = o1.SelectLatestLogEventSigsAddrsWithConfs(ctx, 0 /* startBlock */, []common.Address{common.HexToAddress("0x1234"), common.HexToAddress("0x1235")}, []common.Hash{topic, topic2}, 2) - require.NoError(t, err) - require.Equal(t, 2, len(lgs)) - - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1237"), 16, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1238"), 17, time.Now(), 17)) - - filter0 := logpoller.Filter{ - Name: "permanent retention filter", - Addresses: []common.Address{common.HexToAddress("0x1234")}, - EventSigs: types.HashArray{topic, topic2}, - } - - filter12 := logpoller.Filter{ // retain both topic1 and topic2 on contract3 for at least 1ms - Name: "short retention filter", - Addresses: []common.Address{common.HexToAddress("0x1236")}, - EventSigs: types.HashArray{topic, topic2}, - Retention: time.Millisecond, - } - filter2 := logpoller.Filter{ // retain topic2 on contract3 for at least 1 hour - Name: "long retention filter", - Addresses: []common.Address{common.HexToAddress("0x1236")}, - EventSigs: types.HashArray{topic2}, - Retention: time.Hour, - } - - // Test inserting filters and reading them back - require.NoError(t, o1.InsertFilter(ctx, filter0)) - require.NoError(t, o1.InsertFilter(ctx, filter12)) - require.NoError(t, o1.InsertFilter(ctx, filter2)) - - filters, err := o1.LoadFilters(ctx) - require.NoError(t, err) - require.Len(t, filters, 3) - assert.Equal(t, filter0, filters["permanent retention filter"]) - assert.Equal(t, filter12, filters["short retention filter"]) - assert.Equal(t, filter2, filters["long retention filter"]) - - latest, err = o1.SelectLatestBlock(ctx) - require.NoError(t, err) - require.Equal(t, int64(17), latest.BlockNumber) - logs, err = o1.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber) - require.NoError(t, err) - require.Len(t, logs, 9) - - // Delete expired logs with page limit - time.Sleep(2 * time.Millisecond) // just in case we haven't reached the end of the 1ms retention period - deleted, err := o1.DeleteExpiredLogs(ctx, 1) - require.NoError(t, err) - assert.Equal(t, int64(1), deleted) - - // Delete expired logs without page limit - deleted, err = o1.DeleteExpiredLogs(ctx, 0) - require.NoError(t, err) - assert.Equal(t, int64(1), deleted) - - // Select unmatched logs with page limit - ids, err := o1.SelectUnmatchedLogIDs(ctx, 2) - require.NoError(t, err) - assert.Len(t, ids, 2) - - // Select unmatched logs without page limit - ids, err = o1.SelectUnmatchedLogIDs(ctx, 0) - require.NoError(t, err) - assert.Len(t, ids, 3) - - // Delete logs by row id - deleted, err = o1.DeleteLogsByRowID(ctx, ids) - require.NoError(t, err) - assert.Equal(t, int64(3), deleted) - - // Ensure that both of the logs from the second chain are still there - logs, err = o2.SelectLogs(ctx, 0, 100, common.HexToAddress("0x1236"), topic2) - require.NoError(t, err) - assert.Len(t, logs, 1) - logs, err = o2.SelectLogs(ctx, 0, 100, common.HexToAddress("0x5555"), topic) - require.NoError(t, err) - assert.Len(t, logs, 1) - - logs, err = o1.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber) - require.NoError(t, err) - // The only log which should be deleted is the one which matches filter1 (ret=1ms) but not filter12 (ret=1 hour) - // Importantly, it shouldn't delete any logs matching only filter0 (ret=0 meaning permanent retention). Anything - // matching filter12 should be kept regardless of what other filters it matches. - assert.Len(t, logs, 4) - - // Delete logs after should delete all logs. - err = o1.DeleteLogsAndBlocksAfter(ctx, 1) - require.NoError(t, err) - logs, err = o1.SelectLogsByBlockRange(ctx, 1, latest.BlockNumber) - require.NoError(t, err) - assert.Zero(t, len(logs)) -} - -func TestORM_SelectExcessLogs(t *testing.T) { - t.Parallel() - th := SetupTH(t, lpOpts) - o1 := th.ORM - o2 := th.ORM2 - ctx := testutils.Context(t) - - topic := common.HexToHash("0x1599") - topic2 := common.HexToHash("0x1600") - - blockHashes := []common.Hash{common.HexToHash("0x1234"), common.HexToHash("0x1235"), common.HexToHash("0x1236")} - - // Insert blocks for active chain - for i := int64(0); i < 3; i++ { - blockNumber := 10 + i - require.NoError(t, o1.InsertBlock(ctx, blockHashes[i], blockNumber, time.Now(), blockNumber)) - b1, err := o1.SelectBlockByHash(ctx, blockHashes[i]) - require.NoError(t, err) - require.Equal(t, blockNumber, b1.BlockNumber) - } - - // Insert block from a different chain - require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1234"), 17, time.Now(), 17)) - b, err := o2.SelectBlockByHash(ctx, common.HexToHash("0x1234")) - require.NoError(t, err) - require.Equal(t, int64(17), b.BlockNumber) - - for i := int64(0); i < 7; i++ { - require.NoError(t, o1.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: i, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(10), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1234"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: i, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(11), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1235"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello"), - BlockTimestamp: time.Now(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: i, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(12), - EventSig: topic2, - Topics: [][]byte{topic2[:]}, - Address: common.HexToAddress("0x1235"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello"), - BlockTimestamp: time.Now(), - }, - })) - } - - logs, err := o1.SelectLogsByBlockRange(ctx, 1, 12) - require.NoError(t, err) - require.Len(t, logs, 21) - - // Insert a log on a different chain, to make sure - // it's not affected by any operations on the chain LogPoller - // is managing. - require.NoError(t, o2.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: ubig.New(th.ChainID2), - LogIndex: 8, - BlockHash: common.HexToHash("0x1238"), - BlockNumber: int64(17), - EventSig: topic2, - Topics: [][]byte{topic2[:]}, - Address: common.HexToAddress("0x1236"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("same log on unrelated chain"), - BlockTimestamp: time.Now(), - }, - })) - - logs, err = o2.SelectLogsByBlockRange(ctx, 1, 17) - require.NoError(t, err) - require.Len(t, logs, 1) - - filter1 := logpoller.Filter{ - Name: "MaxLogsKept = 0 (addr 1234 topic1)", - Addresses: []common.Address{common.HexToAddress("0x1234")}, - EventSigs: types.HashArray{topic}, - MaxLogsKept: 0, - } - - filter12 := logpoller.Filter{ // retain both topic1 and topic2 on contract3 for at least 1ms - Name: "MaxLogsKept = 1 (addr 1235 topic1 & topic2)", - Addresses: []common.Address{common.HexToAddress("0x1235")}, - EventSigs: types.HashArray{topic, topic2}, - Retention: time.Millisecond, - MaxLogsKept: 1, - } - filter2 := logpoller.Filter{ // retain topic2 on contract3 for at least 1 hour - Name: "MaxLogsKept = 5 (addr 1235 topic2)", - Addresses: []common.Address{common.HexToAddress("0x1235")}, - EventSigs: types.HashArray{topic2}, - MaxLogsKept: 5, - } - - // Test inserting filters and reading them back - require.NoError(t, o1.InsertFilter(ctx, filter1)) - require.NoError(t, o1.InsertFilter(ctx, filter12)) - require.NoError(t, o1.InsertFilter(ctx, filter2)) - - filters, err := o1.LoadFilters(ctx) - require.NoError(t, err) - require.Len(t, filters, 3) - assert.Equal(t, filter1, filters["MaxLogsKept = 0 (addr 1234 topic1)"]) - assert.Equal(t, filter12, filters["MaxLogsKept = 1 (addr 1235 topic1 & topic2)"]) - assert.Equal(t, filter2, filters["MaxLogsKept = 5 (addr 1235 topic2)"]) - - ids, err := o1.SelectUnmatchedLogIDs(ctx, 0) - require.NoError(t, err) - require.Len(t, ids, 0) - - // Number of excess logs eligible for pruning: - // 2 of the 7 matching filter2 + 6 of the 7 matching filter12 but not filter2 = 8 total of 21 - - // Test SelectExcessLogIDs with limit less than # blocks - // ( should only consider blocks 10 & 11, returning 6 excess events from block 11 - // but ignoring the 2 in block 12 ) - ids, err = o1.SelectExcessLogIDs(ctx, 2) - require.NoError(t, err) - assert.Len(t, ids, 6) - - // Test SelectExcessLogIDs with limit greater than # blocks: - ids, err = o1.SelectExcessLogIDs(ctx, 4) - require.NoError(t, err) - assert.Len(t, ids, 8) - - // Test SelectExcessLogIDs with no limit - ids, err = o1.SelectExcessLogIDs(ctx, 10) - require.NoError(t, err) - assert.Len(t, ids, 8) - - deleted, err := o1.DeleteLogsByRowID(ctx, ids) - require.NoError(t, err) - assert.Equal(t, int64(8), deleted) -} - -func TestLogPollerFilters(t *testing.T) { - lggr := logger.Test(t) - chainID := testutils.NewRandomEVMChainID() - - dbx := testutils.NewSqlxDB(t) - orm := logpoller.NewORM(chainID, dbx, lggr) - - event1 := EmitterABI.Events["Log1"].ID - event2 := EmitterABI.Events["Log2"].ID - address := common.HexToAddress("0x1234") - topicA := common.HexToHash("0x1111") - topicB := common.HexToHash("0x2222") - topicC := common.HexToHash("0x3333") - topicD := common.HexToHash("0x4444") - - ctx := testutils.Context(t) - - filters := []logpoller.Filter{{ - Name: "filter by topic2", - EventSigs: types.HashArray{event1, event2}, - Addresses: types.AddressArray{address}, - Topic2: types.HashArray{topicA, topicB}, - }, { - Name: "filter by topic3", - Addresses: types.AddressArray{address}, - EventSigs: types.HashArray{event1}, - Topic3: types.HashArray{topicB, topicC, topicD}, - }, { - Name: "filter by topic4", - Addresses: types.AddressArray{address}, - EventSigs: types.HashArray{event1}, - Topic4: types.HashArray{topicC}, - }, { - Name: "filter by topics 2 and 4", - Addresses: types.AddressArray{address}, - EventSigs: types.HashArray{event2}, - Topic2: types.HashArray{topicA}, - Topic4: types.HashArray{topicC, topicD}, - }, { - Name: "10 lpb rate limit, 1M max logs", - Addresses: types.AddressArray{address}, - EventSigs: types.HashArray{event1}, - MaxLogsKept: 1000000, - LogsPerBlock: 10, - }, { // ensure that the UNIQUE CONSTRAINT isn't too strict (should only error if all fields are identical) - Name: "duplicate of filter by topic4", - Addresses: types.AddressArray{address}, - EventSigs: types.HashArray{event1}, - Topic3: types.HashArray{topicC}, - }} - - for _, filter := range filters { - t.Run("Save filter: "+filter.Name, func(t *testing.T) { - var count int - err := orm.InsertFilter(ctx, filter) - require.NoError(t, err) - err = dbx.Get(&count, `SELECT COUNT(*) FROM evm.log_poller_filters WHERE evm_chain_id = $1 AND name = $2`, ubig.New(chainID), filter.Name) - require.NoError(t, err) - expectedCount := len(filter.Addresses) * len(filter.EventSigs) - if len(filter.Topic2) > 0 { - expectedCount *= len(filter.Topic2) - } - if len(filter.Topic3) > 0 { - expectedCount *= len(filter.Topic3) - } - if len(filter.Topic4) > 0 { - expectedCount *= len(filter.Topic4) - } - assert.Equal(t, count, expectedCount) - }) - } - - // Make sure they all come back the same when we reload them - t.Run("Load filters", func(t *testing.T) { - loadedFilters, err := orm.LoadFilters(ctx) - require.NoError(t, err) - for _, filter := range filters { - loadedFilter, ok := loadedFilters[filter.Name] - require.True(t, ok, `Failed to reload filter "%s"`, filter.Name) - assert.Equal(t, filter, loadedFilter) - } - }) -} - -func insertLogsTopicValueRange(t *testing.T, chainID *big.Int, o logpoller.ORM, addr common.Address, blockNumber int, eventSig common.Hash, start, stop int) { - var lgs []logpoller.Log - for i := start; i <= stop; i++ { - lgs = append(lgs, logpoller.Log{ - EvmChainId: ubig.New(chainID), - LogIndex: int64(i), - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(blockNumber), - EventSig: eventSig, - Topics: [][]byte{eventSig[:], logpoller.EvmWord(uint64(i)).Bytes()}, - Address: addr, - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello"), - }) - } - require.NoError(t, o.InsertLogs(testutils.Context(t), lgs)) -} - -func TestORM_IndexedLogs(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - ctx := testutils.Context(t) - eventSig := common.HexToHash("0x1599") - addr := common.HexToAddress("0x1234") - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1"), 1, time.Now(), 0)) - insertLogsTopicValueRange(t, th.ChainID, o1, addr, 1, eventSig, 1, 3) - insertLogsTopicValueRange(t, th.ChainID, o1, addr, 2, eventSig, 4, 4) // unconfirmed - - filtersForTopics := func(topicIdx uint64, topicValues []uint64) query.Expression { - topicFilters := query.BoolExpression{ - Expressions: make([]query.Expression, len(topicValues)), - BoolOperator: query.OR, - } - - for idx, value := range topicValues { - topicFilters.Expressions[idx] = logpoller.NewEventByTopicFilter(topicIdx, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(value)}, Operator: primitives.Eq}, - }) - } - - return query.Expression{BoolExpression: topicFilters} - } - - limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Asc)) - standardFilter := func(topicIdx uint64, topicValues []uint64) query.KeyFilter { - return query.KeyFilter{ - Expressions: []query.Expression{ - logpoller.NewAddressFilter(addr), - logpoller.NewEventSigFilter(eventSig), - filtersForTopics(topicIdx, topicValues), - query.Confidence(primitives.Unconfirmed), - }, - } - } - - lgs, err := o1.SelectIndexedLogs(ctx, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1)}, 0) - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - assert.Equal(t, logpoller.EvmWord(1).Bytes(), lgs[0].GetTopics()[1].Bytes()) - - lgs, err = o1.FilteredLogs(ctx, standardFilter(1, []uint64{1}).Expressions, limiter, "") - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - assert.Equal(t, logpoller.EvmWord(1).Bytes(), lgs[0].GetTopics()[1].Bytes()) - - lgs, err = o1.SelectIndexedLogs(ctx, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1), logpoller.EvmWord(2)}, 0) - require.NoError(t, err) - assert.Equal(t, 2, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, standardFilter(1, []uint64{1, 2}).Expressions, limiter, "") - require.NoError(t, err) - assert.Equal(t, 2, len(lgs)) - - blockRangeFilter := func(start, end string, topicIdx uint64, topicValues []uint64) []query.Expression { - return []query.Expression{ - logpoller.NewAddressFilter(addr), - logpoller.NewEventSigFilter(eventSig), - filtersForTopics(topicIdx, topicValues), - query.Block(start, primitives.Gte), - query.Block(end, primitives.Lte), - } - } - - lgs, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 1, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1)}) - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, blockRangeFilter("1", "1", 1, []uint64{1}), limiter, "") - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) - - lgs, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(2)}) - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, blockRangeFilter("1", "2", 1, []uint64{2}), limiter, "") - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) - - lgs, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 1, []common.Hash{logpoller.EvmWord(1)}) - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, blockRangeFilter("1", "2", 1, []uint64{1}), limiter, "") - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) - - _, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 0, []common.Hash{logpoller.EvmWord(1)}) - require.Error(t, err) - assert.Contains(t, err.Error(), "invalid index for topic: 0") - - _, err = o1.FilteredLogs(ctx, blockRangeFilter("1", "2", 0, []uint64{1}), limiter, "") - require.Error(t, err) - assert.Contains(t, err.Error(), "invalid index for topic: 0") - - _, err = o1.SelectIndexedLogsByBlockRange(ctx, 1, 2, addr, eventSig, 4, []common.Hash{logpoller.EvmWord(1)}) - require.Error(t, err) - assert.Contains(t, err.Error(), "invalid index for topic: 4") - - _, err = o1.FilteredLogs(ctx, blockRangeFilter("1", "2", 4, []uint64{1}), limiter, "") - require.Error(t, err) - assert.Contains(t, err.Error(), "invalid index for topic: 4") - - lgs, err = o1.SelectIndexedLogsTopicGreaterThan(ctx, addr, eventSig, 1, logpoller.EvmWord(2), 0) - require.NoError(t, err) - assert.Equal(t, 2, len(lgs)) - - filter := query.KeyFilter{ - Expressions: []query.Expression{ - logpoller.NewAddressFilter(addr), - logpoller.NewEventSigFilter(eventSig), - logpoller.NewEventByTopicFilter(1, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(2)}, Operator: primitives.Gte}, - }), - query.Confidence(primitives.Unconfirmed), - }, - } - - lgs, err = o1.FilteredLogs(ctx, filter.Expressions, limiter, "") - require.NoError(t, err) - assert.Equal(t, 2, len(lgs)) - - rangeFilter := func(topicIdx uint64, min, max uint64) []query.Expression { - return []query.Expression{ - logpoller.NewAddressFilter(addr), - logpoller.NewEventSigFilter(eventSig), - logpoller.NewEventByTopicFilter(topicIdx, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(min)}, Operator: primitives.Gte}, - }), - logpoller.NewEventByTopicFilter(topicIdx, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(max)}, Operator: primitives.Lte}, - }), - query.Confidence(primitives.Unconfirmed), - } - } - - lgs, err = o1.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0) - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) - assert.Equal(t, logpoller.EvmWord(3).Bytes(), lgs[0].GetTopics()[1].Bytes()) - - lgs, err = o1.FilteredLogs(ctx, rangeFilter(1, 3, 3), limiter, "") - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) - assert.Equal(t, logpoller.EvmWord(3).Bytes(), lgs[0].GetTopics()[1].Bytes()) - - lgs, err = o1.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(1), logpoller.EvmWord(3), 0) - require.NoError(t, err) - assert.Equal(t, 3, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, rangeFilter(1, 1, 3), limiter, "") - require.NoError(t, err) - assert.Equal(t, 3, len(lgs)) - - // Check confirmations work as expected. - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x2"), 2, time.Now(), 0)) - lgs, err = o1.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(4), logpoller.EvmWord(4), 1) - require.NoError(t, err) - assert.Equal(t, 0, len(lgs)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x3"), 3, time.Now(), 0)) - lgs, err = o1.SelectIndexedLogsTopicRange(ctx, addr, eventSig, 1, logpoller.EvmWord(4), logpoller.EvmWord(4), 1) - require.NoError(t, err) - assert.Equal(t, 1, len(lgs)) -} - -func TestORM_SelectIndexedLogsByTxHash(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - ctx := testutils.Context(t) - eventSig := common.HexToHash("0x1599") - txHash := common.HexToHash("0x1888") - addr := common.HexToAddress("0x1234") - - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1"), 1, time.Now(), 0)) - logs := []logpoller.Log{ - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: int64(0), - BlockHash: common.HexToHash("0x1"), - BlockNumber: int64(1), - EventSig: eventSig, - Topics: [][]byte{eventSig[:]}, - Address: addr, - TxHash: txHash, - Data: logpoller.EvmWord(1).Bytes(), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: int64(1), - BlockHash: common.HexToHash("0x1"), - BlockNumber: int64(1), - EventSig: eventSig, - Topics: [][]byte{eventSig[:]}, - Address: addr, - TxHash: txHash, - Data: append(logpoller.EvmWord(2).Bytes(), logpoller.EvmWord(3).Bytes()...), - }, - // Different txHash - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: int64(2), - BlockHash: common.HexToHash("0x1"), - BlockNumber: int64(1), - EventSig: eventSig, - Topics: [][]byte{eventSig[:]}, - Address: addr, - TxHash: common.HexToHash("0x1889"), - Data: append(logpoller.EvmWord(2).Bytes(), logpoller.EvmWord(3).Bytes()...), - }, - // Different eventSig - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: int64(3), - BlockHash: common.HexToHash("0x1"), - BlockNumber: int64(1), - EventSig: common.HexToHash("0x1600"), - Topics: [][]byte{eventSig[:]}, - Address: addr, - TxHash: txHash, - Data: append(logpoller.EvmWord(2).Bytes(), logpoller.EvmWord(3).Bytes()...), - }, - } - require.NoError(t, o1.InsertLogs(ctx, logs)) - - retrievedLogs, err := o1.SelectIndexedLogsByTxHash(ctx, addr, eventSig, txHash) - require.NoError(t, err) - - require.Equal(t, 2, len(retrievedLogs)) - require.Equal(t, retrievedLogs[0].LogIndex, logs[0].LogIndex) - require.Equal(t, retrievedLogs[1].LogIndex, logs[1].LogIndex) - - limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Asc)) - filter := query.KeyFilter{ - Expressions: []query.Expression{ - logpoller.NewAddressFilter(addr), - logpoller.NewEventSigFilter(eventSig), - query.TxHash(txHash.Hex()), - }, - } - - retrievedLogs, err = o1.FilteredLogs(ctx, filter.Expressions, limiter, "") - require.NoError(t, err) - - require.Equal(t, 2, len(retrievedLogs)) - require.Equal(t, retrievedLogs[0].LogIndex, logs[0].LogIndex) - require.Equal(t, retrievedLogs[1].LogIndex, logs[1].LogIndex) -} - -func TestORM_DataWords(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - ctx := testutils.Context(t) - eventSig := common.HexToHash("0x1599") - addr := common.HexToAddress("0x1234") - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1"), 1, time.Now(), 0)) - require.NoError(t, o1.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: int64(0), - BlockHash: common.HexToHash("0x1"), - BlockNumber: int64(1), - EventSig: eventSig, - Topics: [][]byte{eventSig[:]}, - Address: addr, - TxHash: common.HexToHash("0x1888"), - Data: logpoller.EvmWord(1).Bytes(), - }, - { - // In block 2, unconfirmed to start - EvmChainId: ubig.New(th.ChainID), - LogIndex: int64(1), - BlockHash: common.HexToHash("0x2"), - BlockNumber: int64(2), - EventSig: eventSig, - Topics: [][]byte{eventSig[:]}, - Address: addr, - TxHash: common.HexToHash("0x1888"), - Data: append(logpoller.EvmWord(2).Bytes(), logpoller.EvmWord(3).Bytes()...), - }, - })) - - wordFilter := func(wordIdx int, word1, word2 uint64) []query.Expression { - return []query.Expression{ - logpoller.NewAddressFilter(addr), - logpoller.NewEventSigFilter(eventSig), - logpoller.NewEventByWordFilter(wordIdx, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(word1)}, Operator: primitives.Gte}, - }), - logpoller.NewEventByWordFilter(wordIdx, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(word2)}, Operator: primitives.Lte}, - }), - query.Confidence(primitives.Unconfirmed), - } - } - - limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Asc)) - - // Outside range should fail. - lgs, err := o1.SelectLogsDataWordRange(ctx, addr, eventSig, 0, logpoller.EvmWord(2), logpoller.EvmWord(2), 0) - require.NoError(t, err) - require.Equal(t, 0, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, wordFilter(0, 2, 2), limiter, "") - require.NoError(t, err) - require.Equal(t, 0, len(lgs)) - - // Range including log should succeed - lgs, err = o1.SelectLogsDataWordRange(ctx, addr, eventSig, 0, logpoller.EvmWord(1), logpoller.EvmWord(2), 0) - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, wordFilter(0, 1, 2), limiter, "") - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - - // Range only covering log should succeed - lgs, err = o1.SelectLogsDataWordRange(ctx, addr, eventSig, 0, logpoller.EvmWord(1), logpoller.EvmWord(1), 0) - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, wordFilter(0, 1, 1), limiter, "") - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - - // Cannot query for unconfirmed second log. - lgs, err = o1.SelectLogsDataWordRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0) - require.NoError(t, err) - require.Equal(t, 0, len(lgs)) - - lgs, err = o1.FilteredLogs(ctx, wordFilter(1, 3, 3), limiter, "") - require.NoError(t, err) - require.Equal(t, 0, len(lgs)) - - // Confirm it, then can query. - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x2"), 2, time.Now(), 0)) - lgs, err = o1.SelectLogsDataWordRange(ctx, addr, eventSig, 1, logpoller.EvmWord(3), logpoller.EvmWord(3), 0) - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - require.Equal(t, lgs[0].Data, append(logpoller.EvmWord(2).Bytes(), logpoller.EvmWord(3).Bytes()...)) - - lgs, err = o1.FilteredLogs(ctx, wordFilter(1, 3, 3), limiter, "") - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - require.Equal(t, lgs[0].Data, append(logpoller.EvmWord(2).Bytes(), logpoller.EvmWord(3).Bytes()...)) - - // Check greater than 1 yields both logs. - lgs, err = o1.SelectLogsDataWordGreaterThan(ctx, addr, eventSig, 0, logpoller.EvmWord(1), 0) - require.NoError(t, err) - assert.Equal(t, 2, len(lgs)) - - filter := []query.Expression{ - logpoller.NewAddressFilter(addr), - logpoller.NewEventSigFilter(eventSig), - logpoller.NewEventByWordFilter(0, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(1)}, Operator: primitives.Gte}, - }), - query.Confidence(primitives.Unconfirmed), - } - - lgs, err = o1.FilteredLogs(ctx, filter, limiter, "") - require.NoError(t, err) - assert.Equal(t, 2, len(lgs)) -} - -func TestORM_SelectLogsWithSigsByBlockRangeFilter(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - ctx := testutils.Context(t) - - // Insert logs on different topics, should be able to read them - // back using SelectLogsWithSigs and specifying - // said topics. - topic := common.HexToHash("0x1599") - topic2 := common.HexToHash("0x1600") - sourceAddr := common.HexToAddress("0x12345") - inputLogs := []logpoller.Log{ - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 1, - BlockHash: common.HexToHash("0x1234"), - BlockNumber: int64(10), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: sourceAddr, - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello1"), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 2, - BlockHash: common.HexToHash("0x1235"), - BlockNumber: int64(11), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: sourceAddr, - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello2"), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 3, - BlockHash: common.HexToHash("0x1236"), - BlockNumber: int64(12), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1235"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello3"), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 4, - BlockHash: common.HexToHash("0x1237"), - BlockNumber: int64(13), - EventSig: topic, - Topics: [][]byte{topic[:]}, - Address: common.HexToAddress("0x1235"), - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello4"), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 5, - BlockHash: common.HexToHash("0x1238"), - BlockNumber: int64(14), - EventSig: topic2, - Topics: [][]byte{topic2[:]}, - Address: sourceAddr, - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello5"), - }, - { - EvmChainId: ubig.New(th.ChainID), - LogIndex: 6, - BlockHash: common.HexToHash("0x1239"), - BlockNumber: int64(15), - EventSig: topic2, - Topics: [][]byte{topic2[:]}, - Address: sourceAddr, - TxHash: common.HexToHash("0x1888"), - Data: []byte("hello6"), - }, - } - require.NoError(t, o1.InsertLogs(ctx, inputLogs)) - - filter := func(sigs []common.Hash, startBlock, endBlock string) query.KeyFilter { - filters := []query.Expression{ - logpoller.NewAddressFilter(sourceAddr), - } - - if len(sigs) > 0 { - exp := make([]query.Expression, len(sigs)) - for idx, val := range sigs { - exp[idx] = logpoller.NewEventSigFilter(val) - } - - filters = append(filters, query.Expression{ - BoolExpression: query.BoolExpression{ - Expressions: exp, - BoolOperator: query.OR, - }, - }) - } - - filters = append(filters, query.Expression{ - BoolExpression: query.BoolExpression{ - Expressions: []query.Expression{ - query.Block(startBlock, primitives.Gte), - query.Block(endBlock, primitives.Lte), - }, - BoolOperator: query.AND, - }, - }) - - return query.KeyFilter{ - Expressions: filters, - } - } - - limiter := query.LimitAndSort{ - SortBy: []query.SortBy{query.NewSortBySequence(query.Asc)}, - } - - assertion := func(t *testing.T, logs []logpoller.Log, err error, startBlock, endBlock int64) { - require.NoError(t, err) - assert.Len(t, logs, 4) - for _, l := range logs { - assert.Equal(t, sourceAddr, l.Address, "wrong log address") - assert.True(t, bytes.Equal(topic.Bytes(), l.EventSig.Bytes()) || bytes.Equal(topic2.Bytes(), l.EventSig.Bytes()), "wrong log topic") - assert.True(t, l.BlockNumber >= startBlock && l.BlockNumber <= endBlock) - } - } - - startBlock, endBlock := int64(10), int64(15) - logs, err := o1.SelectLogsWithSigs(ctx, startBlock, endBlock, sourceAddr, []common.Hash{ - topic, - topic2, - }) - - assertion(t, logs, err, startBlock, endBlock) - logs, err = th.ORM.FilteredLogs(ctx, filter([]common.Hash{topic, topic2}, strconv.Itoa(int(startBlock)), strconv.Itoa(int(endBlock))).Expressions, limiter, "") - - assertion(t, logs, err, startBlock, endBlock) -} - -type mockQueryExecutor struct { - mock.Mock -} - -func (m *mockQueryExecutor) Exec(ctx context.Context, r *logpoller.RangeQueryer[uint64], lower, upper int64) (int64, error) { - res := m.Called(lower, upper) - return int64(res.Int(0)), res.Error(1) -} - -func Test_ExecPagedQuery(t *testing.T) { - t.Parallel() - ctx := testutils.Context(t) - lggr := logger.Test(t) - chainID := testutils.NewRandomEVMChainID() - db := testutils.NewSqlxDB(t) - o := logpoller.NewORM(chainID, db, lggr) - - m := mockQueryExecutor{} - - queryError := errors.New("some error") - m.On("Exec", int64(0), int64(0)).Return(0, queryError).Once() - - // Should handle errors gracefully - r := logpoller.NewRangeQueryer(chainID, db, m.Exec) - _, err := r.ExecPagedQuery(ctx, 0, 0) - assert.ErrorIs(t, err, queryError) - - m.On("Exec", int64(0), int64(60)).Return(4, nil).Once() - - // Query should only get executed once with limitBlock=end if called with limit=0 - numResults, err := r.ExecPagedQuery(ctx, 0, 60) - require.NoError(t, err) - assert.Equal(t, int64(4), numResults) - - // Should report actual db errors - _, err = r.ExecPagedQuery(ctx, 300, 1000) - assert.Error(t, err) - - require.NoError(t, o.InsertBlock(ctx, common.HexToHash("0x1234"), 42, time.Now(), 0)) - - m.On("Exec", mock.Anything, mock.Anything).Return(3, nil) - - // Should get called with limitBlock = 342, 642, 942, 1000 - numResults, err = r.ExecPagedQuery(ctx, 300, 1000) - require.NoError(t, err) - assert.Equal(t, int64(12), numResults) // 3 results in each of 4 calls - m.AssertNumberOfCalls(t, "Exec", 6) // 4 new calls, plus the prior 2 - expectedLimitBlocks := [][]int64{{42, 341}, {342, 641}, {642, 941}, {942, 1000}} - for _, expected := range expectedLimitBlocks { - m.AssertCalled(t, "Exec", expected[0], expected[1]) - } - - // Should not go all the way to 1000, but stop after ~ 13 results have - // been returned - numResults, err = r.ExecPagedQuery(ctx, 15, 1000) - require.NoError(t, err) - assert.Equal(t, int64(15), numResults) - m.AssertNumberOfCalls(t, "Exec", 11) - expectedLimitBlocks = [][]int64{{42, 56}, {57, 71}, {72, 86}, {87, 101}, {102, 116}} // upper[n] = 42 + 15 * n - 1 for n = 1, 2, 3, 4, 5, lower[n] = upper[n-1] + 1 - for _, expected := range expectedLimitBlocks { - m.AssertCalled(t, "Exec", expected[0], expected[1]) - } -} - -func TestORM_DeleteBlocksBefore(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - ctx := testutils.Context(t) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1234"), 1, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1235"), 2, time.Now(), 0)) - deleted, err := o1.DeleteBlocksBefore(ctx, 1, 0) - require.NoError(t, err) - require.Equal(t, int64(1), deleted) - // 1 should be gone. - _, err = o1.SelectBlockByNumber(ctx, 1) - require.Equal(t, err, sql.ErrNoRows) - b, err := o1.SelectBlockByNumber(ctx, 2) - require.NoError(t, err) - assert.Equal(t, int64(2), b.BlockNumber) - // Clear multiple - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1236"), 3, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1237"), 4, time.Now(), 0)) - deleted, err = o1.DeleteBlocksBefore(ctx, 3, 0) - require.NoError(t, err) - assert.Equal(t, int64(2), deleted) - _, err = o1.SelectBlockByNumber(ctx, 2) - require.Equal(t, err, sql.ErrNoRows) - _, err = o1.SelectBlockByNumber(ctx, 3) - require.Equal(t, err, sql.ErrNoRows) -} - -func TestLogPoller_Logs(t *testing.T) { - t.Parallel() - ctx := testutils.Context(t) - th := SetupTH(t, lpOpts) - event1 := EmitterABI.Events["Log1"].ID - event2 := EmitterABI.Events["Log2"].ID - address1 := common.HexToAddress("0x2ab9a2Dc53736b361b72d900CdF9F78F9406fbbb") - address2 := common.HexToAddress("0x6E225058950f237371261C985Db6bDe26df2200E") - - // Block 1-3 - require.NoError(t, th.ORM.InsertLogs(ctx, []logpoller.Log{ - GenLog(th.ChainID, 1, 1, "0x3", event1[:], address1), - GenLog(th.ChainID, 2, 1, "0x3", event2[:], address2), - GenLog(th.ChainID, 1, 2, "0x4", event1[:], address2), - GenLog(th.ChainID, 2, 2, "0x4", event2[:], address1), - GenLog(th.ChainID, 1, 3, "0x5", event1[:], address1), - GenLog(th.ChainID, 2, 3, "0x5", event2[:], address2), - })) - - // Select for all Addresses - lgs, err := th.ORM.SelectLogsByBlockRange(ctx, 1, 3) - require.NoError(t, err) - require.Equal(t, 6, len(lgs)) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000003", lgs[0].BlockHash.String()) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000003", lgs[1].BlockHash.String()) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000004", lgs[2].BlockHash.String()) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000004", lgs[3].BlockHash.String()) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000005", lgs[4].BlockHash.String()) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000005", lgs[5].BlockHash.String()) - - logFilter := func(start, end string, address common.Address) []query.Expression { - return []query.Expression{ - logpoller.NewAddressFilter(address), - logpoller.NewEventSigFilter(event1), - query.Block(start, primitives.Gte), - query.Block(end, primitives.Lte), - } - } - - // Filter by Address and topic - lgs, err = th.ORM.SelectLogs(ctx, 1, 3, address1, event1) - require.NoError(t, err) - require.Equal(t, 2, len(lgs)) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000003", lgs[0].BlockHash.String()) - assert.Equal(t, address1, lgs[0].Address) - assert.Equal(t, event1.Bytes(), lgs[0].Topics[0]) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000005", lgs[1].BlockHash.String()) - assert.Equal(t, address1, lgs[1].Address) - - lgs, err = th.ORM.FilteredLogs(ctx, logFilter("1", "3", address1), query.LimitAndSort{ - SortBy: []query.SortBy{query.NewSortBySequence(query.Asc)}, - }, "") - require.NoError(t, err) - require.Equal(t, 2, len(lgs)) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000003", lgs[0].BlockHash.String()) - assert.Equal(t, address1, lgs[0].Address) - assert.Equal(t, event1.Bytes(), lgs[0].Topics[0]) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000005", lgs[1].BlockHash.String()) - assert.Equal(t, address1, lgs[1].Address) - - // Filter by block - lgs, err = th.ORM.SelectLogs(ctx, 2, 2, address2, event1) - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000004", lgs[0].BlockHash.String()) - assert.Equal(t, int64(1), lgs[0].LogIndex) - assert.Equal(t, address2, lgs[0].Address) - assert.Equal(t, event1.Bytes(), lgs[0].Topics[0]) - - lgs, err = th.ORM.FilteredLogs(ctx, logFilter("2", "2", address2), query.LimitAndSort{ - SortBy: []query.SortBy{query.NewSortBySequence(query.Asc)}, - }, "") - require.NoError(t, err) - require.Equal(t, 1, len(lgs)) - assert.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000004", lgs[0].BlockHash.String()) - assert.Equal(t, int64(1), lgs[0].LogIndex) - assert.Equal(t, address2, lgs[0].Address) - assert.Equal(t, event1.Bytes(), lgs[0].Topics[0]) -} - -func BenchmarkLogs(b *testing.B) { - th := SetupTH(b, lpOpts) - o := th.ORM - ctx := testutils.Context(b) - var lgs []logpoller.Log - addr := common.HexToAddress("0x1234") - for i := 0; i < 10_000; i++ { - lgs = append(lgs, logpoller.Log{ - EvmChainId: ubig.New(th.ChainID), - LogIndex: int64(i), - BlockHash: common.HexToHash("0x1"), - BlockNumber: 1, - EventSig: EmitterABI.Events["Log1"].ID, - Topics: [][]byte{}, - Address: addr, - TxHash: common.HexToHash("0x1234"), - Data: common.HexToHash(fmt.Sprintf("0x%d", i)).Bytes(), - }) - } - require.NoError(b, o.InsertLogs(ctx, lgs)) - b.ResetTimer() - for n := 0; n < b.N; n++ { - lgs, err := o.SelectLogsDataWordRange(ctx, addr, EmitterABI.Events["Log1"].ID, 0, logpoller.EvmWord(8000), logpoller.EvmWord(8002), 0) - require.NoError(b, err) - // TODO: Why is SelectLogsDataWordRange not returning any logs?! - fmt.Println("len logs:", len(lgs)) - } -} - -func TestSelectLogsWithSigsExcluding(t *testing.T) { - th := SetupTH(t, lpOpts) - orm := th.ORM - ctx := testutils.Context(t) - addressA := common.HexToAddress("0x11111") - addressB := common.HexToAddress("0x22222") - addressC := common.HexToAddress("0x33333") - - requestSigA := common.HexToHash("0x01") - responseSigA := common.HexToHash("0x02") - requestSigB := common.HexToHash("0x03") - responseSigB := common.HexToHash("0x04") - - topicA := common.HexToHash("0x000a") - topicB := common.HexToHash("0x000b") - topicC := common.HexToHash("0x000c") - topicD := common.HexToHash("0x000d") - - // Insert two logs that mimics an oracle request from 2 different addresses (matching will be on topic index 1) - require.NoError(t, orm.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 1, - BlockHash: common.HexToHash("0x1"), - BlockNumber: 1, - BlockTimestamp: time.Now(), - Topics: [][]byte{requestSigA.Bytes(), topicA.Bytes(), topicB.Bytes()}, - EventSig: requestSigA, - Address: addressA, - TxHash: common.HexToHash("0x0001"), - Data: []byte("requestID-A1"), - }, - { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 2, - BlockHash: common.HexToHash("0x1"), - BlockNumber: 1, - BlockTimestamp: time.Now(), - Topics: [][]byte{requestSigB.Bytes(), topicA.Bytes(), topicB.Bytes()}, - EventSig: requestSigB, - Address: addressB, - TxHash: common.HexToHash("0x0002"), - Data: []byte("requestID-B1"), - }, - })) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x1"), 1, time.Now(), 0)) - - // Get any requestSigA from addressA that do not have a equivalent responseSigA - logs, err := orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigA, responseSigA, 1, addressA, 0, 3, 0) - require.NoError(t, err) - require.Len(t, logs, 1) - require.Equal(t, logs[0].Data, []byte("requestID-A1")) - - // Get any requestSigB from addressB that do not have a equivalent responseSigB - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0) - require.NoError(t, err) - require.Len(t, logs, 1) - require.Equal(t, logs[0].Data, []byte("requestID-B1")) - - // Insert a log that mimics response for requestID-A1 - require.NoError(t, orm.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 3, - BlockHash: common.HexToHash("0x2"), - BlockNumber: 2, - BlockTimestamp: time.Now(), - Topics: [][]byte{responseSigA.Bytes(), topicA.Bytes(), topicC.Bytes(), topicD.Bytes()}, - EventSig: responseSigA, - Address: addressA, - TxHash: common.HexToHash("0x0002"), - Data: []byte("responseID-A1"), - }, - })) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x2"), 2, time.Now(), 0)) - - // Should return nothing as requestID-A1 has been fulfilled - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigA, responseSigA, 1, addressA, 0, 3, 0) - require.NoError(t, err) - require.Len(t, logs, 0) - - // requestID-B1 should still be unfulfilled - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0) - require.NoError(t, err) - require.Len(t, logs, 1) - require.Equal(t, logs[0].Data, []byte("requestID-B1")) - - // Insert 3 request from addressC (matching will be on topic index 3) - require.NoError(t, orm.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 5, - BlockHash: common.HexToHash("0x2"), - BlockNumber: 3, - BlockTimestamp: time.Now(), - Topics: [][]byte{requestSigB.Bytes(), topicD.Bytes(), topicB.Bytes(), topicC.Bytes()}, - EventSig: requestSigB, - Address: addressC, - TxHash: common.HexToHash("0x0002"), - Data: []byte("requestID-C1"), - }, - { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 6, - BlockHash: common.HexToHash("0x2"), - BlockNumber: 3, - BlockTimestamp: time.Now(), - Topics: [][]byte{requestSigB.Bytes(), topicD.Bytes(), topicB.Bytes(), topicA.Bytes()}, - EventSig: requestSigB, - Address: addressC, - TxHash: common.HexToHash("0x0002"), - Data: []byte("requestID-C2"), - }, { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 7, - BlockHash: common.HexToHash("0x2"), - BlockNumber: 3, - BlockTimestamp: time.Now(), - Topics: [][]byte{requestSigB.Bytes(), topicD.Bytes(), topicB.Bytes(), topicD.Bytes()}, - EventSig: requestSigB, - Address: addressC, - TxHash: common.HexToHash("0x0002"), - Data: []byte("requestID-C3"), - }, - })) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x3"), 3, time.Now(), 0)) - - // Get all unfulfilled requests from addressC, match on topic index 3 - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0) - require.NoError(t, err) - require.Len(t, logs, 3) - require.Equal(t, logs[0].Data, []byte("requestID-C1")) - require.Equal(t, logs[1].Data, []byte("requestID-C2")) - require.Equal(t, logs[2].Data, []byte("requestID-C3")) - - // Fulfill requestID-C2 - require.NoError(t, orm.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 8, - BlockHash: common.HexToHash("0x3"), - BlockNumber: 3, - BlockTimestamp: time.Now(), - Topics: [][]byte{responseSigB.Bytes(), topicC.Bytes(), topicD.Bytes(), topicA.Bytes()}, - EventSig: responseSigB, - Address: addressC, - TxHash: common.HexToHash("0x0002"), - Data: []byte("responseID-C2"), - }, - })) - - // Verify that requestID-C2 is now fulfilled (not returned) - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0) - require.NoError(t, err) - require.Len(t, logs, 2) - require.Equal(t, logs[0].Data, []byte("requestID-C1")) - require.Equal(t, logs[1].Data, []byte("requestID-C3")) - - // Fulfill requestID-C3 - require.NoError(t, orm.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 9, - BlockHash: common.HexToHash("0x3"), - BlockNumber: 3, - BlockTimestamp: time.Now(), - Topics: [][]byte{responseSigB.Bytes(), topicC.Bytes(), topicD.Bytes(), topicD.Bytes()}, - EventSig: responseSigB, - Address: addressC, - TxHash: common.HexToHash("0x0002"), - Data: []byte("responseID-C3"), - }, - })) - - // Verify that requestID-C3 is now fulfilled (not returned) - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 0) - require.NoError(t, err) - require.Len(t, logs, 1) - require.Equal(t, logs[0].Data, []byte("requestID-C1")) - - // Should return no logs as the number of confirmations is not satisfied - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 4, 3) - require.NoError(t, err) - require.Len(t, logs, 0) - - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x4"), 4, time.Now(), 0)) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x5"), 5, time.Now(), 0)) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x6"), 6, time.Now(), 0)) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x7"), 7, time.Now(), 0)) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x8"), 8, time.Now(), 0)) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x9"), 9, time.Now(), 0)) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x10"), 10, time.Now(), 0)) - - // Fulfill requestID-C3 - require.NoError(t, orm.InsertLogs(ctx, []logpoller.Log{ - { - EvmChainId: (*ubig.Big)(th.ChainID), - LogIndex: 10, - BlockHash: common.HexToHash("0x2"), - BlockNumber: 10, - BlockTimestamp: time.Now(), - Topics: [][]byte{responseSigB.Bytes(), topicD.Bytes(), topicB.Bytes(), topicC.Bytes()}, - EventSig: responseSigB, - Address: addressC, - TxHash: common.HexToHash("0x0002"), - Data: []byte("responseID-C1"), - }, - })) - - // All logs for addressC should be fulfilled, query should return 0 logs - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 0) - require.NoError(t, err) - require.Len(t, logs, 0) - - // Should return 1 log as it does not satisfy the required number of confirmations - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 3) - require.NoError(t, err) - require.Len(t, logs, 1) - require.Equal(t, logs[0].Data, []byte("requestID-C1")) - - // Insert 3 more blocks so that the requestID-C1 has enough confirmations - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x11"), 11, time.Now(), 0)) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x12"), 12, time.Now(), 0)) - require.NoError(t, orm.InsertBlock(ctx, common.HexToHash("0x13"), 13, time.Now(), 0)) - - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 3, addressC, 0, 10, 0) - require.NoError(t, err) - require.Len(t, logs, 0) - - // AddressB should still have an unfulfilled log (requestID-B1) - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 0, 3, 0) - require.NoError(t, err) - require.Len(t, logs, 1) - require.Equal(t, logs[0].Data, []byte("requestID-B1")) - - // Should return requestID-A1 as the fulfillment event is out of the block range - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigA, responseSigA, 1, addressA, 0, 1, 10) - require.NoError(t, err) - require.Len(t, logs, 1) - require.Equal(t, logs[0].Data, []byte("requestID-A1")) - - // Should return nothing as requestID-B1 is before the block range - logs, err = orm.SelectIndexedLogsWithSigsExcluding(ctx, requestSigB, responseSigB, 1, addressB, 2, 13, 0) - require.NoError(t, err) - require.Len(t, logs, 0) -} - -func TestSelectLatestBlockNumberEventSigsAddrsWithConfs(t *testing.T) { - ctx := testutils.Context(t) - th := SetupTH(t, lpOpts) - event1 := EmitterABI.Events["Log1"].ID - event2 := EmitterABI.Events["Log2"].ID - address1 := utils.RandomAddress() - address2 := utils.RandomAddress() - - require.NoError(t, th.ORM.InsertLogs(ctx, []logpoller.Log{ - GenLog(th.ChainID, 1, 1, utils.RandomAddress().String(), event1[:], address1), - GenLog(th.ChainID, 2, 1, utils.RandomAddress().String(), event2[:], address2), - GenLog(th.ChainID, 2, 2, utils.RandomAddress().String(), event2[:], address2), - GenLog(th.ChainID, 2, 3, utils.RandomAddress().String(), event2[:], address2), - })) - require.NoError(t, th.ORM.InsertBlock(ctx, utils.RandomHash(), 3, time.Now(), 1)) - - tests := []struct { - name string - events []common.Hash - addrs []common.Address - confs types.Confirmations - fromBlock int64 - expectedBlockNumber int64 - }{ - { - name: "no matching logs returns 0 block number", - events: []common.Hash{event2}, - addrs: []common.Address{address1}, - confs: 0, - fromBlock: 0, - expectedBlockNumber: 0, - }, - { - name: "not enough confirmations block returns 0 block number", - events: []common.Hash{event2}, - addrs: []common.Address{address2}, - confs: 5, - fromBlock: 0, - expectedBlockNumber: 0, - }, - { - name: "single matching event and address returns last block", - events: []common.Hash{event1}, - addrs: []common.Address{address1}, - confs: 0, - fromBlock: 0, - expectedBlockNumber: 1, - }, - { - name: "only finalized log is picked", - events: []common.Hash{event1, event2}, - addrs: []common.Address{address1, address2}, - confs: types.Finalized, - fromBlock: 0, - expectedBlockNumber: 1, - }, - { - name: "picks max block from two events", - events: []common.Hash{event1, event2}, - addrs: []common.Address{address1, address2}, - confs: 0, - fromBlock: 0, - expectedBlockNumber: 3, - }, - { - name: "picks previous block number for confirmations set to 1", - events: []common.Hash{event2}, - addrs: []common.Address{address2}, - confs: 1, - fromBlock: 0, - expectedBlockNumber: 2, - }, - { - name: "returns 0 if from block is not matching", - events: []common.Hash{event1, event2}, - addrs: []common.Address{address1, address2}, - confs: 0, - fromBlock: 4, - expectedBlockNumber: 0, - }, - { - name: "picks max block from two events when from block is lower", - events: []common.Hash{event1, event2}, - addrs: []common.Address{address1, address2}, - confs: 0, - fromBlock: 2, - expectedBlockNumber: 3, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - blockNumber, err := th.ORM.SelectLatestBlockByEventSigsAddrsWithConfs(ctx, tt.fromBlock, tt.events, tt.addrs, tt.confs) - require.NoError(t, err) - assert.Equal(t, tt.expectedBlockNumber, blockNumber) - }) - } -} - -func TestSelectLogsCreatedAfter(t *testing.T) { - ctx := testutils.Context(t) - th := SetupTH(t, lpOpts) - event := EmitterABI.Events["Log1"].ID - address := utils.RandomAddress() - - block1ts := time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC) - block2ts := time.Date(2020, 1, 1, 12, 12, 12, 0, time.UTC) - block3ts := time.Date(2030, 1, 1, 12, 12, 12, 0, time.UTC) - - require.NoError(t, th.ORM.InsertLogs(ctx, []logpoller.Log{ - GenLogWithTimestamp(th.ChainID, 1, 1, utils.RandomAddress().String(), event[:], address, block1ts), - GenLogWithTimestamp(th.ChainID, 1, 2, utils.RandomAddress().String(), event[:], address, block2ts), - GenLogWithTimestamp(th.ChainID, 2, 2, utils.RandomAddress().String(), event[:], address, block2ts), - GenLogWithTimestamp(th.ChainID, 1, 3, utils.RandomAddress().String(), event[:], address, block3ts), - })) - require.NoError(t, th.ORM.InsertBlock(ctx, utils.RandomHash(), 1, block1ts, 0)) - require.NoError(t, th.ORM.InsertBlock(ctx, utils.RandomHash(), 2, block2ts, 1)) - require.NoError(t, th.ORM.InsertBlock(ctx, utils.RandomHash(), 3, block3ts, 2)) - - type expectedLog struct { - block int64 - log int64 - } - - tests := []struct { - name string - confs types.Confirmations - after time.Time - expectedLogs []expectedLog - }{ - { - name: "picks logs after block 1", - confs: 0, - after: block1ts, - expectedLogs: []expectedLog{ - {block: 2, log: 1}, - {block: 2, log: 2}, - {block: 3, log: 1}, - }, - }, - { - name: "skips blocks with not enough confirmations", - confs: 1, - after: block1ts, - expectedLogs: []expectedLog{ - {block: 2, log: 1}, - {block: 2, log: 2}, - }, - }, - { - name: "limits number of blocks by block_timestamp", - confs: 0, - after: block2ts, - expectedLogs: []expectedLog{ - {block: 3, log: 1}, - }, - }, - { - name: "returns empty dataset for future timestamp", - confs: 0, - after: block3ts, - expectedLogs: []expectedLog{}, - }, - { - name: "returns empty dataset when too many confirmations are required", - confs: 3, - after: block1ts, - expectedLogs: []expectedLog{}, - }, - { - name: "returns only finalized log", - confs: types.Finalized, - after: block1ts, - expectedLogs: []expectedLog{ - {block: 2, log: 1}, - {block: 2, log: 2}, - }, - }, - } - - filter := func(timestamp time.Time, confs types.Confirmations, topicIdx uint64, topicVals []common.Hash) query.KeyFilter { - filters := []query.Expression{ - logpoller.NewAddressFilter(address), - logpoller.NewEventSigFilter(event), - } - - if len(topicVals) > 0 { - exp := []query.Expression{ - logpoller.NewEventByTopicFilter(topicIdx, []logpoller.HashedValueComparator{ - {Values: topicVals, Operator: primitives.Eq}, - }), - } - - filters = append(filters, query.Expression{ - BoolExpression: query.BoolExpression{ - Expressions: exp, - BoolOperator: query.OR, - }, - }) - } - - filters = append(filters, []query.Expression{ - query.Timestamp(uint64(timestamp.Unix()), primitives.Gt), - logpoller.NewConfirmationsFilter(confs), - }...) - - return query.KeyFilter{ - Expressions: filters, - } - } - - limiter := query.LimitAndSort{ - SortBy: []query.SortBy{ - query.NewSortBySequence(query.Asc), - }, - } - - assertion := func(t *testing.T, logs []logpoller.Log, err error, exp []expectedLog) { - require.NoError(t, err) - require.Len(t, logs, len(exp)) - - for i, log := range logs { - assert.Equal(t, exp[i].block, log.BlockNumber) - assert.Equal(t, exp[i].log, log.LogIndex) - } - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - logs, err := th.ORM.SelectLogsCreatedAfter(ctx, address, event, tt.after, tt.confs) - - assertion(t, logs, err, tt.expectedLogs) - - logs, err = th.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 0, nil).Expressions, limiter, "") - - assertion(t, logs, err, tt.expectedLogs) - }) - } - - t.Run("SelectIndexedLogsCreatedAfter", func(t *testing.T) { - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - logs, err := th.ORM.SelectIndexedLogsCreatedAfter(ctx, address, event, 1, []common.Hash{event}, tt.after, tt.confs) - - assertion(t, logs, err, tt.expectedLogs) - - logs, err = th.ORM.FilteredLogs(ctx, filter(tt.after, tt.confs, 1, []common.Hash{event}).Expressions, limiter, "") - - assertion(t, logs, err, tt.expectedLogs) - }) - } - }) -} - -func TestNestedLogPollerBlocksQuery(t *testing.T) { - ctx := testutils.Context(t) - th := SetupTH(t, lpOpts) - event := EmitterABI.Events["Log1"].ID - address := utils.RandomAddress() - - require.NoError(t, th.ORM.InsertLogs(ctx, []logpoller.Log{ - GenLog(th.ChainID, 1, 8, utils.RandomAddress().String(), event[:], address), - })) - - // Empty logs when block are not persisted - logs, err := th.ORM.SelectIndexedLogs(ctx, address, event, 1, []common.Hash{event}, types.Unconfirmed) - require.NoError(t, err) - require.Len(t, logs, 0) - - // Persist block - require.NoError(t, th.ORM.InsertBlock(ctx, utils.RandomHash(), 10, time.Now(), 0)) - - // Check if query actually works well with provided dataset - logs, err = th.ORM.SelectIndexedLogs(ctx, address, event, 1, []common.Hash{event}, types.Unconfirmed) - require.NoError(t, err) - require.Len(t, logs, 1) - - // Empty logs when number of confirmations is too deep - logs, err = th.ORM.SelectIndexedLogs(ctx, address, event, 1, []common.Hash{event}, types.Confirmations(4)) - require.NoError(t, err) - require.Len(t, logs, 0) -} - -func TestInsertLogsWithBlock(t *testing.T) { - chainID := testutils.NewRandomEVMChainID() - event := utils.RandomBytes32() - address := utils.RandomAddress() - ctx := testutils.Context(t) - - // We need full db here, because we want to test transaction rollbacks. - // Using testutils.NewSqlxDB(t) will run all tests in TXs which is not desired for this type of test - // (inner tx rollback will rollback outer tx, blocking rest of execution) - db := testutils.NewIndependentSqlxDB(t) - o := logpoller.NewORM(chainID, db, logger.Test(t)) - - correctLog := GenLog(chainID, 1, 1, utils.RandomAddress().String(), event[:], address) - invalidLog := GenLog(chainID, -10, -10, utils.RandomAddress().String(), event[:], address) - correctBlock := logpoller.LogPollerBlock{ - BlockHash: utils.RandomBytes32(), - BlockNumber: 20, - BlockTimestamp: time.Now(), - FinalizedBlockNumber: 10, - } - invalidBlock := logpoller.LogPollerBlock{ - BlockHash: utils.RandomBytes32(), - BlockNumber: -10, - BlockTimestamp: time.Now(), - FinalizedBlockNumber: -10, - } - - tests := []struct { - name string - logs []logpoller.Log - block logpoller.LogPollerBlock - shouldRollback bool - }{ - { - name: "properly persist all data", - logs: []logpoller.Log{correctLog}, - block: correctBlock, - shouldRollback: false, - }, - { - name: "rollbacks transaction when block is invalid", - logs: []logpoller.Log{correctLog}, - block: invalidBlock, - shouldRollback: true, - }, - { - name: "rollbacks transaction when log is invalid", - logs: []logpoller.Log{invalidLog}, - block: correctBlock, - shouldRollback: true, - }, - { - name: "rollback when only some logs are invalid", - logs: []logpoller.Log{correctLog, invalidLog}, - block: correctBlock, - shouldRollback: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // clean all logs and blocks between test cases - defer func() { _ = o.DeleteLogsAndBlocksAfter(ctx, 0) }() - insertError := o.InsertLogsWithBlock(ctx, tt.logs, tt.block) - - logs, logsErr := o.SelectLogs(ctx, 0, math.MaxInt, address, event) - block, blockErr := o.SelectLatestBlock(ctx) - - if tt.shouldRollback { - assert.Error(t, insertError) - - assert.NoError(t, logsErr) - assert.Len(t, logs, 0) - - assert.Error(t, blockErr) - } else { - assert.NoError(t, insertError) - - assert.NoError(t, logsErr) - assert.Len(t, logs, len(tt.logs)) - - assert.NoError(t, blockErr) - assert.Equal(t, block.BlockNumber, tt.block.BlockNumber) - } - }) - } -} - -func TestInsertLogsInTx(t *testing.T) { - chainID := testutils.NewRandomEVMChainID() - event := utils.RandomBytes32() - address := utils.RandomAddress() - maxLogsSize := 9000 - ctx := testutils.Context(t) - - // We need full db here, because we want to test transaction rollbacks. - db := testutils.NewIndependentSqlxDB(t) - o := logpoller.NewORM(chainID, db, logger.Test(t)) - - logs := make([]logpoller.Log, maxLogsSize, maxLogsSize+1) - for i := 0; i < maxLogsSize; i++ { - logs[i] = GenLog(chainID, int64(i+1), int64(i+1), utils.RandomAddress().String(), event[:], address) - } - invalidLog := GenLog(chainID, -10, -10, utils.RandomAddress().String(), event[:], address) - - tests := []struct { - name string - logs []logpoller.Log - shouldRollback bool - }{ - { - name: "all logs persisted", - logs: logs, - shouldRollback: false, - }, - { - name: "rollback when invalid log is passed", - logs: append(logs, invalidLog), - shouldRollback: true, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - // clean all logs and blocks between test cases - defer func() { _, _ = db.Exec("truncate evm.logs") }() - - insertErr := o.InsertLogs(ctx, tt.logs) - logsFromDb, err := o.SelectLogs(ctx, 0, math.MaxInt, address, event) - assert.NoError(t, err) - - if tt.shouldRollback { - assert.Error(t, insertErr) - assert.Len(t, logsFromDb, 0) - } else { - assert.NoError(t, insertErr) - assert.Len(t, logsFromDb, len(tt.logs)) - } - }) - } -} - -func TestSelectLogsDataWordBetween(t *testing.T) { - ctx := testutils.Context(t) - address := utils.RandomAddress() - eventSig := utils.RandomBytes32() - th := SetupTH(t, lpOpts) - - firstLogData := make([]byte, 0, 64) - firstLogData = append(firstLogData, logpoller.EvmWord(1).Bytes()...) - firstLogData = append(firstLogData, logpoller.EvmWord(10).Bytes()...) - - secondLogData := make([]byte, 0, 64) - secondLogData = append(secondLogData, logpoller.EvmWord(5).Bytes()...) - secondLogData = append(secondLogData, logpoller.EvmWord(20).Bytes()...) - - err := th.ORM.InsertLogsWithBlock(ctx, - []logpoller.Log{ - GenLogWithData(th.ChainID, address, eventSig, 1, 1, firstLogData), - GenLogWithData(th.ChainID, address, eventSig, 2, 2, secondLogData), - }, - logpoller.LogPollerBlock{ - BlockHash: utils.RandomBytes32(), - BlockNumber: 10, - BlockTimestamp: time.Now(), - FinalizedBlockNumber: 1, - }, - ) - require.NoError(t, err) - limiter := query.LimitAndSort{ - SortBy: []query.SortBy{ - query.NewSortByBlock(query.Asc), - query.NewSortBySequence(query.Asc), - }, - } - - tests := []struct { - name string - wordValue uint64 - expectedLogs []int64 - }{ - { - name: "returns only first log", - wordValue: 2, - expectedLogs: []int64{1}, - }, - { - name: "returns only second log", - wordValue: 11, - expectedLogs: []int64{2}, - }, - { - name: "returns both logs if word value is between", - wordValue: 5, - expectedLogs: []int64{1, 2}, - }, - { - name: "returns no logs if word value is outside of the range", - wordValue: 21, - expectedLogs: []int64{}, - }, - } - - wordFilter := func(word uint64) query.KeyFilter { - return query.KeyFilter{ - Expressions: []query.Expression{ - logpoller.NewAddressFilter(address), - logpoller.NewEventSigFilter(eventSig), - logpoller.NewEventByWordFilter(0, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(word)}, Operator: primitives.Lte}, - }), - logpoller.NewEventByWordFilter(1, []logpoller.HashedValueComparator{ - {Values: []common.Hash{logpoller.EvmWord(word)}, Operator: primitives.Gte}, - }), - query.Confidence(primitives.Unconfirmed), - }, - } - } - - assertion := func(t *testing.T, logs []logpoller.Log, err error, expected []int64) { - require.NoError(t, err) - assert.Len(t, logs, len(expected)) - - for index := range logs { - assert.Equal(t, expected[index], logs[index].BlockNumber) - } - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - logs, err := th.ORM.SelectLogsDataWordBetween(ctx, address, eventSig, 0, 1, logpoller.EvmWord(tt.wordValue), types.Unconfirmed) - - assertion(t, logs, err, tt.expectedLogs) - - logs, err = th.ORM.FilteredLogs(ctx, wordFilter(tt.wordValue).Expressions, limiter, "") - - assertion(t, logs, err, tt.expectedLogs) - }) - } -} - -func Benchmark_LogsDataWordBetween(b *testing.B) { - chainId := big.NewInt(137) - db := testutils.NewIndependentSqlxDB(b) - o := logpoller.NewORM(chainId, db, logger.Test(b)) - ctx := testutils.Context(b) - - numberOfReports := 100_000 - numberOfMessagesPerReport := 256 - - commitStoreAddress := utils.RandomAddress() - commitReportAccepted := utils.RandomBytes32() - - var dbLogs []logpoller.Log - for i := 0; i < numberOfReports; i++ { - data := make([]byte, 64) - // MinSeqNr - data = append(data, logpoller.EvmWord(uint64(numberOfMessagesPerReport*i+1)).Bytes()...) - // MaxSeqNr - data = append(data, logpoller.EvmWord(uint64(numberOfMessagesPerReport*(i+1))).Bytes()...) - - dbLogs = append(dbLogs, logpoller.Log{ - EvmChainId: ubig.New(chainId), - LogIndex: int64(i + 1), - BlockHash: utils.RandomBytes32(), - BlockNumber: int64(i + 1), - BlockTimestamp: time.Now(), - EventSig: commitReportAccepted, - Topics: [][]byte{}, - Address: commitStoreAddress, - TxHash: utils.RandomHash(), - Data: data, - CreatedAt: time.Now(), - }) - } - require.NoError(b, o.InsertBlock(ctx, utils.RandomHash(), int64(numberOfReports*numberOfMessagesPerReport), time.Now(), int64(numberOfReports*numberOfMessagesPerReport))) - require.NoError(b, o.InsertLogs(ctx, dbLogs)) - - b.ResetTimer() - - for i := 0; i < b.N; i++ { - logs, err := o.SelectLogsDataWordBetween(ctx, - commitStoreAddress, - commitReportAccepted, - 2, - 3, - logpoller.EvmWord(uint64(numberOfReports*numberOfMessagesPerReport/2)), // Pick the middle report - types.Unconfirmed, - ) - assert.NoError(b, err) - assert.Len(b, logs, 1) - } -} - -func Benchmark_DeleteExpiredLogs(b *testing.B) { - chainId := big.NewInt(137) - db := testutils.NewIndependentSqlxDB(b) - o := logpoller.NewORM(chainId, db, logger.Test(b)) - ctx := testutils.Context(b) - - numberOfReports := 200_000 - commitStoreAddress := utils.RandomAddress() - commitReportAccepted := utils.RandomBytes32() - - past := time.Now().Add(-1 * time.Hour) - - err := o.InsertFilter(ctx, logpoller.Filter{ - Name: "test filter", - EventSigs: []common.Hash{commitReportAccepted}, - Addresses: []common.Address{commitStoreAddress}, - Retention: 1 * time.Millisecond, - }) - require.NoError(b, err) - - for j := 0; j < 5; j++ { - var dbLogs []logpoller.Log - for i := 0; i < numberOfReports; i++ { - dbLogs = append(dbLogs, logpoller.Log{ - EvmChainId: ubig.New(chainId), - LogIndex: int64(i + 1), - BlockHash: utils.RandomBytes32(), - BlockNumber: int64(i + 1), - BlockTimestamp: past, - EventSig: commitReportAccepted, - Topics: [][]byte{}, - Address: commitStoreAddress, - TxHash: utils.RandomHash(), - Data: []byte{}, - CreatedAt: past, - }) - } - require.NoError(b, o.InsertLogs(ctx, dbLogs)) - } - - b.ResetTimer() - - for i := 0; i < b.N; i++ { - tx, err1 := db.Beginx() - assert.NoError(b, err1) - - _, err1 = o.DeleteExpiredLogs(ctx, 0) - assert.NoError(b, err1) - - err1 = tx.Rollback() - assert.NoError(b, err1) - } -} - -func TestSelectOldestBlock(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - o2 := th.ORM2 - ctx := testutils.Context(t) - t.Run("Selects oldest within given chain", func(t *testing.T) { - // insert blocks - require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1231"), 11, time.Now(), 0)) - require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1232"), 12, time.Now(), 0)) - // insert newer block from different chain - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1233"), 13, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1231"), 14, time.Now(), 0)) - block, err := o1.SelectOldestBlock(ctx, 0) - require.NoError(t, err) - require.NotNil(t, block) - require.Equal(t, block.BlockNumber, int64(13)) - require.Equal(t, block.BlockHash, common.HexToHash("0x1233")) - }) - t.Run("Does not select blocks older than specified limit", func(t *testing.T) { - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1232"), 11, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1233"), 13, time.Now(), 0)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1234"), 15, time.Now(), 0)) - block, err := o1.SelectOldestBlock(ctx, 12) - require.NoError(t, err) - require.NotNil(t, block) - require.Equal(t, block.BlockNumber, int64(13)) - require.Equal(t, block.BlockHash, common.HexToHash("0x1233")) - }) -} - -func TestSelectLatestFinalizedBlock(t *testing.T) { - t.Run("If finalized block is not present in DB return error", func(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - o2 := th.ORM2 - ctx := testutils.Context(t) - // o2's chain does not have finalized block - require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1231"), 11, time.Now(), 9)) - require.NoError(t, o2.InsertBlock(ctx, common.HexToHash("0x1234"), 10, time.Now(), 8)) - // o1 has finalized blocks - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1233"), 11, time.Now(), 10)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1232"), 10, time.Now(), 10)) - result, err := o2.SelectLatestFinalizedBlock(ctx) - require.ErrorIs(t, err, sql.ErrNoRows) - require.Nil(t, result) - }) - t.Run("Returns latest finalized block even if there is no exact match by block number", func(t *testing.T) { - th := SetupTH(t, lpOpts) - o1 := th.ORM - ctx := testutils.Context(t) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1233"), 12, time.Now(), 10)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1232"), 11, time.Now(), 9)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1231"), 5, time.Now(), 4)) - require.NoError(t, o1.InsertBlock(ctx, common.HexToHash("0x1230"), 4, time.Now(), 4)) - result, err := o1.SelectLatestFinalizedBlock(ctx) - require.NoError(t, err) - require.NotNil(t, result) - require.Equal(t, int64(5), result.BlockNumber) - require.Equal(t, common.HexToHash("0x1231"), result.BlockHash) - }) -} diff --git a/core/chains/evm/logpoller/parser.go b/core/chains/evm/logpoller/parser.go deleted file mode 100644 index f1deec3cf2c..00000000000 --- a/core/chains/evm/logpoller/parser.go +++ /dev/null @@ -1,564 +0,0 @@ -package logpoller - -import ( - "errors" - "fmt" - "math/big" - "strconv" - "strings" - "time" - - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - - "github.com/smartcontractkit/chainlink-common/pkg/types/query" - "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" - evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -const ( - blockFieldName = "block_number" - timestampFieldName = "block_timestamp" - txHashFieldName = "tx_hash" - eventSigFieldName = "event_sig" - defaultSort = "block_number DESC, log_index DESC" -) - -var ( - ErrUnexpectedCursorFormat = errors.New("unexpected cursor format") - logsFields = [...]string{"evm_chain_id", "log_index", "block_hash", "block_number", - "address", "event_sig", "topics", "tx_hash", "data", "created_at", "block_timestamp"} - blocksFields = [...]string{"evm_chain_id", "block_hash", "block_number", "block_timestamp", - "finalized_block_number", "created_at"} -) - -// The parser builds SQL expressions piece by piece for each Accept function call and resets the error and expression -// values after every call. -type pgDSLParser struct { - args *queryArgs - - // transient properties expected to be set and reset with every expression - expression string - err error -} - -var _ primitives.Visitor = (*pgDSLParser)(nil) - -func (v *pgDSLParser) Comparator(_ primitives.Comparator) {} - -func (v *pgDSLParser) Block(p primitives.Block) { - cmp, err := cmpOpToString(p.Operator) - if err != nil { - v.err = err - - return - } - - v.expression = fmt.Sprintf( - "%s %s :%s", - blockFieldName, - cmp, - v.args.withIndexedField(blockFieldName, p.Block), - ) -} - -func (v *pgDSLParser) Confidence(p primitives.Confidence) { - switch p.ConfidenceLevel { - case primitives.Finalized: - // the highest level of confidence maps to finalized - v.expression = v.nestedConfQuery(true, 0) - case primitives.Unconfirmed: - v.expression = v.nestedConfQuery(false, 0) - default: - v.err = errors.New("unrecognized confidence level; use confidence to confirmations mappings instead") - - return - } -} - -func (v *pgDSLParser) Timestamp(p primitives.Timestamp) { - cmp, err := cmpOpToString(p.Operator) - if err != nil { - v.err = err - - return - } - - v.expression = fmt.Sprintf( - "%s %s :%s", - timestampFieldName, - cmp, - v.args.withIndexedField(timestampFieldName, time.Unix(int64(p.Timestamp), 0)), - ) -} - -func (v *pgDSLParser) TxHash(p primitives.TxHash) { - bts, err := hexutil.Decode(p.TxHash) - if errors.Is(err, hexutil.ErrMissingPrefix) { - bts, err = hexutil.Decode("0x" + p.TxHash) - } - - if err != nil { - v.err = err - - return - } - - txHash := common.BytesToHash(bts) - - v.expression = fmt.Sprintf( - "%s = :%s", - txHashFieldName, - v.args.withIndexedField(txHashFieldName, txHash), - ) -} - -func (v *pgDSLParser) VisitAddressFilter(p *addressFilter) { - v.expression = fmt.Sprintf( - "address = :%s", - v.args.withIndexedField("address", p.address), - ) -} - -func (v *pgDSLParser) VisitEventSigFilter(p *eventSigFilter) { - v.expression = fmt.Sprintf( - "%s = :%s", - eventSigFieldName, - v.args.withIndexedField(eventSigFieldName, p.eventSig), - ) -} - -func (v *pgDSLParser) nestedConfQuery(finalized bool, confs uint64) string { - var ( - from = "FROM evm.log_poller_blocks " - where = "WHERE evm_chain_id = :evm_chain_id " - order = "ORDER BY block_number DESC LIMIT 1" - selector string - ) - - if finalized { - selector = "SELECT finalized_block_number " - } else { - selector = fmt.Sprintf("SELECT greatest(block_number - :%s, 0) ", - v.args.withIndexedField("confs", confs), - ) - } - - var builder strings.Builder - - builder.WriteString(selector) - builder.WriteString(from) - builder.WriteString(where) - builder.WriteString(order) - - return fmt.Sprintf("%s <= (%s)", blockFieldName, builder.String()) -} - -func (v *pgDSLParser) VisitEventByWordFilter(p *eventByWordFilter) { - if len(p.HashedValueComparers) > 0 { - columnName := fmt.Sprintf("substring(data from 32*%d+1 for 32)", p.WordIndex) - - comps := make([]string, len(p.HashedValueComparers)) - for idx, comp := range p.HashedValueComparers { - comps[idx], v.err = v.hashedValueCmpToCondition(comp, columnName, "word_value") - if v.err != nil { - return - } - } - - v.expression = strings.Join(comps, " AND ") - } -} -func (v *pgDSLParser) VisitEventTopicsByValueFilter(p *eventByTopicFilter) { - if len(p.ValueComparers) == 0 { - return - } - - if !(p.Topic == 1 || p.Topic == 2 || p.Topic == 3) { - v.err = fmt.Errorf("invalid index for topic: %d", p.Topic) - - return - } - - // Add 1 since postgresql arrays are 1-indexed. - columnName := fmt.Sprintf("topics[%d]", p.Topic+1) - - comps := make([]string, len(p.ValueComparers)) - for idx, comp := range p.ValueComparers { - comps[idx], v.err = v.hashedValueCmpToCondition(comp, columnName, "topic_value") - if v.err != nil { - return - } - } - - v.expression = strings.Join(comps, " AND ") -} - -func (v *pgDSLParser) VisitConfirmationsFilter(p *confirmationsFilter) { - switch p.Confirmations { - case evmtypes.Finalized: - // the highest level of confidence maps to finalized - v.expression = v.nestedConfQuery(true, 0) - default: - v.expression = v.nestedConfQuery(false, uint64(p.Confirmations)) - } -} - -func (v *pgDSLParser) hashedValueCmpToCondition(comp HashedValueComparator, column, fieldName string) (string, error) { - cmp, err := cmpOpToString(comp.Operator) - if err != nil { - return "", err - } - - // simplify query for Postgres as in some cases, it's not that smart - if len(comp.Values) == 1 { - return fmt.Sprintf("%s %s :%s", column, cmp, v.args.withIndexedField(fieldName, comp.Values[0])), nil - } - - return fmt.Sprintf("%s %s ANY(:%s)", column, cmp, v.args.withIndexedField(fieldName, comp.Values)), nil -} - -func (v *pgDSLParser) buildQuery(chainID *big.Int, expressions []query.Expression, limiter query.LimitAndSort) (string, *queryArgs, error) { - // reset transient properties - v.args = newQueryArgs(chainID) - v.expression = "" - v.err = nil - - // build the query string - clauses := []string{logsQuery("")} - - where, err := v.whereClause(expressions, limiter) - if err != nil { - return "", nil, err - } - - clauses = append(clauses, where) - - order, err := v.orderClause(limiter) - if err != nil { - return "", nil, err - } - - if len(order) > 0 { - clauses = append(clauses, order) - } - - limit := v.limitClause(limiter) - if len(limit) > 0 { - clauses = append(clauses, limit) - } - - return strings.Join(clauses, " "), v.args, nil -} - -func (v *pgDSLParser) whereClause(expressions []query.Expression, limiter query.LimitAndSort) (string, error) { - segment := "WHERE evm_chain_id = :evm_chain_id" - - if len(expressions) > 0 { - exp, hasFinalized, err := v.combineExpressions(expressions, query.AND) - if err != nil { - return "", err - } - - if limiter.HasCursorLimit() && !hasFinalized { - return "", errors.New("cursor-base queries limited to only finalized blocks") - } - - segment = fmt.Sprintf("%s AND %s", segment, exp) - } - - if limiter.HasCursorLimit() { - var op string - switch limiter.Limit.CursorDirection { - case query.CursorFollowing: - op = ">" - case query.CursorPrevious: - op = "<" - default: - return "", errors.New("invalid cursor direction") - } - - block, logIdx, _, err := valuesFromCursor(limiter.Limit.Cursor) - if err != nil { - return "", err - } - - segment = fmt.Sprintf("%s AND (block_number %s :cursor_block_number OR (block_number = :cursor_block_number AND log_index %s :cursor_log_index))", segment, op, op) - - v.args.withField("cursor_block_number", block). - withField("cursor_log_index", logIdx) - } - - return segment, nil -} - -func (v *pgDSLParser) orderClause(limiter query.LimitAndSort) (string, error) { - sorting := limiter.SortBy - - if limiter.HasCursorLimit() && !limiter.HasSequenceSort() { - var dir query.SortDirection - - switch limiter.Limit.CursorDirection { - case query.CursorFollowing: - dir = query.Asc - case query.CursorPrevious: - dir = query.Desc - default: - return "", errors.New("unexpected cursor direction") - } - - sorting = append(sorting, query.NewSortBySequence(dir)) - } - - if len(sorting) == 0 { - return fmt.Sprintf("ORDER BY %s", defaultSort), nil - } - - sort := make([]string, len(sorting)) - - for idx, sorted := range sorting { - var name string - - order, err := orderToString(sorted.GetDirection()) - if err != nil { - return "", err - } - - switch sorted.(type) { - case query.SortByBlock: - name = blockFieldName - case query.SortBySequence: - sort[idx] = fmt.Sprintf("block_number %s, log_index %s, tx_hash %s", order, order, order) - - continue - case query.SortByTimestamp: - name = timestampFieldName - default: - return "", errors.New("unexpected sort by") - } - - sort[idx] = fmt.Sprintf("%s %s", name, order) - } - - return fmt.Sprintf("ORDER BY %s", strings.Join(sort, ", ")), nil -} - -func (v *pgDSLParser) limitClause(limiter query.LimitAndSort) string { - if !limiter.HasCursorLimit() && limiter.Limit.Count == 0 { - return "" - } - - return fmt.Sprintf("LIMIT %d", limiter.Limit.Count) -} - -func (v *pgDSLParser) getLastExpression() (string, error) { - exp := v.expression - err := v.err - - v.expression = "" - v.err = nil - - return exp, err -} - -func (v *pgDSLParser) combineExpressions(expressions []query.Expression, op query.BoolOperator) (string, bool, error) { - grouped := len(expressions) > 1 - clauses := make([]string, len(expressions)) - - var isFinalized bool - - for idx, exp := range expressions { - if exp.IsPrimitive() { - exp.Primitive.Accept(v) - - switch prim := exp.Primitive.(type) { - case *primitives.Confidence: - isFinalized = prim.ConfidenceLevel == primitives.Finalized - case *confirmationsFilter: - isFinalized = prim.Confirmations == evmtypes.Finalized - } - - clause, err := v.getLastExpression() - if err != nil { - return "", isFinalized, err - } - - clauses[idx] = clause - } else { - clause, fin, err := v.combineExpressions(exp.BoolExpression.Expressions, exp.BoolExpression.BoolOperator) - if err != nil { - return "", isFinalized, err - } - - if fin { - isFinalized = fin - } - - clauses[idx] = clause - } - } - - output := strings.Join(clauses, fmt.Sprintf(" %s ", op.String())) - - if grouped { - output = fmt.Sprintf("(%s)", output) - } - - return output, isFinalized, nil -} - -func cmpOpToString(op primitives.ComparisonOperator) (string, error) { - switch op { - case primitives.Eq: - return "=", nil - case primitives.Neq: - return "!=", nil - case primitives.Gt: - return ">", nil - case primitives.Gte: - return ">=", nil - case primitives.Lt: - return "<", nil - case primitives.Lte: - return "<=", nil - default: - return "", errors.New("invalid comparison operator") - } -} - -func orderToString(dir query.SortDirection) (string, error) { - switch dir { - case query.Asc: - return "ASC", nil - case query.Desc: - return "DESC", nil - default: - return "", errors.New("invalid sort direction") - } -} - -// MakeContractReaderCursor is exported to ensure cursor structure remains consistent. -func FormatContractReaderCursor(log Log) string { - return fmt.Sprintf("%d-%d-%s", log.BlockNumber, log.LogIndex, log.TxHash) -} - -// ensure valuesFromCursor remains consistent with the function above that creates a cursor -func valuesFromCursor(cursor string) (int64, int, []byte, error) { - partCount := 3 - - parts := strings.Split(cursor, "-") - if len(parts) != partCount { - return 0, 0, nil, fmt.Errorf("%w: must be composed as block-logindex-txHash", ErrUnexpectedCursorFormat) - } - - block, err := strconv.ParseInt(parts[0], 10, 64) - if err != nil { - return 0, 0, nil, fmt.Errorf("%w: block number not parsable as int64", ErrUnexpectedCursorFormat) - } - - logIdx, err := strconv.ParseInt(parts[1], 10, 32) - if err != nil { - return 0, 0, nil, fmt.Errorf("%w: log index not parsable as int", ErrUnexpectedCursorFormat) - } - - txHash, err := hexutil.Decode(parts[2]) - if err != nil { - return 0, 0, nil, fmt.Errorf("%w: invalid transaction hash: %s", ErrUnexpectedCursorFormat, err.Error()) - } - - return block, int(logIdx), txHash, nil -} - -type addressFilter struct { - address common.Address -} - -func NewAddressFilter(address common.Address) query.Expression { - return query.Expression{ - Primitive: &addressFilter{address: address}, - } -} - -func (f *addressFilter) Accept(visitor primitives.Visitor) { - switch v := visitor.(type) { - case *pgDSLParser: - v.VisitAddressFilter(f) - } -} - -type eventSigFilter struct { - eventSig common.Hash -} - -func NewEventSigFilter(hash common.Hash) query.Expression { - return query.Expression{ - Primitive: &eventSigFilter{eventSig: hash}, - } -} - -func (f *eventSigFilter) Accept(visitor primitives.Visitor) { - switch v := visitor.(type) { - case *pgDSLParser: - v.VisitEventSigFilter(f) - } -} - -type HashedValueComparator struct { - Values []common.Hash - Operator primitives.ComparisonOperator -} - -type eventByWordFilter struct { - WordIndex int - HashedValueComparers []HashedValueComparator -} - -func NewEventByWordFilter(wordIndex int, valueComparers []HashedValueComparator) query.Expression { - return query.Expression{Primitive: &eventByWordFilter{ - WordIndex: wordIndex, - HashedValueComparers: valueComparers, - }} -} - -func (f *eventByWordFilter) Accept(visitor primitives.Visitor) { - switch v := visitor.(type) { - case *pgDSLParser: - v.VisitEventByWordFilter(f) - } -} - -type eventByTopicFilter struct { - Topic uint64 - ValueComparers []HashedValueComparator -} - -func NewEventByTopicFilter(topicIndex uint64, valueComparers []HashedValueComparator) query.Expression { - return query.Expression{Primitive: &eventByTopicFilter{ - Topic: topicIndex, - ValueComparers: valueComparers, - }} -} - -func (f *eventByTopicFilter) Accept(visitor primitives.Visitor) { - switch v := visitor.(type) { - case *pgDSLParser: - v.VisitEventTopicsByValueFilter(f) - } -} - -type confirmationsFilter struct { - Confirmations evmtypes.Confirmations -} - -func NewConfirmationsFilter(confirmations evmtypes.Confirmations) query.Expression { - return query.Expression{Primitive: &confirmationsFilter{ - Confirmations: confirmations, - }} -} - -func (f *confirmationsFilter) Accept(visitor primitives.Visitor) { - switch v := visitor.(type) { - case *pgDSLParser: - v.VisitConfirmationsFilter(f) - } -} diff --git a/core/chains/evm/logpoller/parser_test.go b/core/chains/evm/logpoller/parser_test.go deleted file mode 100644 index fcfcb8663b2..00000000000 --- a/core/chains/evm/logpoller/parser_test.go +++ /dev/null @@ -1,369 +0,0 @@ -package logpoller - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-common/pkg/types/query" - "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" - "github.com/smartcontractkit/chainlink-integrations/evm/types" -) - -func assertArgs(t *testing.T, args *queryArgs, numVals int) { - values, err := args.toArgs() - - assert.Len(t, values, numVals) - assert.NoError(t, err) -} - -func TestDSLParser(t *testing.T) { - t.Parallel() - - t.Run("query with no filters no order and no limit", func(t *testing.T) { - t.Parallel() - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - expressions := []query.Expression{} - limiter := query.LimitAndSort{} - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - - require.NoError(t, err) - assert.Equal(t, logsQuery(" WHERE evm_chain_id = :evm_chain_id ORDER BY "+defaultSort), result) - - assertArgs(t, args, 1) - }) - - t.Run("query with cursor and no order by", func(t *testing.T) { - t.Parallel() - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - expressions := []query.Expression{ - NewAddressFilter(common.HexToAddress("0x42")), - NewEventSigFilter(common.HexToHash("0x21")), - NewConfirmationsFilter(types.Finalized), - } - limiter := query.NewLimitAndSort(query.CursorLimit("10-5-0x42", query.CursorFollowing, 20)) - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND (address = :address_0 AND event_sig = :event_sig_0 " + - "AND block_number <= " + - "(SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)) " + - "AND (block_number > :cursor_block_number OR (block_number = :cursor_block_number AND log_index > :cursor_log_index)) " + - "ORDER BY block_number ASC, log_index ASC, tx_hash ASC " + - "LIMIT 20") - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 5) - }) - - t.Run("query with limit and no order by", func(t *testing.T) { - t.Parallel() - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - expressions := []query.Expression{ - NewAddressFilter(common.HexToAddress("0x42")), - NewEventSigFilter(common.HexToHash("0x21")), - } - limiter := query.NewLimitAndSort(query.CountLimit(20)) - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND (address = :address_0 AND event_sig = :event_sig_0) " + - "ORDER BY " + defaultSort + " " + - "LIMIT 20") - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 3) - }) - - t.Run("query with order by sequence no cursor no limit", func(t *testing.T) { - t.Parallel() - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - expressions := []query.Expression{} - limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Desc)) - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "ORDER BY block_number DESC, log_index DESC, tx_hash DESC") - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 1) - }) - - t.Run("query with multiple order by no limit", func(t *testing.T) { - t.Parallel() - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - expressions := []query.Expression{} - limiter := query.NewLimitAndSort(query.Limit{}, query.NewSortByBlock(query.Asc), query.NewSortByTimestamp(query.Desc)) - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "ORDER BY block_number ASC, block_timestamp DESC") - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 1) - }) - - t.Run("basic query with default primitives no order by and cursor", func(t *testing.T) { - t.Parallel() - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - expressions := []query.Expression{ - query.Timestamp(10, primitives.Eq), - query.TxHash(common.HexToHash("0x84").String()), - query.Block("99", primitives.Neq), - query.Confidence(primitives.Finalized), - } - limiter := query.NewLimitAndSort(query.CursorLimit("10-20-0x42", query.CursorPrevious, 20)) - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND (block_timestamp = :block_timestamp_0 " + - "AND tx_hash = :tx_hash_0 " + - "AND block_number != :block_number_0 " + - "AND block_number <= " + - "(SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1)) " + - "AND (block_number < :cursor_block_number OR (block_number = :cursor_block_number AND log_index < :cursor_log_index)) " + - "ORDER BY block_number DESC, log_index DESC, tx_hash DESC LIMIT 20") - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 6) - }) - - t.Run("query for finality", func(t *testing.T) { - t.Parallel() - - t.Run("finalized", func(t *testing.T) { - parser := &pgDSLParser{} - chainID := big.NewInt(1) - - expressions := []query.Expression{query.Confidence(primitives.Finalized)} - limiter := query.LimitAndSort{} - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND block_number <= (SELECT finalized_block_number FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1) ORDER BY " + defaultSort) - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 1) - }) - - t.Run("unconfirmed", func(t *testing.T) { - parser := &pgDSLParser{} - chainID := big.NewInt(1) - - expressions := []query.Expression{query.Confidence(primitives.Unconfirmed)} - limiter := query.LimitAndSort{} - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1) ORDER BY " + defaultSort) - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 2) - }) - - t.Run("exact confirmations", func(t *testing.T) { - parser := &pgDSLParser{} - chainID := big.NewInt(1) - - expressions := []query.Expression{NewConfirmationsFilter(25)} - limiter := query.LimitAndSort{} - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1) ORDER BY " + defaultSort) - - require.NoError(t, err) - assert.Equal(t, expected, result) - - confirmations, ok := args.args["confs_0"] - - require.True(t, ok) - require.Equal(t, uint64(25), confirmations) - - assertArgs(t, args, 2) - }) - }) - - t.Run("query for event by word", func(t *testing.T) { - t.Parallel() - - wordFilter := NewEventByWordFilter(8, []HashedValueComparator{ - {Values: []common.Hash{common.HexToHash("0x1"), common.HexToHash("0x2")}, Operator: primitives.Gt}, - }) - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - expressions := []query.Expression{wordFilter} - limiter := query.LimitAndSort{} - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND substring(data from 32*8+1 for 32) > ANY(:word_value_0) ORDER BY " + defaultSort) - - require.NoError(t, err) - assert.Equal(t, expected, result) - - values, err := args.toArgs() - require.NoError(t, err) - require.Len(t, values, 2) - // HashedValueComparator values should be concatenated into single slice - require.Len(t, values["word_value_0"], 2) - }) - - t.Run("query for event topic", func(t *testing.T) { - t.Parallel() - - topicFilter := NewEventByTopicFilter(2, []HashedValueComparator{ - {Values: []common.Hash{common.HexToHash("a")}, Operator: primitives.Gt}, - {Values: []common.Hash{common.HexToHash("b"), common.HexToHash("c")}, Operator: primitives.Lt}, - }) - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - expressions := []query.Expression{topicFilter} - limiter := query.LimitAndSort{} - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND topics[3] > :topic_value_0 AND topics[3] < ANY(:topic_value_1) ORDER BY " + defaultSort) - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 3) - }) - - // nested query -> a & (b || c) - t.Run("nested query", func(t *testing.T) { - t.Parallel() - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - - expressions := []query.Expression{ - {BoolExpression: query.BoolExpression{ - Expressions: []query.Expression{ - query.Timestamp(10, primitives.Gte), - {BoolExpression: query.BoolExpression{ - Expressions: []query.Expression{ - query.TxHash(common.HexToHash("0x84").Hex()), - query.Confidence(primitives.Unconfirmed), - }, - BoolOperator: query.OR, - }}, - }, - BoolOperator: query.AND, - }}, - } - limiter := query.LimitAndSort{} - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND (block_timestamp >= :block_timestamp_0 " + - "AND (tx_hash = :tx_hash_0 " + - "OR block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1))) ORDER BY " + defaultSort) - - require.NoError(t, err) - assert.Equal(t, expected, result) - - assertArgs(t, args, 4) - }) - - // deep nested query -> a & (b || (c & d)) - t.Run("nested query deep", func(t *testing.T) { - t.Parallel() - - wordFilter := NewEventByWordFilter(8, []HashedValueComparator{ - {Values: []common.Hash{common.HexToHash("a")}, Operator: primitives.Gt}, - {Values: []common.Hash{common.HexToHash("b"), common.HexToHash("c")}, Operator: primitives.Lte}, - }) - - parser := &pgDSLParser{} - chainID := big.NewInt(1) - - expressions := []query.Expression{ - {BoolExpression: query.BoolExpression{ - Expressions: []query.Expression{ - query.Timestamp(10, primitives.Eq), - {BoolExpression: query.BoolExpression{ - Expressions: []query.Expression{ - query.TxHash(common.HexToHash("0x84").Hex()), - {BoolExpression: query.BoolExpression{ - Expressions: []query.Expression{ - query.Confidence(primitives.Unconfirmed), - wordFilter, - }, - BoolOperator: query.AND, - }}, - }, - BoolOperator: query.OR, - }}, - }, - BoolOperator: query.AND, - }}, - } - limiter := query.LimitAndSort{} - - result, args, err := parser.buildQuery(chainID, expressions, limiter) - expected := logsQuery( - " WHERE evm_chain_id = :evm_chain_id " + - "AND (block_timestamp = :block_timestamp_0 " + - "AND (tx_hash = :tx_hash_0 " + - "OR (block_number <= (SELECT greatest(block_number - :confs_0, 0) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id ORDER BY block_number DESC LIMIT 1) " + - "AND substring(data from 32*8+1 for 32) > :word_value_0 " + - "AND substring(data from 32*8+1 for 32) <= ANY(:word_value_1)))) ORDER BY " + defaultSort) - - require.NoError(t, err) - assert.Equal(t, expected, result) - - values, err := args.toArgs() - require.NoError(t, err) - require.Len(t, values, 6) - // unwraps slice of len 1 - require.IsType(t, []uint8{}, values["word_value_0"]) - // HashedValueComparator values should be concatenated into single slice - require.IsType(t, [][]uint8{}, values["word_value_1"]) - require.Len(t, values["word_value_1"], 2) - }) -} diff --git a/core/chains/evm/logpoller/query.go b/core/chains/evm/logpoller/query.go deleted file mode 100644 index 82a80dc85c1..00000000000 --- a/core/chains/evm/logpoller/query.go +++ /dev/null @@ -1,206 +0,0 @@ -package logpoller - -import ( - "errors" - "fmt" - "math/big" - "time" - - "github.com/ethereum/go-ethereum/common" - - "github.com/smartcontractkit/chainlink-integrations/evm/types" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" -) - -type bytesProducer interface { - Bytes() []byte -} - -func concatBytes[T bytesProducer](byteSlice []T) [][]byte { - var output [][]byte - for _, b := range byteSlice { - output = append(output, b.Bytes()) - } - return output -} - -// queryArgs is a helper for building the arguments to a postgres query created by DSORM -// Besides the convenience methods, it also keeps track of arguments validation and sanitization. -type queryArgs struct { - args map[string]any - idxLookup map[string]uint8 - err []error -} - -func newQueryArgs(chainId *big.Int) *queryArgs { - return &queryArgs{ - args: map[string]any{ - "evm_chain_id": ubig.New(chainId), - }, - idxLookup: make(map[string]uint8), - err: []error{}, - } -} - -func newQueryArgsForEvent(chainId *big.Int, address common.Address, eventSig common.Hash) *queryArgs { - return newQueryArgs(chainId). - withAddress(address). - withEventSig(eventSig) -} - -func (q *queryArgs) withField(fieldName string, value any) *queryArgs { - _, args := q.withIndexableField(fieldName, value, false) - - return args -} - -func (q *queryArgs) withIndexedField(fieldName string, value any) string { - field, _ := q.withIndexableField(fieldName, value, true) - - return field -} - -func (q *queryArgs) withIndexableField(fieldName string, value any, addIndex bool) (string, *queryArgs) { - if addIndex { - idx := q.nextIdx(fieldName) - idxName := fmt.Sprintf("%s_%d", fieldName, idx) - - q.idxLookup[fieldName] = uint8(idx) - fieldName = idxName - } - - switch typed := value.(type) { - case common.Hash: - q.args[fieldName] = typed.Bytes() - case []common.Hash: - q.args[fieldName] = concatBytes(typed) - case types.HashArray: - q.args[fieldName] = concatBytes(typed) - case []common.Address: - q.args[fieldName] = concatBytes(typed) - default: - q.args[fieldName] = typed - } - - return fieldName, q -} - -func (q *queryArgs) nextIdx(baseFieldName string) int { - idx, ok := q.idxLookup[baseFieldName] - if !ok { - return 0 - } - - return int(idx) + 1 -} - -func (q *queryArgs) withEventSig(eventSig common.Hash) *queryArgs { - return q.withField("event_sig", eventSig) -} - -func (q *queryArgs) withEventSigArray(eventSigs []common.Hash) *queryArgs { - return q.withField("event_sig_array", eventSigs) -} - -func (q *queryArgs) withTopicArray(topicValues types.HashArray, topicNum uint64) *queryArgs { - return q.withField(fmt.Sprintf("topic%d", topicNum), topicValues) -} - -func (q *queryArgs) withTopicArrays(topic2Vals types.HashArray, topic3Vals types.HashArray, topic4Vals types.HashArray) *queryArgs { - return q.withTopicArray(topic2Vals, 2). - withTopicArray(topic3Vals, 3). - withTopicArray(topic4Vals, 4) -} - -func (q *queryArgs) withAddress(address common.Address) *queryArgs { - return q.withField("address", address) -} - -func (q *queryArgs) withAddressArray(addresses []common.Address) *queryArgs { - return q.withField("address_array", addresses) -} - -func (q *queryArgs) withStartBlock(startBlock int64) *queryArgs { - return q.withField("start_block", startBlock) -} - -func (q *queryArgs) withEndBlock(endBlock int64) *queryArgs { - return q.withField("end_block", endBlock) -} - -func (q *queryArgs) withWordIndex(wordIndex int) *queryArgs { - return q.withField("word_index", wordIndex) -} - -func (q *queryArgs) withWordValueMin(wordValueMin common.Hash) *queryArgs { - return q.withField("word_value_min", wordValueMin) -} - -func (q *queryArgs) withWordValueMax(wordValueMax common.Hash) *queryArgs { - return q.withField("word_value_max", wordValueMax) -} - -func (q *queryArgs) withWordIndexMin(wordIndex int) *queryArgs { - return q.withField("word_index_min", wordIndex) -} - -func (q *queryArgs) withWordIndexMax(wordIndex int) *queryArgs { - return q.withField("word_index_max", wordIndex) -} - -func (q *queryArgs) withWordValue(wordValue common.Hash) *queryArgs { - return q.withField("word_value", wordValue) -} - -func (q *queryArgs) withConfs(confs types.Confirmations) *queryArgs { - return q.withField("confs", confs) -} - -func (q *queryArgs) withTopicIndex(index int) *queryArgs { - // Only topicIndex 1 through 3 is valid. 0 is the event sig and only 4 total topics are allowed - if !(index == 1 || index == 2 || index == 3) { - q.err = append(q.err, fmt.Errorf("invalid index for topic: %d", index)) - } - // Add 1 since postgresql arrays are 1-indexed. - return q.withField("topic_index", index+1) -} - -func (q *queryArgs) withTopicValueMin(valueMin common.Hash) *queryArgs { - return q.withField("topic_value_min", valueMin) -} - -func (q *queryArgs) withTopicValueMax(valueMax common.Hash) *queryArgs { - return q.withField("topic_value_max", valueMax) -} - -func (q *queryArgs) withTopicValues(values []common.Hash) *queryArgs { - return q.withField("topic_values", concatBytes(values)) -} - -func (q *queryArgs) withBlockTimestampAfter(after time.Time) *queryArgs { - return q.withField("block_timestamp_after", after) -} - -func (q *queryArgs) withTxHash(hash common.Hash) *queryArgs { - return q.withField("tx_hash", hash) -} - -func (q *queryArgs) withRetention(retention time.Duration) *queryArgs { - return q.withField("retention", retention) -} - -func (q *queryArgs) withLogsPerBlock(logsPerBlock uint64) *queryArgs { - return q.withField("logs_per_block", logsPerBlock) -} - -func (q *queryArgs) withMaxLogsKept(maxLogsKept uint64) *queryArgs { - return q.withField("max_logs_kept", maxLogsKept) -} - -func (q *queryArgs) toArgs() (map[string]any, error) { - if len(q.err) > 0 { - return nil, errors.Join(q.err...) - } - - return q.args, nil -} diff --git a/core/chains/evm/logpoller/query_test.go b/core/chains/evm/logpoller/query_test.go deleted file mode 100644 index f26e259976d..00000000000 --- a/core/chains/evm/logpoller/query_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package logpoller - -import ( - "math/big" - "testing" - - "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/require" - - "github.com/smartcontractkit/chainlink-integrations/evm/utils" - ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" -) - -func Test_QueryArgs(t *testing.T) { - tests := []struct { - name string - queryArgs *queryArgs - want map[string]interface{} - wantErr bool - }{ - { - name: "valid arguments", - queryArgs: newQueryArgs(big.NewInt(20)).withAddress(utils.ZeroAddress), - want: map[string]interface{}{ - "evm_chain_id": ubig.NewI(20), - "address": utils.ZeroAddress, - }, - }, - { - name: "invalid topic index", - queryArgs: newQueryArgs(big.NewInt(20)).withTopicIndex(0), - wantErr: true, - }, - { - name: "custom argument", - queryArgs: newEmptyArgs().withField("arg", "value"), - want: map[string]interface{}{ - "arg": "value", - }, - }, - { - name: "hash converted to bytes", - queryArgs: newEmptyArgs().withField("hash", common.Hash{}), - want: map[string]interface{}{ - "hash": make([]byte, 32), - }, - }, - { - name: "hash array converted to bytes array", - queryArgs: newEmptyArgs().withEventSigArray([]common.Hash{{}, {}}), - want: map[string]interface{}{ - "event_sig_array": [][]byte{make([]byte, 32), make([]byte, 32)}, - }, - }, - { - name: "topic index incremented", - queryArgs: newEmptyArgs().withTopicIndex(2), - want: map[string]interface{}{ - "topic_index": 3, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - args, err := tt.queryArgs.toArgs() - if tt.wantErr { - require.Error(t, err) - } else { - require.NoError(t, err) - require.Equal(t, tt.want, args) - } - }) - } -} - -func newEmptyArgs() *queryArgs { - return &queryArgs{ - args: map[string]interface{}{}, - err: []error{}, - } -} diff --git a/core/chains/evm/txmgr/builder.go b/core/chains/evm/txmgr/builder.go index 6a9aa9266ca..86751dcfadb 100644 --- a/core/chains/evm/txmgr/builder.go +++ b/core/chains/evm/txmgr/builder.go @@ -17,9 +17,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/config/chaintype" "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink-integrations/evm/keystore" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/clientwrappers" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txm/storage" diff --git a/core/chains/evm/txmgr/txmgr_test.go b/core/chains/evm/txmgr/txmgr_test.go index 2142d654c05..971df7f3e15 100644 --- a/core/chains/evm/txmgr/txmgr_test.go +++ b/core/chains/evm/txmgr/txmgr_test.go @@ -37,6 +37,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/keystore" ksmocks "github.com/smartcontractkit/chainlink-integrations/evm/keystore/mocks" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" @@ -44,7 +45,6 @@ import ( commontxmmocks "github.com/smartcontractkit/chainlink/v2/common/txmgr/types/mocks" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" ) @@ -56,7 +56,7 @@ func makeTestEvmTxm( PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } diff --git a/core/chains/legacyevm/chain.go b/core/chains/legacyevm/chain.go index a4cc0326341..5b60f3ac0a8 100644 --- a/core/chains/legacyevm/chain.go +++ b/core/chains/legacyevm/chain.go @@ -23,12 +23,12 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/gas/rollups" "github.com/smartcontractkit/chainlink-integrations/evm/heads" "github.com/smartcontractkit/chainlink-integrations/evm/keystore" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/monitor" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/chains" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/logger" ) @@ -240,7 +240,7 @@ func newChain(ctx context.Context, cfg *config.ChainScoped, nodes []*toml.Node, UseFinalityTag: cfg.EVM().FinalityTagEnabled(), FinalityDepth: int64(cfg.EVM().FinalityDepth()), BackfillBatchSize: int64(cfg.EVM().LogBackfillBatchSize()), - RpcBatchSize: int64(cfg.EVM().RPCDefaultBatchSize()), + RPCBatchSize: int64(cfg.EVM().RPCDefaultBatchSize()), KeepFinalizedBlocksDepth: int64(cfg.EVM().LogKeepBlocksDepth()), LogPrunePageSize: int64(cfg.EVM().LogPrunePageSize()), BackupPollerBlockDelay: int64(cfg.EVM().BackupLogPollerBlockDelay()), diff --git a/core/chains/legacyevm/evm_txm.go b/core/chains/legacyevm/evm_txm.go index 8002c0252ba..70c42916e2c 100644 --- a/core/chains/legacyevm/evm_txm.go +++ b/core/chains/legacyevm/evm_txm.go @@ -10,8 +10,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink-integrations/evm/gas/rollups" evmheads "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/core/chains/legacyevm/mocks/chain.go b/core/chains/legacyevm/mocks/chain.go index 1f28aedf987..cc5fdacd7ae 100644 --- a/core/chains/legacyevm/mocks/chain.go +++ b/core/chains/legacyevm/mocks/chain.go @@ -22,7 +22,7 @@ import ( logger "github.com/smartcontractkit/chainlink/v2/core/logger" - logpoller "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + logpoller "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" mock "github.com/stretchr/testify/mock" diff --git a/core/internal/mocks/application.go b/core/internal/mocks/application.go index b3d5c1c351a..e528930dbb4 100644 --- a/core/internal/mocks/application.go +++ b/core/internal/mocks/application.go @@ -23,7 +23,7 @@ import ( logger "github.com/smartcontractkit/chainlink/v2/core/logger" - logpoller "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + logpoller "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" mock "github.com/stretchr/testify/mock" @@ -392,23 +392,23 @@ func (_c *Application_EVMORM_Call) RunAndReturn(run func() types.Configs) *Appli } // FindLCA provides a mock function with given fields: ctx, chainID -func (_m *Application) FindLCA(ctx context.Context, chainID *big.Int) (*logpoller.LogPollerBlock, error) { +func (_m *Application) FindLCA(ctx context.Context, chainID *big.Int) (*logpoller.Block, error) { ret := _m.Called(ctx, chainID) if len(ret) == 0 { panic("no return value specified for FindLCA") } - var r0 *logpoller.LogPollerBlock + var r0 *logpoller.Block var r1 error - if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*logpoller.LogPollerBlock, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) (*logpoller.Block, error)); ok { return rf(ctx, chainID) } - if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *logpoller.LogPollerBlock); ok { + if rf, ok := ret.Get(0).(func(context.Context, *big.Int) *logpoller.Block); ok { r0 = rf(ctx, chainID) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(*logpoller.LogPollerBlock) + r0 = ret.Get(0).(*logpoller.Block) } } @@ -440,12 +440,12 @@ func (_c *Application_FindLCA_Call) Run(run func(ctx context.Context, chainID *b return _c } -func (_c *Application_FindLCA_Call) Return(_a0 *logpoller.LogPollerBlock, _a1 error) *Application_FindLCA_Call { +func (_c *Application_FindLCA_Call) Return(_a0 *logpoller.Block, _a1 error) *Application_FindLCA_Call { _c.Call.Return(_a0, _a1) return _c } -func (_c *Application_FindLCA_Call) RunAndReturn(run func(context.Context, *big.Int) (*logpoller.LogPollerBlock, error)) *Application_FindLCA_Call { +func (_c *Application_FindLCA_Call) RunAndReturn(run func(context.Context, *big.Int) (*logpoller.Block, error)) *Application_FindLCA_Call { _c.Call.Return(run) return _c } diff --git a/core/internal/testutils/evmtest/evmtest.go b/core/internal/testutils/evmtest/evmtest.go index bb9e4b3a890..180f9bd6fe4 100644 --- a/core/internal/testutils/evmtest/evmtest.go +++ b/core/internal/testutils/evmtest/evmtest.go @@ -23,12 +23,12 @@ import ( configtoml "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-integrations/evm/gas" evmheads "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/chains" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/log" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 3b72c7d34eb..cacb9739b11 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -36,7 +36,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 github.com/spf13/cobra v1.8.1 diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 21c10b9433d..2656937455a 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1137,8 +1137,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/core/services/blockhashstore/coordinators.go b/core/services/blockhashstore/coordinators.go index 9a8c34a434e..38a507612bb 100644 --- a/core/services/blockhashstore/coordinators.go +++ b/core/services/blockhashstore/coordinators.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" v1 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_coordinator_interface" v2 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2" v2plus "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2plus_interface" diff --git a/core/services/blockhashstore/delegate_test.go b/core/services/blockhashstore/delegate_test.go index 1dfe2fa3668..df3f4d898f0 100644 --- a/core/services/blockhashstore/delegate_test.go +++ b/core/services/blockhashstore/delegate_test.go @@ -11,8 +11,8 @@ import ( "go.uber.org/zap/zaptest/observer" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" mocklp "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -58,7 +58,7 @@ func createTestDelegate(t *testing.T) (*blockhashstore.Delegate, *testData) { sendingKey, _ := cltest.MustInsertRandomKey(t, kst) lp := &mocklp.LogPoller{} lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{}, nil) legacyChains := evmtest.NewLegacyChains( t, diff --git a/core/services/blockhashstore/feeder.go b/core/services/blockhashstore/feeder.go index e5367cba697..da490fd096f 100644 --- a/core/services/blockhashstore/feeder.go +++ b/core/services/blockhashstore/feeder.go @@ -11,7 +11,7 @@ import ( "go.uber.org/multierr" "golang.org/x/exp/maps" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/core/services/blockhashstore/feeder_test.go b/core/services/blockhashstore/feeder_test.go index 76918a554f3..0892a3a30d2 100644 --- a/core/services/blockhashstore/feeder_test.go +++ b/core/services/blockhashstore/feeder_test.go @@ -16,8 +16,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/mathutil" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" mocklp "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_coordinator_interface" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2" @@ -444,7 +444,7 @@ func (test testCase) testFeederWithLogPollerVRFv1(t *testing.T) { // Mock log poller. lp.On("LatestBlock", mock.Anything). - Return(logpoller.LogPollerBlock{BlockNumber: latest}, nil) + Return(logpoller.Block{BlockNumber: latest}, nil) lp.On( "LogsWithSigs", mock.Anything, @@ -542,7 +542,7 @@ func (test testCase) testFeederWithLogPollerVRFv2(t *testing.T) { // Mock log poller. lp.On("LatestBlock", mock.Anything). - Return(logpoller.LogPollerBlock{BlockNumber: latest}, nil) + Return(logpoller.Block{BlockNumber: latest}, nil) lp.On( "LogsWithSigs", mock.Anything, @@ -640,7 +640,7 @@ func (test testCase) testFeederWithLogPollerVRFv2Plus(t *testing.T) { // Mock log poller. lp.On("LatestBlock", mock.Anything). - Return(logpoller.LogPollerBlock{BlockNumber: latest}, nil) + Return(logpoller.Block{BlockNumber: latest}, nil) lp.On( "LogsWithSigs", mock.Anything, diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go index 5136b684483..55ca46828d5 100644 --- a/core/services/chainlink/application.go +++ b/core/services/chainlink/application.go @@ -30,6 +30,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink-common/pkg/utils/jsonserializable" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/bridges" @@ -40,7 +41,6 @@ import ( gatewayconnector "github.com/smartcontractkit/chainlink/v2/core/capabilities/gateway_connector" "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote" remotetypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/config" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -135,7 +135,7 @@ type Application interface { SecretGenerator() SecretGenerator // FindLCA - finds last common ancestor for LogPoller's chain available in the database and RPC chain - FindLCA(ctx context.Context, chainID *big.Int) (*logpoller.LogPollerBlock, error) + FindLCA(ctx context.Context, chainID *big.Int) (*logpoller.Block, error) // DeleteLogPollerDataAfter - delete LogPoller state starting from the specified block DeleteLogPollerDataAfter(ctx context.Context, chainID *big.Int, start int64) error } @@ -1225,7 +1225,7 @@ func (app *ChainlinkApplication) ID() uuid.UUID { } // FindLCA - finds last common ancestor -func (app *ChainlinkApplication) FindLCA(ctx context.Context, chainID *big.Int) (*logpoller.LogPollerBlock, error) { +func (app *ChainlinkApplication) FindLCA(ctx context.Context, chainID *big.Int) (*logpoller.Block, error) { chain, err := app.GetRelayers().LegacyEVMChains().Get(chainID.String()) if err != nil { return nil, err diff --git a/core/services/headreporter/prometheus_reporter_test.go b/core/services/headreporter/prometheus_reporter_test.go index c091af807a5..5c8ef15c136 100644 --- a/core/services/headreporter/prometheus_reporter_test.go +++ b/core/services/headreporter/prometheus_reporter_test.go @@ -13,8 +13,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -130,7 +130,7 @@ func newLegacyChainContainer(t *testing.T, db *sqlx.DB) legacyevm.LegacyChainCon PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/llo/channel_definition_cache_factory.go b/core/services/llo/channel_definition_cache_factory.go index 55a79ed7a91..3a505ec99fe 100644 --- a/core/services/llo/channel_definition_cache_factory.go +++ b/core/services/llo/channel_definition_cache_factory.go @@ -6,7 +6,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" llotypes "github.com/smartcontractkit/chainlink-common/pkg/types/llo" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" lloconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/llo/config" ) diff --git a/core/services/llo/onchain_channel_definition_cache.go b/core/services/llo/onchain_channel_definition_cache.go index 3a7790c49da..5d86d841dfc 100644 --- a/core/services/llo/onchain_channel_definition_cache.go +++ b/core/services/llo/onchain_channel_definition_cache.go @@ -26,7 +26,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/channel_config_store" "github.com/smartcontractkit/chainlink/v2/core/utils" clhttp "github.com/smartcontractkit/chainlink/v2/core/utils/http" @@ -69,7 +69,7 @@ type ChannelDefinitionCacheORM interface { var _ llotypes.ChannelDefinitionCache = &channelDefinitionCache{} type LogPoller interface { - LatestBlock(ctx context.Context) (logpoller.LogPollerBlock, error) + LatestBlock(ctx context.Context) (logpoller.Block, error) FilteredLogs(ctx context.Context, filter []query.Expression, limitAndSort query.LimitAndSort, queryName string) ([]logpoller.Log, error) RegisterFilter(ctx context.Context, filter logpoller.Filter) error UnregisterFilter(ctx context.Context, filterName string) error diff --git a/core/services/llo/onchain_channel_definition_cache_test.go b/core/services/llo/onchain_channel_definition_cache_test.go index e6ea3264273..f5502a5d37e 100644 --- a/core/services/llo/onchain_channel_definition_cache_test.go +++ b/core/services/llo/onchain_channel_definition_cache_test.go @@ -20,13 +20,13 @@ import ( llotypes "github.com/smartcontractkit/chainlink-common/pkg/types/llo" "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/channel_config_store" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) type mockLogPoller struct { - latestBlock logpoller.LogPollerBlock + latestBlock logpoller.Block latestBlockErr error filteredLogs []logpoller.Log filteredLogsErr error @@ -37,7 +37,7 @@ type mockLogPoller struct { func (m *mockLogPoller) RegisterFilter(ctx context.Context, filter logpoller.Filter) error { return nil } -func (m *mockLogPoller) LatestBlock(ctx context.Context) (logpoller.LogPollerBlock, error) { +func (m *mockLogPoller) LatestBlock(ctx context.Context) (logpoller.Block, error) { return m.latestBlock, m.latestBlockErr } func (m *mockLogPoller) FilteredLogs(ctx context.Context, filter []query.Expression, limitAndSort query.LimitAndSort, queryName string) ([]logpoller.Log, error) { @@ -145,7 +145,7 @@ func Test_ChannelDefinitionCache(t *testing.T) { t.Run("does nothing if LatestBlock older or the same as current channel definitions block", func(t *testing.T) { ctx := tests.Context(t) lp.latestBlockErr = nil - lp.latestBlock = logpoller.LogPollerBlock{BlockNumber: 42} + lp.latestBlock = logpoller.Block{BlockNumber: 42} cdc.definitionsBlockNum = 43 err := cdc.readLogs(ctx) diff --git a/core/services/ocr2/plugins/ccip/exportinternal.go b/core/services/ocr2/plugins/ccip/exportinternal.go index edf1f31243f..0b0cadc1e9c 100644 --- a/core/services/ocr2/plugins/ccip/exportinternal.go +++ b/core/services/ocr2/plugins/ccip/exportinternal.go @@ -14,7 +14,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/internal/gethwrappers2/generated/offchainaggregator" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" diff --git a/core/services/ocr2/plugins/ccip/internal/cache/autosync.go b/core/services/ocr2/plugins/ccip/internal/cache/autosync.go index 90786d0a51c..047e7158675 100644 --- a/core/services/ocr2/plugins/ccip/internal/cache/autosync.go +++ b/core/services/ocr2/plugins/ccip/internal/cache/autosync.go @@ -9,8 +9,8 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/pkg/errors" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" ) type AutoSync[T any] interface { diff --git a/core/services/ocr2/plugins/ccip/internal/cache/autosync_test.go b/core/services/ocr2/plugins/ccip/internal/cache/autosync_test.go index 7371d396bce..b08ff109b43 100644 --- a/core/services/ocr2/plugins/ccip/internal/cache/autosync_test.go +++ b/core/services/ocr2/plugins/ccip/internal/cache/autosync_test.go @@ -8,9 +8,9 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache" @@ -108,7 +108,7 @@ func TestLogpollerEventsBased(t *testing.T) { for _, round := range testRounds { lp.On("LatestBlock", mock.Anything). - Return(logpoller.LogPollerBlock{FinalizedBlockNumber: round.logPollerLatestBlock}, nil).Once() + Return(logpoller.Block{FinalizedBlockNumber: round.logPollerLatestBlock}, nil).Once() if round.stateLatestBlock > 0 { lp.On( diff --git a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go index e3047cd0f4f..fabe60e1c57 100644 --- a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go +++ b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go @@ -12,7 +12,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -30,7 +30,7 @@ func Test_RootsEligibleForExecution(t *testing.T) { PollPeriod: time.Hour, FinalityDepth: 2, BackfillBatchSize: 20, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 1000, } lp := logpoller.NewLogPoller(orm, nil, logger.TestLogger(t), nil, lpOpts) @@ -53,7 +53,7 @@ func Test_RootsEligibleForExecution(t *testing.T) { createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 1, root1, block2), createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 2, root2, block2), } - require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.LogPollerBlock{ + require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.Block{ BlockHash: utils.RandomBytes32(), BlockNumber: 2, BlockTimestamp: time.Now(), FinalizedBlockNumber: 1, })) @@ -100,7 +100,7 @@ func Test_RootsEligibleForExecution(t *testing.T) { createReportAcceptedLog(t, chainID, commitStoreAddr, 4, 1, root4, block4), createReportAcceptedLog(t, chainID, commitStoreAddr, 5, 1, root5, block5), } - require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.LogPollerBlock{ + require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.Block{ BlockHash: utils.RandomBytes32(), BlockNumber: 5, BlockTimestamp: time.Now(), FinalizedBlockNumber: 3, })) roots, err = rootsCache.RootsEligibleForExecution(ctx) @@ -123,7 +123,7 @@ func Test_RootsEligibleForExecution(t *testing.T) { inputLogs = []logpoller.Log{ createReportAcceptedLog(t, chainID, commitStoreAddr, 4, 1, root4, newBlock4), } - require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.LogPollerBlock{ + require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.Block{ BlockHash: utils.RandomBytes32(), BlockNumber: 5, BlockTimestamp: time.Now(), FinalizedBlockNumber: 3, })) roots, err = rootsCache.RootsEligibleForExecution(ctx) @@ -146,7 +146,7 @@ func Test_RootsEligibleForExecutionWithReorgs(t *testing.T) { PollPeriod: time.Hour, FinalityDepth: 2, BackfillBatchSize: 20, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 1000, } lp := logpoller.NewLogPoller(orm, nil, logger.TestLogger(t), nil, lpOpts) @@ -169,7 +169,7 @@ func Test_RootsEligibleForExecutionWithReorgs(t *testing.T) { createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 2, root2, block2), createReportAcceptedLog(t, chainID, commitStoreAddr, 3, 1, root3, block3), } - require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.LogPollerBlock{ + require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.Block{ BlockHash: utils.RandomBytes32(), BlockNumber: 3, BlockTimestamp: time.Now(), FinalizedBlockNumber: 1, })) @@ -197,7 +197,7 @@ func Test_RootsEligibleForExecutionWithReorgs(t *testing.T) { createReportAcceptedLog(t, chainID, commitStoreAddr, 4, 1, root2, block4), createReportAcceptedLog(t, chainID, commitStoreAddr, 4, 2, root3, block4), } - require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.LogPollerBlock{ + require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.Block{ BlockHash: utils.RandomBytes32(), BlockNumber: 5, BlockTimestamp: time.Now(), FinalizedBlockNumber: 3, })) roots, err = rootsCache.RootsEligibleForExecution(ctx) @@ -220,7 +220,7 @@ func Test_BlocksWithTheSameTimestamps(t *testing.T) { PollPeriod: time.Hour, FinalityDepth: 2, BackfillBatchSize: 20, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 1000, } lp := logpoller.NewLogPoller(orm, nil, logger.TestLogger(t), nil, lpOpts) @@ -234,7 +234,7 @@ func Test_BlocksWithTheSameTimestamps(t *testing.T) { inputLogs := []logpoller.Log{ createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 1, root1, block), } - require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.LogPollerBlock{ + require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.Block{ BlockHash: utils.RandomBytes32(), BlockNumber: 2, BlockTimestamp: time.Now(), FinalizedBlockNumber: 2, })) @@ -251,7 +251,7 @@ func Test_BlocksWithTheSameTimestamps(t *testing.T) { inputLogs = []logpoller.Log{ createReportAcceptedLog(t, chainID, commitStoreAddr, 3, 1, root2, block), } - require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.LogPollerBlock{ + require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.Block{ BlockHash: utils.RandomBytes32(), BlockNumber: 3, BlockTimestamp: time.Now(), FinalizedBlockNumber: 3, })) @@ -313,6 +313,6 @@ func createReportAcceptedLog(t testing.TB, chainID *big.Int, address common.Addr EventSig: topic0, Address: address, TxHash: utils.RandomBytes32(), - EvmChainId: ubig.New(chainID), + EVMChainID: ubig.New(chainID), } } diff --git a/core/services/ocr2/plugins/ccip/internal/ccipcommon/shortcuts.go b/core/services/ocr2/plugins/ccip/internal/ccipcommon/shortcuts.go index 138d674f93f..e726041645b 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipcommon/shortcuts.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipcommon/shortcuts.go @@ -15,7 +15,7 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider/provider.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider/provider.go index 4ff4dd76a1b..2dcd3dc3b2b 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider/provider.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider/provider.go @@ -6,7 +6,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/factory" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/observability" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go index 08e5227b458..16e1bb51855 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/commit_store_reader_test.go @@ -23,9 +23,9 @@ import ( gasmocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/mocks" rollupMocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/rollups/mocks" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" commit_store_helper_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store_helper" price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" @@ -146,7 +146,7 @@ func TestCommitStoreReaders(t *testing.T) { PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } headTracker := headstest.NewSimulatedHeadTracker(ec, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store.go index a975eacb28b..eb18d1b8b3d 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store.go @@ -10,7 +10,7 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store_test.go index c27162924c0..e3225d10cd0 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/commit_store_test.go @@ -11,8 +11,8 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" mocks2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp.go index 8c99fb07f3f..35925b62799 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp.go @@ -13,8 +13,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp_test.go index e5312e8d238..873baa8af77 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/offramp_test.go @@ -11,8 +11,8 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" mocks2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/onramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/onramp.go index 7ed60cd065d..e5ed8419df4 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/onramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/onramp.go @@ -9,7 +9,7 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/onramp_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/onramp_test.go index 3e37f67835b..60aadac8f61 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/onramp_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/onramp_test.go @@ -11,8 +11,8 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" mocks2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/price_registry.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/price_registry.go index 6ef70e49c8c..fa7592f0b1c 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/price_registry.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/price_registry.go @@ -9,7 +9,7 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/price_registry_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/price_registry_test.go index 32d4f6f66b2..29e360abeb3 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/price_registry_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/factory/price_registry_test.go @@ -10,8 +10,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" mocks2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go index 8ff3f43b5d1..0ecf0efcd85 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/offramp_reader_test.go @@ -17,9 +17,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store_helper" @@ -115,7 +115,7 @@ func setupOffRampReaderTH(t *testing.T, version string) offRampReaderTH { PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } headTracker := headstest.NewSimulatedHeadTracker(bc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go index 41560b7e19b..b77e91ac698 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go @@ -19,9 +19,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" @@ -77,7 +77,7 @@ func setupOnRampReaderTH(t *testing.T, version string) onRampReaderTH { PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } headTracker := headstest.NewSimulatedHeadTracker(bc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go index 628829627de..99b9222cd06 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go @@ -22,9 +22,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -76,7 +76,7 @@ func setupPriceRegistryReaderTH(t *testing.T) priceRegReaderTH { PollPeriod: 100 * time.Millisecond, FinalityDepth: 2, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } headTracker := headstest.NewSimulatedHeadTracker(ec, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/reader.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/reader.go index 9e4dcc2d365..b87fa2a8822 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/reader.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/reader.go @@ -8,8 +8,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" ) const ( diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/reader_test.go index 06766be81ee..5ddd528fa17 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/reader_test.go @@ -10,7 +10,7 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader.go index 9c5c01d63d3..78343a56c04 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader.go @@ -12,8 +12,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader_internal_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader_internal_test.go index ab261407c6e..0d0dc1ddfee 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader_internal_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/usdc_reader_internal_test.go @@ -18,9 +18,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -153,7 +153,7 @@ func TestFilters(t *testing.T) { PollPeriod: 1 * time.Hour, FinalityDepth: 1, BackfillBatchSize: 1, - RpcBatchSize: 1, + RPCBatchSize: 1, KeepFinalizedBlocksDepth: 100, } headTracker := headstest.NewSimulatedHeadTracker(esc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go index 38823cf60e9..3c4d2be50db 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go @@ -21,9 +21,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go index 5aa51180cc0..ef4d3434243 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go @@ -20,9 +20,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_reader_unit_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_reader_unit_test.go index 12da2298f59..b618a5eb443 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_reader_unit_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_reader_unit_test.go @@ -16,10 +16,10 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" evm_2_evm_offramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" @@ -112,7 +112,7 @@ func TestCachedOffRampTokens(t *testing.T) { mockOffRamp.On("Address").Return(utils.RandomAddress()) lp := mocks.NewLogPoller(t) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: rand.Int63()}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: rand.Int63()}, nil) offRamp := OffRamp{ offRampV120: mockOffRamp, @@ -194,7 +194,7 @@ func Test_LogsAreProperlyMarkedAsFinalized(t *testing.T) { lp := mocks.NewLogPoller(t) lp.On("LatestBlock", mock.Anything). - Return(logpoller.LogPollerBlock{FinalizedBlockNumber: tt.lastFinalizedBlock}, nil) + Return(logpoller.Block{FinalizedBlockNumber: tt.lastFinalizedBlock}, nil) lp.On("IndexedLogsTopicRange", mock.Anything, ExecutionStateChangedEvent, offrampAddress, 1, logpoller.EvmWord(minSeqNr), logpoller.EvmWord(maxSeqNr), evmtypes.Confirmations(0)). Return(inputLogs, nil) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp.go index 90fdc56dc3d..1ee0d74b738 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp.go @@ -15,8 +15,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" evm_2_evm_onramp_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp_test.go index 3921684948c..799dbd4c6d0 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/onramp_test.go @@ -8,9 +8,9 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/price_registry.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/price_registry.go index f240a3f2ae8..be3d21c523e 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/price_registry.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/price_registry.go @@ -15,9 +15,9 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/erc20" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/commit_store.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/commit_store.go index 3bbaf9b8dea..3914c3485c8 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/commit_store.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/commit_store.go @@ -12,7 +12,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/commit_store" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0" ) diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go index df11ec00e49..bd2b8129234 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go @@ -14,8 +14,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_offramp" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp.go index b5f689bc02a..4d027fb33e9 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp.go @@ -16,8 +16,8 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go index 6dd23147db3..6571faa64e2 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go @@ -12,10 +12,10 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/evm_2_evm_onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" diff --git a/core/services/ocr2/plugins/ccip/internal/logpollerutil/filters.go b/core/services/ocr2/plugins/ccip/internal/logpollerutil/filters.go index 9c6fee26aab..4f78f08acbb 100644 --- a/core/services/ocr2/plugins/ccip/internal/logpollerutil/filters.go +++ b/core/services/ocr2/plugins/ccip/internal/logpollerutil/filters.go @@ -5,8 +5,8 @@ import ( "github.com/ethereum/go-ethereum/common" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" ) func RegisterLpFilters(ctx context.Context, lp logpoller.LogPoller, filters []logpoller.Filter) error { diff --git a/core/services/ocr2/plugins/ccip/internal/logpollerutil/filters_test.go b/core/services/ocr2/plugins/ccip/internal/logpollerutil/filters_test.go index 9ea08ec1421..5e4b9efb733 100644 --- a/core/services/ocr2/plugins/ccip/internal/logpollerutil/filters_test.go +++ b/core/services/ocr2/plugins/ccip/internal/logpollerutil/filters_test.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) func Test_FiltersDiff(t *testing.T) { diff --git a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go index c83a45d9afc..546f51f158f 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go @@ -28,9 +28,9 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" commit_store_helper_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store_helper" diff --git a/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go b/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go index bd01b642aef..3a0e2e4bbb9 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go @@ -41,11 +41,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" evmUtils "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" evmcapabilities "github.com/smartcontractkit/chainlink/v2/core/capabilities" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" configv2 "github.com/smartcontractkit/chainlink/v2/core/config/toml" price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go index 6ca4370a100..0257e04cb67 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go @@ -27,19 +27,18 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" - evm_2_evm_offramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" - burn_mint_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/burn_mint_token_pool" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/latest/maybe_revert_message_receiver" lock_release_token_pool_1_0_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/lock_release_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" - evm_2_evm_onramp "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" + commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_offramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/evm_2_evm_onramp" price_registry_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/price_registry" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" + burn_mint_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/burn_mint_token_pool" lock_release_token_pool_1_4_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_4_0/lock_release_token_pool" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/mock_rmn_contract" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go index 9d67ba62104..49f55667ec5 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go @@ -41,11 +41,11 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" evmUtils "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" evmcapabilities "github.com/smartcontractkit/chainlink/v2/core/capabilities" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" configv2 "github.com/smartcontractkit/chainlink/v2/core/config/toml" commit_store_1_2_0 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/commit_store" diff --git a/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go b/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go index 7773334253c..7da0c42f280 100644 --- a/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go +++ b/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go @@ -26,8 +26,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/channel_config_store" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -148,7 +148,7 @@ func Test_ChannelDefinitionCache_Integration(t *testing.T) { PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/log_provider.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/log_provider.go index 56576cb654c..29b5cf05281 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/log_provider.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/log_provider.go @@ -18,7 +18,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/keeper_registry_wrapper2_0" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry.go index d0aab0cceb8..c31453546a2 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry.go @@ -22,7 +22,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/keeper_registry_wrapper2_0" @@ -353,7 +353,7 @@ func (r *EvmRegistry) initialize(ctx context.Context) error { func (r *EvmRegistry) pollLogs(ctx context.Context) error { var latest int64 - var end logpoller.LogPollerBlock + var end logpoller.Block var err error if end, err = r.poller.LatestBlock(ctx); err != nil { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go index 8073e448517..5a0c23848f8 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v20/registry_test.go @@ -13,10 +13,10 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-automation/pkg/v2" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) @@ -177,8 +177,8 @@ func TestPollLogs(t *testing.T) { InputStart: 250, InputEnd: 500, OutputLogs: []logpoller.Log{ - {EvmChainId: ubig.New(big.NewInt(5)), LogIndex: 1}, - {EvmChainId: ubig.New(big.NewInt(6)), LogIndex: 2}, + {EVMChainID: ubig.New(big.NewInt(5)), LogIndex: 1}, + {EVMChainID: ubig.New(big.NewInt(6)), LogIndex: 2}, }, OutputErr: nil, }, @@ -192,7 +192,7 @@ func TestPollLogs(t *testing.T) { if test.LatestBlock != nil { mp.On("LatestBlock", mock.Anything). - Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr) + Return(logpoller.Block{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr) } if test.LogsWithSigs != nil { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go index 7c1bcd4292e..7337a52a7d5 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/autotelemetry21/custom_telemetry_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/logger" evm "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber.go index 76cb48e8816..1e5c0807756 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber.go @@ -14,9 +14,9 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/utils" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go index 35194c77962..9be3a29390b 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/block_subscriber_test.go @@ -13,9 +13,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/heads" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -98,7 +98,7 @@ func TestBlockSubscriber_GetBlockRange(t *testing.T) { for _, tc := range tests { t.Run(tc.Name, func(t *testing.T) { lp := new(mocks.LogPoller) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.LatestBlock}, tc.LatestBlockErr) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: tc.LatestBlock}, tc.LatestBlockErr) bs := NewBlockSubscriber(hb, lp, finality, lggr) bs.blockHistorySize = historySize bs.blockSize = blockSize @@ -120,7 +120,7 @@ func TestBlockSubscriber_InitializeBlocks(t *testing.T) { tests := []struct { Name string Blocks []uint64 - PollerBlocks []logpoller.LogPollerBlock + PollerBlocks []logpoller.Block LastClearedBlock int64 Error error }{ @@ -131,7 +131,7 @@ func TestBlockSubscriber_InitializeBlocks(t *testing.T) { { Name: "get block range", Blocks: []uint64{97, 98, 99, 100}, - PollerBlocks: []logpoller.LogPollerBlock{ + PollerBlocks: []logpoller.Block{ { BlockNumber: 97, BlockHash: common.HexToHash("0x5e7fadfc14e1cfa9c05a91128c16a20c6cbc3be38b4723c3d482d44bf9c0e07b"), @@ -279,9 +279,9 @@ func TestBlockSubscriber_Start(t *testing.T) { hb := headstest.NewBroadcaster[*evmtypes.Head, common.Hash](t) hb.On("Subscribe", mock.Anything).Return(&evmtypes.Head{Number: 42}, func() {}) lp := new(mocks.LogPoller) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: 100}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: 100}, nil) blocks := []uint64{97, 98, 99, 100} - pollerBlocks := []logpoller.LogPollerBlock{ + pollerBlocks := []logpoller.Block{ { BlockNumber: 97, BlockHash: common.HexToHash("0xda2f9d1359eadd7b93338703adc07d942021a78195564038321ef53f23f87333"), diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time.go index 9dd442f2e8d..0a4f51fc095 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time.go @@ -6,7 +6,7 @@ import ( "sort" "time" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) var ( diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go index 683ba378940..a0a64d2e6a2 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/block_time_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) @@ -21,7 +21,7 @@ func TestBlockTimeResolver_BlockTime(t *testing.T) { blockSampleSize int64 latestBlock int64 latestBlockErr error - blocksRange []logpoller.LogPollerBlock + blocksRange []logpoller.Block blocksRangeErr error blockTime time.Duration blockTimeErr error @@ -51,7 +51,7 @@ func TestBlockTimeResolver_BlockTime(t *testing.T) { 4, 20, nil, - []logpoller.LogPollerBlock{ + []logpoller.Block{ {BlockTimestamp: now.Add(-time.Second * (2 * 4)), BlockNumber: 16}, {BlockTimestamp: now, BlockNumber: 20}, }, @@ -68,7 +68,7 @@ func TestBlockTimeResolver_BlockTime(t *testing.T) { lp := new(lpmocks.LogPoller) resolver := newBlockTimeResolver(lp) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: tc.latestBlock}, tc.latestBlockErr) lp.On("GetBlocksRange", mock.Anything, mock.Anything).Return(tc.blocksRange, tc.blocksRangeErr) blockTime, err := resolver.BlockTime(ctx, tc.blockSampleSize) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1.go index 00a56496a00..b8fd4378fa7 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1.go @@ -8,7 +8,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/prommetrics" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go index 4c46b9b3fea..c9a990919c4 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/buffer_v1_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/logger" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/factory.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/factory.go index b7c19e5d3f3..162fb48d6e6 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/factory.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/factory.go @@ -7,7 +7,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter.go index c0f204aa57b..67fbf24dfee 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) type upkeepFilter struct { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go index 75684d17bd8..8f4c216df72 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/filter_test.go @@ -8,7 +8,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/stretchr/testify/assert" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) func TestUpkeepFilter_Select(t *testing.T) { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go index 315e30fd13f..5d7a94cb011 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go @@ -17,12 +17,12 @@ import ( "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" - "github.com/smartcontractkit/chainlink-integrations/evm/assets" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/log_upkeep_counter_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -457,7 +457,7 @@ func setupDependencies(t *testing.T, db *sqlx.DB, backend evmtypes.Backend) (log PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 2, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log.go index ba577f57130..815f8ef915c 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log.go @@ -5,7 +5,7 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) // LogSorter sorts the logs primarily by block number, then by log index, and finally by tx hash. diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_packer.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_packer.go index 9ffc48c6c36..bfcf617639b 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_packer.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_packer.go @@ -5,7 +5,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/automation_compatible_utils" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go index 9ee8e98a996..c17929815b7 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/log_test.go @@ -6,7 +6,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) func TestLogComparatorSorter(t *testing.T) { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider.go index 50b2ebc0d06..ed90a2353cc 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider.go @@ -20,7 +20,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/automation_compatible_utils" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/prommetrics" diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle.go index cbd493bf2e4..cafd4529cc7 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle.go @@ -12,7 +12,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) var ( diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go index 26e989c7466..1b859800e87 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_life_cycle_test.go @@ -5,14 +5,14 @@ import ( "math/big" "testing" - "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" - "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" + + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -110,7 +110,7 @@ func TestLogEventProvider_LifeCycle(t *testing.T) { lp := new(mocks.LogPoller) lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) lp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{}, nil) hasFitlerTimes := 1 if tc.unregister { hasFitlerTimes = 2 @@ -149,7 +149,7 @@ func TestEventLogProvider_RefreshActiveUpkeeps(t *testing.T) { mp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) mp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil) mp.On("HasFilter", mock.Anything).Return(false) - mp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{}, nil) + mp.On("LatestBlock", mock.Anything).Return(logpoller.Block{}, nil) mp.On("ReplayAsync", mock.Anything).Return(nil) p := NewLogProvider(logger.TestLogger(t), mp, big.NewInt(1), &mockedPacker{}, NewUpkeepFilterStore(), NewOptions(200, big.NewInt(1))) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go index 9536a24ce06..293561cde5c 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/provider_test.go @@ -8,15 +8,14 @@ import ( "testing" "time" - "github.com/stretchr/testify/assert" - "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -247,7 +246,7 @@ func TestLogEventProvider_ReadLogs(t *testing.T) { mp.On("ReplayAsync", mock.Anything).Return() mp.On("HasFilter", mock.Anything).Return(false) mp.On("UnregisterFilter", mock.Anything, mock.Anything).Return(nil) - mp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: int64(1)}, nil) + mp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: int64(1)}, nil) mp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]logpoller.Log{ { BlockNumber: 1, diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer.go index ed8789c5394..c90ed7455b8 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer.go @@ -24,7 +24,7 @@ import ( "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/prommetrics" "github.com/smartcontractkit/chainlink/v2/core/utils" diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go index 6bfe0a10cf9..3b62df3df73 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer_test.go @@ -19,9 +19,9 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/logger" @@ -32,7 +32,7 @@ import ( func TestLogRecoverer_GetRecoverables(t *testing.T) { ctx := testutils.Context(t) lp := &lpmocks.LogPoller{} - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: 100}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: 100}, nil) r := NewLogRecoverer(logger.TestLogger(t), lp, nil, nil, nil, nil, NewOptions(200, big.NewInt(1))) tests := []struct { @@ -182,7 +182,7 @@ func TestLogRecoverer_Clean(t *testing.T) { start, _ := r.getRecoveryWindow(0) block24h := int64(math.Abs(float64(start))) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: block24h + oldLogsOffset}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: block24h + oldLogsOffset}, nil) statesReader.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.states, nil) r.lock.Lock() @@ -422,7 +422,7 @@ func TestLogRecoverer_Recover(t *testing.T) { recoverer, filterStore, lp, statesReader := setupTestRecoverer(t, time.Millisecond*50, lookbackBlocks) filterStore.AddActiveUpkeeps(tc.active...) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, tc.latestBlockErr) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: tc.latestBlock}, tc.latestBlockErr) lp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.logs, tc.logsErr) statesReader.On("SelectByWorkIDs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.states, tc.statesErr) @@ -1023,7 +1023,7 @@ func TestLogRecoverer_GetProposalData(t *testing.T) { LogsWithSigsFn: func(ctx context.Context, start, end int64, eventSigs []common.Hash, address common.Address) ([]logpoller.Log, error) { return []logpoller.Log{ { - EvmChainId: ubig.New(big.NewInt(1)), + EVMChainID: ubig.New(big.NewInt(1)), LogIndex: 3, BlockHash: [32]byte{1}, BlockNumber: 80, @@ -1205,9 +1205,9 @@ type mockLogPoller struct { func (p *mockLogPoller) LogsWithSigs(ctx context.Context, start, end int64, eventSigs []common.Hash, address common.Address) ([]logpoller.Log, error) { return p.LogsWithSigsFn(ctx, start, end, eventSigs, address) } -func (p *mockLogPoller) LatestBlock(ctx context.Context) (logpoller.LogPollerBlock, error) { +func (p *mockLogPoller) LatestBlock(ctx context.Context) (logpoller.Block, error) { block, err := p.LatestBlockFn(ctx) - return logpoller.LogPollerBlock{BlockNumber: block}, err + return logpoller.Block{BlockNumber: block}, err } type mockClient struct { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry.go index 90eec7ab57f..4689db9256c 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry.go @@ -27,8 +27,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_v21_plus_common" @@ -405,7 +405,7 @@ func (r *EvmRegistry) refreshLogTriggerUpkeepsBatch(ctx context.Context, logTrig func (r *EvmRegistry) pollUpkeepStateLogs(ctx context.Context) error { var latest int64 - var end logpoller.LogPollerBlock + var end logpoller.Block var err error if end, err = r.poller.LatestBlock(ctx); err != nil { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go index c831557b101..4ba30ff2114 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_check_pipeline_test.go @@ -23,8 +23,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" gasMocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/mocks" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_v21_plus_common" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/streams_lookup_compatible_interface" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -107,8 +107,8 @@ func TestRegistry_VerifyCheckBlock(t *testing.T) { WorkID: "work", }, poller: &mockLogPoller{ - GetBlocksRangeFn: func(ctx context.Context, numbers []uint64) ([]logpoller.LogPollerBlock, error) { - return []logpoller.LogPollerBlock{ + GetBlocksRangeFn: func(ctx context.Context, numbers []uint64) ([]logpoller.Block, error) { + return []logpoller.Block{ { BlockHash: common.HexToHash("abcdef"), }, @@ -131,8 +131,8 @@ func TestRegistry_VerifyCheckBlock(t *testing.T) { WorkID: "work", }, poller: &mockLogPoller{ - GetBlocksRangeFn: func(ctx context.Context, numbers []uint64) ([]logpoller.LogPollerBlock, error) { - return []logpoller.LogPollerBlock{ + GetBlocksRangeFn: func(ctx context.Context, numbers []uint64) ([]logpoller.Block, error) { + return []logpoller.Block{ { BlockHash: common.HexToHash("0x5bff03de234fe771ac0d685f9ee0fb0b757ea02ec9e6f10e8e2ee806db1b6b83"), }, @@ -155,8 +155,8 @@ func TestRegistry_VerifyCheckBlock(t *testing.T) { WorkID: "work", }, poller: &mockLogPoller{ - GetBlocksRangeFn: func(ctx context.Context, numbers []uint64) ([]logpoller.LogPollerBlock, error) { - return []logpoller.LogPollerBlock{ + GetBlocksRangeFn: func(ctx context.Context, numbers []uint64) ([]logpoller.Block, error) { + return []logpoller.Block{ { BlockHash: common.HexToHash("0xcba5cf9e2bb32373c76015384e1098912d9510a72481c78057fcb088209167de"), }, @@ -213,11 +213,11 @@ func TestRegistry_VerifyCheckBlock(t *testing.T) { type mockLogPoller struct { logpoller.LogPoller - GetBlocksRangeFn func(ctx context.Context, numbers []uint64) ([]logpoller.LogPollerBlock, error) + GetBlocksRangeFn func(ctx context.Context, numbers []uint64) ([]logpoller.Block, error) IndexedLogsFn func(ctx context.Context, eventSig common.Hash, address common.Address, topicIndex int, topicValues []common.Hash, confs evmtypes.Confirmations) ([]logpoller.Log, error) } -func (p *mockLogPoller) GetBlocksRange(ctx context.Context, numbers []uint64) ([]logpoller.LogPollerBlock, error) { +func (p *mockLogPoller) GetBlocksRange(ctx context.Context, numbers []uint64) ([]logpoller.Block, error) { return p.GetBlocksRangeFn(ctx, numbers) } @@ -484,8 +484,8 @@ func TestRegistry_CheckUpkeeps(t *testing.T) { }, receipts: map[string]*evmtypes.Receipt{}, poller: &mockLogPoller{ - GetBlocksRangeFn: func(ctx context.Context, numbers []uint64) ([]logpoller.LogPollerBlock, error) { - return []logpoller.LogPollerBlock{ + GetBlocksRangeFn: func(ctx context.Context, numbers []uint64) ([]logpoller.Block, error) { + return []logpoller.Block{ { BlockHash: common.HexToHash("0xcba5cf9e2bb32373c76015384e1098912d9510a72481c78057fcb088209167de"), }, diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go index 15b41710fa6..619733b9b7a 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/registry_test.go @@ -20,10 +20,10 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" evmheads "github.com/smartcontractkit/chainlink-integrations/evm/heads" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/automation_compatible_utils" @@ -179,8 +179,8 @@ func TestPollLogs(t *testing.T) { InputStart: 250, InputEnd: 500, OutputLogs: []logpoller.Log{ - {EvmChainId: ubig.New(big.NewInt(5)), LogIndex: 1}, - {EvmChainId: ubig.New(big.NewInt(6)), LogIndex: 2}, + {EVMChainID: ubig.New(big.NewInt(5)), LogIndex: 1}, + {EVMChainID: ubig.New(big.NewInt(6)), LogIndex: 2}, }, OutputErr: nil, }, @@ -194,7 +194,7 @@ func TestPollLogs(t *testing.T) { if test.LatestBlock != nil { mp.On("LatestBlock", mock.Anything). - Return(logpoller.LogPollerBlock{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr) + Return(logpoller.Block{BlockNumber: test.LatestBlock.OutputBlock}, test.LatestBlock.OutputErr) } if test.LogsWithSigs != nil { diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding.go index c77e01dc847..bbb861540fd 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding.go @@ -6,7 +6,7 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_v21_plus_common" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go index 34dccdbafd5..3e9f4e409a7 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/encoding_test.go @@ -3,14 +3,13 @@ package transmit import ( "testing" - "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" - "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_v21_plus_common" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider.go index 55c0a7da4fa..2cf4893b58f 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_v21_plus_common" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go index fc120f793f2..866d13faab4 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/transmit/event_provider_test.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_v21_plus_common" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -90,7 +90,7 @@ func TestTransmitEventProvider_Sanity(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: tc.latestBlock}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: tc.latestBlock}, nil) lp.On("LogsWithSigs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(tc.logs, nil) res, err := provider.GetLatestEvents(ctx) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider.go index 01f136aaa6b..1ef34f9b0cf 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider.go @@ -7,7 +7,7 @@ import ( "github.com/smartcontractkit/chainlink-automation/pkg/v3/types" ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go index cad2d77411d..bb272575f06 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeep_provider_test.go @@ -11,7 +11,7 @@ import ( ocr2keepers "github.com/smartcontractkit/chainlink-common/pkg/types/automation" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/core" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner.go index 8eb3d08b4f8..472ca7e7c21 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner.go @@ -10,8 +10,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_v21_plus_common" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider" ) diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go index dad9273aabc..8ed003614f7 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate/scanner_test.go @@ -9,7 +9,7 @@ import ( "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_automation_v21_plus_common" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index ecd7b0a6857..cb7fd7f91a4 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -34,8 +34,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" automationForwarderLogic "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/automation_forwarder_logic" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/basic_upkeep_contract" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/dummy_protocol_wrapper" diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_test.go index 63a7609ccc5..2164c561627 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_test.go @@ -32,10 +32,10 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/config/toml" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/authorized_forwarder" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/basic_upkeep_contract" diff --git a/core/services/registrysyncer/syncer_test.go b/core/services/registrysyncer/syncer_test.go index f6d4445dc8f..87b7dcbdd63 100644 --- a/core/services/registrysyncer/syncer_test.go +++ b/core/services/registrysyncer/syncer_test.go @@ -29,7 +29,7 @@ import ( evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -108,7 +108,7 @@ func newContractReaderFactory(t *testing.T, simulatedBackend *simulated.Backend) PollPeriod: 100 * time.Millisecond, FinalityDepth: finalityDepth, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, }, ) diff --git a/core/services/relay/evm/capabilities/testutils/backend.go b/core/services/relay/evm/capabilities/testutils/backend.go index d412087bfd9..57e337365cf 100644 --- a/core/services/relay/evm/capabilities/testutils/backend.go +++ b/core/services/relay/evm/capabilities/testutils/backend.go @@ -18,9 +18,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -98,7 +98,7 @@ func (th *EVMBackendTH) SetupCoreServices(t *testing.T) (logpoller.HeadTracker, PollPeriod: 100 * time.Millisecond, FinalityDepth: finalityDepth, BackfillBatchSize: 3, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, }, ) diff --git a/core/services/relay/evm/ccip.go b/core/services/relay/evm/ccip.go index 7f9752c62f4..01274b657e9 100644 --- a/core/services/relay/evm/ccip.go +++ b/core/services/relay/evm/ccip.go @@ -11,7 +11,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers" ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config" diff --git a/core/services/relay/evm/chain_components_test.go b/core/services/relay/evm/chain_components_test.go index dc48edad132..10f6f78035b 100644 --- a/core/services/relay/evm/chain_components_test.go +++ b/core/services/relay/evm/chain_components_test.go @@ -33,9 +33,9 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" clevmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" lpMocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" evmtxmgr "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -294,7 +294,7 @@ func getLPOpts() logpoller.Opts { PollPeriod: time.Millisecond, FinalityDepth: finalityDepth, BackfillBatchSize: 1, - RpcBatchSize: 1, + RPCBatchSize: 1, KeepFinalizedBlocksDepth: 10000, } } diff --git a/core/services/relay/evm/chain_reader.go b/core/services/relay/evm/chain_reader.go index e52c8b72388..1a8f11c9efc 100644 --- a/core/services/relay/evm/chain_reader.go +++ b/core/services/relay/evm/chain_reader.go @@ -22,8 +22,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/values" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/codec" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/read" diff --git a/core/services/relay/evm/chain_reader_historical_client_wrapper_test.go b/core/services/relay/evm/chain_reader_historical_client_wrapper_test.go index 162777e76e2..d80acca0d11 100644 --- a/core/services/relay/evm/chain_reader_historical_client_wrapper_test.go +++ b/core/services/relay/evm/chain_reader_historical_client_wrapper_test.go @@ -15,7 +15,7 @@ import ( clcommontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/codec" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" diff --git a/core/services/relay/evm/commit_provider.go b/core/services/relay/evm/commit_provider.go index 9997f10cdce..4d98797933e 100644 --- a/core/services/relay/evm/commit_provider.go +++ b/core/services/relay/evm/commit_provider.go @@ -17,8 +17,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig" diff --git a/core/services/relay/evm/config_poller.go b/core/services/relay/evm/config_poller.go index f3c997da293..b46ea0e5e83 100644 --- a/core/services/relay/evm/config_poller.go +++ b/core/services/relay/evm/config_poller.go @@ -19,7 +19,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmRelayTypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" ) diff --git a/core/services/relay/evm/config_poller_test.go b/core/services/relay/evm/config_poller_test.go index 3af5ef3c27c..95f47f08256 100644 --- a/core/services/relay/evm/config_poller_test.go +++ b/core/services/relay/evm/config_poller_test.go @@ -34,8 +34,8 @@ import ( evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -100,7 +100,7 @@ func TestConfigPoller(t *testing.T) { PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 2, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/relay/evm/contract_transmitter.go b/core/services/relay/evm/contract_transmitter.go index d0526e449a0..40b263370da 100644 --- a/core/services/relay/evm/contract_transmitter.go +++ b/core/services/relay/evm/contract_transmitter.go @@ -18,8 +18,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/services" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" diff --git a/core/services/relay/evm/contract_transmitter_test.go b/core/services/relay/evm/contract_transmitter_test.go index 71fd5b123df..2469e14d8d0 100644 --- a/core/services/relay/evm/contract_transmitter_test.go +++ b/core/services/relay/evm/contract_transmitter_test.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" diff --git a/core/services/relay/evm/dual_contract_transmitter.go b/core/services/relay/evm/dual_contract_transmitter.go index 981c6120cdd..45b8e5f4f58 100644 --- a/core/services/relay/evm/dual_contract_transmitter.go +++ b/core/services/relay/evm/dual_contract_transmitter.go @@ -19,7 +19,7 @@ import ( ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" ) diff --git a/core/services/relay/evm/dual_contract_transmitter_test.go b/core/services/relay/evm/dual_contract_transmitter_test.go index 88dee4faa64..0d1a0661fef 100644 --- a/core/services/relay/evm/dual_contract_transmitter_test.go +++ b/core/services/relay/evm/dual_contract_transmitter_test.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" diff --git a/core/services/relay/evm/evmtesting/chain_components_interface_tester.go b/core/services/relay/evm/evmtesting/chain_components_interface_tester.go index 4ad897bb989..d2fe649d444 100644 --- a/core/services/relay/evm/evmtesting/chain_components_interface_tester.go +++ b/core/services/relay/evm/evmtesting/chain_components_interface_tester.go @@ -22,8 +22,8 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" evmtxmgr "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/chain_reader_tester" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" diff --git a/core/services/relay/evm/exec_provider.go b/core/services/relay/evm/exec_provider.go index ead1dc9e421..69aceed9bb0 100644 --- a/core/services/relay/evm/exec_provider.go +++ b/core/services/relay/evm/exec_provider.go @@ -23,7 +23,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/gas" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/estimatorconfig" diff --git a/core/services/relay/evm/functions/config_poller.go b/core/services/relay/evm/functions/config_poller.go index 2cb21738b91..623668e5e8a 100644 --- a/core/services/relay/evm/functions/config_poller.go +++ b/core/services/relay/evm/functions/config_poller.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" ) diff --git a/core/services/relay/evm/functions/config_poller_test.go b/core/services/relay/evm/functions/config_poller_test.go index 0c6dadce691..f6919f9a536 100644 --- a/core/services/relay/evm/functions/config_poller_test.go +++ b/core/services/relay/evm/functions/config_poller_test.go @@ -25,9 +25,9 @@ import ( evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -87,7 +87,7 @@ func runTest(t *testing.T, pluginType functions.FunctionsPluginType, expectedDig PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 2, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/relay/evm/functions/contract_transmitter.go b/core/services/relay/evm/functions/contract_transmitter.go index d9c13ef4b38..edf192f076c 100644 --- a/core/services/relay/evm/functions/contract_transmitter.go +++ b/core/services/relay/evm/functions/contract_transmitter.go @@ -20,8 +20,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-framework/chains/txmgr/types" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" "github.com/smartcontractkit/chainlink/v2/core/services" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/functions/encoding" diff --git a/core/services/relay/evm/functions/logpoller_wrapper.go b/core/services/relay/evm/functions/logpoller_wrapper.go index fd8f3165d03..1344c2a40eb 100644 --- a/core/services/relay/evm/functions/logpoller_wrapper.go +++ b/core/services/relay/evm/functions/logpoller_wrapper.go @@ -14,7 +14,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-integrations/evm/client" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/functions/generated/functions_coordinator" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/functions/generated/functions_router" "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/functions/config" diff --git a/core/services/relay/evm/functions/logpoller_wrapper_test.go b/core/services/relay/evm/functions/logpoller_wrapper_test.go index 175185beae3..4528636ca7a 100644 --- a/core/services/relay/evm/functions/logpoller_wrapper_test.go +++ b/core/services/relay/evm/functions/logpoller_wrapper_test.go @@ -16,7 +16,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/functions/generated/functions_coordinator" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -89,7 +89,7 @@ func TestLogPollerWrapper_SingleSubscriberEmptyEvents(t *testing.T) { t.Parallel() ctx := testutils.Context(t) lp, lpWrapper, client := setUp(t, 100_000) // check only once - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: int64(100)}, nil) lp.On("Logs", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]logpoller.Log{}, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(addr(t, "01"), nil) @@ -111,7 +111,7 @@ func TestLogPollerWrapper_ErrorOnZeroAddresses(t *testing.T) { t.Parallel() ctx := testutils.Context(t) lp, lpWrapper, client := setUp(t, 100_000) // check only once - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: int64(100)}, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(addr(t, "00"), nil) @@ -124,7 +124,7 @@ func TestLogPollerWrapper_LatestEvents_ReorgHandling(t *testing.T) { t.Parallel() ctx := testutils.Context(t) lp, lpWrapper, client := setUp(t, 100_000) - lp.On("LatestBlock", mock.Anything).Return(logpoller.LogPollerBlock{BlockNumber: int64(100)}, nil) + lp.On("LatestBlock", mock.Anything).Return(logpoller.Block{BlockNumber: int64(100)}, nil) client.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(addr(t, "01"), nil) lp.On("RegisterFilter", mock.Anything, mock.Anything).Return(nil) lp.On("GetFilters").Return(map[string]logpoller.Filter{}, nil) diff --git a/core/services/relay/evm/llo/config_poller.go b/core/services/relay/evm/llo/config_poller.go index 9865bea8632..c1dda411ea0 100644 --- a/core/services/relay/evm/llo/config_poller.go +++ b/core/services/relay/evm/llo/config_poller.go @@ -20,7 +20,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/configurator" ) @@ -41,7 +41,7 @@ type ConfigPollerService interface { } type LogPoller interface { - LatestBlock(ctx context.Context) (logpoller.LogPollerBlock, error) + LatestBlock(ctx context.Context) (logpoller.Block, error) FilteredLogs(ctx context.Context, filter []query.Expression, limitAndSort query.LimitAndSort, queryName string) ([]logpoller.Log, error) } diff --git a/core/services/relay/evm/llo/config_poller_test.go b/core/services/relay/evm/llo/config_poller_test.go index f9870b22b9c..76911eb4bc7 100644 --- a/core/services/relay/evm/llo/config_poller_test.go +++ b/core/services/relay/evm/llo/config_poller_test.go @@ -16,7 +16,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/types/query" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) @@ -30,8 +30,8 @@ type mockLogPoller struct { limitAndSort query.LimitAndSort } -func (m *mockLogPoller) LatestBlock(ctx context.Context) (logpoller.LogPollerBlock, error) { - return logpoller.LogPollerBlock{BlockNumber: m.latestBlock}, nil +func (m *mockLogPoller) LatestBlock(ctx context.Context) (logpoller.Block, error) { + return logpoller.Block{BlockNumber: m.latestBlock}, nil } func (m *mockLogPoller) RegisterFilter(ctx context.Context, filter logpoller.Filter) error { return nil diff --git a/core/services/relay/evm/llo/should_retire_cache.go b/core/services/relay/evm/llo/should_retire_cache.go index 2815cd9e92d..b1b543ca9a5 100644 --- a/core/services/relay/evm/llo/should_retire_cache.go +++ b/core/services/relay/evm/llo/should_retire_cache.go @@ -11,7 +11,7 @@ import ( ocr2types "github.com/smartcontractkit/libocr/offchainreporting2plus/types" ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" diff --git a/core/services/relay/evm/llo/should_retire_cache_test.go b/core/services/relay/evm/llo/should_retire_cache_test.go index 25c0c92d017..ac51ee6296a 100644 --- a/core/services/relay/evm/llo/should_retire_cache_test.go +++ b/core/services/relay/evm/llo/should_retire_cache_test.go @@ -15,7 +15,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services/servicetest" "github.com/smartcontractkit/chainlink-common/pkg/types/query" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) diff --git a/core/services/relay/evm/llo_provider.go b/core/services/relay/evm/llo_provider.go index ab7cac6da0c..83e62f75f33 100644 --- a/core/services/relay/evm/llo_provider.go +++ b/core/services/relay/evm/llo_provider.go @@ -9,17 +9,18 @@ import ( "github.com/ethereum/go-ethereum/common" ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" - "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/llo" - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury" - "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" - "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink-common/pkg/services" commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" relaytypes "github.com/smartcontractkit/chainlink-common/pkg/types" llotypes "github.com/smartcontractkit/chainlink-common/pkg/types/llo" + + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + + "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" + "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/llo" + "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury" + "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" ) var _ commontypes.LLOProvider = (*lloProvider)(nil) diff --git a/core/services/relay/evm/mercury/config_poller.go b/core/services/relay/evm/mercury/config_poller.go index 7bb5d2af7b5..8074a8202ba 100644 --- a/core/services/relay/evm/mercury/config_poller.go +++ b/core/services/relay/evm/mercury/config_poller.go @@ -13,7 +13,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/logger" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/verifier" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/utils" ) diff --git a/core/services/relay/evm/mercury/helpers_test.go b/core/services/relay/evm/mercury/helpers_test.go index c2a8ae1b33f..f44594514d7 100644 --- a/core/services/relay/evm/mercury/helpers_test.go +++ b/core/services/relay/evm/mercury/helpers_test.go @@ -23,9 +23,9 @@ import ( evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/utils" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/verifier" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/verifier_proxy" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -176,7 +176,7 @@ func SetupTH(t *testing.T, feedID common.Hash) TestHarness { PollPeriod: 100 * time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 2, - RpcBatchSize: 2, + RPCBatchSize: 2, KeepFinalizedBlocksDepth: 1000, } ht := headstest.NewSimulatedHeadTracker(ethClient, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) diff --git a/core/services/relay/evm/read/bindings.go b/core/services/relay/evm/read/bindings.go index 083023754ce..04524c2e615 100644 --- a/core/services/relay/evm/read/bindings.go +++ b/core/services/relay/evm/read/bindings.go @@ -13,8 +13,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/codec" ) diff --git a/core/services/relay/evm/read/bindings_test.go b/core/services/relay/evm/read/bindings_test.go index 129d3138141..a34c0425fce 100644 --- a/core/services/relay/evm/read/bindings_test.go +++ b/core/services/relay/evm/read/bindings_test.go @@ -11,7 +11,7 @@ import ( commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/read" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/read/mocks" ) diff --git a/core/services/relay/evm/read/contract.go b/core/services/relay/evm/read/contract.go index c8770b93600..c6b022eb7fa 100644 --- a/core/services/relay/evm/read/contract.go +++ b/core/services/relay/evm/read/contract.go @@ -10,7 +10,7 @@ import ( commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) // contractBinding stores read bindings and manages the common contract event filter. diff --git a/core/services/relay/evm/read/errors.go b/core/services/relay/evm/read/errors.go index e767da495e7..cccad23a110 100644 --- a/core/services/relay/evm/read/errors.go +++ b/core/services/relay/evm/read/errors.go @@ -7,7 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) type readType string diff --git a/core/services/relay/evm/read/event.go b/core/services/relay/evm/read/event.go index 34b13f7f968..caaa4d673b9 100644 --- a/core/services/relay/evm/read/event.go +++ b/core/services/relay/evm/read/event.go @@ -19,8 +19,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/codec" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types" ) diff --git a/core/services/relay/evm/read/filter.go b/core/services/relay/evm/read/filter.go index 0a5f35891d6..057b944e7a2 100644 --- a/core/services/relay/evm/read/filter.go +++ b/core/services/relay/evm/read/filter.go @@ -9,7 +9,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) type Registrar interface { diff --git a/core/services/relay/evm/read/method.go b/core/services/relay/evm/read/method.go index 0e338c065b0..52c175da097 100644 --- a/core/services/relay/evm/read/method.go +++ b/core/services/relay/evm/read/method.go @@ -17,8 +17,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives" evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/codec" ) diff --git a/core/services/relay/evm/read/mocks/registrar.go b/core/services/relay/evm/read/mocks/registrar.go index 472e68622be..1f4c5ef7f0e 100644 --- a/core/services/relay/evm/read/mocks/registrar.go +++ b/core/services/relay/evm/read/mocks/registrar.go @@ -5,7 +5,7 @@ package mocks import ( context "context" - logpoller "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + logpoller "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" mock "github.com/stretchr/testify/mock" ) diff --git a/core/services/relay/evm/read/multieventtype.go b/core/services/relay/evm/read/multieventtype.go index 1b561912d18..19c52692579 100644 --- a/core/services/relay/evm/read/multieventtype.go +++ b/core/services/relay/evm/read/multieventtype.go @@ -15,7 +15,7 @@ import ( commontypes "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-common/pkg/types/query" "github.com/smartcontractkit/chainlink-common/pkg/values" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ) type EventQuery struct { diff --git a/core/services/relay/evm/types/types.go b/core/services/relay/evm/types/types.go index 3f42d85816b..f03008f1c14 100644 --- a/core/services/relay/evm/types/types.go +++ b/core/services/relay/evm/types/types.go @@ -17,9 +17,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/types" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/store/models" ) diff --git a/core/services/vrf/v2/listener_v2.go b/core/services/vrf/v2/listener_v2.go index 07883925dd3..b403eb09843 100644 --- a/core/services/vrf/v2/listener_v2.go +++ b/core/services/vrf/v2/listener_v2.go @@ -19,8 +19,8 @@ import ( txmgrcommon "github.com/smartcontractkit/chainlink-framework/chains/txmgr" txmgrtypes "github.com/smartcontractkit/chainlink-framework/chains/txmgr/types" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/batch_vrf_coordinator_v2" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/batch_vrf_coordinator_v2plus" @@ -252,7 +252,7 @@ func (lsn *listenerV2) GetStartingResponseCountsV2(ctx context.Context) (respCou return respCounts, nil } -func (lsn *listenerV2) setLatestHead(head logpoller.LogPollerBlock) { +func (lsn *listenerV2) setLatestHead(head logpoller.Block) { lsn.latestHeadMu.Lock() defer lsn.latestHeadMu.Unlock() num := uint64(head.BlockNumber) diff --git a/core/services/vrf/v2/listener_v2_log_listener.go b/core/services/vrf/v2/listener_v2_log_listener.go index eff023c8a0b..168840c040b 100644 --- a/core/services/vrf/v2/listener_v2_log_listener.go +++ b/core/services/vrf/v2/listener_v2_log_listener.go @@ -11,8 +11,8 @@ import ( "go.uber.org/multierr" "github.com/smartcontractkit/chainlink-common/pkg/utils/mathutil" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/vrf/vrfcommon" ) diff --git a/core/services/vrf/v2/listener_v2_log_listener_test.go b/core/services/vrf/v2/listener_v2_log_listener_test.go index f7a1eb88e34..42e6e5ede15 100644 --- a/core/services/vrf/v2/listener_v2_log_listener_test.go +++ b/core/services/vrf/v2/listener_v2_log_listener_test.go @@ -23,10 +23,10 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" evmmocks "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm/mocks" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/log_emitter" @@ -107,7 +107,7 @@ func setupVRFLogPollerListenerTH(t *testing.T) *vrfLogPollerListenerTH { UseFinalityTag: useFinalityTag, FinalityDepth: finalityDepth, BackfillBatchSize: backfillBatchSize, - RpcBatchSize: rpcBatchSize, + RPCBatchSize: rpcBatchSize, KeepFinalizedBlocksDepth: keepFinalizedBlocksDepth, } ht := headstest.NewSimulatedHeadTracker(esc, lpOpts.UseFinalityTag, lpOpts.FinalityDepth) @@ -835,7 +835,7 @@ func TestGetUnfulfilled_NoVRFReqs(t *testing.T) { logs := []logpoller.Log{} for i := 0; i < 10; i++ { logs = append(logs, logpoller.Log{ - EvmChainId: chainID, + EVMChainID: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(i))), BlockNumber: int64(i), @@ -877,7 +877,7 @@ func TestGetUnfulfilled_NoUnfulfilledVRFReqs(t *testing.T) { } } logs = append(logs, logpoller.Log{ - EvmChainId: chainID, + EVMChainID: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2 * i))), BlockNumber: int64(2 * i), @@ -891,7 +891,7 @@ func TestGetUnfulfilled_NoUnfulfilledVRFReqs(t *testing.T) { }) if i%2 == 0 { logs = append(logs, logpoller.Log{ - EvmChainId: chainID, + EVMChainID: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2*i + 1))), BlockNumber: int64(2*i + 1), @@ -935,7 +935,7 @@ func TestGetUnfulfilled_OneUnfulfilledVRFReq(t *testing.T) { } } logs = append(logs, logpoller.Log{ - EvmChainId: chainID, + EVMChainID: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2 * i))), BlockNumber: int64(2 * i), @@ -976,7 +976,7 @@ func TestGetUnfulfilled_SomeUnfulfilledVRFReq(t *testing.T) { } } logs = append(logs, logpoller.Log{ - EvmChainId: chainID, + EVMChainID: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2 * i))), BlockNumber: int64(2 * i), @@ -1023,7 +1023,7 @@ func TestGetUnfulfilled_UnfulfilledNFulfilledVRFReqs(t *testing.T) { } } logs = append(logs, logpoller.Log{ - EvmChainId: chainID, + EVMChainID: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2 * i))), BlockNumber: int64(2 * i), @@ -1037,7 +1037,7 @@ func TestGetUnfulfilled_UnfulfilledNFulfilledVRFReqs(t *testing.T) { }) if i%2 == 0 && i < 6 { logs = append(logs, logpoller.Log{ - EvmChainId: chainID, + EVMChainID: chainID, LogIndex: 0, BlockHash: common.BigToHash(big.NewInt(int64(2*i + 1))), BlockNumber: int64(2*i + 1), diff --git a/core/store/migrate/migrate_test.go b/core/store/migrate/migrate_test.go index 80ff3d45210..ef18967780b 100644 --- a/core/store/migrate/migrate_test.go +++ b/core/store/migrate/migrate_test.go @@ -16,8 +16,8 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/types" evmcfg "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/config/env" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest" @@ -570,10 +570,10 @@ func BenchmarkBackfillingRecordsWithMigration202(b *testing.B) { for j := 0; j < chainCount; j++ { // Insert 100_000 block to database, can't do all at once, so batching by 10k - var blocks []logpoller.LogPollerBlock + var blocks []logpoller.Block for i := 0; i < maxLogsSize; i++ { - blocks = append(blocks, logpoller.LogPollerBlock{ - EvmChainId: ubig.NewI(int64(j + 1)), + blocks = append(blocks, logpoller.Block{ + EVMChainID: ubig.NewI(int64(j + 1)), BlockHash: testutils.Random32Byte(), BlockNumber: int64(i + 1000), FinalizedBlockNumber: 0, diff --git a/core/web/evm_forwarders_controller.go b/core/web/evm_forwarders_controller.go index 1b404cbc999..870f9341198 100644 --- a/core/web/evm_forwarders_controller.go +++ b/core/web/evm_forwarders_controller.go @@ -5,18 +5,17 @@ import ( "net/http" "github.com/ethereum/go-ethereum/common" + "github.com/gin-gonic/gin" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/logger/audit" "github.com/smartcontractkit/chainlink/v2/core/services/chainlink" "github.com/smartcontractkit/chainlink/v2/core/utils/stringutils" "github.com/smartcontractkit/chainlink/v2/core/web/presenters" - - "github.com/gin-gonic/gin" ) // EVMForwardersController manages EVM forwarders. diff --git a/deployment/go.mod b/deployment/go.mod index 5ec2a4ce4bb..8d1539cde49 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -35,7 +35,7 @@ require ( github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a github.com/smartcontractkit/chainlink-testing-framework/framework v0.4.7 diff --git a/deployment/go.sum b/deployment/go.sum index 357dfb9842e..58d31c94179 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1140,8 +1140,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/go.mod b/go.mod index 8da12ade374..57cba4ae448 100644 --- a/go.mod +++ b/go.mod @@ -85,7 +85,7 @@ require ( github.com/smartcontractkit/chainlink-feeds v0.1.1 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 github.com/smartcontractkit/chainlink-solana v1.1.2-0.20250213203720-e15b1333a14a github.com/smartcontractkit/libocr v0.0.0-20241223215956-e5b78d8e3919 diff --git a/go.sum b/go.sum index 755367b409a..f89d9947716 100644 --- a/go.sum +++ b/go.sum @@ -1024,8 +1024,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0/go.mod h1:m/A3lqD7ms/RsQ9BT5P2uceYY0QX5mIt4KQxT2G6qEo= github.com/smartcontractkit/chainlink-protos/rmn/v1.6/go v0.0.0-20250131130834-15e0d4cde2a6 h1:L6KJ4kGv/yNNoCk8affk7Y1vAY0qglPMXC/hevV/IsA= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 2fe7c407d26..111815592d0 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -51,7 +51,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.2 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 668d04578b5..183a9d802f7 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1392,8 +1392,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 622a9826ca1..99c0ea50d21 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -30,7 +30,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb - github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b + github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.2 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 02e91c52135..58219f786e9 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1375,8 +1375,8 @@ github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb h1:LWijSyJ2lhppkFLN19EGsLHZXQ5wen2DEk1cyR0tV+o= github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b h1:vRt+Q51lO9SH4kEk7HbuR0bt0mi27lO9BDUr8l/LwUo= -github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250211220805-23e1d9f38c6b/go.mod h1:UAWEMU4mLuxvr86sN8XFMtFRjkuYQnr+d6iGIbNC36s= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 h1:3icYNFldKQbs6Qrfai2LE+tKbNcE4tfgPRELF30mnEA= +github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02/go.mod h1:7DbPnG0E39eZaX1CXKxRiJ1NOWHwTZYDWR9ys3kZZuU= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM= github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0/go.mod h1:/dVVLXrsp+V0AbcYGJo3XMzKg3CkELsweA/TTopCsKE= github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 h1:ZBat8EBvE2LpSQR9U1gEbRV6PfAkiFdINmQ8nVnXIAQ= diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index bfb06b03b84..3ca3ef73316 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -38,12 +38,12 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" evmchaintypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" evmconfig "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_0_0/rmn_proxy_contract" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/ccip_reader_tester" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/fee_quoter" @@ -254,7 +254,7 @@ func TestCCIPReader_GetRMNRemoteConfig(t *testing.T) { PollPeriod: time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 10, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, sb, big.NewInt(1337)) @@ -378,7 +378,7 @@ func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) { PollPeriod: time.Millisecond, FinalityDepth: 1, BackfillBatchSize: 10, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, sb, big.NewInt(1337)) @@ -1140,7 +1140,7 @@ func populateDatabaseForCommitReportAccepted( // Create log entry logs = append(logs, logpoller.Log{ - EvmChainId: ubig.New(new(big.Int).SetUint64(uint64(destChain))), + EVMChainID: ubig.New(new(big.Int).SetUint64(uint64(destChain))), LogIndex: logIndex, BlockHash: utils.NewHash(), BlockNumber: blockNumber, @@ -1260,7 +1260,7 @@ func populateDatabaseForExecutionStateChanged( // Create log entry logs = append(logs, logpoller.Log{ - EvmChainId: ubig.New(big.NewInt(0).SetUint64(uint64(destChain))), + EVMChainID: ubig.New(big.NewInt(0).SetUint64(uint64(destChain))), LogIndex: logIndex, BlockHash: utils.NewHash(), BlockNumber: blockNumber, @@ -1415,7 +1415,7 @@ func populateDatabaseForMessageSent( // Create log entry logs = append(logs, logpoller.Log{ - EvmChainId: ubig.New(big.NewInt(0).SetUint64(uint64(sourceChain))), + EVMChainID: ubig.New(big.NewInt(0).SetUint64(uint64(sourceChain))), LogIndex: logIndex, BlockHash: utils.NewHash(), BlockNumber: blockNumber, @@ -1485,7 +1485,7 @@ func testSetupRealContracts( PollPeriod: time.Millisecond, FinalityDepth: 0, BackfillBatchSize: 10, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 100000, } lggr := logger.TestLogger(t) @@ -1577,7 +1577,7 @@ func testSetup( PollPeriod: time.Millisecond, FinalityDepth: params.FinalityDepth, BackfillBatchSize: 10, - RpcBatchSize: 10, + RPCBatchSize: 10, KeepFinalizedBlocksDepth: 100000, } cl := client.NewSimulatedBackendClient(t, params.SimulatedBackend, big.NewInt(0).SetUint64(uint64(params.ReaderChain))) diff --git a/integration-tests/universal/log_poller/helpers.go b/integration-tests/universal/log_poller/helpers.go index 8813a34aac0..90a21cb9504 100644 --- a/integration-tests/universal/log_poller/helpers.go +++ b/integration-tests/universal/log_poller/helpers.go @@ -23,6 +23,7 @@ import ( "github.com/scylladb/go-reflectx" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" "github.com/smartcontractkit/chainlink-testing-framework/seth" "github.com/smartcontractkit/chainlink-testing-framework/wasp" "github.com/smartcontractkit/chainlink/integration-tests/utils" @@ -40,7 +41,6 @@ import ( "github.com/smartcontractkit/chainlink/integration-tests/docker/test_env" tc "github.com/smartcontractkit/chainlink/integration-tests/testconfig" lp_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/log_poller" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" ac "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/automation_compatible_utils" le "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/log_emitter" core_logger "github.com/smartcontractkit/chainlink/v2/core/logger" From d1006bec3ff2051a68b892712e7536393c696d72 Mon Sep 17 00:00:00 2001 From: gustavogama-cll <165679773+gustavogama-cll@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:16:56 -0300 Subject: [PATCH 73/83] feat(deployment): changesets to deploy and initialize mcms contracts in Solana (#16163) * feat: add changeset to deploy and init mcms+timelock using new mcms lib * review: remove comments about address lookup tables * review: move access controller data size to a global constant * review: remove callproxy refs, fix state getter and use mcms address functions * review: set deployer as executor role and transfer timelock to itself after initialization * review: fix error messages and comments * fix: use new changeset functions * chore: use DeployMCMSWithTimelockV2 in all integration tests * review: fix contract labels in logs messages --------- Co-authored-by: Pablo --- .../ccip/changeset/cs_deploy_chain_test.go | 6 +- .../changeset/solana/cs_deploy_chain_test.go | 6 +- deployment/ccip/changeset/solana_state.go | 4 +- .../changeset/testhelpers/test_environment.go | 6 +- .../testhelpers/test_token_helpers.go | 6 +- .../changeset/deploy_mcms_with_timelock.go | 45 ++- .../deploy_mcms_with_timelock_test.go | 303 ++++++++++++++++ .../changeset/example/link_transfer_test.go | 6 +- .../common/changeset/internal/evm/mcms.go | 162 +++++++++ .../common/changeset/internal/evm/ownable.go | 14 + .../internal/solana/access_controller.go | 191 ++++++++++ .../common/changeset/internal/solana/mcm.go | 160 +++++++++ .../common/changeset/internal/solana/mcms.go | 101 ++++++ .../common/changeset/internal/solana/pda.go | 77 ++++ .../changeset/internal/solana/timelock.go | 171 +++++++++ .../common/changeset/set_config_mcms_test.go | 6 +- deployment/common/changeset/state/evm.go | 235 ++++++++++++ deployment/common/changeset/state/solana.go | 338 ++++++++++++++++++ .../transfer_to_mcms_with_timelock_test.go | 24 +- .../common/proposalutils/mcms_test_helpers.go | 19 + .../common/proposalutils/propose_test.go | 6 +- deployment/common/types/types.go | 18 + deployment/environment/crib/ccip_deployer.go | 17 +- deployment/environment/memory/chain.go | 22 +- deployment/go.mod | 5 +- deployment/go.sum | 4 +- .../changeset/accept_ownership_test.go | 6 +- .../keystone/changeset/test/env_setup.go | 6 +- go.mod | 2 - 29 files changed, 1898 insertions(+), 68 deletions(-) create mode 100644 deployment/common/changeset/deploy_mcms_with_timelock_test.go create mode 100644 deployment/common/changeset/internal/evm/mcms.go create mode 100644 deployment/common/changeset/internal/evm/ownable.go create mode 100644 deployment/common/changeset/internal/solana/access_controller.go create mode 100644 deployment/common/changeset/internal/solana/mcm.go create mode 100644 deployment/common/changeset/internal/solana/mcms.go create mode 100644 deployment/common/changeset/internal/solana/pda.go create mode 100644 deployment/common/changeset/internal/solana/timelock.go create mode 100644 deployment/common/changeset/state/evm.go create mode 100644 deployment/common/changeset/state/solana.go diff --git a/deployment/ccip/changeset/cs_deploy_chain_test.go b/deployment/ccip/changeset/cs_deploy_chain_test.go index 94a8e5eca14..8802a935a2a 100644 --- a/deployment/ccip/changeset/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/cs_deploy_chain_test.go @@ -29,10 +29,10 @@ func TestDeployChainContractsChangeset(t *testing.T) { nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) require.NoError(t, err) p2pIds := nodes.NonBootstraps().PeerIDs() - cfg := make(map[uint64]commontypes.MCMSWithTimelockConfig) + cfg := make(map[uint64]commontypes.MCMSWithTimelockConfigV2) contractParams := make(map[uint64]changeset.ChainContractParams) for _, chain := range e.AllChainSelectors() { - cfg[chain] = proposalutils.SingleGroupTimelockConfig(t) + cfg[chain] = proposalutils.SingleGroupTimelockConfigV2(t) contractParams[chain] = changeset.ChainContractParams{ FeeQuoterParams: changeset.DefaultFeeQuoterParams(), OffRampParams: changeset.DefaultOffRampParams(), @@ -63,7 +63,7 @@ func TestDeployChainContractsChangeset(t *testing.T) { evmSelectors, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), cfg, ), commonchangeset.Configure( diff --git a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go index 97689265be2..f4d4e591412 100644 --- a/deployment/ccip/changeset/solana/cs_deploy_chain_test.go +++ b/deployment/ccip/changeset/solana/cs_deploy_chain_test.go @@ -32,10 +32,10 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { solChainSelectors := e.AllChainSelectorsSolana() nodes, err := deployment.NodeInfo(e.NodeIDs, e.Offchain) require.NoError(t, err) - cfg := make(map[uint64]commontypes.MCMSWithTimelockConfig) + cfg := make(map[uint64]commontypes.MCMSWithTimelockConfigV2) contractParams := make(map[uint64]changeset.ChainContractParams) for _, chain := range e.AllChainSelectors() { - cfg[chain] = proposalutils.SingleGroupTimelockConfig(t) + cfg[chain] = proposalutils.SingleGroupTimelockConfigV2(t) contractParams[chain] = changeset.ChainContractParams{ FeeQuoterParams: changeset.DefaultFeeQuoterParams(), OffRampParams: changeset.DefaultOffRampParams(), @@ -72,7 +72,7 @@ func TestDeployChainContractsChangesetSolana(t *testing.T) { ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), cfg, ), commonchangeset.Configure( diff --git a/deployment/ccip/changeset/solana_state.go b/deployment/ccip/changeset/solana_state.go index 2bead429d46..eb524fb3dce 100644 --- a/deployment/ccip/changeset/solana_state.go +++ b/deployment/ccip/changeset/solana_state.go @@ -27,8 +27,8 @@ var ( TokenPoolLookupTable deployment.ContractType = "TokenPoolLookupTable" ) -// SolChainState holds a Go binding for all the currently deployed CCIP programs -// on a chain. If a binding is nil, it means here is no such contract on the chain. +// SolCCIPChainState holds public keys for all the currently deployed CCIP programs +// on a chain. If a key has zero value, it means the program does not exist on the chain. type SolCCIPChainState struct { LinkToken solana.PublicKey Router solana.PublicKey diff --git a/deployment/ccip/changeset/testhelpers/test_environment.go b/deployment/ccip/changeset/testhelpers/test_environment.go index f05d76f3150..ba02ab5be80 100644 --- a/deployment/ccip/changeset/testhelpers/test_environment.go +++ b/deployment/ccip/changeset/testhelpers/test_environment.go @@ -419,9 +419,9 @@ func NewEnvironmentWithPrerequisitesContracts(t *testing.T, tEnv TestEnvironment if len(solChains) > 0 { SavePreloadedSolAddresses(t, e.Env, solChains[0]) } - mcmsCfg := make(map[uint64]commontypes.MCMSWithTimelockConfig) + mcmsCfg := make(map[uint64]commontypes.MCMSWithTimelockConfigV2) for _, c := range e.Env.AllChainSelectors() { - mcmsCfg[c] = proposalutils.SingleGroupTimelockConfig(t) + mcmsCfg[c] = proposalutils.SingleGroupTimelockConfigV2(t) } prereqCfg := make([]changeset.DeployPrerequisiteConfigPerChain, 0) for _, chain := range evmChains { @@ -461,7 +461,7 @@ func NewEnvironmentWithPrerequisitesContracts(t *testing.T, tEnv TestEnvironment }, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), mcmsCfg, ), ) diff --git a/deployment/ccip/changeset/testhelpers/test_token_helpers.go b/deployment/ccip/changeset/testhelpers/test_token_helpers.go index c3645794863..a819ad09b18 100644 --- a/deployment/ccip/changeset/testhelpers/test_token_helpers.go +++ b/deployment/ccip/changeset/testhelpers/test_token_helpers.go @@ -44,9 +44,9 @@ func SetupTwoChainEnvironmentWithTokens( } } - mcmsCfg := make(map[uint64]commontypes.MCMSWithTimelockConfig) + mcmsCfg := make(map[uint64]commontypes.MCMSWithTimelockConfigV2) for _, selector := range selectors { - mcmsCfg[selector] = proposalutils.SingleGroupTimelockConfig(t) + mcmsCfg[selector] = proposalutils.SingleGroupTimelockConfigV2(t) } // Deploy one burn-mint token per chain to use in the tests @@ -82,7 +82,7 @@ func SetupTwoChainEnvironmentWithTokens( changeset.DeployPrerequisiteConfig{Configs: prereqCfg}, ), commoncs.Configure( - deployment.CreateLegacyChangeSet(commoncs.DeployMCMSWithTimelock), + deployment.CreateLegacyChangeSet(commoncs.DeployMCMSWithTimelockV2), mcmsCfg, ), ) diff --git a/deployment/common/changeset/deploy_mcms_with_timelock.go b/deployment/common/changeset/deploy_mcms_with_timelock.go index 10a48b0b22b..02c4db8fb59 100644 --- a/deployment/common/changeset/deploy_mcms_with_timelock.go +++ b/deployment/common/changeset/deploy_mcms_with_timelock.go @@ -6,16 +6,23 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" - "github.com/gagliardetto/solana-go" + chain_selectors "github.com/smartcontractkit/chain-selectors" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal" + evminternal "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal/evm" + solanainternal "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal/solana" "github.com/smartcontractkit/chainlink/deployment/common/types" ) -var _ deployment.ChangeSet[map[uint64]types.MCMSWithTimelockConfig] = DeployMCMSWithTimelock +var ( + _ deployment.ChangeSet[map[uint64]types.MCMSWithTimelockConfig] = DeployMCMSWithTimelock + _ deployment.ChangeSet[map[uint64]types.MCMSWithTimelockConfigV2] = DeployMCMSWithTimelockV2 +) +// DeployMCMSWithTimelock deploys and initializes the MCM and Timelock contracts +// Deprecated: use DeployMCMSWithTimelockV2 instead func DeployMCMSWithTimelock(e deployment.Environment, cfgByChain map[uint64]types.MCMSWithTimelockConfig) (deployment.ChangesetOutput, error) { newAddresses := deployment.NewMemoryAddressBook() err := internal.DeployMCMSWithTimelockContractsBatch( @@ -27,6 +34,40 @@ func DeployMCMSWithTimelock(e deployment.Environment, cfgByChain map[uint64]type return deployment.ChangesetOutput{AddressBook: newAddresses}, nil } +// DeployMCMSWithTimelockV2 deploys and initializes the MCM and Timelock contracts +func DeployMCMSWithTimelockV2( + env deployment.Environment, cfgByChain map[uint64]types.MCMSWithTimelockConfigV2, +) (deployment.ChangesetOutput, error) { + newAddresses := deployment.NewMemoryAddressBook() + + for chainSel, cfg := range cfgByChain { + family, err := chain_selectors.GetSelectorFamily(chainSel) + if err != nil { + return deployment.ChangesetOutput{AddressBook: newAddresses}, err + } + + switch family { + case chain_selectors.FamilyEVM: + _, err := evminternal.DeployMCMSWithTimelockContractsEVM(env.Logger, env.Chains[chainSel], newAddresses, cfg) + if err != nil { + return deployment.ChangesetOutput{AddressBook: newAddresses}, err + } + + case chain_selectors.FamilySolana: + _, err := solanainternal.DeployMCMSWithTimelockProgramsSolana(env, env.SolChains[chainSel], newAddresses, cfg) + if err != nil { + return deployment.ChangesetOutput{AddressBook: newAddresses}, err + } + + default: + err = fmt.Errorf("unsupported chain family: %s", family) + return deployment.ChangesetOutput{AddressBook: newAddresses}, err + } + } + + return deployment.ChangesetOutput{AddressBook: newAddresses}, nil +} + func ValidateOwnership(ctx context.Context, mcms bool, deployerKey, timelock common.Address, contract Ownable) error { owner, err := contract.Owner(&bind.CallOpts{Context: ctx}) if err != nil { diff --git a/deployment/common/changeset/deploy_mcms_with_timelock_test.go b/deployment/common/changeset/deploy_mcms_with_timelock_test.go new file mode 100644 index 00000000000..d5f1a8c4749 --- /dev/null +++ b/deployment/common/changeset/deploy_mcms_with_timelock_test.go @@ -0,0 +1,303 @@ +//nolint:testifylint // inverting want and got is more succinct +package changeset_test + +import ( + "context" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/gagliardetto/solana-go" + "github.com/google/go-cmp/cmp" + mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm" + mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" + mcmstypes "github.com/smartcontractkit/mcms/types" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" + + timelockBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/timelock" + "github.com/smartcontractkit/chainlink/deployment" + commonchangeset "github.com/smartcontractkit/chainlink/deployment/common/changeset" + solanainternal "github.com/smartcontractkit/chainlink/deployment/common/changeset/internal/solana" + mcmschangesetstate "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" + "github.com/smartcontractkit/chainlink/deployment/environment/memory" + "github.com/smartcontractkit/chainlink/v2/core/logger" +) + +func TestDeployMCMSWithTimelockV2(t *testing.T) { + // --- arrange --- + log := logger.TestLogger(t) + envConfig := memory.MemoryEnvironmentConfig{Chains: 2, SolChains: 1} + env := memory.NewMemoryEnvironment(t, log, zapcore.InfoLevel, envConfig) + evmSelectors := env.AllChainSelectors() + solanaSelectors := env.AllChainSelectorsSolana() + changesetConfig := map[uint64]commontypes.MCMSWithTimelockConfigV2{ + evmSelectors[0]: { + Proposer: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000001")}, + GroupSigners: []mcmstypes.Config{ + { + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000002")}, + GroupSigners: []mcmstypes.Config{}, + }, + }, + }, + Canceller: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000003")}, + GroupSigners: []mcmstypes.Config{}, + }, + Bypasser: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000004")}, + GroupSigners: []mcmstypes.Config{}, + }, + TimelockMinDelay: big.NewInt(0), + }, + evmSelectors[1]: { + Proposer: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000011")}, + GroupSigners: []mcmstypes.Config{}, + }, + Canceller: mcmstypes.Config{ + Quorum: 2, + Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000012"), + common.HexToAddress("0x0000000000000000000000000000000000000013"), + common.HexToAddress("0x0000000000000000000000000000000000000014"), + }, + GroupSigners: []mcmstypes.Config{}, + }, + Bypasser: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{common.HexToAddress("0x0000000000000000000000000000000000000005")}, + GroupSigners: []mcmstypes.Config{}, + }, + TimelockMinDelay: big.NewInt(1), + }, + solanaSelectors[0]: { + Proposer: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000021"), + common.HexToAddress("0x0000000000000000000000000000000000000022"), + }, + GroupSigners: []mcmstypes.Config{ + { + Quorum: 2, + Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000023"), + common.HexToAddress("0x0000000000000000000000000000000000000024"), + common.HexToAddress("0x0000000000000000000000000000000000000025"), + }, + GroupSigners: []mcmstypes.Config{ + { + Quorum: 1, + Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000026"), + }, + GroupSigners: []mcmstypes.Config{}, + }, + }, + }, + }, + }, + Canceller: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000027"), + }, + GroupSigners: []mcmstypes.Config{}, + }, + Bypasser: mcmstypes.Config{ + Quorum: 1, + Signers: []common.Address{ + common.HexToAddress("0x0000000000000000000000000000000000000028"), + common.HexToAddress("0x0000000000000000000000000000000000000029"), + }, + GroupSigners: []mcmstypes.Config{}, + }, + TimelockMinDelay: big.NewInt(2), + }, + } + configuredChangeset := commonchangeset.Configure( + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), + changesetConfig, + ) + setPreloadedSolanaAddresses(t, env, solanaSelectors[0]) + + // --- act --- + updatedEnv, err := commonchangeset.Apply(t, env, nil, configuredChangeset) + require.NoError(t, err) + + evmState, err := mcmschangesetstate.MaybeLoadMCMSWithTimelockState(updatedEnv, evmSelectors) + require.NoError(t, err) + solanaState, err := mcmschangesetstate.MaybeLoadMCMSWithTimelockStateSolana(updatedEnv, solanaSelectors) + require.NoError(t, err) + + // --- assert --- + require.Len(t, evmState, 2) + require.Len(t, solanaState, 1) + ctx := updatedEnv.GetContext() + + // evm chain 0 + evmState0 := evmState[evmSelectors[0]] + evmInspector := mcmsevmsdk.NewInspector(updatedEnv.Chains[evmSelectors[0]].Client) + evmTimelockInspector := mcmsevmsdk.NewTimelockInspector(updatedEnv.Chains[evmSelectors[0]].Client) + + config, err := evmInspector.GetConfig(ctx, evmState0.ProposerMcm.Address().Hex()) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[evmSelectors[0]].Proposer)) + + config, err = evmInspector.GetConfig(ctx, evmState0.CancellerMcm.Address().Hex()) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[evmSelectors[0]].Canceller)) + + config, err = evmInspector.GetConfig(ctx, evmState0.BypasserMcm.Address().Hex()) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[evmSelectors[0]].Bypasser)) + + proposers, err := evmTimelockInspector.GetProposers(ctx, evmState0.Timelock.Address().Hex()) + require.NoError(t, err) + require.Equal(t, proposers, []string{evmState0.ProposerMcm.Address().Hex()}) + + executors, err := evmTimelockInspector.GetExecutors(ctx, evmState0.Timelock.Address().Hex()) + require.NoError(t, err) + require.Equal(t, executors, []string{evmState0.CallProxy.Address().Hex()}) + + cancellers, err := evmTimelockInspector.GetCancellers(ctx, evmState0.Timelock.Address().Hex()) + require.NoError(t, err) + require.ElementsMatch(t, cancellers, []string{ + evmState0.CancellerMcm.Address().Hex(), + evmState0.ProposerMcm.Address().Hex(), + evmState0.BypasserMcm.Address().Hex(), + }) + + bypassers, err := evmTimelockInspector.GetBypassers(ctx, evmState0.Timelock.Address().Hex()) + require.NoError(t, err) + require.Equal(t, bypassers, []string{evmState0.BypasserMcm.Address().Hex()}) + + // evm chain 1 + evmState1 := evmState[evmSelectors[1]] + evmInspector = mcmsevmsdk.NewInspector(updatedEnv.Chains[evmSelectors[1]].Client) + evmTimelockInspector = mcmsevmsdk.NewTimelockInspector(updatedEnv.Chains[evmSelectors[1]].Client) + + config, err = evmInspector.GetConfig(ctx, evmState1.ProposerMcm.Address().Hex()) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[evmSelectors[1]].Proposer)) + + config, err = evmInspector.GetConfig(ctx, evmState1.CancellerMcm.Address().Hex()) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[evmSelectors[1]].Canceller)) + + config, err = evmInspector.GetConfig(ctx, evmState1.BypasserMcm.Address().Hex()) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[evmSelectors[1]].Bypasser)) + + proposers, err = evmTimelockInspector.GetProposers(ctx, evmState1.Timelock.Address().Hex()) + require.NoError(t, err) + require.Equal(t, proposers, []string{evmState1.ProposerMcm.Address().Hex()}) + + executors, err = evmTimelockInspector.GetExecutors(ctx, evmState1.Timelock.Address().Hex()) + require.NoError(t, err) + require.Equal(t, executors, []string{evmState1.CallProxy.Address().Hex()}) + + cancellers, err = evmTimelockInspector.GetCancellers(ctx, evmState1.Timelock.Address().Hex()) + require.NoError(t, err) + require.ElementsMatch(t, cancellers, []string{ + evmState1.CancellerMcm.Address().Hex(), + evmState1.ProposerMcm.Address().Hex(), + evmState1.BypasserMcm.Address().Hex(), + }) + + bypassers, err = evmTimelockInspector.GetBypassers(ctx, evmState1.Timelock.Address().Hex()) + require.NoError(t, err) + require.Equal(t, bypassers, []string{evmState1.BypasserMcm.Address().Hex()}) + + // solana chain 0 + solanaState0 := solanaState[solanaSelectors[0]] + solanaChain0 := updatedEnv.SolChains[solanaSelectors[0]] + solanaInspector := mcmssolanasdk.NewInspector(solanaChain0.Client) + solanaTimelockInspector := mcmssolanasdk.NewTimelockInspector(solanaChain0.Client) + + addr := mcmssolanasdk.ContractAddress(solanaState0.McmProgram, mcmssolanasdk.PDASeed(solanaState0.ProposerMcmSeed)) + config, err = solanaInspector.GetConfig(ctx, addr) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[solanaSelectors[0]].Proposer)) + + addr = mcmssolanasdk.ContractAddress(solanaState0.McmProgram, mcmssolanasdk.PDASeed(solanaState0.CancellerMcmSeed)) + config, err = solanaInspector.GetConfig(ctx, addr) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[solanaSelectors[0]].Canceller)) + + addr = mcmssolanasdk.ContractAddress(solanaState0.McmProgram, mcmssolanasdk.PDASeed(solanaState0.BypasserMcmSeed)) + config, err = solanaInspector.GetConfig(ctx, addr) + require.NoError(t, err) + require.Empty(t, cmp.Diff(*config, changesetConfig[solanaSelectors[0]].Bypasser)) + + addr = mcmssolanasdk.ContractAddress(solanaState0.TimelockProgram, mcmssolanasdk.PDASeed(solanaState0.TimelockSeed)) + proposers, err = solanaTimelockInspector.GetProposers(ctx, addr) + require.NoError(t, err) + require.Equal(t, proposers, []string{mcmSignerPDA(solanaState0.McmProgram, solanaState0.ProposerMcmSeed)}) + + executors, err = solanaTimelockInspector.GetExecutors(ctx, addr) + require.NoError(t, err) + require.Equal(t, executors, []string{solanaChain0.DeployerKey.PublicKey().String()}) + + cancellers, err = solanaTimelockInspector.GetCancellers(ctx, addr) + require.NoError(t, err) + require.ElementsMatch(t, cancellers, []string{ + mcmSignerPDA(solanaState0.McmProgram, solanaState0.CancellerMcmSeed), + mcmSignerPDA(solanaState0.McmProgram, solanaState0.ProposerMcmSeed), + mcmSignerPDA(solanaState0.McmProgram, solanaState0.BypasserMcmSeed), + }) + + bypassers, err = solanaTimelockInspector.GetBypassers(ctx, addr) + require.NoError(t, err) + require.Equal(t, bypassers, []string{mcmSignerPDA(solanaState0.McmProgram, solanaState0.BypasserMcmSeed)}) + + timelockConfig := solanaTimelockConfig(ctx, t, solanaChain0, solanaState0.TimelockProgram, solanaState0.TimelockSeed) + require.NoError(t, err) + require.Equal(t, timelockConfig.ProposedOwner.String(), + timelockSignerPDA(solanaState0.TimelockProgram, solanaState0.TimelockSeed)) +} + +// ----- helpers ----- + +func mcmSignerPDA(programID solana.PublicKey, seed mcmschangesetstate.PDASeed) string { + return solanainternal.GetMCMSignerPDA(programID, seed).String() +} + +func timelockSignerPDA(programID solana.PublicKey, seed mcmschangesetstate.PDASeed) string { + return solanainternal.GetTimelockSignerPDA(programID, seed).String() +} + +func setPreloadedSolanaAddresses(t *testing.T, env deployment.Environment, selector uint64) { + typeAndVersion := deployment.NewTypeAndVersion(commontypes.ManyChainMultisigProgram, deployment.Version1_0_0) + err := env.ExistingAddresses.Save(selector, memory.SolanaProgramIDs["mcm"], typeAndVersion) + require.NoError(t, err) + + typeAndVersion = deployment.NewTypeAndVersion(commontypes.AccessControllerProgram, deployment.Version1_0_0) + err = env.ExistingAddresses.Save(selector, memory.SolanaProgramIDs["access_controller"], typeAndVersion) + require.NoError(t, err) + + typeAndVersion = deployment.NewTypeAndVersion(commontypes.RBACTimelockProgram, deployment.Version1_0_0) + err = env.ExistingAddresses.Save(selector, memory.SolanaProgramIDs["timelock"], typeAndVersion) + require.NoError(t, err) +} + +func solanaTimelockConfig( + ctx context.Context, t *testing.T, chain deployment.SolChain, programID solana.PublicKey, seed mcmschangesetstate.PDASeed, +) timelockBindings.Config { + t.Helper() + + var data timelockBindings.Config + err := chain.GetAccountDataBorshInto(ctx, solanainternal.GetTimelockConfigPDA(programID, seed), &data) + require.NoError(t, err) + + return data +} diff --git a/deployment/common/changeset/example/link_transfer_test.go b/deployment/common/changeset/example/link_transfer_test.go index 7281c5858b0..0c34f31c2a8 100644 --- a/deployment/common/changeset/example/link_transfer_test.go +++ b/deployment/common/changeset/example/link_transfer_test.go @@ -32,7 +32,7 @@ func setupLinkTransferTestEnv(t *testing.T) deployment.Environment { } env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) chainSelector := env.AllChainSelectors()[0] - config := proposalutils.SingleGroupMCMS(t) + config := proposalutils.SingleGroupMCMSV2(t) // Deploy MCMS and Timelock env, err := changeset.Apply(t, env, nil, @@ -41,8 +41,8 @@ func setupLinkTransferTestEnv(t *testing.T) deployment.Environment { []uint64{chainSelector}, ), changeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployMCMSWithTimelock), - map[uint64]types.MCMSWithTimelockConfig{ + deployment.CreateLegacyChangeSet(changeset.DeployMCMSWithTimelockV2), + map[uint64]types.MCMSWithTimelockConfigV2{ chainSelector: { Canceller: config, Bypasser: config, diff --git a/deployment/common/changeset/internal/evm/mcms.go b/deployment/common/changeset/internal/evm/mcms.go new file mode 100644 index 00000000000..8346f0d0e75 --- /dev/null +++ b/deployment/common/changeset/internal/evm/mcms.go @@ -0,0 +1,162 @@ +package mcmsnew + +import ( + "github.com/ethereum/go-ethereum/common" + + bindings "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" + evmMcms "github.com/smartcontractkit/mcms/sdk/evm" + mcmsTypes "github.com/smartcontractkit/mcms/types" + + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" + commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" + "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" +) + +// MCMSWithTimelockEVMDeploy holds a bundle of MCMS contract deploys. +type MCMSWithTimelockEVMDeploy struct { + Canceller *deployment.ContractDeploy[*bindings.ManyChainMultiSig] + Bypasser *deployment.ContractDeploy[*bindings.ManyChainMultiSig] + Proposer *deployment.ContractDeploy[*bindings.ManyChainMultiSig] + Timelock *deployment.ContractDeploy[*bindings.RBACTimelock] + CallProxy *deployment.ContractDeploy[*bindings.CallProxy] +} + +func deployMCMSWithConfigEVM( + contractType deployment.ContractType, + lggr logger.Logger, + chain deployment.Chain, + ab deployment.AddressBook, + mcmConfig mcmsTypes.Config, +) (*deployment.ContractDeploy[*bindings.ManyChainMultiSig], error) { + groupQuorums, groupParents, signerAddresses, signerGroups, err := evmMcms.ExtractSetConfigInputs(&mcmConfig) + if err != nil { + lggr.Errorw("Failed to extract set config inputs", "chain", chain.String(), "err", err) + return nil, err + } + mcm, err := deployment.DeployContract(lggr, chain, ab, + func(chain deployment.Chain) deployment.ContractDeploy[*bindings.ManyChainMultiSig] { + mcmAddr, tx, mcm, err2 := bindings.DeployManyChainMultiSig( + chain.DeployerKey, + chain.Client, + ) + return deployment.ContractDeploy[*bindings.ManyChainMultiSig]{ + Address: mcmAddr, Contract: mcm, Tx: tx, Tv: deployment.NewTypeAndVersion(contractType, deployment.Version1_0_0), Err: err2, + } + }) + if err != nil { + lggr.Errorw("Failed to deploy mcm", "chain", chain.String(), "err", err) + return mcm, err + } + mcmsTx, err := mcm.Contract.SetConfig(chain.DeployerKey, + signerAddresses, + // Signer 1 is int group 0 (root group) with quorum 1. + signerGroups, + groupQuorums, + groupParents, + false, + ) + if _, err := deployment.ConfirmIfNoError(chain, mcmsTx, err); err != nil { + lggr.Errorw("Failed to confirm mcm config", "chain", chain.String(), "err", err) + return mcm, err + } + return mcm, nil +} + +// DeployMCMSWithTimelockContractsEVM deploys an MCMS for +// each of the timelock roles Bypasser, ProposerMcm, Canceller on an EVM chain. +// MCMS contracts for the given configuration +// as well as the timelock. It's not necessarily the only way to use +// the timelock and MCMS, but its reasonable pattern. +func DeployMCMSWithTimelockContractsEVM( + lggr logger.Logger, + chain deployment.Chain, + ab deployment.AddressBook, + config commontypes.MCMSWithTimelockConfigV2, +) (*MCMSWithTimelockEVMDeploy, error) { + bypasser, err := deployMCMSWithConfigEVM(commontypes.BypasserManyChainMultisig, lggr, chain, ab, config.Bypasser) + if err != nil { + return nil, err + } + canceller, err := deployMCMSWithConfigEVM(commontypes.CancellerManyChainMultisig, lggr, chain, ab, config.Canceller) + if err != nil { + return nil, err + } + proposer, err := deployMCMSWithConfigEVM(commontypes.ProposerManyChainMultisig, lggr, chain, ab, config.Proposer) + if err != nil { + return nil, err + } + + timelock, err := deployment.DeployContract(lggr, chain, ab, + func(chain deployment.Chain) deployment.ContractDeploy[*bindings.RBACTimelock] { + timelock, tx2, cc, err2 := bindings.DeployRBACTimelock( + chain.DeployerKey, + chain.Client, + config.TimelockMinDelay, + // Deployer is the initial admin. + // TODO: Could expose this as config? + // Or keep this enforced to follow the same pattern? + chain.DeployerKey.From, + []common.Address{proposer.Address}, // proposers + // Executors field is empty here because we grant the executor role to the call proxy later + // and the call proxy cannot be deployed before the timelock. + []common.Address{}, + []common.Address{canceller.Address, proposer.Address, bypasser.Address}, // cancellers + []common.Address{bypasser.Address}, // bypassers + ) + return deployment.ContractDeploy[*bindings.RBACTimelock]{ + Address: timelock, Contract: cc, Tx: tx2, Tv: deployment.NewTypeAndVersion(commontypes.RBACTimelock, deployment.Version1_0_0), Err: err2, + } + }) + if err != nil { + lggr.Errorw("Failed to deploy timelock", "chain", chain.String(), "err", err) + return nil, err + } + + callProxy, err := deployment.DeployContract(lggr, chain, ab, + func(chain deployment.Chain) deployment.ContractDeploy[*bindings.CallProxy] { + callProxy, tx2, cc, err2 := bindings.DeployCallProxy( + chain.DeployerKey, + chain.Client, + timelock.Address, + ) + return deployment.ContractDeploy[*bindings.CallProxy]{ + Address: callProxy, Contract: cc, Tx: tx2, Tv: deployment.NewTypeAndVersion(commontypes.CallProxy, deployment.Version1_0_0), Err: err2, + } + }) + if err != nil { + lggr.Errorw("Failed to deploy call proxy", "chain", chain.String(), "err", err) + return nil, err + } + + grantRoleTx, err := timelock.Contract.GrantRole( + chain.DeployerKey, + v1_0.EXECUTOR_ROLE.ID, + callProxy.Address, + ) + if err != nil { + lggr.Errorw("Failed to grant timelock executor role", "chain", chain.String(), "err", err) + return nil, err + } + + if _, err := deployment.ConfirmIfNoError(chain, grantRoleTx, err); err != nil { + lggr.Errorw("Failed to grant timelock executor role", "chain", chain.String(), "err", err) + return nil, err + } + // We grant the timelock the admin role on the MCMS contracts. + tx, err := timelock.Contract.GrantRole(chain.DeployerKey, + v1_0.ADMIN_ROLE.ID, timelock.Address) + if _, err := deployment.ConfirmIfNoError(chain, tx, err); err != nil { + lggr.Errorw("Failed to grant timelock admin role", "chain", chain.String(), "err", err) + return nil, err + } + // After the proposer cycle is validated, + // we can remove the deployer as an admin. + return &MCMSWithTimelockEVMDeploy{ + Canceller: canceller, + Bypasser: bypasser, + Proposer: proposer, + Timelock: timelock, + CallProxy: callProxy, + }, nil +} diff --git a/deployment/common/changeset/internal/evm/ownable.go b/deployment/common/changeset/internal/evm/ownable.go new file mode 100644 index 00000000000..b65e10b6eaf --- /dev/null +++ b/deployment/common/changeset/internal/evm/ownable.go @@ -0,0 +1,14 @@ +package mcmsnew + +import ( + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + gethtypes "github.com/ethereum/go-ethereum/core/types" +) + +type Ownable interface { + Owner(opts *bind.CallOpts) (common.Address, error) + TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*gethtypes.Transaction, error) + AcceptOwnership(opts *bind.TransactOpts) (*gethtypes.Transaction, error) + Address() common.Address +} diff --git a/deployment/common/changeset/internal/solana/access_controller.go b/deployment/common/changeset/internal/solana/access_controller.go new file mode 100644 index 00000000000..4975187c2d6 --- /dev/null +++ b/deployment/common/changeset/internal/solana/access_controller.go @@ -0,0 +1,191 @@ +package mcmsnew + +import ( + "errors" + "fmt" + + "github.com/gagliardetto/solana-go" + "github.com/gagliardetto/solana-go/programs/system" + "github.com/gagliardetto/solana-go/rpc" + + accessControllerBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/access_controller" + timelockBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/timelock" + solanaUtils "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/common" + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" +) + +func deployAccessControllerProgram( + e deployment.Environment, chainState *state.MCMSWithTimelockStateSolana, + chain deployment.SolChain, addressBook deployment.AddressBook, +) error { + typeAndVersion := deployment.NewTypeAndVersion(commontypes.AccessControllerProgram, deployment.Version1_0_0) + log := logger.With(e.Logger, "chain", chain.String(), "contract", typeAndVersion.String()) + + programID, _, err := chainState.GetStateFromType(commontypes.AccessControllerProgram) + if err != nil { + return fmt.Errorf("failed to get access controller program state: %w", err) + } + + if programID.IsZero() { + deployedProgramID, err := chain.DeployProgram(e.Logger, "access_controller") + if err != nil { + return fmt.Errorf("failed to deploy access controller program: %w", err) + } + + programID, err = solana.PublicKeyFromBase58(deployedProgramID) + if err != nil { + return fmt.Errorf("failed to convert mcm program id to public key: %w", err) + } + + err = addressBook.Save(chain.Selector, programID.String(), typeAndVersion) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + + err = chainState.SetState(commontypes.AccessControllerProgram, programID, state.PDASeed{}) + if err != nil { + return fmt.Errorf("failed to save onchain state: %w", err) + } + + log.Infow("deployed access controller contract", "programId", programID) + } else { + log.Infow("using existing AccessController program", "programId", programID) + } + + return nil +} + +func initAccessController( + e deployment.Environment, chainState *state.MCMSWithTimelockStateSolana, contractType deployment.ContractType, + chain deployment.SolChain, addressBook deployment.AddressBook, +) error { + if chainState.AccessControllerProgram.IsZero() { + return errors.New("access controller program is not deployed") + } + programID := chainState.AccessControllerProgram + accessControllerBindings.SetProgramID(programID) + + typeAndVersion := deployment.NewTypeAndVersion(contractType, deployment.Version1_0_0) + log := logger.With(e.Logger, "chain", chain.String(), "contract", typeAndVersion.String(), "programID", programID) + + account, err := solana.NewRandomPrivateKey() // FIXME: what should we do with the account private key? + if err != nil { + return fmt.Errorf("failed to generate new random private key for access controller account: %w", err) + } + + err = initializeAccessController(e, chain, programID, account) + if err != nil { + return fmt.Errorf("failed to initialize access controller: %w", err) + } + log.Infow("initialized access controller", "account", account.PublicKey()) + + address := state.EncodeAddressWithAccount(programID, account.PublicKey()) + err = addressBook.Save(chain.Selector, address, typeAndVersion) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + + err = chainState.SetState(contractType, programID, state.PDASeed(account.PublicKey())) + if err != nil { + return fmt.Errorf("failed to save onchain state: %w", err) + } + + return nil +} + +// discriminator + owner + proposed owner + access_list (64 max addresses + length) +const accessControllerAccountSize = uint64(8 + 32 + 32 + ((32 * 64) + 8)) + +func initializeAccessController( + e deployment.Environment, chain deployment.SolChain, programID solana.PublicKey, account solana.PrivateKey, +) error { + rentExemption, err := chain.Client.GetMinimumBalanceForRentExemption(e.GetContext(), + accessControllerAccountSize, rpc.CommitmentConfirmed) + if err != nil { + return fmt.Errorf("failed to get minimum balance for rent exemption: %w", err) + } + + createAccountInstruction, err := system.NewCreateAccountInstruction(rentExemption, accessControllerAccountSize, + programID, chain.DeployerKey.PublicKey(), account.PublicKey()).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to create CreateAccount instruction: %w", err) + } + + initializeInstruction, err := accessControllerBindings.NewInitializeInstruction( + account.PublicKey(), + chain.DeployerKey.PublicKey(), + ).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + + instructions := []solana.Instruction{createAccountInstruction, initializeInstruction} + err = chain.Confirm(instructions, solanaUtils.AddSigners(account)) + if err != nil { + return fmt.Errorf("failed to confirm CreateAccount and InitializeAccessController instructions: %w", err) + } + + var data accessControllerBindings.AccessController + err = solanaUtils.GetAccountDataBorshInto(e.GetContext(), chain.Client, account.PublicKey(), rpc.CommitmentConfirmed, &data) + if err != nil { + return fmt.Errorf("failed to read access controller account: %w", err) + } + + return nil +} + +func setupRoles(chainState *state.MCMSWithTimelockStateSolana, chain deployment.SolChain) error { + proposerPDA := GetMCMSignerPDA(chainState.McmProgram, chainState.ProposerMcmSeed) + cancellerPDA := GetMCMSignerPDA(chainState.McmProgram, chainState.CancellerMcmSeed) + bypasserPDA := GetMCMSignerPDA(chainState.McmProgram, chainState.BypasserMcmSeed) + + err := addAccess(chain, chainState, timelockBindings.Proposer_Role, proposerPDA) + if err != nil { + return fmt.Errorf("failed to add access for proposer role: %w", err) + } + + err = addAccess(chain, chainState, timelockBindings.Executor_Role, chain.DeployerKey.PublicKey()) + if err != nil { + return fmt.Errorf("failed to add access for executor role: %w", err) + } + + err = addAccess(chain, chainState, timelockBindings.Canceller_Role, cancellerPDA, proposerPDA, bypasserPDA) + if err != nil { + return fmt.Errorf("failed to add access for canceller role: %w", err) + } + + err = addAccess(chain, chainState, timelockBindings.Bypasser_Role, bypasserPDA) + if err != nil { + return fmt.Errorf("failed to add access for bypasser role: %w", err) + } + + return nil +} + +func addAccess( + chain deployment.SolChain, chainState *state.MCMSWithTimelockStateSolana, + role timelockBindings.Role, accounts ...solana.PublicKey, +) error { + timelockConfigPDA := GetTimelockConfigPDA(chainState.TimelockProgram, chainState.TimelockSeed) + + instructionBuilder := timelockBindings.NewBatchAddAccessInstruction([32]uint8(chainState.TimelockSeed), role, + timelockConfigPDA, chainState.AccessControllerProgram, chainState.RoleAccount(role), chain.DeployerKey.PublicKey()) + for _, account := range accounts { + instructionBuilder.Append(solana.Meta(account)) + } + + instruction, err := instructionBuilder.ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to build BatchAddAccess instruction: %w", err) + } + + err = chain.Confirm([]solana.Instruction{instruction}) + if err != nil { + return fmt.Errorf("failed to confirm BatchAddAccess instruction: %w", err) + } + + return nil +} diff --git a/deployment/common/changeset/internal/solana/mcm.go b/deployment/common/changeset/internal/solana/mcm.go new file mode 100644 index 00000000000..6e6332bbe6c --- /dev/null +++ b/deployment/common/changeset/internal/solana/mcm.go @@ -0,0 +1,160 @@ +package mcmsnew + +import ( + "errors" + "fmt" + "math/rand" + + binary "github.com/gagliardetto/binary" + "github.com/gagliardetto/solana-go" + "github.com/gagliardetto/solana-go/rpc" + mcmsSolanaSdk "github.com/smartcontractkit/mcms/sdk/solana" + mcmsTypes "github.com/smartcontractkit/mcms/types" + + mcmBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/mcm" + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" +) + +func deployMCMProgram( + env deployment.Environment, chainState *state.MCMSWithTimelockStateSolana, + chain deployment.SolChain, addressBook deployment.AddressBook, +) error { + typeAndVersion := deployment.NewTypeAndVersion(commontypes.ManyChainMultisigProgram, deployment.Version1_0_0) + log := logger.With(env.Logger, "chain", chain.String(), "contract", typeAndVersion.String()) + + programID, _, err := chainState.GetStateFromType(commontypes.ManyChainMultisigProgram) + if err != nil { + return fmt.Errorf("failed to get mcm state: %w", err) + } + + if programID.IsZero() { + deployedProgramID, err := chain.DeployProgram(log, "mcm") + if err != nil { + return fmt.Errorf("failed to deploy mcm program: %w", err) + } + + programID, err = solana.PublicKeyFromBase58(deployedProgramID) + if err != nil { + return fmt.Errorf("failed to convert mcm program id to public key: %w", err) + } + + err = addressBook.Save(chain.Selector, programID.String(), typeAndVersion) + if err != nil { + return fmt.Errorf("failed to save mcm address: %w", err) + } + + err = chainState.SetState(commontypes.ManyChainMultisigProgram, programID, state.PDASeed{}) + if err != nil { + return fmt.Errorf("failed to save onchain state: %w", err) + } + + log.Infow("deployed mcm contract", "programId", deployedProgramID) + } else { + log.Infow("using existing MCM program", "programId", programID.String()) + } + + return nil +} + +func initMCM( + env deployment.Environment, chainState *state.MCMSWithTimelockStateSolana, contractType deployment.ContractType, + chain deployment.SolChain, addressBook deployment.AddressBook, mcmConfig *mcmsTypes.Config, +) error { + if chainState.McmProgram.IsZero() { + return errors.New("mcm program is not deployed") + } + programID := chainState.McmProgram + mcmBindings.SetProgramID(programID) + + typeAndVersion := deployment.NewTypeAndVersion(contractType, deployment.Version1_0_0) + log := logger.With(env.Logger, "chain", chain.String(), "contract", typeAndVersion.String()) + + seed := randomSeed() + log.Infow("generated MCM seed", "seed", string(seed[:])) + + err := initializeMCM(env, chain, programID, seed) + if err != nil { + return fmt.Errorf("failed to initialize mcm: %w", err) + } + + mcmAddress := state.EncodeAddressWithSeed(programID, seed) + + configurer := mcmsSolanaSdk.NewConfigurer(chain.Client, *chain.DeployerKey, mcmsTypes.ChainSelector(chain.Selector)) + tx, err := configurer.SetConfig(env.GetContext(), mcmAddress, mcmConfig, false) + if err != nil { + return fmt.Errorf("failed to set config on mcm: %w", err) + } + log.Infow("called SetConfig on MCM", "transaction", tx.Hash) + + err = addressBook.Save(chain.Selector, mcmAddress, typeAndVersion) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + + err = chainState.SetState(contractType, programID, seed) + if err != nil { + return fmt.Errorf("failed to save onchain state: %w", err) + } + + return nil +} + +func initializeMCM(e deployment.Environment, chain deployment.SolChain, mcmProgram solana.PublicKey, multisigID state.PDASeed) error { + var mcmConfig mcmBindings.MultisigConfig + err := chain.GetAccountDataBorshInto(e.GetContext(), GetMCMConfigPDA(mcmProgram, multisigID), &mcmConfig) + if err == nil { + e.Logger.Infow("MCM already initialized, skipping initialization", "chain", chain.String()) + return nil + } + + var programData struct { + DataType uint32 + Address solana.PublicKey + } + opts := &rpc.GetAccountInfoOpts{Commitment: rpc.CommitmentConfirmed} + + data, err := chain.Client.GetAccountInfoWithOpts(e.GetContext(), mcmProgram, opts) + if err != nil { + return fmt.Errorf("failed to get mcm program account info: %w", err) + } + err = binary.UnmarshalBorsh(&programData, data.Bytes()) + if err != nil { + return fmt.Errorf("failed to unmarshal program data: %w", err) + } + + instruction, err := mcmBindings.NewInitializeInstruction( + chain.Selector, + multisigID, + GetMCMConfigPDA(mcmProgram, multisigID), + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + mcmProgram, + programData.Address, + GetMCMRootMetadataPDA(mcmProgram, multisigID), + GetMCMExpiringRootAndOpCountPDA(mcmProgram, multisigID), + ).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + + err = chain.Confirm([]solana.Instruction{instruction}) + if err != nil { + return fmt.Errorf("failed to confirm instructions: %w", err) + } + + return nil +} + +func randomSeed() state.PDASeed { + const alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + + seed := state.PDASeed{} + for i := range seed { + seed[i] = alphabet[rand.Intn(len(alphabet))] + } + + return seed +} diff --git a/deployment/common/changeset/internal/solana/mcms.go b/deployment/common/changeset/internal/solana/mcms.go new file mode 100644 index 00000000000..355eb0bd2df --- /dev/null +++ b/deployment/common/changeset/internal/solana/mcms.go @@ -0,0 +1,101 @@ +package mcmsnew + +import ( + "fmt" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" +) + +// DeployMCMSWithTimelockProgramsSolana deploys an MCMS program +// and initializes 3 instances for each of the timelock roles: Bypasser, ProposerMcm, Canceller on an Solana chain. +// as well as the timelock program. It's not necessarily the only way to use +// the timelock and MCMS, but its reasonable pattern. +func DeployMCMSWithTimelockProgramsSolana( + e deployment.Environment, + chain deployment.SolChain, + addressBook deployment.AddressBook, + config commontypes.MCMSWithTimelockConfigV2, +) (*state.MCMSWithTimelockStateSolana, error) { + addresses, err := e.ExistingAddresses.AddressesForChain(chain.Selector) + if err != nil { + return nil, fmt.Errorf("failed to get addresses for chain %v from environment: %w", chain.Selector, err) + } + + chainState, err := state.MaybeLoadMCMSWithTimelockChainStateSolana(chain, addresses) + if err != nil { + return nil, fmt.Errorf("failed to load mcms with timelock solana chain state: %w", err) + } + + // access controller + err = deployAccessControllerProgram(e, chainState, chain, addressBook) + if err != nil { + return nil, fmt.Errorf("failed to deploy access controller program: %w", err) + } + err = initAccessController(e, chainState, commontypes.ProposerAccessControllerAccount, chain, addressBook) + if err != nil { + return nil, fmt.Errorf("failed to init proposer access controller: %w", err) + } + err = initAccessController(e, chainState, commontypes.ExecutorAccessControllerAccount, chain, addressBook) + if err != nil { + return nil, fmt.Errorf("failed to init access controller: %w", err) + } + err = initAccessController(e, chainState, commontypes.CancellerAccessControllerAccount, chain, addressBook) + if err != nil { + return nil, fmt.Errorf("failed to init access controller: %w", err) + } + err = initAccessController(e, chainState, commontypes.BypasserAccessControllerAccount, chain, addressBook) + if err != nil { + return nil, fmt.Errorf("failed to init access controller: %w", err) + } + + // mcm + err = deployMCMProgram(e, chainState, chain, addressBook) + if err != nil { + return nil, fmt.Errorf("failed to deploy mcm program: %w", err) + } + err = initMCM(e, chainState, commontypes.BypasserManyChainMultisig, chain, addressBook, &config.Bypasser) + if err != nil { + return nil, fmt.Errorf("failed to init bypasser mcm: %w", err) + } + err = initMCM(e, chainState, commontypes.CancellerManyChainMultisig, chain, addressBook, &config.Canceller) + if err != nil { + return nil, fmt.Errorf("failed to init canceller mcm: %w", err) + } + err = initMCM(e, chainState, commontypes.ProposerManyChainMultisig, chain, addressBook, &config.Proposer) + if err != nil { + return nil, fmt.Errorf("failed to init proposer mcm: %w", err) + } + + // timelock + err = deployTimelockProgram(e, chainState, chain, addressBook) + if err != nil { + return nil, fmt.Errorf("failed to deploy timelock program: %w", err) + } + err = initTimelock(e, chainState, chain, addressBook, config.TimelockMinDelay) + if err != nil { + return nil, fmt.Errorf("failed to init timelock: %w", err) + } + + err = setupRoles(chainState, chain) + if err != nil { + return nil, fmt.Errorf("failed to setup roles and ownership: %w", err) + } + + err = transferOwnership(chainState, chain) + if err != nil { + return nil, fmt.Errorf("failed to transfer ownership: %w", err) + } + + return chainState, nil +} + +func transferOwnership(chainState *state.MCMSWithTimelockStateSolana, chain deployment.SolChain) error { + err := transferOwnershipTimelock(chain, chainState.TimelockProgram, chainState.TimelockSeed) + if err != nil { + return fmt.Errorf("failed to transfer ownership of timelock: %w", err) + } + + return nil +} diff --git a/deployment/common/changeset/internal/solana/pda.go b/deployment/common/changeset/internal/solana/pda.go new file mode 100644 index 00000000000..c0255a45dcf --- /dev/null +++ b/deployment/common/changeset/internal/solana/pda.go @@ -0,0 +1,77 @@ +package mcmsnew + +import ( + "encoding/binary" + + "github.com/ethereum/go-ethereum/common" + "github.com/gagliardetto/solana-go" + + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" +) + +func getPDA(programID solana.PublicKey, seeds [][]byte) solana.PublicKey { + pda, _, _ := solana.FindProgramAddress(seeds, programID) + return pda +} + +func GetMCMSignerPDA(programID solana.PublicKey, msigID state.PDASeed) solana.PublicKey { + seeds := [][]byte{[]byte("multisig_signer"), msigID[:]} + return getPDA(programID, seeds) +} + +func GetMCMConfigPDA(programID solana.PublicKey, msigID state.PDASeed) solana.PublicKey { + seeds := [][]byte{[]byte("multisig_config"), msigID[:]} + return getPDA(programID, seeds) +} + +func GetMCMRootMetadataPDA(programID solana.PublicKey, msigID state.PDASeed) solana.PublicKey { + seeds := [][]byte{[]byte("root_metadata"), msigID[:]} + return getPDA(programID, seeds) +} + +func GetMCMExpiringRootAndOpCountPDA(programID solana.PublicKey, pdaSeed state.PDASeed) solana.PublicKey { + seeds := [][]byte{[]byte("expiring_root_and_op_count"), pdaSeed[:]} + return getPDA(programID, seeds) +} + +func GetMCMRootSignaturesPDA( + programID solana.PublicKey, msigID state.PDASeed, root common.Hash, validUntil uint32, +) solana.PublicKey { + seeds := [][]byte{[]byte("root_signatures"), msigID[:], root[:], validUntilBytes(validUntil)} + return getPDA(programID, seeds) +} + +func GetMCMSeenSignedHashesPDA( + programID solana.PublicKey, msigID state.PDASeed, root common.Hash, validUntil uint32, +) solana.PublicKey { + seeds := [][]byte{[]byte("seen_signed_hashes"), msigID[:], root[:], validUntilBytes(validUntil)} + return getPDA(programID, seeds) +} + +func GetTimelockConfigPDA(programID solana.PublicKey, timelockID state.PDASeed) solana.PublicKey { + seeds := [][]byte{[]byte("timelock_config"), timelockID[:]} + return getPDA(programID, seeds) +} + +func GetTimelockOperationPDA(programID solana.PublicKey, timelockID state.PDASeed, opID [32]byte) solana.PublicKey { + seeds := [][]byte{[]byte("timelock_operation"), timelockID[:], opID[:]} + return getPDA(programID, seeds) +} + +func GetTimelockBypasserOperationPDA(programID solana.PublicKey, timelockID state.PDASeed, opID [32]byte) solana.PublicKey { + seeds := [][]byte{[]byte("timelock_bypasser_operation"), timelockID[:], opID[:]} + return getPDA(programID, seeds) +} + +func GetTimelockSignerPDA(programID solana.PublicKey, timelockID state.PDASeed) solana.PublicKey { + seeds := [][]byte{[]byte("timelock_signer"), timelockID[:]} + return getPDA(programID, seeds) +} + +func validUntilBytes(validUntil uint32) []byte { + const uint32Size = 4 + vuBytes := make([]byte, uint32Size) + binary.LittleEndian.PutUint32(vuBytes, validUntil) + + return vuBytes +} diff --git a/deployment/common/changeset/internal/solana/timelock.go b/deployment/common/changeset/internal/solana/timelock.go new file mode 100644 index 00000000000..043bd0a2494 --- /dev/null +++ b/deployment/common/changeset/internal/solana/timelock.go @@ -0,0 +1,171 @@ +package mcmsnew + +import ( + "errors" + "fmt" + "math/big" + + binary "github.com/gagliardetto/binary" + "github.com/gagliardetto/solana-go" + "github.com/gagliardetto/solana-go/rpc" + + timelockBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/timelock" + "github.com/smartcontractkit/chainlink-common/pkg/logger" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/changeset/state" + commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" +) + +func deployTimelockProgram( + e deployment.Environment, chainState *state.MCMSWithTimelockStateSolana, chain deployment.SolChain, + addressBook deployment.AddressBook, +) error { + typeAndVersion := deployment.NewTypeAndVersion(commontypes.RBACTimelockProgram, deployment.Version1_0_0) + log := logger.With(e.Logger, "chain", chain.String(), "contract", typeAndVersion.String()) + + programID, _, err := chainState.GetStateFromType(commontypes.RBACTimelock) + if err != nil { + return fmt.Errorf("failed to get timelock state: %w", err) + } + + if programID.IsZero() { + deployedProgramID, err := chain.DeployProgram(log, "timelock") + if err != nil { + return fmt.Errorf("failed to deploy timelock program: %w", err) + } + + programID, err = solana.PublicKeyFromBase58(deployedProgramID) + if err != nil { + return fmt.Errorf("failed to convert timelock program id to public key: %w", err) + } + + err = addressBook.Save(chain.Selector, programID.String(), typeAndVersion) + if err != nil { + return fmt.Errorf("failed to save mcm address: %w", err) + } + + err = chainState.SetState(commontypes.RBACTimelockProgram, programID, state.PDASeed{}) + if err != nil { + return fmt.Errorf("failed to save onchain state: %w", err) + } + + log.Infow("deployed timelock contract", "programId", programID) + } else { + log.Infow("using existing Timelock program", "programId", programID.String()) + } + + return nil +} + +func initTimelock( + e deployment.Environment, chainState *state.MCMSWithTimelockStateSolana, chain deployment.SolChain, + addressBook deployment.AddressBook, minDelay *big.Int, +) error { + if chainState.TimelockProgram.IsZero() { + return errors.New("mcm program is not deployed") + } + programID := chainState.TimelockProgram + timelockBindings.SetProgramID(programID) + + typeAndVersion := deployment.NewTypeAndVersion(commontypes.RBACTimelock, deployment.Version1_0_0) + log := logger.With(e.Logger, "chain", chain.String(), "contract", typeAndVersion.String()) + + seed := randomSeed() + log.Infow("generated Timelock seed", "seed", string(seed[:])) + + err := initializeTimelock(e, chain, programID, seed, chainState, minDelay) + if err != nil { + return fmt.Errorf("failed to initialize timelock: %w", err) + } + + timelockAddress := state.EncodeAddressWithSeed(programID, seed) + + err = addressBook.Save(chain.Selector, timelockAddress, typeAndVersion) + if err != nil { + return fmt.Errorf("failed to save address: %w", err) + } + + err = chainState.SetState(commontypes.RBACTimelock, programID, seed) + if err != nil { + return fmt.Errorf("failed to save onchain state: %w", err) + } + + return nil +} + +func initializeTimelock( + e deployment.Environment, chain deployment.SolChain, timelockProgram solana.PublicKey, timelockID state.PDASeed, + chainState *state.MCMSWithTimelockStateSolana, minDelay *big.Int, +) error { + if minDelay == nil { + minDelay = big.NewInt(0) + } + + var timelockConfig timelockBindings.Config + err := chain.GetAccountDataBorshInto(e.GetContext(), GetTimelockConfigPDA(timelockProgram, timelockID), + &timelockConfig) + if err == nil { + e.Logger.Infow("Timelock already initialized, skipping initialization", "chain", chain.String()) + return nil + } + + var programData struct { + DataType uint32 + Address solana.PublicKey + } + opts := &rpc.GetAccountInfoOpts{Commitment: rpc.CommitmentConfirmed} + + data, err := chain.Client.GetAccountInfoWithOpts(e.GetContext(), timelockProgram, opts) + if err != nil { + return fmt.Errorf("failed to get timelock program account info: %w", err) + } + err = binary.UnmarshalBorsh(&programData, data.Bytes()) + if err != nil { + return fmt.Errorf("failed to unmarshal program data: %w", err) + } + + instruction, err := timelockBindings.NewInitializeInstruction( + timelockID, + minDelay.Uint64(), + GetTimelockConfigPDA(timelockProgram, timelockID), + chain.DeployerKey.PublicKey(), + solana.SystemProgramID, + timelockProgram, + programData.Address, + chainState.AccessControllerProgram, + chainState.ProposerAccessControllerAccount, + chainState.ExecutorAccessControllerAccount, + chainState.CancellerAccessControllerAccount, + chainState.BypasserAccessControllerAccount, + ).ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to build instruction: %w", err) + } + + err = chain.Confirm([]solana.Instruction{instruction}) + if err != nil { + return fmt.Errorf("failed to confirm instructions: %w", err) + } + + return nil +} + +func transferOwnershipTimelock(chain deployment.SolChain, programID solana.PublicKey, seed state.PDASeed) error { + // transfer timelock ownership to itself + timelockConfigPDA := GetTimelockConfigPDA(programID, seed) + timelockSignerPDA := GetTimelockSignerPDA(programID, seed) + + instructionBuilder := timelockBindings.NewTransferOwnershipInstruction([32]uint8(seed), + timelockSignerPDA, timelockConfigPDA, chain.DeployerKey.PublicKey()) + instruction, err := instructionBuilder.ValidateAndBuild() + if err != nil { + return fmt.Errorf("failed to build TransferOwnership instruction: %w", err) + } + + err = chain.Confirm([]solana.Instruction{instruction}) + if err != nil { + return fmt.Errorf("failed to confirm TransferOwnership instruction: %w", err) + } + + return nil +} diff --git a/deployment/common/changeset/set_config_mcms_test.go b/deployment/common/changeset/set_config_mcms_test.go index aa9bf37579b..0951e059f14 100644 --- a/deployment/common/changeset/set_config_mcms_test.go +++ b/deployment/common/changeset/set_config_mcms_test.go @@ -33,7 +33,7 @@ func setupSetConfigTestEnv(t *testing.T) deployment.Environment { env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) chainSelector := env.AllChainSelectors()[0] - config := proposalutils.SingleGroupTimelockConfig(t) + config := proposalutils.SingleGroupTimelockConfigV2(t) // Deploy MCMS and Timelock env, err := commonchangeset.Apply(t, env, nil, commonchangeset.Configure( @@ -41,8 +41,8 @@ func setupSetConfigTestEnv(t *testing.T) deployment.Environment { []uint64{chainSelector}, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), - map[uint64]types.MCMSWithTimelockConfig{ + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), + map[uint64]types.MCMSWithTimelockConfigV2{ chainSelector: config, }, ), diff --git a/deployment/common/changeset/state/evm.go b/deployment/common/changeset/state/evm.go new file mode 100644 index 00000000000..aa3dc189972 --- /dev/null +++ b/deployment/common/changeset/state/evm.go @@ -0,0 +1,235 @@ +package state + +import ( + "errors" + "fmt" + + "github.com/ethereum/go-ethereum/common" + bindings "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" + + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/proposalutils" + "github.com/smartcontractkit/chainlink/deployment/common/types" + "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/link_token" +) + +// MCMSWithTimelockState holds the Go bindings +// for a MCMSWithTimelock contract deployment. +// It is public for use in product specific packages. +// Either all fields are nil or all fields are non-nil. +type MCMSWithTimelockState struct { + *proposalutils.MCMSWithTimelockContracts +} + +func (state MCMSWithTimelockState) GenerateMCMSWithTimelockView() (v1_0.MCMSWithTimelockView, error) { + if err := state.Validate(); err != nil { + return v1_0.MCMSWithTimelockView{}, err + } + timelockView, err := v1_0.GenerateTimelockView(*state.Timelock) + if err != nil { + return v1_0.MCMSWithTimelockView{}, nil + } + callProxyView, err := v1_0.GenerateCallProxyView(*state.CallProxy) + if err != nil { + return v1_0.MCMSWithTimelockView{}, nil + } + bypasserView, err := v1_0.GenerateMCMSView(*state.BypasserMcm) + if err != nil { + return v1_0.MCMSWithTimelockView{}, nil + } + proposerView, err := v1_0.GenerateMCMSView(*state.ProposerMcm) + if err != nil { + return v1_0.MCMSWithTimelockView{}, nil + } + cancellerView, err := v1_0.GenerateMCMSView(*state.CancellerMcm) + if err != nil { + return v1_0.MCMSWithTimelockView{}, nil + } + return v1_0.MCMSWithTimelockView{ + Timelock: timelockView, + Bypasser: bypasserView, + Proposer: proposerView, + Canceller: cancellerView, + CallProxy: callProxyView, + }, nil +} + +// MaybeLoadMCMSWithTimelockState loads the MCMSWithTimelockState state for each chain in the given environment. +func MaybeLoadMCMSWithTimelockState(env deployment.Environment, chainSelectors []uint64) (map[uint64]*MCMSWithTimelockState, error) { + result := map[uint64]*MCMSWithTimelockState{} + for _, chainSelector := range chainSelectors { + chain, ok := env.Chains[chainSelector] + if !ok { + return nil, fmt.Errorf("chain %d not found", chainSelector) + } + addressesChain, err := env.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return nil, err + } + state, err := MaybeLoadMCMSWithTimelockChainState(chain, addressesChain) + if err != nil { + return nil, err + } + result[chainSelector] = state + } + return result, nil +} + +// MaybeLoadMCMSWithTimelockChainState looks for the addresses corresponding to +// contracts deployed with DeployMCMSWithTimelock and loads them into a +// MCMSWithTimelockState struct. If none of the contracts are found, the state struct will be nil. +// An error indicates: +// - Found but was unable to load a contract +// - It only found part of the bundle of contracts +// - If found more than one instance of a contract (we expect one bundle in the given addresses) +func MaybeLoadMCMSWithTimelockChainState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*MCMSWithTimelockState, error) { + state := MCMSWithTimelockState{ + MCMSWithTimelockContracts: &proposalutils.MCMSWithTimelockContracts{}, + } + // We expect one of each contract on the chain. + timelock := deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0) + callProxy := deployment.NewTypeAndVersion(types.CallProxy, deployment.Version1_0_0) + proposer := deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0) + canceller := deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0) + bypasser := deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0) + + // Convert map keys to a slice + wantTypes := []deployment.TypeAndVersion{timelock, proposer, canceller, bypasser, callProxy} + + // Ensure we either have the bundle or not. + _, err := deployment.AddressesContainBundle(addresses, wantTypes) + if err != nil { + return nil, fmt.Errorf("unable to check MCMS contracts on chain %s error: %w", chain.Name(), err) + } + + for address, tvStr := range addresses { + switch { + case tvStr.Type == timelock.Type && tvStr.Version.String() == timelock.Version.String(): + tl, err := bindings.NewRBACTimelock(common.HexToAddress(address), chain.Client) + if err != nil { + return nil, err + } + state.Timelock = tl + case tvStr.Type == callProxy.Type && tvStr.Version.String() == callProxy.Version.String(): + cp, err := bindings.NewCallProxy(common.HexToAddress(address), chain.Client) + if err != nil { + return nil, err + } + state.CallProxy = cp + case tvStr.Type == proposer.Type && tvStr.Version.String() == proposer.Version.String(): + mcms, err := bindings.NewManyChainMultiSig(common.HexToAddress(address), chain.Client) + if err != nil { + return nil, err + } + state.ProposerMcm = mcms + case tvStr.Type == bypasser.Type && tvStr.Version.String() == bypasser.Version.String(): + mcms, err := bindings.NewManyChainMultiSig(common.HexToAddress(address), chain.Client) + if err != nil { + return nil, err + } + state.BypasserMcm = mcms + case tvStr.Type == canceller.Type && tvStr.Version.String() == canceller.Version.String(): + mcms, err := bindings.NewManyChainMultiSig(common.HexToAddress(address), chain.Client) + if err != nil { + return nil, err + } + state.CancellerMcm = mcms + } + } + return &state, nil +} + +type LinkTokenState struct { + LinkToken *link_token.LinkToken +} + +func (s LinkTokenState) GenerateLinkView() (v1_0.LinkTokenView, error) { + if s.LinkToken == nil { + return v1_0.LinkTokenView{}, errors.New("link token not found") + } + return v1_0.GenerateLinkTokenView(s.LinkToken) +} + +// MaybeLoadLinkTokenState loads the LinkTokenState state for each chain in the given environment. +func MaybeLoadLinkTokenState(env deployment.Environment, chainSelectors []uint64) (map[uint64]*LinkTokenState, error) { + result := map[uint64]*LinkTokenState{} + for _, chainSelector := range chainSelectors { + chain, ok := env.Chains[chainSelector] + if !ok { + return nil, fmt.Errorf("chain %d not found", chainSelector) + } + addressesChain, err := env.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + return nil, err + } + state, err := MaybeLoadLinkTokenChainState(chain, addressesChain) + if err != nil { + return nil, err + } + result[chainSelector] = state + } + return result, nil +} + +func MaybeLoadLinkTokenChainState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*LinkTokenState, error) { + state := LinkTokenState{} + linkToken := deployment.NewTypeAndVersion(types.LinkToken, deployment.Version1_0_0) + + // Convert map keys to a slice + wantTypes := []deployment.TypeAndVersion{linkToken} + + // Ensure we either have the bundle or not. + _, err := deployment.AddressesContainBundle(addresses, wantTypes) + if err != nil { + return nil, fmt.Errorf("unable to check link token on chain %s error: %w", chain.Name(), err) + } + + for address, tvStr := range addresses { + if tvStr.Type == linkToken.Type && tvStr.Version.String() == linkToken.Version.String() { + lt, err := link_token.NewLinkToken(common.HexToAddress(address), chain.Client) + if err != nil { + return nil, err + } + state.LinkToken = lt + } + } + return &state, nil +} + +type StaticLinkTokenState struct { + StaticLinkToken *link_token_interface.LinkToken +} + +func (s StaticLinkTokenState) GenerateStaticLinkView() (v1_0.StaticLinkTokenView, error) { + if s.StaticLinkToken == nil { + return v1_0.StaticLinkTokenView{}, errors.New("static link token not found") + } + return v1_0.GenerateStaticLinkTokenView(s.StaticLinkToken) +} + +func MaybeLoadStaticLinkTokenState(chain deployment.Chain, addresses map[string]deployment.TypeAndVersion) (*StaticLinkTokenState, error) { + state := StaticLinkTokenState{} + staticLinkToken := deployment.NewTypeAndVersion(types.StaticLinkToken, deployment.Version1_0_0) + + // Convert map keys to a slice + wantTypes := []deployment.TypeAndVersion{staticLinkToken} + + // Ensure we either have the bundle or not. + _, err := deployment.AddressesContainBundle(addresses, wantTypes) + if err != nil { + return nil, fmt.Errorf("unable to check static link token on chain %s error: %w", chain.Name(), err) + } + + for address, tvStr := range addresses { + if tvStr.Type == staticLinkToken.Type && tvStr.Version.String() == staticLinkToken.Version.String() { + lt, err := link_token_interface.NewLinkToken(common.HexToAddress(address), chain.Client) + if err != nil { + return nil, err + } + state.StaticLinkToken = lt + } + } + return &state, nil +} diff --git a/deployment/common/changeset/state/solana.go b/deployment/common/changeset/state/solana.go new file mode 100644 index 00000000000..1733c41eef7 --- /dev/null +++ b/deployment/common/changeset/state/solana.go @@ -0,0 +1,338 @@ +package state + +import ( + "errors" + "fmt" + "strings" + + "github.com/gagliardetto/solana-go" + mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" + + timelockBindings "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/timelock" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/common/types" +) + +type PDASeed [32]byte + +// MCMSWithTimelockProgramsSolana holds the solana publick keys +// and seeds for the MCM, AccessController and Timelock programs. +// It is public for use in product specific packages. +type MCMSWithTimelockProgramsSolana struct { + McmProgram solana.PublicKey + ProposerMcmSeed PDASeed + CancellerMcmSeed PDASeed + BypasserMcmSeed PDASeed + TimelockProgram solana.PublicKey + TimelockSeed PDASeed + AccessControllerProgram solana.PublicKey + ProposerAccessControllerAccount solana.PublicKey + ExecutorAccessControllerAccount solana.PublicKey + CancellerAccessControllerAccount solana.PublicKey + BypasserAccessControllerAccount solana.PublicKey +} + +func (s *MCMSWithTimelockProgramsSolana) GetStateFromType(programType deployment.ContractType) (solana.PublicKey, PDASeed, error) { + switch programType { + case types.ManyChainMultisigProgram: + return s.McmProgram, PDASeed{}, nil + case types.ProposerManyChainMultisig: + return s.McmProgram, s.ProposerMcmSeed, nil + case types.BypasserManyChainMultisig: + return s.McmProgram, s.BypasserMcmSeed, nil + case types.CancellerManyChainMultisig: + return s.McmProgram, s.CancellerMcmSeed, nil + case types.RBACTimelockProgram: + return s.TimelockProgram, PDASeed{}, nil + case types.RBACTimelock: + return s.TimelockProgram, s.TimelockSeed, nil + case types.AccessControllerProgram: + return s.AccessControllerProgram, PDASeed{}, nil + case types.ProposerAccessControllerAccount: + return s.AccessControllerProgram, PDASeed(s.ProposerAccessControllerAccount), nil + case types.ExecutorAccessControllerAccount: + return s.AccessControllerProgram, PDASeed(s.ExecutorAccessControllerAccount), nil + case types.CancellerAccessControllerAccount: + return s.AccessControllerProgram, PDASeed(s.CancellerAccessControllerAccount), nil + case types.BypasserAccessControllerAccount: + return s.AccessControllerProgram, PDASeed(s.BypasserAccessControllerAccount), nil + default: + return solana.PublicKey{}, PDASeed{}, fmt.Errorf("unknown program type: %s", programType) + } +} + +func (s *MCMSWithTimelockProgramsSolana) SetState(contractType deployment.ContractType, program solana.PublicKey, seed PDASeed) error { + switch contractType { + case types.ManyChainMultisigProgram: + s.McmProgram = program + case types.ProposerManyChainMultisig: + s.McmProgram = program + s.ProposerMcmSeed = seed + case types.BypasserManyChainMultisig: + s.McmProgram = program + s.BypasserMcmSeed = seed + case types.CancellerManyChainMultisig: + s.McmProgram = program + s.CancellerMcmSeed = seed + case types.RBACTimelockProgram: + s.TimelockProgram = program + case types.RBACTimelock: + s.TimelockProgram = program + s.TimelockSeed = seed + case types.AccessControllerProgram: + s.AccessControllerProgram = program + case types.ProposerAccessControllerAccount: + s.AccessControllerProgram = program + s.ProposerAccessControllerAccount = solana.PublicKey(seed) + case types.ExecutorAccessControllerAccount: + s.AccessControllerProgram = program + s.ExecutorAccessControllerAccount = solana.PublicKey(seed) + case types.CancellerAccessControllerAccount: + s.AccessControllerProgram = program + s.CancellerAccessControllerAccount = solana.PublicKey(seed) + case types.BypasserAccessControllerAccount: + s.AccessControllerProgram = program + s.BypasserAccessControllerAccount = solana.PublicKey(seed) + default: + return fmt.Errorf("unknown program type: %s", contractType) + } + return nil +} + +// Validate checks that all fields are non-nil, ensuring it's ready +// for use generating views or interactions. +func (s *MCMSWithTimelockProgramsSolana) Validate() error { + if s.McmProgram.IsZero() { + return errors.New("canceller not found") + } + if s.TimelockProgram.IsZero() { + return errors.New("timelock not found") + } + if s.AccessControllerProgram.IsZero() { + return errors.New("timelock not found") + } + if s.ProposerAccessControllerAccount.IsZero() { + return errors.New("access controller not found") + } + if s.ExecutorAccessControllerAccount.IsZero() { + return errors.New("access controller not found") + } + if s.CancellerAccessControllerAccount.IsZero() { + return errors.New("access controller not found") + } + if s.BypasserAccessControllerAccount.IsZero() { + return errors.New("access controller not found") + } + return nil +} + +func (s *MCMSWithTimelockProgramsSolana) RoleAccount(role timelockBindings.Role) solana.PublicKey { + switch role { + case timelockBindings.Proposer_Role: + return s.ProposerAccessControllerAccount + case timelockBindings.Executor_Role: + return s.ExecutorAccessControllerAccount + case timelockBindings.Canceller_Role: + return s.CancellerAccessControllerAccount + case timelockBindings.Bypasser_Role: + return s.BypasserAccessControllerAccount + default: + return solana.PublicKey{} + } +} + +// MCMSWithTimelockStateStateSolana holds the Go bindings +// for a MCMSWithTimelock contract deployment. +// It is public for use in product specific packages. +// Either all fields are nil or all fields are non-nil. +type MCMSWithTimelockStateSolana struct { + *MCMSWithTimelockProgramsSolana +} + +// MaybeLoadMCMSWithTimelockState loads the MCMSWithTimelockState state for each chain in the given environment. +func MaybeLoadMCMSWithTimelockStateSolana(env deployment.Environment, chainSelectors []uint64) (map[uint64]*MCMSWithTimelockStateSolana, error) { + result := map[uint64]*MCMSWithTimelockStateSolana{} + for _, chainSelector := range chainSelectors { + chain, ok := env.SolChains[chainSelector] + if !ok { + return nil, fmt.Errorf("chain %d not found", chainSelector) + } + addressesChain, err := env.ExistingAddresses.AddressesForChain(chainSelector) + if err != nil { + if !errors.Is(err, deployment.ErrChainNotFound) { + return nil, fmt.Errorf("unable to get addresses for chain %v: %w", chainSelector, err) + } + // chain not found in address book, initialize empty + addressesChain = make(map[string]deployment.TypeAndVersion) + } + state, err := MaybeLoadMCMSWithTimelockChainStateSolana(chain, addressesChain) + if err != nil { + return nil, fmt.Errorf("unable to load mcms and timelock solana chain state: %w", err) + } + result[chainSelector] = state + } + return result, nil +} + +// MaybeLoadMCMSWithTimelockChainState looks for the addresses corresponding to +// contracts deployed with DeployMCMSWithTimelock and loads them into a +// MCMSWithTimelockStateSolana struct. If none of the contracts are found, the +// state struct will be nil. +// An error indicates: +// - Found but was unable to load a contract +// - It only found part of the bundle of contracts +// - If found more than one instance of a contract (we expect one bundle in the given addresses) +func MaybeLoadMCMSWithTimelockChainStateSolana(chain deployment.SolChain, addresses map[string]deployment.TypeAndVersion) (*MCMSWithTimelockStateSolana, error) { + state := MCMSWithTimelockStateSolana{MCMSWithTimelockProgramsSolana: &MCMSWithTimelockProgramsSolana{}} + + mcmProgram := deployment.NewTypeAndVersion(types.ManyChainMultisigProgram, deployment.Version1_0_0) + timelockProgram := deployment.NewTypeAndVersion(types.RBACTimelockProgram, deployment.Version1_0_0) + accessControllerProgram := deployment.NewTypeAndVersion(types.AccessControllerProgram, deployment.Version1_0_0) + proposerMCM := deployment.NewTypeAndVersion(types.ProposerManyChainMultisig, deployment.Version1_0_0) + cancellerMCM := deployment.NewTypeAndVersion(types.CancellerManyChainMultisig, deployment.Version1_0_0) + bypasserMCM := deployment.NewTypeAndVersion(types.BypasserManyChainMultisig, deployment.Version1_0_0) + timelock := deployment.NewTypeAndVersion(types.RBACTimelock, deployment.Version1_0_0) + proposerAccessControllerAccount := deployment.NewTypeAndVersion(types.ProposerAccessControllerAccount, deployment.Version1_0_0) + executorAccessControllerAccount := deployment.NewTypeAndVersion(types.ExecutorAccessControllerAccount, deployment.Version1_0_0) + cancellerAccessControllerAccount := deployment.NewTypeAndVersion(types.CancellerAccessControllerAccount, deployment.Version1_0_0) + bypasserAccessControllerAccount := deployment.NewTypeAndVersion(types.BypasserAccessControllerAccount, deployment.Version1_0_0) + + // Convert map keys to a slice + wantTypes := []deployment.TypeAndVersion{ + mcmProgram, timelockProgram, accessControllerProgram, proposerMCM, cancellerMCM, bypasserMCM, timelock, + proposerAccessControllerAccount, executorAccessControllerAccount, cancellerAccessControllerAccount, + bypasserAccessControllerAccount, + } + + // Ensure we either have the bundle or not. + _, err := deployment.AddressesContainBundle(addresses, wantTypes) + if err != nil { + return nil, fmt.Errorf("unable to check MCMS contracts on chain %s error: %w", chain.Name(), err) + } + + for address, tvStr := range addresses { + switch { + case tvStr.Type == timelockProgram.Type && tvStr.Version.String() == timelockProgram.Version.String(): + programID, err := solana.PublicKeyFromBase58(address) + if err != nil { + return nil, fmt.Errorf("unable to decode timelock program address (%s): %w", address, err) + } + state.TimelockProgram = programID + + case tvStr.Type == timelock.Type && tvStr.Version.String() == timelock.Version.String(): + programID, seed, err := DecodeAddressWithSeed(address) + if err != nil { + return nil, fmt.Errorf("unable to decode timelock address (%s): %w", address, err) + } + state.TimelockProgram = programID + state.TimelockSeed = seed + + case tvStr.Type == accessControllerProgram.Type && tvStr.Version.String() == accessControllerProgram.Version.String(): + programID, err := solana.PublicKeyFromBase58(address) + if err != nil { + return nil, fmt.Errorf("unable to parse public key from access controller address: %s", address) + } + state.AccessControllerProgram = programID + + case tvStr.Type == proposerAccessControllerAccount.Type && tvStr.Version.String() == proposerAccessControllerAccount.Version.String(): + programID, account, err := DecodeAddressWithAccount(address) + if err != nil { + return nil, fmt.Errorf("unable to decode proposer access controlle address (%s): %w", address, err) + } + state.AccessControllerProgram = programID + state.ProposerAccessControllerAccount = account + + case tvStr.Type == executorAccessControllerAccount.Type && tvStr.Version.String() == executorAccessControllerAccount.Version.String(): + programID, account, err := DecodeAddressWithAccount(address) + if err != nil { + return nil, fmt.Errorf("unable to decode executor access controlle address (%s): %w", address, err) + } + state.AccessControllerProgram = programID + state.ExecutorAccessControllerAccount = account + + case tvStr.Type == cancellerAccessControllerAccount.Type && tvStr.Version.String() == cancellerAccessControllerAccount.Version.String(): + programID, account, err := DecodeAddressWithAccount(address) + if err != nil { + return nil, fmt.Errorf("unable to decode canceller access controlle address (%s): %w", address, err) + } + state.AccessControllerProgram = programID + state.CancellerAccessControllerAccount = account + + case tvStr.Type == bypasserAccessControllerAccount.Type && tvStr.Version.String() == bypasserAccessControllerAccount.Version.String(): + programID, account, err := DecodeAddressWithAccount(address) + if err != nil { + return nil, fmt.Errorf("unable to decode bypasser access controlle address (%s): %w", address, err) + } + state.AccessControllerProgram = programID + state.BypasserAccessControllerAccount = account + + case tvStr.Type == mcmProgram.Type && tvStr.Version.String() == mcmProgram.Version.String(): + programID, err := solana.PublicKeyFromBase58(address) + if err != nil { + return nil, fmt.Errorf("unable to parse public key from mcm address: %s", address) + } + state.McmProgram = programID + + case tvStr.Type == proposerMCM.Type && tvStr.Version.String() == proposerMCM.Version.String(): + programID, seed, err := DecodeAddressWithSeed(address) + if err != nil { + return nil, fmt.Errorf("unable to decode proposer address (%s): %w", address, err) + } + state.McmProgram = programID + state.ProposerMcmSeed = seed + + case tvStr.Type == bypasserMCM.Type && tvStr.Version.String() == bypasserMCM.Version.String(): + programID, seed, err := DecodeAddressWithSeed(address) + if err != nil { + return nil, fmt.Errorf("unable to decode bypasser address (%s): %w", address, err) + } + state.McmProgram = programID + state.BypasserMcmSeed = seed + + case tvStr.Type == cancellerMCM.Type && tvStr.Version.String() == cancellerMCM.Version.String(): + programID, seed, err := DecodeAddressWithSeed(address) + if err != nil { + return nil, fmt.Errorf("unable to decode canceller address (%s): %w", address, err) + } + state.McmProgram = programID + state.CancellerMcmSeed = seed + } + } + return &state, nil +} + +func EncodeAddressWithSeed(programID solana.PublicKey, seed PDASeed) string { + return mcmssolanasdk.ContractAddress(programID, mcmssolanasdk.PDASeed(seed)) +} + +func DecodeAddressWithSeed(address string) (solana.PublicKey, PDASeed, error) { + programID, seed, err := mcmssolanasdk.ParseContractAddress(address) + if err != nil { + return solana.PublicKey{}, PDASeed{}, fmt.Errorf("unable to parse address: %s", address) + } + + return programID, PDASeed(seed), nil +} + +func EncodeAddressWithAccount(programID, account solana.PublicKey) string { + return fmt.Sprintf("%s.%s", programID.String(), account.String()) +} + +func DecodeAddressWithAccount(address string) (solana.PublicKey, solana.PublicKey, error) { + parts := strings.Split(address, ".") + if len(parts) != 2 { + return solana.PublicKey{}, solana.PublicKey{}, fmt.Errorf("invalid address: %s", address) + } + + programID, err := solana.PublicKeyFromBase58(parts[0]) + if err != nil { + return solana.PublicKey{}, solana.PublicKey{}, fmt.Errorf("unable to parse public key from program id: %s", parts[0]) + } + + account, err := solana.PublicKeyFromBase58(parts[1]) + if err != nil { + return solana.PublicKey{}, solana.PublicKey{}, fmt.Errorf("unable to parse public key from account: %s", parts[1]) + } + + return programID, account, nil +} diff --git a/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go b/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go index ba43de3bef7..af26b28fd8e 100644 --- a/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go +++ b/deployment/common/changeset/transfer_to_mcms_with_timelock_test.go @@ -29,9 +29,9 @@ func TestTransferToMCMSWithTimelock(t *testing.T) { []uint64{chain1}, ), Configure( - deployment.CreateLegacyChangeSet(DeployMCMSWithTimelock), - map[uint64]types.MCMSWithTimelockConfig{ - chain1: proposalutils.SingleGroupTimelockConfig(t), + deployment.CreateLegacyChangeSet(DeployMCMSWithTimelockV2), + map[uint64]types.MCMSWithTimelockConfigV2{ + chain1: proposalutils.SingleGroupTimelockConfigV2(t), }, ), ) @@ -94,9 +94,9 @@ func TestTransferToMCMSWithTimelockV2(t *testing.T) { []uint64{chain1}, ), Configure( - deployment.CreateLegacyChangeSet(DeployMCMSWithTimelock), - map[uint64]types.MCMSWithTimelockConfig{ - chain1: proposalutils.SingleGroupTimelockConfig(t), + deployment.CreateLegacyChangeSet(DeployMCMSWithTimelockV2), + map[uint64]types.MCMSWithTimelockConfigV2{ + chain1: proposalutils.SingleGroupTimelockConfigV2(t), }, ), ) @@ -156,9 +156,9 @@ func TestRenounceTimelockDeployerConfigValidate(t *testing.T) { chain1 := e.AllChainSelectors()[0] e, err := Apply(t, e, nil, Configure( - deployment.CreateLegacyChangeSet(DeployMCMSWithTimelock), - map[uint64]types.MCMSWithTimelockConfig{ - chain1: proposalutils.SingleGroupTimelockConfig(t), + deployment.CreateLegacyChangeSet(DeployMCMSWithTimelockV2), + map[uint64]types.MCMSWithTimelockConfigV2{ + chain1: proposalutils.SingleGroupTimelockConfigV2(t), }, ), ) @@ -230,9 +230,9 @@ func TestRenounceTimelockDeployer(t *testing.T) { chain1 := e.AllChainSelectors()[0] e, err := Apply(t, e, nil, Configure( - deployment.CreateLegacyChangeSet(DeployMCMSWithTimelock), - map[uint64]types.MCMSWithTimelockConfig{ - chain1: proposalutils.SingleGroupTimelockConfig(t), + deployment.CreateLegacyChangeSet(DeployMCMSWithTimelockV2), + map[uint64]types.MCMSWithTimelockConfigV2{ + chain1: proposalutils.SingleGroupTimelockConfigV2(t), }, ), ) diff --git a/deployment/common/proposalutils/mcms_test_helpers.go b/deployment/common/proposalutils/mcms_test_helpers.go index f9f4be153ec..1340236fc30 100644 --- a/deployment/common/proposalutils/mcms_test_helpers.go +++ b/deployment/common/proposalutils/mcms_test_helpers.go @@ -17,6 +17,7 @@ import ( "github.com/smartcontractkit/mcms/sdk/evm" "github.com/smartcontractkit/mcms/sdk/solana" "github.com/smartcontractkit/mcms/types" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink/deployment" @@ -46,6 +47,15 @@ func SingleGroupMCMS(t *testing.T) config.Config { return *c } +func SingleGroupMCMSV2(t *testing.T) mcmstypes.Config { + publicKey := TestXXXMCMSSigner.Public().(*ecdsa.PublicKey) + // Convert the public key to an Ethereum address + address := crypto.PubkeyToAddress(*publicKey) + c, err := mcmstypes.NewConfig(1, []common.Address{address}, []mcmstypes.Config{}) + require.NoError(t, err) + return c +} + // Deprecated: Use SignMCMSTimelockProposal instead. func SignProposal(t *testing.T, env deployment.Environment, proposal *timelock.MCMSWithTimelockProposal) *mcms.Executor { executorClients := make(map[mcms.ChainIdentifier]mcms.ContractDeployBackend) @@ -297,3 +307,12 @@ func SingleGroupTimelockConfig(t *testing.T) commontypes.MCMSWithTimelockConfig TimelockMinDelay: big.NewInt(0), } } + +func SingleGroupTimelockConfigV2(t *testing.T) commontypes.MCMSWithTimelockConfigV2 { + return commontypes.MCMSWithTimelockConfigV2{ + Canceller: SingleGroupMCMSV2(t), + Bypasser: SingleGroupMCMSV2(t), + Proposer: SingleGroupMCMSV2(t), + TimelockMinDelay: big.NewInt(0), + } +} diff --git a/deployment/common/proposalutils/propose_test.go b/deployment/common/proposalutils/propose_test.go index f106f7d4406..352428ae0ed 100644 --- a/deployment/common/proposalutils/propose_test.go +++ b/deployment/common/proposalutils/propose_test.go @@ -30,12 +30,12 @@ func TestBuildProposalFromBatchesV2(t *testing.T) { } env := memory.NewMemoryEnvironment(t, lggr, zapcore.DebugLevel, cfg) chainSelector := env.AllChainSelectors()[0] - config := proposalutils.SingleGroupMCMS(t) + config := proposalutils.SingleGroupMCMSV2(t) env, err := changeset.Apply(t, env, nil, changeset.Configure( - deployment.CreateLegacyChangeSet(changeset.DeployMCMSWithTimelock), - map[uint64]types2.MCMSWithTimelockConfig{ + deployment.CreateLegacyChangeSet(changeset.DeployMCMSWithTimelockV2), + map[uint64]types2.MCMSWithTimelockConfigV2{ chainSelector: { Canceller: config, Bypasser: config, diff --git a/deployment/common/types/types.go b/deployment/common/types/types.go index 4e4c60048e0..5d8386ee674 100644 --- a/deployment/common/types/types.go +++ b/deployment/common/types/types.go @@ -6,6 +6,7 @@ import ( "time" "github.com/smartcontractkit/ccip-owner-contracts/pkg/config" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink/deployment" ) @@ -35,6 +36,14 @@ const ( // Corresponds to the ABI // https://github.com/smartcontractkit/chainlink/blob/develop/core/gethwrappers/generated/link_token_interface/link_token_interface.go#L34 StaticLinkToken deployment.ContractType = "StaticLinkToken" + // mcms Solana specific + ManyChainMultisigProgram deployment.ContractType = "ManyChainMultiSigProgram" + RBACTimelockProgram deployment.ContractType = "RBACTimelockProgram" + AccessControllerProgram deployment.ContractType = "AccessControllerProgram" + ProposerAccessControllerAccount deployment.ContractType = "ProposerAccessControllerAccount" + ExecutorAccessControllerAccount deployment.ContractType = "ExecutorAccessControllerAccount" + CancellerAccessControllerAccount deployment.ContractType = "CancellerAccessControllerAccount" + BypasserAccessControllerAccount deployment.ContractType = "BypasserAccessControllerAccount" ) func (role MCMSRole) String() string { @@ -49,6 +58,15 @@ type MCMSWithTimelockConfig struct { Label *string } +// MCMSWithTimelockConfigV2 holds the configuration for an MCMS with timelock. +// Note that this type already exists in types.go, but this one is using the new lib version. +type MCMSWithTimelockConfigV2 struct { + Canceller mcmstypes.Config + Bypasser mcmstypes.Config + Proposer mcmstypes.Config + TimelockMinDelay *big.Int +} + type OCRParameters struct { DeltaProgress time.Duration DeltaResend time.Duration diff --git a/deployment/environment/crib/ccip_deployer.go b/deployment/environment/crib/ccip_deployer.go index a30edf80a4b..ee3e5fe6dd1 100644 --- a/deployment/environment/crib/ccip_deployer.go +++ b/deployment/environment/crib/ccip_deployer.go @@ -14,8 +14,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/ethereum/go-ethereum/common" - - "github.com/smartcontractkit/ccip-owner-contracts/pkg/config" + mcmstypes "github.com/smartcontractkit/mcms/types" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -46,22 +45,22 @@ func DeployHomeChainContracts(ctx context.Context, lggr logger.Logger, envConfig return deployment.CapabilityRegistryConfig{}, e.ExistingAddresses, fmt.Errorf("failed to get node info from env: %w", err) } p2pIds := nodes.NonBootstraps().PeerIDs() - cfg := make(map[uint64]commontypes.MCMSWithTimelockConfig) + cfg := make(map[uint64]commontypes.MCMSWithTimelockConfigV2) for _, chain := range e.AllChainSelectors() { - mcmsConfig, err := config.NewConfig(1, []common.Address{e.Chains[chain].DeployerKey.From}, []config.Config{}) + mcmsConfig, err := mcmstypes.NewConfig(1, []common.Address{e.Chains[chain].DeployerKey.From}, []mcmstypes.Config{}) if err != nil { return deployment.CapabilityRegistryConfig{}, e.ExistingAddresses, fmt.Errorf("failed to create mcms config: %w", err) } - cfg[chain] = commontypes.MCMSWithTimelockConfig{ - Canceller: *mcmsConfig, - Bypasser: *mcmsConfig, - Proposer: *mcmsConfig, + cfg[chain] = commontypes.MCMSWithTimelockConfigV2{ + Canceller: mcmsConfig, + Bypasser: mcmsConfig, + Proposer: mcmsConfig, TimelockMinDelay: big.NewInt(0), } } *e, err = commonchangeset.Apply(nil, *e, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), cfg, ), commonchangeset.Configure( diff --git a/deployment/environment/memory/chain.go b/deployment/environment/memory/chain.go index e9332f81601..99fb3de8efc 100644 --- a/deployment/environment/memory/chain.go +++ b/deployment/environment/memory/chain.go @@ -181,6 +181,18 @@ func evmChain(t *testing.T, numUsers int) EVMChain { } } +var SolanaProgramIDs = map[string]string{ + "ccip_router": solTestConfig.CcipRouterProgram.String(), + "test_token_pool": solTestConfig.CcipTokenPoolProgram.String(), + "fee_quoter": solTestConfig.FeeQuoterProgram.String(), + "test_ccip_receiver": solTestConfig.CcipLogicReceiver.String(), + "ccip_offramp": solTestConfig.CcipOfframpProgram.String(), + "mcm": solTestConfig.McmProgram.String(), + "timelock": solTestConfig.TimelockProgram.String(), + "access_controller": solTestConfig.AccessControllerProgram.String(), + "external_program_cpi_stub": solTestConfig.ExternalCpiStubProgram.String(), +} + var once = &sync.Once{} func solChain(t *testing.T, chainID uint64, adminKey *solana.PrivateKey) (string, string, error) { @@ -195,21 +207,13 @@ func solChain(t *testing.T, chainID uint64, adminKey *solana.PrivateKey) (string for i := 0; i < maxRetries; i++ { port := freeport.GetOne(t) - programIds := map[string]string{ - "ccip_router": solTestConfig.CcipRouterProgram.String(), - "test_token_pool": solTestConfig.CcipTokenPoolProgram.String(), - "fee_quoter": solTestConfig.FeeQuoterProgram.String(), - "test_ccip_receiver": solTestConfig.CcipLogicReceiver.String(), - "ccip_offramp": solTestConfig.CcipOfframpProgram.String(), - } - bcInput := &blockchain.Input{ Type: "solana", ChainID: strconv.FormatUint(chainID, 10), PublicKey: adminKey.PublicKey().String(), Port: strconv.Itoa(port), ContractsDir: ProgramsPath, - SolanaPrograms: programIds, + SolanaPrograms: SolanaProgramIDs, } output, err := blockchain.NewBlockchainNetwork(bcInput) if err != nil { diff --git a/deployment/go.mod b/deployment/go.mod index 8d1539cde49..cf9a3f80057 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -2,8 +2,6 @@ module github.com/smartcontractkit/chainlink/deployment go 1.23.3 -toolchain go1.23.4 - // Make sure we're working with the latest chainlink libs replace github.com/smartcontractkit/chainlink/v2 => ../ @@ -22,6 +20,7 @@ require ( github.com/gagliardetto/binary v0.8.0 github.com/gagliardetto/solana-go v1.12.0 github.com/go-resty/resty/v2 v2.15.3 + github.com/google/go-cmp v0.6.0 github.com/google/uuid v1.6.0 github.com/hashicorp/consul/sdk v0.16.1 github.com/mr-tron/base58 v1.2.0 @@ -211,7 +210,6 @@ require ( github.com/google/btree v1.1.2 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.9-0.20230804172637-c7be7c783f49 // indirect - github.com/google/go-cmp v0.6.0 // indirect github.com/google/go-github/v41 v41.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/go-tpm v0.9.0 // indirect @@ -469,4 +467,5 @@ replace ( // replicating the replace directive on cosmos SDK github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 github.com/sourcegraph/sourcegraph/lib => github.com/sourcegraph/sourcegraph-public-snapshot/lib v0.0.0-20240822153003-c864f15af264 + github.com/testcontainers/testcontainers-go => github.com/testcontainers/testcontainers-go v0.34.0 ) diff --git a/deployment/go.sum b/deployment/go.sum index 58d31c94179..9ef8a13e006 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1237,8 +1237,8 @@ github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2l github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/test-go/testify v1.1.4/go.mod h1:rH7cfJo/47vWGdi4GPj16x3/t1xGOj2YxzmNQzk2ghU= -github.com/testcontainers/testcontainers-go v0.35.0 h1:uADsZpTKFAtp8SLK+hMwSaa+X+JiERHtd4sQAFmXeMo= -github.com/testcontainers/testcontainers-go v0.35.0/go.mod h1:oEVBj5zrfJTrgjwONs1SsRbnBtH9OKl+IGl3UMcr2B4= +github.com/testcontainers/testcontainers-go v0.34.0 h1:5fbgF0vIN5u+nD3IWabQwRybuB4GY8G2HHgCkbMzMHo= +github.com/testcontainers/testcontainers-go v0.34.0/go.mod h1:6P/kMkQe8yqPHfPWNulFGdFHTD8HB2vLq/231xY2iPQ= github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a h1:YuO+afVc3eqrjiCUizNCxI53bl/BnPiVwXqLzqYTqgU= github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a/go.mod h1:/sfW47zCZp9FrtGcWyo1VjbgDaodxX9ovZvgLb/MxaA= github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= diff --git a/deployment/keystone/changeset/accept_ownership_test.go b/deployment/keystone/changeset/accept_ownership_test.go index 4156be6854f..0f951567064 100644 --- a/deployment/keystone/changeset/accept_ownership_test.go +++ b/deployment/keystone/changeset/accept_ownership_test.go @@ -43,9 +43,9 @@ func TestAcceptAllOwnership(t *testing.T) { &changeset.DeployFeedsConsumerRequest{ChainSelector: registrySel}, ), commonchangeset.Configure( - deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), - map[uint64]types.MCMSWithTimelockConfig{ - registrySel: proposalutils.SingleGroupTimelockConfig(t), + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), + map[uint64]types.MCMSWithTimelockConfigV2{ + registrySel: proposalutils.SingleGroupTimelockConfigV2(t), }, ), ) diff --git a/deployment/keystone/changeset/test/env_setup.go b/deployment/keystone/changeset/test/env_setup.go index f8b1b46f248..2bce7fd3db7 100644 --- a/deployment/keystone/changeset/test/env_setup.go +++ b/deployment/keystone/changeset/test/env_setup.go @@ -298,14 +298,14 @@ func setupTestEnv(t *testing.T, c EnvWrapperConfig) EnvWrapper { if c.UseMCMS { // deploy, configure and xfer ownership of MCMS on all chains - timelockCfgs := make(map[uint64]commontypes.MCMSWithTimelockConfig) + timelockCfgs := make(map[uint64]commontypes.MCMSWithTimelockConfigV2) for sel := range env.Chains { t.Logf("Enabling MCMS on chain %d", sel) - timelockCfgs[sel] = proposalutils.SingleGroupTimelockConfig(t) + timelockCfgs[sel] = proposalutils.SingleGroupTimelockConfigV2(t) } env, err = commonchangeset.Apply(t, env, nil, commonchangeset.Configure( - deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelock), + deployment.CreateLegacyChangeSet(commonchangeset.DeployMCMSWithTimelockV2), timelockCfgs, ), ) diff --git a/go.mod b/go.mod index 57cba4ae448..e75471e473b 100644 --- a/go.mod +++ b/go.mod @@ -2,8 +2,6 @@ module github.com/smartcontractkit/chainlink/v2 go 1.23.3 -toolchain go1.23.4 - require ( github.com/Depado/ginprom v1.8.0 github.com/Masterminds/semver/v3 v3.3.0 From b2dca0382d229a515147fbc82f8fae7e1f35f0d8 Mon Sep 17 00:00:00 2001 From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com> Date: Fri, 14 Feb 2025 09:01:55 -0800 Subject: [PATCH 74/83] CCIP-3410 : add validations for ocr3 config (#16405) * add validations for ocr3 config * fixes * fix lint * fix me --- deployment/ccip/changeset/cs_ccip_home.go | 8 +- .../ccip/changeset/cs_ccip_home_test.go | 1 + .../ccip/changeset/cs_chain_contracts.go | 37 ++- .../ccip/changeset/cs_chain_contracts_test.go | 214 ++++++++++++++++++ .../changeset/internal/deploy_home_chain.go | 103 ++++++--- .../ccip/ccip_migration_to_v_1_6_test.go | 4 + 6 files changed, 328 insertions(+), 39 deletions(-) diff --git a/deployment/ccip/changeset/cs_ccip_home.go b/deployment/ccip/changeset/cs_ccip_home.go index 1303800c4e0..0922b526e5a 100644 --- a/deployment/ccip/changeset/cs_ccip_home.go +++ b/deployment/ccip/changeset/cs_ccip_home.go @@ -622,6 +622,7 @@ func AddDonAndSetCandidateChangeset( return deployment.ChangesetOutput{}, err } newDONArgs, err := internal.BuildOCR3ConfigForCCIPHome( + state.Chains[cfg.HomeChainSelector].CCIPHome, e.OCRSecrets, offRampAddress, chainSelector, @@ -726,7 +727,7 @@ func newDonWithCandidateOp( ) if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( - homeChain, addDonTx, capabilities_registry.CapabilitiesRegistryABI, err) + homeChain, addDonTx, ccip_home.CCIPHomeABI, err) if err != nil { return mcms.Operation{}, fmt.Errorf("error confirming addDon call: %w", err) } @@ -813,6 +814,7 @@ func SetCandidateChangeset( return deployment.ChangesetOutput{}, err } newDONArgs, err := internal.BuildOCR3ConfigForCCIPHome( + state.Chains[cfg.HomeChainSelector].CCIPHome, e.OCRSecrets, offRampAddress, chainSelector, @@ -916,7 +918,7 @@ func setCandidateOnExistingDon( ) if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( - homeChain, updateDonTx, capabilities_registry.CapabilitiesRegistryABI, err) + homeChain, updateDonTx, ccip_home.CCIPHomeABI, err) if err != nil { return nil, fmt.Errorf("error confirming updateDon call: %w", err) } @@ -973,7 +975,7 @@ func promoteCandidateOp( ) if !mcmsEnabled { _, err = deployment.ConfirmIfNoErrorWithABI( - homeChain, updateDonTx, capabilities_registry.CapabilitiesRegistryABI, err) + homeChain, updateDonTx, ccip_home.CCIPHomeABI, err) if err != nil { return mcms.Operation{}, fmt.Errorf("error confirming updateDon call for donID(%d) and plugin type (%d): %w", donID, pluginType, err) diff --git a/deployment/ccip/changeset/cs_ccip_home_test.go b/deployment/ccip/changeset/cs_ccip_home_test.go index 7c4095afa74..e8d4fa62872 100644 --- a/deployment/ccip/changeset/cs_ccip_home_test.go +++ b/deployment/ccip/changeset/cs_ccip_home_test.go @@ -76,6 +76,7 @@ func TestInvalidOCR3Params(t *testing.T) { // make DeltaRound greater than DeltaProgress params.OCRParameters.DeltaRound = params.OCRParameters.DeltaProgress + time.Duration(1) _, err = internal.BuildOCR3ConfigForCCIPHome( + state.Chains[e.HomeChainSel].CCIPHome, e.Env.OCRSecrets, state.Chains[chain1].OffRamp.Address().Bytes(), chain1, diff --git a/deployment/ccip/changeset/cs_chain_contracts.go b/deployment/ccip/changeset/cs_chain_contracts.go index 49f777e32b2..c7f1a47f7f6 100644 --- a/deployment/ccip/changeset/cs_chain_contracts.go +++ b/deployment/ccip/changeset/cs_chain_contracts.go @@ -75,6 +75,11 @@ type NonceManagerUpdate struct { type PreviousRampCfg struct { RemoteChainSelector uint64 OverrideExisting bool + // Set these only if the prevOnRamp or prevOffRamp addresses are not required to be in nonce manager. + // If one of the onRamp or OffRamp is set with non-zero address and other is set with zero address, + // it will not be possible to update the previous ramps later unless OverrideExisting is set to true. + AllowEmptyOnRamp bool // If true, the prevOnRamp address can be 0x0. + AllowEmptyOffRamp bool // If true, the prevOffRamp address can be 0x0. } func (cfg UpdateNonceManagerConfig) Validate(e deployment.Environment) error { @@ -106,16 +111,23 @@ func (cfg UpdateNonceManagerConfig) Validate(e deployment.Environment) error { } // If one of the onRamp or OffRamp is set with non-zero address and other is set with zero address, // it will not be possible to update the previous ramps later. + // Allow blank onRamp or offRamp only if AllowEmptyOnRamp or AllowEmptyOffRamp is set to true. // see https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/ccip/NonceManager.sol#L139-L142 - if prevOnRamp := state.Chains[sourceSel].EVM2EVMOnRamp; prevOnRamp == nil { - return fmt.Errorf("no previous onramp for source chain %d", sourceSel) - } else if prevOnRamp[prevRamp.RemoteChainSelector] == nil || prevOnRamp[prevRamp.RemoteChainSelector].Address() == (common.Address{}) { - return fmt.Errorf("no previous onramp for source chain %d and dest chain %d", sourceSel, prevRamp.RemoteChainSelector) + if !prevRamp.AllowEmptyOnRamp { + if prevOnRamp := state.Chains[sourceSel].EVM2EVMOnRamp; prevOnRamp == nil || + prevOnRamp[prevRamp.RemoteChainSelector] == nil || + prevOnRamp[prevRamp.RemoteChainSelector].Address() == (common.Address{}) { + return fmt.Errorf("no previous onramp for source chain %d and dest chain %d, "+ + "If you want to set zero address for onRamp, set AllowEmptyOnRamp to true", sourceSel, prevRamp.RemoteChainSelector) + } } - if prevOffRamp := state.Chains[sourceSel].EVM2EVMOffRamp; prevOffRamp == nil { - return fmt.Errorf("missing previous offramps for chain %d", sourceSel) - } else if prevOffRamp[prevRamp.RemoteChainSelector] == nil || prevOffRamp[prevRamp.RemoteChainSelector].Address() == (common.Address{}) { - return fmt.Errorf("no previous offramp for source chain %d and dest chain %d", prevRamp.RemoteChainSelector, sourceSel) + if !prevRamp.AllowEmptyOffRamp { + if prevOffRamp := state.Chains[sourceSel].EVM2EVMOffRamp; prevOffRamp == nil || + prevOffRamp[prevRamp.RemoteChainSelector] == nil || + prevOffRamp[prevRamp.RemoteChainSelector].Address() == (common.Address{}) { + return fmt.Errorf("no previous offramp for source chain %d and dest chain %d"+ + "If you want to set zero address for offRamp, set AllowEmptyOffRamp to true", prevRamp.RemoteChainSelector, sourceSel) + } } } } @@ -159,8 +171,13 @@ func UpdateNonceManagersChangeset(e deployment.Environment, cfg UpdateNonceManag if len(updates.PreviousRampsArgs) > 0 { previousRampsArgs := make([]nonce_manager.NonceManagerPreviousRampsArgs, 0) for _, prevRamp := range updates.PreviousRampsArgs { - onRamp := s.Chains[chainSel].EVM2EVMOnRamp[prevRamp.RemoteChainSelector].Address() - offRamp := s.Chains[chainSel].EVM2EVMOffRamp[prevRamp.RemoteChainSelector].Address() + var onRamp, offRamp common.Address + if !prevRamp.AllowEmptyOnRamp { + onRamp = s.Chains[chainSel].EVM2EVMOnRamp[prevRamp.RemoteChainSelector].Address() + } + if !prevRamp.AllowEmptyOffRamp { + offRamp = s.Chains[chainSel].EVM2EVMOffRamp[prevRamp.RemoteChainSelector].Address() + } previousRampsArgs = append(previousRampsArgs, nonce_manager.NonceManagerPreviousRampsArgs{ RemoteChainSelector: prevRamp.RemoteChainSelector, OverrideExistingRamps: prevRamp.OverrideExisting, diff --git a/deployment/ccip/changeset/cs_chain_contracts_test.go b/deployment/ccip/changeset/cs_chain_contracts_test.go index 75b36cdad49..6bf532e9a72 100644 --- a/deployment/ccip/changeset/cs_chain_contracts_test.go +++ b/deployment/ccip/changeset/cs_chain_contracts_test.go @@ -6,12 +6,21 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + chainselectors "github.com/smartcontractkit/chain-selectors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/exp/maps" + "github.com/smartcontractkit/chainlink-ccip/chainconfig" + cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + "github.com/smartcontractkit/chainlink-testing-framework/lib/utils/testcontext" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/v1_5" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/rmn_contract" "github.com/smartcontractkit/chainlink-integrations/evm/utils" @@ -422,9 +431,13 @@ func TestUpdateOffRampsSources(t *testing.T) { sourceCfg, err := state.Chains[source].OffRamp.GetSourceChainConfig(&bind.CallOpts{Context: ctx}, dest) require.NoError(t, err) require.Equal(t, state.Chains[source].TestRouter.Address(), sourceCfg.Router) + require.True(t, sourceCfg.IsRMNVerificationDisabled) + require.True(t, sourceCfg.IsEnabled) destCfg, err := state.Chains[dest].OffRamp.GetSourceChainConfig(&bind.CallOpts{Context: ctx}, source) require.NoError(t, err) require.Equal(t, state.Chains[dest].Router.Address(), destCfg.Router) + require.True(t, destCfg.IsRMNVerificationDisabled) + require.True(t, destCfg.IsEnabled) }) } } @@ -691,3 +704,204 @@ func TestUpdateNonceManagersCS(t *testing.T) { }) } } + +func TestUpdateNonceManagersCSApplyPreviousRampsUpdates(t *testing.T) { + e, tenv := testhelpers.NewMemoryEnvironment( + t, + testhelpers.WithPrerequisiteDeploymentOnly(&changeset.V1_5DeploymentConfig{ + PriceRegStalenessThreshold: 60 * 60 * 24 * 14, // two weeks + RMNConfig: &rmn_contract.RMNConfig{ + BlessWeightThreshold: 2, + CurseWeightThreshold: 2, + // setting dummy voters, we will permabless this later + Voters: []rmn_contract.RMNVoter{ + { + BlessWeight: 2, + CurseWeight: 2, + BlessVoteAddr: utils.RandomAddress(), + CurseVoteAddr: utils.RandomAddress(), + }, + }, + }, + }), + testhelpers.WithNumOfChains(3), + testhelpers.WithChainIDs([]uint64{chainselectors.GETH_TESTNET.EvmChainID})) + state, err := changeset.LoadOnchainState(e.Env) + require.NoError(t, err) + allChains := e.Env.AllChainSelectorsExcluding([]uint64{chainselectors.GETH_TESTNET.Selector}) + require.Contains(t, e.Env.AllChainSelectors(), chainselectors.GETH_TESTNET.Selector) + require.Len(t, allChains, 2) + src, dest := allChains[1], chainselectors.GETH_TESTNET.Selector + srcChain := e.Env.Chains[src] + destChain := e.Env.Chains[dest] + pairs := []testhelpers.SourceDestPair{ + {SourceChainSelector: src, DestChainSelector: dest}, + } + e = testhelpers.AddCCIPContractsToEnvironment(t, e.Env.AllChainSelectors(), tenv, false) + // try to apply previous ramps updates without having any previous ramps + // it should fail + _, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), + changeset.UpdateNonceManagerConfig{ + UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ + srcChain.Selector: { + PreviousRampsArgs: []changeset.PreviousRampCfg{ + { + RemoteChainSelector: destChain.Selector, + }, + }, + }, + }, + }, + ), + ) + require.Error(t, err) + require.Contains(t, err.Error(), "no previous onramp for source chain") + e.Env = v1_5.AddLanes(t, e.Env, state, pairs) + // Now apply the nonce manager update + // it should fail again as there is no offramp for the source chain + _, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), + changeset.UpdateNonceManagerConfig{ + UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ + srcChain.Selector: { + PreviousRampsArgs: []changeset.PreviousRampCfg{ + { + RemoteChainSelector: destChain.Selector, + }, + }, + }, + }, + }, + ), + ) + require.Error(t, err) + require.Contains(t, err.Error(), "no previous offramp for source chain") + // Now apply the update with AllowEmptyOffRamp and it should pass + _, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.UpdateNonceManagersChangeset), + changeset.UpdateNonceManagerConfig{ + UpdatesByChain: map[uint64]changeset.NonceManagerUpdate{ + srcChain.Selector: { + PreviousRampsArgs: []changeset.PreviousRampCfg{ + { + RemoteChainSelector: destChain.Selector, + AllowEmptyOffRamp: true, + }, + }, + }, + }, + }, + ), + ) + require.NoError(t, err) +} + +func TestSetOCR3ConfigValidations(t *testing.T) { + e, _ := testhelpers.NewMemoryEnvironment( + t, + testhelpers.WithPrerequisiteDeploymentOnly(nil)) + envNodes, err := deployment.NodeInfo(e.Env.NodeIDs, e.Env.Offchain) + require.NoError(t, err) + allChains := e.Env.AllChainSelectors() + evmContractParams := make(map[uint64]changeset.ChainContractParams) + for _, chain := range allChains { + evmContractParams[chain] = changeset.ChainContractParams{ + FeeQuoterParams: changeset.DefaultFeeQuoterParams(), + OffRampParams: changeset.DefaultOffRampParams(), + } + } + var apps []commonchangeset.ConfiguredChangeSet + // now deploy contracts + apps = append(apps, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployHomeChainChangeset), + changeset.DeployHomeChainConfig{ + HomeChainSel: e.HomeChainSel, + RMNDynamicConfig: testhelpers.NewTestRMNDynamicConfig(), + RMNStaticConfig: testhelpers.NewTestRMNStaticConfig(), + NodeOperators: testhelpers.NewTestNodeOperator(e.Env.Chains[e.HomeChainSel].DeployerKey.From), + NodeP2PIDsPerNodeOpAdmin: map[string][][32]byte{ + testhelpers.TestNodeOperator: envNodes.NonBootstraps().PeerIDs(), + }, + }, + ), + commonchangeset.Configure( + deployment.CreateLegacyChangeSet(changeset.DeployChainContractsChangeset), + changeset.DeployChainContractsConfig{ + HomeChainSelector: e.HomeChainSel, + ContractParamsPerChain: evmContractParams, + }, + ), + }...) + e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, apps) + require.NoError(t, err) + // try to apply ocr3config on offRamp without setting the active config on home chain + _, err = commonchangeset.Apply(t, e.Env, e.TimelockContracts(t), + commonchangeset.Configure( + // Enable the OCR config on the remote chains. + deployment.CreateLegacyChangeSet(changeset.SetOCR3OffRampChangeset), + changeset.SetOCR3OffRampConfig{ + HomeChainSel: e.HomeChainSel, + RemoteChainSels: allChains, + CCIPHomeConfigType: globals.ConfigTypeActive, + }, + ), + ) + // it should fail as we need to update the chainconfig on CCIPHome first + require.Error(t, err) + require.Contains(t, err.Error(), "invalid OCR3 config state, expected active config") + + // Build the per chain config. + wrongChainConfigs := make(map[uint64]changeset.ChainConfig) + ocrConfigs := make(map[uint64]changeset.CCIPOCRParams) + for _, chain := range allChains { + ocrParams := changeset.DeriveCCIPOCRParams( + changeset.WithDefaultCommitOffChainConfig(e.FeedChainSel, nil), + changeset.WithDefaultExecuteOffChainConfig(nil), + ) + ocrConfigs[chain] = ocrParams + // set wrong chain config with incorrect value of FChain + wrongChainConfigs[chain] = changeset.ChainConfig{ + Readers: envNodes.NonBootstraps().PeerIDs(), + //nolint:gosec // disable G115 + FChain: uint8(len(envNodes.NonBootstraps().PeerIDs())), + EncodableChainConfig: chainconfig.ChainConfig{ + GasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(globals.GasPriceDeviationPPB)}, + DAGasPriceDeviationPPB: cciptypes.BigInt{Int: big.NewInt(globals.DAGasPriceDeviationPPB)}, + OptimisticConfirmations: globals.OptimisticConfirmations, + }, + } + } + // now set the chain config with wrong values of FChain + // it should fail on addDonAndSetCandidateChangeset + e.Env, err = commonchangeset.ApplyChangesets(t, e.Env, nil, []commonchangeset.ConfiguredChangeSet{ + commonchangeset.Configure( + // Add the chain configs for the new chains. + deployment.CreateLegacyChangeSet(changeset.UpdateChainConfigChangeset), + changeset.UpdateChainConfigConfig{ + HomeChainSelector: e.HomeChainSel, + RemoteChainAdds: wrongChainConfigs, + }, + ), + commonchangeset.Configure( + // Add the DONs and candidate commit OCR instances for the chain. + deployment.CreateLegacyChangeSet(changeset.AddDonAndSetCandidateChangeset), + changeset.AddDonAndSetCandidateChangesetConfig{ + SetCandidateConfigBase: changeset.SetCandidateConfigBase{ + HomeChainSelector: e.HomeChainSel, + FeedChainSelector: e.FeedChainSel, + }, + PluginInfo: changeset.SetCandidatePluginInfo{ + OCRConfigPerRemoteChainSelector: ocrConfigs, + PluginType: types.PluginTypeCCIPCommit, + }, + }, + ), + }) + require.Error(t, err) + require.Contains(t, err.Error(), "OCR3 config FRoleDON is lower than chainConfig FChain") +} diff --git a/deployment/ccip/changeset/internal/deploy_home_chain.go b/deployment/ccip/changeset/internal/deploy_home_chain.go index fb91ab3163d..e7266e65543 100644 --- a/deployment/ccip/changeset/internal/deploy_home_chain.go +++ b/deployment/ccip/changeset/internal/deploy_home_chain.go @@ -14,9 +14,12 @@ import ( "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper" ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types" + "github.com/smartcontractkit/chainlink-common/pkg/utils/bytes" + "github.com/smartcontractkit/chainlink-ccip/pluginconfig" "github.com/smartcontractkit/chainlink-integrations/evm/utils" + "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/globals" commontypes "github.com/smartcontractkit/chainlink/deployment/common/types" @@ -139,6 +142,10 @@ func BuildSetOCR3ConfigArgs( destSelector uint64, configType globals.ConfigType, ) ([]offramp.MultiOCR3BaseOCRConfigArgs, error) { + chainCfg, err := ccipHome.GetChainConfig(nil, destSelector) + if err != nil { + return nil, fmt.Errorf("error getting chain config for chain selector %d it must be set before OCR3Config set up: %w", destSelector, err) + } var offrampOCR3Configs []offramp.MultiOCR3BaseOCRConfigArgs for _, pluginType := range []types.PluginType{types.PluginTypeCCIPCommit, types.PluginTypeCCIPExec} { ocrConfig, err2 := ccipHome.GetAllConfigs(&bind.CallOpts{ @@ -165,6 +172,9 @@ func BuildSetOCR3ConfigArgs( } configForOCR3 = ocrConfig.CandidateConfig } + if err := validateOCR3Config(destSelector, configForOCR3.Config, chainCfg); err != nil { + return nil, err + } var signerAddresses []common.Address var transmitterAddresses []common.Address @@ -185,6 +195,63 @@ func BuildSetOCR3ConfigArgs( return offrampOCR3Configs, nil } +func validateOCR3Config(chainSel uint64, configForOCR3 ccip_home.CCIPHomeOCR3Config, chainConfig ccip_home.CCIPHomeChainConfig) error { + // chainConfigs must be set before OCR3 configs due to the added fChain == F validation + if chainConfig.FChain == 0 || bytes.IsEmpty(chainConfig.Config) || len(chainConfig.Readers) == 0 { + return fmt.Errorf("chain config is not set for chain selector %d", chainSel) + } + for _, reader := range chainConfig.Readers { + if bytes.IsEmpty(reader[:]) { + return fmt.Errorf("reader is empty, chain selector %d", chainSel) + } + } + // FRoleDON >= fChain is a requirement + if configForOCR3.FRoleDON < chainConfig.FChain { + return fmt.Errorf("OCR3 config FRoleDON is lower than chainConfig FChain, chain %d", chainSel) + } + + if len(configForOCR3.Nodes) < 3*int(chainConfig.FChain)+1 { + return fmt.Errorf("number of nodes %d is less than 3 * fChain + 1 %d", len(configForOCR3.Nodes), 3*int(chainConfig.FChain)+1) + } + // check if there is any zero byte address + // The reason for this is that the MultiOCR3Base disallows zero addresses and duplicates + if bytes.IsEmpty(configForOCR3.OfframpAddress) { + return fmt.Errorf("zero address found in offramp address, chain %d", chainSel) + } + if bytes.IsEmpty(configForOCR3.RmnHomeAddress) { + return fmt.Errorf("zero address found in rmn home address, chain %d", chainSel) + } + mapSignerKey := make(map[string]struct{}) + mapTransmitterKey := make(map[string]struct{}) + for _, node := range configForOCR3.Nodes { + if bytes.IsEmpty(node.SignerKey) { + return fmt.Errorf("zero address found in signer key, chain %d", chainSel) + } + if bytes.IsEmpty(node.TransmitterKey) { + return fmt.Errorf("zero address found in transmitter key, chain %d", chainSel) + } + if bytes.IsEmpty(node.P2pId[:]) { + return fmt.Errorf("empty p2p id, chain %d", chainSel) + } + // Signer and transmitter duplication must be checked + if _, ok := mapSignerKey[hexutil.Encode(node.SignerKey)]; ok { + return fmt.Errorf("duplicate signer key found, chain %d", chainSel) + } + if _, ok := mapTransmitterKey[hexutil.Encode(node.TransmitterKey)]; ok { + return fmt.Errorf("duplicate transmitter key found, chain %d", chainSel) + } + mapSignerKey[hexutil.Encode(node.SignerKey)] = struct{}{} + mapTransmitterKey[hexutil.Encode(node.TransmitterKey)] = struct{}{} + } + // transmitters.length should be validated such that it meets the 3 * fChain + 1 requirement + minTransmitterReq := 3*int(chainConfig.FChain) + 1 + if len(configForOCR3.Nodes) < minTransmitterReq { + return fmt.Errorf("no of transmitters %d is less than 3 * fChain + 1 %d, chain %d", + len(configForOCR3.Nodes), minTransmitterReq, chainSel) + } + return nil +} + // https://github.com/smartcontractkit/chainlink-ccip/blob/bdbfcc588847d70817333487a9883e94c39a332e/chains/solana/gobindings/ccip_router/SetOcrConfig.go#L23 type MultiOCR3BaseOCRConfigArgsSolana struct { ConfigDigest [32]byte @@ -246,6 +313,7 @@ func BuildSetOCR3ConfigArgsSolana( } func BuildOCR3ConfigForCCIPHome( + ccipHome *ccip_home.CCIPHome, ocrSecrets deployment.OCRSecrets, offRampAddress []byte, destSelector uint64, @@ -255,6 +323,10 @@ func BuildOCR3ConfigForCCIPHome( commitOffchainCfg *pluginconfig.CommitOffchainConfig, execOffchainCfg *pluginconfig.ExecuteOffchainConfig, ) (map[types.PluginType]ccip_home.CCIPHomeOCR3Config, error) { + chainConfig, err := ccipHome.GetChainConfig(nil, destSelector) + if err != nil { + return nil, fmt.Errorf("can't get chain config for %d: %w", destSelector, err) + } p2pIDs := nodes.PeerIDs() // Get OCR3 Config from helper var schedule []int @@ -291,36 +363,12 @@ func BuildOCR3ConfigForCCIPHome( if commitOffchainCfg == nil { return nil, errors.New("commitOffchainCfg is nil") } - encodedOffchainConfig, err2 = pluginconfig.EncodeCommitOffchainConfig(pluginconfig.CommitOffchainConfig{ - RemoteGasPriceBatchWriteFrequency: commitOffchainCfg.RemoteGasPriceBatchWriteFrequency, - TokenPriceBatchWriteFrequency: commitOffchainCfg.TokenPriceBatchWriteFrequency, - PriceFeedChainSelector: commitOffchainCfg.PriceFeedChainSelector, - TokenInfo: commitOffchainCfg.TokenInfo, - NewMsgScanBatchSize: commitOffchainCfg.NewMsgScanBatchSize, - MaxReportTransmissionCheckAttempts: commitOffchainCfg.MaxReportTransmissionCheckAttempts, - MaxMerkleTreeSize: commitOffchainCfg.MaxMerkleTreeSize, - SignObservationPrefix: commitOffchainCfg.SignObservationPrefix, - RMNEnabled: commitOffchainCfg.RMNEnabled, - RMNSignaturesTimeout: commitOffchainCfg.RMNSignaturesTimeout, - MerkleRootAsyncObserverSyncFreq: commitOffchainCfg.MerkleRootAsyncObserverSyncFreq, - MerkleRootAsyncObserverSyncTimeout: commitOffchainCfg.MerkleRootAsyncObserverSyncTimeout, - InflightPriceCheckRetries: commitOffchainCfg.InflightPriceCheckRetries, - TransmissionDelayMultiplier: commitOffchainCfg.TransmissionDelayMultiplier, - FeeInfo: commitOffchainCfg.FeeInfo, - }) + encodedOffchainConfig, err2 = pluginconfig.EncodeCommitOffchainConfig(*commitOffchainCfg) } else { if execOffchainCfg == nil { return nil, errors.New("execOffchainCfg is nil") } - encodedOffchainConfig, err2 = pluginconfig.EncodeExecuteOffchainConfig(pluginconfig.ExecuteOffchainConfig{ - BatchGasLimit: execOffchainCfg.BatchGasLimit, - RelativeBoostPerWaitHour: execOffchainCfg.RelativeBoostPerWaitHour, - MessageVisibilityInterval: execOffchainCfg.MessageVisibilityInterval, - InflightCacheExpiry: execOffchainCfg.InflightCacheExpiry, - RootSnoozeTime: execOffchainCfg.RootSnoozeTime, - BatchingStrategyID: execOffchainCfg.BatchingStrategyID, - TokenDataObservers: execOffchainCfg.TokenDataObservers, - }) + encodedOffchainConfig, err2 = pluginconfig.EncodeExecuteOffchainConfig(*execOffchainCfg) } if err2 != nil { return nil, err2 @@ -400,6 +448,9 @@ func BuildOCR3ConfigForCCIPHome( OffchainConfig: offchainConfig, RmnHomeAddress: rmnHomeAddress.Bytes(), } + if err := validateOCR3Config(destSelector, ocr3Configs[pluginType], chainConfig); err != nil { + return nil, fmt.Errorf("failed to validate ocr3 config: %w", err) + } } return ocr3Configs, nil diff --git a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go index 3273b113717..5e6279f5748 100644 --- a/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go +++ b/integration-tests/smoke/ccip/ccip_migration_to_v_1_6_test.go @@ -206,6 +206,7 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { PreviousRampsArgs: []changeset.PreviousRampCfg{ { RemoteChainSelector: dest, + AllowEmptyOffRamp: true, }, }, }, @@ -213,6 +214,7 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { PreviousRampsArgs: []changeset.PreviousRampCfg{ { RemoteChainSelector: dest, + AllowEmptyOffRamp: true, }, }, }, @@ -220,9 +222,11 @@ func TestMigrateFromV1_5ToV1_6(t *testing.T) { PreviousRampsArgs: []changeset.PreviousRampCfg{ { RemoteChainSelector: src1, + AllowEmptyOnRamp: true, }, { RemoteChainSelector: src2, + AllowEmptyOnRamp: true, }, }, }, From 112402014b37e9aed934e28fd1e0d8d079c052ce Mon Sep 17 00:00:00 2001 From: pavel-raykov <165708424+pavel-raykov@users.noreply.github.com> Date: Fri, 14 Feb 2025 18:44:04 +0100 Subject: [PATCH 75/83] Use MustNewSimTransactor from chainlink-integrations instead of its old copy. (#16357) * Minor * Minor * Minor * Minor * Minor * Minor * Minor * Minor * Minor * Minor * Minor * Minor * Minor * Minor --- .changeset/seven-bees-complain.md | 5 +++ .../integrationhelpers/integration_helpers.go | 3 +- .../ccip/ccipevm/executecodec_test.go | 3 +- .../ccip/ccipevm/msghasher_test.go | 5 +-- core/capabilities/ccip/common/common_test.go | 2 +- .../ocrimpls/contract_transmitter_test.go | 3 +- .../integration_tests/framework/ethereum.go | 2 +- core/chains/evm/txmgr/attempts_test.go | 6 ++-- .../ccip/deployment_test/deployment_test.go | 3 +- core/internal/features/features_test.go | 4 +-- .../features/ocr2/features_ocr2_helper.go | 3 +- core/internal/testutils/testutils.go | 12 ------- .../fluxmonitorv2/integrations_test.go | 7 +++-- core/services/keeper/integration_test.go | 31 ++++++++++--------- .../ccipdata/price_registry_reader_test.go | 3 +- .../ccip/internal/ccipdata/test_utils.go | 3 +- .../v1/internal/testutils.go | 3 +- .../ocr2/plugins/llo/integration_test.go | 3 +- ...annel_definition_cache_integration_test.go | 3 +- .../ocr2/plugins/mercury/integration_test.go | 3 +- .../v21/logprovider/integration_test.go | 7 +++-- .../plugins/ocr2keeper/integration_21_test.go | 25 ++++++++------- .../plugins/ocr2keeper/integration_test.go | 13 ++++---- core/services/registrysyncer/syncer_test.go | 3 +- .../vrf_solidity_crosscheck_test.go | 2 +- .../vrf_v08_solidity_crosscheck_test.go | 2 +- .../vrf/v2/integration_v2_plus_test.go | 23 +++++++------- core/services/vrf/v2/integration_v2_test.go | 21 +++++++------ .../vrf/v2/listener_v2_log_listener_test.go | 5 +-- core/services/vrf/vrftesthelpers/helpers.go | 9 +++--- 30 files changed, 115 insertions(+), 102 deletions(-) create mode 100644 .changeset/seven-bees-complain.md diff --git a/.changeset/seven-bees-complain.md b/.changeset/seven-bees-complain.md new file mode 100644 index 00000000000..3ce5b039ac1 --- /dev/null +++ b/.changeset/seven-bees-complain.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#updated Use MustNewSimTransactor from chainlink-integrations instead of its old copy. diff --git a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go index bb3cb86c832..9282e8c55c0 100644 --- a/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go +++ b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go @@ -29,6 +29,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" configsevm "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm" cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" @@ -102,7 +103,7 @@ type TestUniverse struct { } func NewTestUniverse(ctx context.Context, t *testing.T, lggr logger.Logger) TestUniverse { - transactor := testutils.MustNewSimTransactor(t) + transactor := evmtestutils.MustNewSimTransactor(t) backend := simulated.NewBackend(ethtypes.GenesisAlloc{ transactor.From: {Balance: assets.Ether(1000).ToInt()}, }, simulated.WithBlockGasLimit(30e6)) diff --git a/core/capabilities/ccip/ccipevm/executecodec_test.go b/core/capabilities/ccip/ccipevm/executecodec_test.go index ba282073db8..2e171f04030 100644 --- a/core/capabilities/ccip/ccipevm/executecodec_test.go +++ b/core/capabilities/ccip/ccipevm/executecodec_test.go @@ -17,6 +17,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/message_hasher" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" @@ -128,7 +129,7 @@ func TestExecutePluginCodecV1(t *testing.T) { ctx := testutils.Context(t) // Deploy the contract - transactor := testutils.MustNewSimTransactor(t) + transactor := evmtestutils.MustNewSimTransactor(t) simulatedBackend := backends.NewSimulatedBackend(core.GenesisAlloc{ transactor.From: {Balance: assets.Ether(1000).ToInt()}, }, 30e6) diff --git a/core/capabilities/ccip/ccipevm/msghasher_test.go b/core/capabilities/ccip/ccipevm/msghasher_test.go index 28cf5d04bce..cb399a75573 100644 --- a/core/capabilities/ccip/ccipevm/msghasher_test.go +++ b/core/capabilities/ccip/ccipevm/msghasher_test.go @@ -23,6 +23,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/message_hasher" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" @@ -181,7 +182,7 @@ type testSetupData struct { } func testSetup(t *testing.T) *testSetupData { - transactor := testutils.MustNewSimTransactor(t) + transactor := evmtestutils.MustNewSimTransactor(t) simulatedBackend := backends.NewSimulatedBackend(core.GenesisAlloc{ transactor.From: {Balance: assets.Ether(1000).ToInt()}, }, 30e6) @@ -204,7 +205,7 @@ func testSetup(t *testing.T) *testSetupData { } func TestMessagerHasher_againstRmnSharedVector(t *testing.T) { - transactor := testutils.MustNewSimTransactor(t) + transactor := evmtestutils.MustNewSimTransactor(t) backend := backends.NewSimulatedBackend(types.GenesisAlloc{ transactor.From: {Balance: assets.Ether(1000).ToInt()}, }, 30e6) diff --git a/core/capabilities/ccip/common/common_test.go b/core/capabilities/ccip/common/common_test.go index 9b974ec60e8..f1695d41871 100644 --- a/core/capabilities/ccip/common/common_test.go +++ b/core/capabilities/ccip/common/common_test.go @@ -9,9 +9,9 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/testutils" capcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" - "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) func Test_HashedCapabilityId(t *testing.T) { diff --git a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go index 637f51962fc..53042e475e4 100644 --- a/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go +++ b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go @@ -31,6 +31,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/gas" "github.com/smartcontractkit/chainlink-integrations/evm/keystore" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ocrimpls" @@ -203,7 +204,7 @@ func newTestUniverse(t *testing.T, ks *keyringsAndSigners[[]byte]) *testUniverse t.Helper() db := pgtest.NewSqlxDB(t) - owner := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) // create many transmitters but only need to fund one, rest are to get // setOCR3Config to pass. diff --git a/core/capabilities/integration_tests/framework/ethereum.go b/core/capabilities/integration_tests/framework/ethereum.go index 823dc752644..dbd5582fdc5 100644 --- a/core/capabilities/integration_tests/framework/ethereum.go +++ b/core/capabilities/integration_tests/framework/ethereum.go @@ -15,9 +15,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" - "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) type EthBlockchain struct { diff --git a/core/chains/evm/txmgr/attempts_test.go b/core/chains/evm/txmgr/attempts_test.go index 42e8356f9b0..9f83ac9e44b 100644 --- a/core/chains/evm/txmgr/attempts_test.go +++ b/core/chains/evm/txmgr/attempts_test.go @@ -22,13 +22,13 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/gas" gasmocks "github.com/smartcontractkit/chainlink-integrations/evm/gas/mocks" ksmocks "github.com/smartcontractkit/chainlink-integrations/evm/keystore/mocks" - testutils2 "github.com/smartcontractkit/chainlink-integrations/evm/testutils" + "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr" ) func NewEvmAddress() gethcommon.Address { - return testutils2.NewAddress() + return testutils.NewAddress() } type feeConfig struct { @@ -175,7 +175,7 @@ func TestTxm_NewDynamicFeeTx(t *testing.T) { for _, tt := range cases { test := tt t.Run(test.name, func(t *testing.T) { - cfg := testutils2.NewTestChainScopedConfig(t, test.setCfg) + cfg := testutils.NewTestChainScopedConfig(t, test.setCfg) cks := txmgr.NewEvmTxAttemptBuilder(*big.NewInt(1), cfg.EVM().GasEstimator(), kst, nil) dynamicFee := gas.DynamicFee{GasTipCap: test.tipcap, GasFeeCap: test.feecap} _, _, err := cks.NewCustomTxAttempt(tests.Context(t), txmgr.Tx{Sequence: &n, FromAddress: addr}, gas.EvmFee{ diff --git a/core/gethwrappers/ccip/deployment_test/deployment_test.go b/core/gethwrappers/ccip/deployment_test/deployment_test.go index 2e6116b2d73..2e09a03ed82 100644 --- a/core/gethwrappers/ccip/deployment_test/deployment_test.go +++ b/core/gethwrappers/ccip/deployment_test/deployment_test.go @@ -11,6 +11,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_2_0/router" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_5_0/token_admin_registry" @@ -18,8 +19,6 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/nonce_manager" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/offramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/v1_6_0/onramp" - - "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) // This tests ensures that all of the compiled contracts can be diff --git a/core/internal/features/features_test.go b/core/internal/features/features_test.go index 746c1ca5800..810f705bbfd 100644 --- a/core/internal/features/features_test.go +++ b/core/internal/features/features_test.go @@ -299,7 +299,7 @@ type OperatorContracts struct { } func setupOperatorContracts(t *testing.T) OperatorContracts { - user := testutils.MustNewSimTransactor(t) + user := evmtestutils.MustNewSimTransactor(t) genesisData := gethtypes.GenesisAlloc{ user.From: {Balance: assets.Ether(1000).ToInt()}, } @@ -649,7 +649,7 @@ observationSource = """ } func setupOCRContracts(t *testing.T) (*bind.TransactOpts, types.Backend, common.Address, *offchainaggregator.OffchainAggregator, *flags_wrapper.Flags, common.Address) { - owner := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) sb := new(big.Int) sb, _ = sb.SetString("100000000000000000000000", 10) // 1000 eth genesisData := gethtypes.GenesisAlloc{ diff --git a/core/internal/features/ocr2/features_ocr2_helper.go b/core/internal/features/ocr2/features_ocr2_helper.go index e723dfd9e8e..4343ed61ede 100644 --- a/core/internal/features/ocr2/features_ocr2_helper.go +++ b/core/internal/features/ocr2/features_ocr2_helper.go @@ -36,6 +36,7 @@ import ( commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/bridges" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" @@ -64,7 +65,7 @@ type Node struct { } func SetupOCR2Contracts(t *testing.T) (*bind.TransactOpts, *simulated.Backend, common.Address, *ocr2aggregator.OCR2Aggregator) { - owner := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) sb := new(big.Int) sb, _ = sb.SetString("100000000000000000000", 10) // 1 eth genesisData := types.GenesisAlloc{owner.From: {Balance: sb}} diff --git a/core/internal/testutils/testutils.go b/core/internal/testutils/testutils.go index f1d92e2a734..f8be9dd2376 100644 --- a/core/internal/testutils/testutils.go +++ b/core/internal/testutils/testutils.go @@ -17,7 +17,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" @@ -47,17 +46,6 @@ var FixtureChainID = big.NewInt(0) // SimulatedChainID is the chain ID for the go-ethereum simulated backend var SimulatedChainID = big.NewInt(1337) -// MustNewSimTransactor returns a transactor for interacting with the -// geth simulated backend. -// TODO use evm/testutils -func MustNewSimTransactor(t testing.TB) *bind.TransactOpts { - key, err := crypto.GenerateKey() - require.NoError(t, err) - transactor, err := bind.NewKeyedTransactorWithChainID(key, SimulatedChainID) - require.NoError(t, err) - return transactor -} - // NewAddress return a random new address func NewAddress() common.Address { return common.BytesToAddress(randomBytes(20)) diff --git a/core/services/fluxmonitorv2/integrations_test.go b/core/services/fluxmonitorv2/integrations_test.go index cc553172b88..3750b236e22 100644 --- a/core/services/fluxmonitorv2/integrations_test.go +++ b/core/services/fluxmonitorv2/integrations_test.go @@ -28,6 +28,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink-integrations/evm/types" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/bridges" @@ -114,9 +115,9 @@ func setupFluxAggregatorUniverse(t *testing.T, configOptions ...func(cfg *fluxAg var f fluxAggregatorUniverse f.evmChainID = *testutils.SimulatedChainID f.key = key - f.sergey = testutils.MustNewSimTransactor(t) - f.neil = testutils.MustNewSimTransactor(t) - f.ned = testutils.MustNewSimTransactor(t) + f.sergey = evmtestutils.MustNewSimTransactor(t) + f.neil = evmtestutils.MustNewSimTransactor(t) + f.ned = evmtestutils.MustNewSimTransactor(t) f.nallory = oracleTransactor genesisData := gethtypes.GenesisAlloc{ f.sergey.From: {Balance: assets.Ether(1000).ToInt()}, diff --git a/core/services/keeper/integration_test.go b/core/services/keeper/integration_test.go index cc04e9f9b8b..a5e64be0f8e 100644 --- a/core/services/keeper/integration_test.go +++ b/core/services/keeper/integration_test.go @@ -19,6 +19,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" @@ -177,11 +178,11 @@ func TestKeeperEthIntegration(t *testing.T) { nodeAddressEIP55 := evmtypes.EIP55AddressFromAddress(nodeAddress) // setup blockchain - sergey := testutils.MustNewSimTransactor(t) // owns all the link - steve := testutils.MustNewSimTransactor(t) // registry owner - carrol := testutils.MustNewSimTransactor(t) // client - nelly := testutils.MustNewSimTransactor(t) // other keeper operator 1 - nick := testutils.MustNewSimTransactor(t) // other keeper operator 2 + sergey := evmtestutils.MustNewSimTransactor(t) // owns all the link + steve := evmtestutils.MustNewSimTransactor(t) // registry owner + carrol := evmtestutils.MustNewSimTransactor(t) // client + nelly := evmtestutils.MustNewSimTransactor(t) // other keeper operator 1 + nick := evmtestutils.MustNewSimTransactor(t) // other keeper operator 2 genesisData := types.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, @@ -332,11 +333,11 @@ func TestKeeperForwarderEthIntegration(t *testing.T) { nodeAddressEIP55 := evmtypes.EIP55AddressFromAddress(nodeAddress) // setup blockchain - sergey := testutils.MustNewSimTransactor(t) // owns all the link - steve := testutils.MustNewSimTransactor(t) // registry owner - carrol := testutils.MustNewSimTransactor(t) // client - nelly := testutils.MustNewSimTransactor(t) // other keeper operator 1 - nick := testutils.MustNewSimTransactor(t) // other keeper operator 2 + sergey := evmtestutils.MustNewSimTransactor(t) // owns all the link + steve := evmtestutils.MustNewSimTransactor(t) // registry owner + carrol := evmtestutils.MustNewSimTransactor(t) // client + nelly := evmtestutils.MustNewSimTransactor(t) // other keeper operator 1 + nick := evmtestutils.MustNewSimTransactor(t) // other keeper operator 2 genesisData := types.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, @@ -493,11 +494,11 @@ func TestMaxPerformDataSize(t *testing.T) { nodeAddressEIP55 := evmtypes.EIP55AddressFromAddress(nodeAddress) // setup blockchain - sergey := testutils.MustNewSimTransactor(t) // owns all the link - steve := testutils.MustNewSimTransactor(t) // registry owner - carrol := testutils.MustNewSimTransactor(t) // client - nelly := testutils.MustNewSimTransactor(t) // other keeper operator 1 - nick := testutils.MustNewSimTransactor(t) // other keeper operator 2 + sergey := evmtestutils.MustNewSimTransactor(t) // owns all the link + steve := evmtestutils.MustNewSimTransactor(t) // registry owner + carrol := evmtestutils.MustNewSimTransactor(t) // client + nelly := evmtestutils.MustNewSimTransactor(t) // other keeper operator 1 + nick := evmtestutils.MustNewSimTransactor(t) // other keeper operator 2 genesisData := types.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go index 99b9222cd06..f0ae5c5c5df 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/price_registry_reader_test.go @@ -23,6 +23,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink-integrations/evm/utils" lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" @@ -57,7 +58,7 @@ func commitAndGetBlockTs(ec *client.SimulatedBackendClient) uint64 { } func newSim(t *testing.T) (*bind.TransactOpts, *client.SimulatedBackendClient) { - user := testutils.MustNewSimTransactor(t) + user := evmtestutils.MustNewSimTransactor(t) sim := simulated.NewBackend(map[common.Address]types.Account{ user.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/test_utils.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/test_utils.go index 39bdd2295ce..1efd43dd643 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdata/test_utils.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/test_utils.go @@ -10,12 +10,13 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/client" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) // NewSimulation returns a client and a simulated backend. func NewSimulation(t testing.TB) (*bind.TransactOpts, *client.SimulatedBackendClient) { - user := testutils.MustNewSimTransactor(t) + user := evmtestutils.MustNewSimTransactor(t) simulatedBackend := simulated.NewBackend(types.GenesisAlloc{ user.From: { Balance: big.NewInt(0).Mul(big.NewInt(3), big.NewInt(1e18)), diff --git a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go index 2ab152783c4..d00def5841f 100644 --- a/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go +++ b/core/services/ocr2/plugins/functions/integration_tests/v1/internal/testutils.go @@ -31,6 +31,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/client" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/bridges" @@ -167,7 +168,7 @@ type Coordinator struct { } func StartNewChainWithContracts(t *testing.T, nClients int) (*bind.TransactOpts, evmtypes.Backend, func() common.Hash, func(), Coordinator, Coordinator, []deployedClientContract, common.Address, *functions_router.FunctionsRouter, *link_token_interface.LinkToken, common.Address, *functions_allow_list.TermsOfServiceAllowList) { - owner := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) owner.GasPrice = big.NewInt(int64(DefaultGasPrice)) sb := new(big.Int) sb, _ = sb.SetString("100000000000000000000", 10) // 1 eth diff --git a/core/services/ocr2/plugins/llo/integration_test.go b/core/services/ocr2/plugins/llo/integration_test.go index 437c1a49343..634ab0be170 100644 --- a/core/services/ocr2/plugins/llo/integration_test.go +++ b/core/services/ocr2/plugins/llo/integration_test.go @@ -38,6 +38,7 @@ import ( datastreamsllo "github.com/smartcontractkit/chainlink-data-streams/llo" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" @@ -85,7 +86,7 @@ func setupBlockchain(t *testing.T) ( *verifier_proxy.VerifierProxy, common.Address, ) { - steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner + steve := evmtestutils.MustNewSimTransactor(t) // config contract deployer and owner genesisData := gethtypes.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, ethconfig.Defaults.Miner.GasCeil) backend.Commit() diff --git a/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go b/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go index 7da0c42f280..9e325701fe5 100644 --- a/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go +++ b/core/services/ocr2/plugins/llo/onchain_channel_definition_cache_integration_test.go @@ -27,6 +27,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/llo-feeds/generated/channel_config_store" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" @@ -132,7 +133,7 @@ func Test_ChannelDefinitionCache_Integration(t *testing.T) { const ETHMainnetChainSelector uint64 = 5009297550715157269 orm := llo.NewChainScopedORM(db, ETHMainnetChainSelector) - steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner + steve := evmtestutils.MustNewSimTransactor(t) // config contract deployer and owner genesisData := types.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, ethconfig.Defaults.Miner.GasCeil) backend.Commit() // ensure starting block number at least 1 diff --git a/core/services/ocr2/plugins/mercury/integration_test.go b/core/services/ocr2/plugins/mercury/integration_test.go index c33ef18b44f..f856d88a25d 100644 --- a/core/services/ocr2/plugins/mercury/integration_test.go +++ b/core/services/ocr2/plugins/mercury/integration_test.go @@ -40,6 +40,7 @@ import ( datastreamsmercury "github.com/smartcontractkit/chainlink-data-streams/mercury" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink/v2/core/bridges" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" @@ -91,7 +92,7 @@ func detectPanicLogs(t *testing.T, logObservers []*observer.ObservedLogs) { } func setupBlockchain(t *testing.T) (*bind.TransactOpts, evmtypes.Backend, *verifier.Verifier, common.Address, func() common.Hash) { - steve := testutils.MustNewSimTransactor(t) // config contract deployer and owner + steve := evmtestutils.MustNewSimTransactor(t) // config contract deployer and owner genesisData := types.GenesisAlloc{steve.From: {Balance: assets.Ether(1000).ToInt()}} backend := cltest.NewSimulatedBackend(t, genesisData, ethconfig.Defaults.Miner.GasCeil) backend.Commit() // ensure starting block number at least 1 diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go index 5d7a94cb011..08a5ae0a237 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/integration_test.go @@ -21,6 +21,7 @@ import ( evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/log_upkeep_counter_wrapper" @@ -479,9 +480,9 @@ func setup(lggr logger.Logger, poller logpoller.LogPoller, c evmclient.Client, s } func setupBackend(t *testing.T) (backend evmtypes.Backend, stop func(), opts []*bind.TransactOpts) { - sergey := testutils.MustNewSimTransactor(t) // owns all the link - steve := testutils.MustNewSimTransactor(t) // registry owner - carrol := testutils.MustNewSimTransactor(t) // upkeep owner + sergey := evmtestutils.MustNewSimTransactor(t) // owns all the link + steve := evmtestutils.MustNewSimTransactor(t) // registry owner + carrol := evmtestutils.MustNewSimTransactor(t) // upkeep owner genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000000000000000000).ToInt()}, steve.From: {Balance: assets.Ether(1000000000000000000).ToInt()}, diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go index cb7fd7f91a4..2ec6bebc1eb 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_21_test.go @@ -35,6 +35,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" automationForwarderLogic "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/automation_forwarder_logic" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/basic_upkeep_contract" @@ -89,9 +90,9 @@ func TestIntegration_KeeperPluginConditionalUpkeep(t *testing.T) { lggr := logger.TestLogger(t) // setup blockchain - sergey := testutils.MustNewSimTransactor(t) // owns all the link - steve := testutils.MustNewSimTransactor(t) // registry owner - carrol := testutils.MustNewSimTransactor(t) // upkeep owner + sergey := evmtestutils.MustNewSimTransactor(t) // owns all the link + steve := evmtestutils.MustNewSimTransactor(t) // registry owner + carrol := evmtestutils.MustNewSimTransactor(t) // upkeep owner genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(10000).ToInt()}, steve.From: {Balance: assets.Ether(10000).ToInt()}, @@ -185,9 +186,9 @@ func TestIntegration_KeeperPluginLogUpkeep(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain - sergey := testutils.MustNewSimTransactor(t) // owns all the link - steve := testutils.MustNewSimTransactor(t) // registry owner - carrol := testutils.MustNewSimTransactor(t) // upkeep owner + sergey := evmtestutils.MustNewSimTransactor(t) // owns all the link + steve := evmtestutils.MustNewSimTransactor(t) // registry owner + carrol := evmtestutils.MustNewSimTransactor(t) // upkeep owner genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(10000).ToInt()}, steve.From: {Balance: assets.Ether(10000).ToInt()}, @@ -278,9 +279,9 @@ func TestIntegration_KeeperPluginLogUpkeep_Retry(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain - linkOwner := testutils.MustNewSimTransactor(t) // owns all the link - registryOwner := testutils.MustNewSimTransactor(t) // registry owner - upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner + linkOwner := evmtestutils.MustNewSimTransactor(t) // owns all the link + registryOwner := evmtestutils.MustNewSimTransactor(t) // registry owner + upkeepOwner := evmtestutils.MustNewSimTransactor(t) // upkeep owner genesisData := gethtypes.GenesisAlloc{ linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, @@ -398,9 +399,9 @@ func TestIntegration_KeeperPluginLogUpkeep_ErrHandler(t *testing.T) { g := gomega.NewWithT(t) // setup blockchain - linkOwner := testutils.MustNewSimTransactor(t) // owns all the link - registryOwner := testutils.MustNewSimTransactor(t) // registry owner - upkeepOwner := testutils.MustNewSimTransactor(t) // upkeep owner + linkOwner := evmtestutils.MustNewSimTransactor(t) // owns all the link + registryOwner := evmtestutils.MustNewSimTransactor(t) // registry owner + upkeepOwner := evmtestutils.MustNewSimTransactor(t) // upkeep owner genesisData := gethtypes.GenesisAlloc{ linkOwner.From: {Balance: assets.Ether(10000).ToInt()}, registryOwner.From: {Balance: assets.Ether(10000).ToInt()}, diff --git a/core/services/ocr2/plugins/ocr2keeper/integration_test.go b/core/services/ocr2/plugins/ocr2keeper/integration_test.go index 2164c561627..33ff2557282 100644 --- a/core/services/ocr2/plugins/ocr2keeper/integration_test.go +++ b/core/services/ocr2/plugins/ocr2keeper/integration_test.go @@ -33,6 +33,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders" @@ -210,9 +211,9 @@ func runKeeperPluginBasic(t *testing.T) { lggr := logger.TestLogger(t) // setup blockchain - sergey := testutils.MustNewSimTransactor(t) // owns all the link - steve := testutils.MustNewSimTransactor(t) // registry owner - carrol := testutils.MustNewSimTransactor(t) // upkeep owner + sergey := evmtestutils.MustNewSimTransactor(t) // owns all the link + steve := evmtestutils.MustNewSimTransactor(t) // registry owner + carrol := evmtestutils.MustNewSimTransactor(t) // upkeep owner genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, @@ -464,9 +465,9 @@ func TestIntegration_KeeperPluginForwarderEnabled(t *testing.T) { lggr := logger.TestLogger(t) // setup blockchain - sergey := testutils.MustNewSimTransactor(t) // owns all the link - steve := testutils.MustNewSimTransactor(t) // registry owner - carrol := testutils.MustNewSimTransactor(t) // upkeep owner + sergey := evmtestutils.MustNewSimTransactor(t) // owns all the link + steve := evmtestutils.MustNewSimTransactor(t) // registry owner + carrol := evmtestutils.MustNewSimTransactor(t) // upkeep owner genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, steve.From: {Balance: assets.Ether(1000).ToInt()}, diff --git a/core/services/registrysyncer/syncer_test.go b/core/services/registrysyncer/syncer_test.go index 87b7dcbdd63..c156800a692 100644 --- a/core/services/registrysyncer/syncer_test.go +++ b/core/services/registrysyncer/syncer_test.go @@ -30,6 +30,7 @@ import ( evmclient "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry_1_1_0" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest" @@ -48,7 +49,7 @@ var writeChainCapability = kcr.CapabilitiesRegistryCapability{ } func startNewChainWithRegistry(t *testing.T) (*kcr.CapabilitiesRegistry, common.Address, *bind.TransactOpts, *simulated.Backend) { - owner := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) i := &big.Int{} oneEth, _ := i.SetString("100000000000000000000", 10) diff --git a/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go b/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go index e3b96c4ae1f..eb88901b04b 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_solidity_crosscheck_test.go @@ -17,9 +17,9 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_verifier_wrapper" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" - "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/vrfkey" "github.com/smartcontractkit/chainlink/v2/core/services/signatures/secp256k1" proof2 "github.com/smartcontractkit/chainlink/v2/core/services/vrf/proof" diff --git a/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go b/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go index 22b776437a7..47935bbb60c 100644 --- a/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go +++ b/core/services/vrf/solidity_cross_tests/vrf_v08_solidity_crosscheck_test.go @@ -8,7 +8,6 @@ import ( gethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/solidity_vrf_v08_verifier_wrapper" - "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" proof2 "github.com/smartcontractkit/chainlink/v2/core/services/vrf/proof" "github.com/ethereum/go-ethereum/eth/ethconfig" @@ -19,6 +18,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink/v2/core/internal/cltest" "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/vrfkey" "github.com/smartcontractkit/chainlink/v2/core/services/signatures/secp256k1" diff --git a/core/services/vrf/v2/integration_v2_plus_test.go b/core/services/vrf/v2/integration_v2_plus_test.go index b6d84d87f0c..b611c767c31 100644 --- a/core/services/vrf/v2/integration_v2_plus_test.go +++ b/core/services/vrf/v2/integration_v2_plus_test.go @@ -21,6 +21,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/assets" "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink-integrations/evm/utils" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/batch_blockhash_store" @@ -71,19 +72,19 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer oracleTransactor, err := bind.NewKeyedTransactorWithChainID(key.ToEcdsaPrivKey(), testutils.SimulatedChainID) require.NoError(t, err) var ( - sergey = testutils.MustNewSimTransactor(t) - neil = testutils.MustNewSimTransactor(t) - ned = testutils.MustNewSimTransactor(t) - evil = testutils.MustNewSimTransactor(t) - reverter = testutils.MustNewSimTransactor(t) - submanager = testutils.MustNewSimTransactor(t) + sergey = evmtestutils.MustNewSimTransactor(t) + neil = evmtestutils.MustNewSimTransactor(t) + ned = evmtestutils.MustNewSimTransactor(t) + evil = evmtestutils.MustNewSimTransactor(t) + reverter = evmtestutils.MustNewSimTransactor(t) + submanager = evmtestutils.MustNewSimTransactor(t) nallory = oracleTransactor vrfConsumers []*bind.TransactOpts ) // Create consumer contract deployer identities for i := 0; i < numConsumers; i++ { - vrfConsumers = append(vrfConsumers, testutils.MustNewSimTransactor(t)) + vrfConsumers = append(vrfConsumers, evmtestutils.MustNewSimTransactor(t)) } genesisData := gethtypes.GenesisAlloc{ @@ -717,8 +718,8 @@ func TestVRFV2PlusIntegration_ConsumerProxy_CoordinatorZeroAddress(t *testing.T) } func TestVRFV2PlusIntegration_ExternalOwnerConsumerExample(t *testing.T) { - owner := testutils.MustNewSimTransactor(t) - random := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) + random := evmtestutils.MustNewSimTransactor(t) genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: assets.Ether(10).ToInt()}, random.From: {Balance: assets.Ether(10).ToInt()}, @@ -799,8 +800,8 @@ func TestVRFV2PlusIntegration_ExternalOwnerConsumerExample(t *testing.T) { } func TestVRFV2PlusIntegration_SimpleConsumerExample(t *testing.T) { - owner := testutils.MustNewSimTransactor(t) - random := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) + random := evmtestutils.MustNewSimTransactor(t) genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: assets.Ether(10).ToInt()}, } diff --git a/core/services/vrf/v2/integration_v2_test.go b/core/services/vrf/v2/integration_v2_test.go index 936e937f690..b6e0646ccb0 100644 --- a/core/services/vrf/v2/integration_v2_test.go +++ b/core/services/vrf/v2/integration_v2_test.go @@ -38,6 +38,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client/clienttest" "github.com/smartcontractkit/chainlink-integrations/evm/config/toml" "github.com/smartcontractkit/chainlink-integrations/evm/gas" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" "github.com/smartcontractkit/chainlink-integrations/evm/types" evmutils "github.com/smartcontractkit/chainlink-integrations/evm/utils" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" @@ -150,18 +151,18 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in oracleTransactor, err := bind.NewKeyedTransactorWithChainID(key.ToEcdsaPrivKey(), testutils.SimulatedChainID) require.NoError(t, err) var ( - sergey = testutils.MustNewSimTransactor(t) - neil = testutils.MustNewSimTransactor(t) - ned = testutils.MustNewSimTransactor(t) - evil = testutils.MustNewSimTransactor(t) - reverter = testutils.MustNewSimTransactor(t) + sergey = evmtestutils.MustNewSimTransactor(t) + neil = evmtestutils.MustNewSimTransactor(t) + ned = evmtestutils.MustNewSimTransactor(t) + evil = evmtestutils.MustNewSimTransactor(t) + reverter = evmtestutils.MustNewSimTransactor(t) nallory = oracleTransactor vrfConsumers []*bind.TransactOpts ) // Create consumer contract deployer identities for i := 0; i < numConsumers; i++ { - vrfConsumers = append(vrfConsumers, testutils.MustNewSimTransactor(t)) + vrfConsumers = append(vrfConsumers, evmtestutils.MustNewSimTransactor(t)) } genesisData := gethtypes.GenesisAlloc{ @@ -1566,8 +1567,8 @@ func registerProvingKeyHelper(t *testing.T, uni coordinatorV2UniverseCommon, coo } func TestExternalOwnerConsumerExample(t *testing.T) { - owner := testutils.MustNewSimTransactor(t) - random := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) + random := evmtestutils.MustNewSimTransactor(t) genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: assets.Ether(10).ToInt()}, random.From: {Balance: assets.Ether(10).ToInt()}, @@ -1630,8 +1631,8 @@ func TestExternalOwnerConsumerExample(t *testing.T) { } func TestSimpleConsumerExample(t *testing.T) { - owner := testutils.MustNewSimTransactor(t) - random := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) + random := evmtestutils.MustNewSimTransactor(t) genesisData := gethtypes.GenesisAlloc{ owner.From: {Balance: assets.Ether(10).ToInt()}, } diff --git a/core/services/vrf/v2/listener_v2_log_listener_test.go b/core/services/vrf/v2/listener_v2_log_listener_test.go index 42e6e5ede15..8f0248d2dab 100644 --- a/core/services/vrf/v2/listener_v2_log_listener_test.go +++ b/core/services/vrf/v2/listener_v2_log_listener_test.go @@ -24,6 +24,7 @@ import ( "github.com/smartcontractkit/chainlink-integrations/evm/client" "github.com/smartcontractkit/chainlink-integrations/evm/heads/headstest" "github.com/smartcontractkit/chainlink-integrations/evm/logpoller" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" ubig "github.com/smartcontractkit/chainlink-integrations/evm/utils/big" @@ -77,7 +78,7 @@ func setupVRFLogPollerListenerTH(t *testing.T) *vrfLogPollerListenerTH { db := pgtest.NewSqlxDB(t) o := logpoller.NewORM(chainID, db, lggr) - owner := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) backend := simulated.NewBackend(ethtypes.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), @@ -804,7 +805,7 @@ func SetupGetUnfulfilledTH(t *testing.T) (*listenerV2, *ubig.Big) { chain := evmmocks.NewChain(t) // Construct CoordinatorV2_X object for VRF listener - owner := testutils.MustNewSimTransactor(t) + owner := evmtestutils.MustNewSimTransactor(t) b := simulated.NewBackend(ethtypes.GenesisAlloc{ owner.From: { Balance: big.NewInt(0).Mul(big.NewInt(10), big.NewInt(1e18)), diff --git a/core/services/vrf/vrftesthelpers/helpers.go b/core/services/vrf/vrftesthelpers/helpers.go index cd5cbf7d367..29198fc1913 100644 --- a/core/services/vrf/vrftesthelpers/helpers.go +++ b/core/services/vrf/vrftesthelpers/helpers.go @@ -16,6 +16,7 @@ import ( "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-integrations/evm/assets" + evmtestutils "github.com/smartcontractkit/chainlink-integrations/evm/testutils" evmtypes "github.com/smartcontractkit/chainlink-integrations/evm/types" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/blockhash_store" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/link_token_interface" @@ -189,10 +190,10 @@ func NewVRFCoordinatorUniverse(t *testing.T, keys ...ethkey.KeyV2) CoordinatorUn } var ( - sergey = testutils.MustNewSimTransactor(t) - neil = testutils.MustNewSimTransactor(t) - ned = testutils.MustNewSimTransactor(t) - carol = testutils.MustNewSimTransactor(t) + sergey = evmtestutils.MustNewSimTransactor(t) + neil = evmtestutils.MustNewSimTransactor(t) + ned = evmtestutils.MustNewSimTransactor(t) + carol = evmtestutils.MustNewSimTransactor(t) ) genesisData := gethtypes.GenesisAlloc{ sergey.From: {Balance: assets.Ether(1000).ToInt()}, From a8398497ad12baa1639fc0c9fcecb4a67469533f Mon Sep 17 00:00:00 2001 From: msuchacz-cll <170782674+msuchacz-cll@users.noreply.github.com> Date: Fri, 14 Feb 2025 18:47:14 +0100 Subject: [PATCH 76/83] chore: remove for in the reaper loop (#16413) --- core/services/llo/cleanup.go | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/core/services/llo/cleanup.go b/core/services/llo/cleanup.go index be1330297d5..dab00965809 100644 --- a/core/services/llo/cleanup.go +++ b/core/services/llo/cleanup.go @@ -94,22 +94,20 @@ func (t *transmissionReaper) runLoop(ctx context.Context) { cancel() return case <-ticker.C: - for { - // TODO: Could also automatically reap orphaned transmissions - // that don't have a job with a matching DON ID (from job - // deletion) - // - // https://smartcontract-it.atlassian.net/browse/MERC-6807 - // TODO: Should also reap other LLO garbage that can be left - // behind e.g. channel definitions etc - n, err := t.reapStale(ctx, TransmissionReaperBatchSize) - if err != nil { - t.lggr.Errorw("Failed to reap", "err", err) - continue - } - if n > 0 { - t.lggr.Infow("Reaped stale transmissions", "nDeleted", n) - } + // TODO: Could also automatically reap orphaned transmissions + // that don't have a job with a matching DON ID (from job + // deletion) + // + // https://smartcontract-it.atlassian.net/browse/MERC-6807 + // TODO: Should also reap other LLO garbage that can be left + // behind e.g. channel definitions etc + n, err := t.reapStale(ctx, TransmissionReaperBatchSize) + if err != nil { + t.lggr.Errorw("Failed to reap", "err", err) + continue + } + if n > 0 { + t.lggr.Infow("Reaped stale transmissions", "nDeleted", n) } } } From 09fa7183c7cd31e8624627dc8ec664ba995f2212 Mon Sep 17 00:00:00 2001 From: gustavogama-cll <165679773+gustavogama-cll@users.noreply.github.com> Date: Fri, 14 Feb 2025 14:56:24 -0300 Subject: [PATCH 77/83] chore(deployment): add test helpers for changesets using the new mcms lib (#16403) --- .../common/proposalutils/mcms_helpers.go | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/deployment/common/proposalutils/mcms_helpers.go b/deployment/common/proposalutils/mcms_helpers.go index be437479d5e..ad6b3d227ba 100644 --- a/deployment/common/proposalutils/mcms_helpers.go +++ b/deployment/common/proposalutils/mcms_helpers.go @@ -5,11 +5,18 @@ import ( "encoding/json" "errors" "fmt" + "math/big" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/gagliardetto/solana-go" owner_helpers "github.com/smartcontractkit/ccip-owner-contracts/pkg/gethwrappers" "github.com/smartcontractkit/ccip-owner-contracts/pkg/proposal/mcms" + chain_selectors "github.com/smartcontractkit/chain-selectors" + mcmssdk "github.com/smartcontractkit/mcms/sdk" + mcmsevmsdk "github.com/smartcontractkit/mcms/sdk/evm" + mcmssolanasdk "github.com/smartcontractkit/mcms/sdk/solana" + mcmstypes "github.com/smartcontractkit/mcms/types" "github.com/smartcontractkit/chainlink-common/pkg/logger" "github.com/smartcontractkit/chainlink/deployment" @@ -272,3 +279,122 @@ func MaybeLoadMCMSWithTimelockContracts(chain deployment.Chain, addresses map[st } return &state, nil } + +func McmsTimelockConverterForChain(env deployment.Environment, chain uint64) (mcmssdk.TimelockConverter, error) { + chainFamily, err := mcmstypes.GetChainSelectorFamily(mcmstypes.ChainSelector(chain)) + if err != nil { + return nil, fmt.Errorf("failed to get chain family for chain %d: %w", chain, err) + } + + switch chainFamily { + case chain_selectors.FamilyEVM: + return &mcmsevmsdk.TimelockConverter{}, nil + case chain_selectors.FamilySolana: + return mcmssolanasdk.NewTimelockConverter(env.SolChains[chain].Client), nil + default: + return nil, fmt.Errorf("unsupported chain family %s", chainFamily) + } +} + +func McmsTimelockConverters(env deployment.Environment) (map[uint64]mcmssdk.TimelockConverter, error) { + converters := make(map[uint64]mcmssdk.TimelockConverter, len(env.Chains)+len(env.SolChains)) + + for _, chain := range env.Chains { + var err error + converters[chain.Selector], err = McmsTimelockConverterForChain(env, chain.Selector) + if err != nil { + return nil, fmt.Errorf("failed to get mcms inspector for chain %s: %w", chain.String(), err) + } + } + + for _, chain := range env.SolChains { + var err error + converters[chain.Selector], err = McmsTimelockConverterForChain(env, chain.Selector) + if err != nil { + return nil, fmt.Errorf("failed to get mcms inspector for chain %s: %w", chain.String(), err) + } + } + + return converters, nil +} + +func McmsInspectorForChain(env deployment.Environment, chain uint64) (mcmssdk.Inspector, error) { + chainFamily, err := mcmstypes.GetChainSelectorFamily(mcmstypes.ChainSelector(chain)) + if err != nil { + return nil, fmt.Errorf("failed to get chain family for chain %d: %w", chain, err) + } + + switch chainFamily { + case chain_selectors.FamilyEVM: + return mcmsevmsdk.NewInspector(env.Chains[chain].Client), nil + case chain_selectors.FamilySolana: + return mcmssolanasdk.NewInspector(env.SolChains[chain].Client), nil + default: + return nil, fmt.Errorf("unsupported chain family %s", chainFamily) + } +} + +func McmsInspectors(env deployment.Environment) (map[uint64]mcmssdk.Inspector, error) { + inspectors := make(map[uint64]mcmssdk.Inspector, len(env.Chains)+len(env.SolChains)) + + for _, chain := range env.Chains { + var err error + inspectors[chain.Selector], err = McmsInspectorForChain(env, chain.Selector) + if err != nil { + return nil, fmt.Errorf("failed to get mcms inspector for chain %s: %w", chain.String(), err) + } + } + + for _, chain := range env.SolChains { + var err error + inspectors[chain.Selector], err = McmsInspectorForChain(env, chain.Selector) + if err != nil { + return nil, fmt.Errorf("failed to get mcms inspector for chain %s: %w", chain.String(), err) + } + } + + return inspectors, nil +} + +func TransactionForChain( + chain uint64, toAddress string, data []byte, value *big.Int, contractType string, tags []string, +) (mcmstypes.Transaction, error) { + chainFamily, err := mcmstypes.GetChainSelectorFamily(mcmstypes.ChainSelector(chain)) + if err != nil { + return mcmstypes.Transaction{}, fmt.Errorf("failed to get chain family for chain %d: %w", chain, err) + } + + var tx mcmstypes.Transaction + + switch chainFamily { + case chain_selectors.FamilyEVM: + tx = mcmsevmsdk.NewTransaction(common.HexToAddress(toAddress), data, value, contractType, tags) + + case chain_selectors.FamilySolana: + accounts := []*solana.AccountMeta{} // FIXME: how to pass accounts to support solana? + var err error + tx, err = mcmssolanasdk.NewTransaction(toAddress, data, value, accounts, contractType, tags) + if err != nil { + return mcmstypes.Transaction{}, fmt.Errorf("failed to create solana transaction: %w", err) + } + + default: + return mcmstypes.Transaction{}, fmt.Errorf("unsupported chain family %s", chainFamily) + } + + return tx, nil +} + +func BatchOperationForChain( + chain uint64, toAddress string, data []byte, value *big.Int, contractType string, tags []string, +) (mcmstypes.BatchOperation, error) { + tx, err := TransactionForChain(chain, toAddress, data, value, contractType, tags) + if err != nil { + return mcmstypes.BatchOperation{}, fmt.Errorf("failed to create transaction for chain: %w", err) + } + + return mcmstypes.BatchOperation{ + ChainSelector: mcmstypes.ChainSelector(chain), + Transactions: []mcmstypes.Transaction{tx}, + }, nil +} From c38d0b0a95610b9527d2f108f56da9f6ab4f02da Mon Sep 17 00:00:00 2001 From: Erik Burton Date: Fri, 14 Feb 2025 10:16:55 -0800 Subject: [PATCH 78/83] chore: pin actions/* to major versions (#16220) * chore: pin actions/checkout to v4 * chore: pin actions/setup-node to v4 * chore: pin actions/upload-artifact to v4 * chore: pin actions/setup-go to v5 * chore: pin actions/cache to v4 * chore: pin actions/download-artifact to v4 * chore: pin actions/stale to v9 * chore: pin actions/setup-python to v5 --- .github/actions/delete-deployments/action.yml | 2 +- .github/actions/golangci-lint/action.yml | 8 +-- .../goreleaser-build-sign-publish/README.md | 2 +- .github/actions/setup-go/action.yml | 2 +- .github/actions/setup-nodejs/action.yaml | 2 +- .../setup-solana/build-contracts/action.yml | 5 +- .github/workflows/bash-scripts.yml | 4 +- .../workflows/build-publish-develop-pr.yml | 8 +-- .../workflows/build-publish-goreleaser.yml | 6 +- .github/workflows/build-publish.yml | 8 +-- .github/workflows/chain-selectors-check.yml | 2 +- .github/workflows/changeset.yml | 10 +-- .github/workflows/changesets-preview-pr.yml | 4 +- .github/workflows/ci-core-partial.yml | 12 ++-- .github/workflows/ci-core.yml | 18 ++--- .github/workflows/ci-flakeguard.yml | 4 +- .github/workflows/ci-protobuf.yml | 2 +- .../workflows/client-compatibility-tests.yml | 8 +-- .github/workflows/codeql-analysis.yml | 4 +- .github/workflows/crib-integration-test.yml | 2 +- .github/workflows/delete-caches.yml | 10 +-- .github/workflows/delete-deployments.yml | 2 +- .github/workflows/dependency-check.yml | 4 +- .github/workflows/flakeguard.yml | 72 +++++++++---------- .github/workflows/go-mod-cache.yml | 4 +- .../workflows/integration-in-memory-tests.yml | 4 +- .../workflows/integration-tests-publish.yml | 4 +- .github/workflows/integration-tests.yml | 28 ++++---- .github/workflows/lint-gh-workflows.yml | 2 +- .github/workflows/operator-ui-ci.yml | 2 +- .../workflows/solidity-foundry-artifacts.yml | 4 +- .github/workflows/solidity-foundry.yml | 34 ++++----- .github/workflows/solidity-hardhat.yml | 4 +- .github/workflows/solidity-traceability.yml | 12 ++-- .github/workflows/solidity-wrappers.yml | 4 +- .github/workflows/solidity.yml | 20 +++--- .github/workflows/stale.yml | 2 +- ...evelop-from-smartcontractkit-chainlink.yml | 2 +- 38 files changed, 163 insertions(+), 164 deletions(-) diff --git a/.github/actions/delete-deployments/action.yml b/.github/actions/delete-deployments/action.yml index 00b092bc80f..28835f4cf43 100644 --- a/.github/actions/delete-deployments/action.yml +++ b/.github/actions/delete-deployments/action.yml @@ -33,7 +33,7 @@ runs: with: version: ^9.0.0 - - uses: actions/setup-node@v4.0.4 + - uses: actions/setup-node@v4 with: node-version: "20" cache: "pnpm" diff --git a/.github/actions/golangci-lint/action.yml b/.github/actions/golangci-lint/action.yml index c82fa998fa2..18c2e129ac5 100644 --- a/.github/actions/golangci-lint/action.yml +++ b/.github/actions/golangci-lint/action.yml @@ -27,7 +27,7 @@ runs: using: composite steps: - name: Checkout repo (full) - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 # Only do a full checkout on merge_groups if: github.event_name == 'merge_group' with: @@ -35,7 +35,7 @@ runs: fetch-depth: 0 - name: Checkout repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 if: github.event_name != 'merge_group' with: persist-credentials: false @@ -89,7 +89,7 @@ runs: run: | go_directory=${{ steps.set-working-directory.outputs.golangci-lint-working-directory }} echo "Validating if directory name '$go_directory' is empty or has slashes" - + if [[ $go_directory == *\/* ]]; then suffix=$(echo "$go_directory" | sed 's:\/$::' | tr '/' '-') echo "Directory name with slashes '$go_directory' updated to a valid artifact suffix '$suffix'" @@ -106,7 +106,7 @@ runs: - name: Store Golangci-lint report artifact if: always() id: upload-artifact - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 with: # Use a unique suffix for each lint report artifact to avoid duplication errors name: golangci-lint-report-${{ steps.suffix.outputs.suffix }} diff --git a/.github/actions/goreleaser-build-sign-publish/README.md b/.github/actions/goreleaser-build-sign-publish/README.md index 9b520c1741a..8266478a672 100644 --- a/.github/actions/goreleaser-build-sign-publish/README.md +++ b/.github/actions/goreleaser-build-sign-publish/README.md @@ -23,7 +23,7 @@ jobs: contents: read steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Configure aws credentials diff --git a/.github/actions/setup-go/action.yml b/.github/actions/setup-go/action.yml index d2b5a64af82..b1fd20ad50a 100644 --- a/.github/actions/setup-go/action.yml +++ b/.github/actions/setup-go/action.yml @@ -42,7 +42,7 @@ runs: echo "version=$version" >> "$GITHUB_OUTPUT" - name: Set up Go - uses: actions/setup-go@v5.0.2 + uses: actions/setup-go@v5 with: go-version: ${{ steps.go-version.outputs.version }} cache: false diff --git a/.github/actions/setup-nodejs/action.yaml b/.github/actions/setup-nodejs/action.yaml index f9b89392620..bd96c4ef5e8 100644 --- a/.github/actions/setup-nodejs/action.yaml +++ b/.github/actions/setup-nodejs/action.yaml @@ -15,7 +15,7 @@ runs: with: version: ^9.0.0 - - uses: actions/setup-node@v4.0.4 + - uses: actions/setup-node@v4 with: node-version: "20" cache: "pnpm" diff --git a/.github/actions/setup-solana/build-contracts/action.yml b/.github/actions/setup-solana/build-contracts/action.yml index 84c3fef0b5f..21252a7af26 100644 --- a/.github/actions/setup-solana/build-contracts/action.yml +++ b/.github/actions/setup-solana/build-contracts/action.yml @@ -10,7 +10,7 @@ runs: using: composite steps: - name: Checkout chainlink-ccip - uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b # v4.1.5 + uses: actions/checkout@v4 with: repository: smartcontractkit/chainlink-ccip path: chainlink-ccip @@ -41,7 +41,7 @@ runs: ARTIFACT_NAME=$(echo "$artifact" | jq -r '.name') ARTIFACT_EXPIRED=$(echo "$artifact" | jq -r '.expired') ARTIFACT_DOWNLOAD_URL=$(echo "$artifact" | jq -r '.archive_download_url') - + if [[ "$ARTIFACT_NAME" == "${{ env.ARTIFACT_NAME }}" && "$ARTIFACT_EXPIRED" == false ]]; then # First non-expired artifact found, set variables and break loop echo "Artifact found" @@ -81,4 +81,3 @@ runs: with: name: ${{ env.ARTIFACT_NAME }} path: chainlink-ccip/chains/solana/contracts/target/deploy/*.so - \ No newline at end of file diff --git a/.github/workflows/bash-scripts.yml b/.github/workflows/bash-scripts.yml index d5de0d42bb9..c67a9080429 100644 --- a/.github/workflows/bash-scripts.yml +++ b/.github/workflows/bash-scripts.yml @@ -11,7 +11,7 @@ jobs: bash-scripts-src: ${{ steps.bash-scripts.outputs.src }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 @@ -27,7 +27,7 @@ jobs: needs: [changes] steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Run ShellCheck diff --git a/.github/workflows/build-publish-develop-pr.yml b/.github/workflows/build-publish-develop-pr.yml index 58f5ee560a7..f870d12d900 100644 --- a/.github/workflows/build-publish-develop-pr.yml +++ b/.github/workflows/build-publish-develop-pr.yml @@ -36,7 +36,7 @@ jobs: release-type: ${{ steps.get-image-tag.outputs.release-type }} steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ env.CHECKOUT_REF }} @@ -90,7 +90,7 @@ jobs: dist_name: linux_arm64 steps: - name: Checkout chainlink repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ env.CHECKOUT_REF }} @@ -105,7 +105,7 @@ jobs: aws-region: ${{ secrets.AWS_REGION }} - name: Checkout capabilities repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: repository: smartcontractkit/capabilities token: ${{ steps.token.outputs.access-token }} @@ -144,7 +144,7 @@ jobs: contents: read steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ env.CHECKOUT_REF }} diff --git a/.github/workflows/build-publish-goreleaser.yml b/.github/workflows/build-publish-goreleaser.yml index 9f8f774acc0..5ecdbf70511 100644 --- a/.github/workflows/build-publish-goreleaser.yml +++ b/.github/workflows/build-publish-goreleaser.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Check for VERSION file bump on tags @@ -38,7 +38,7 @@ jobs: attestations: write steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 @@ -97,7 +97,7 @@ jobs: contents: write steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 diff --git a/.github/workflows/build-publish.yml b/.github/workflows/build-publish.yml index 0c26836cd4e..5f9a94575db 100644 --- a/.github/workflows/build-publish.yml +++ b/.github/workflows/build-publish.yml @@ -19,7 +19,7 @@ jobs: is-pre-release: ${{ steps.release-tag-check.outputs.is-pre-release }} steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Check git tag type @@ -68,7 +68,7 @@ jobs: docker-image-digest: ${{ steps.build-sign-publish.outputs.docker-image-digest }} steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -103,7 +103,7 @@ jobs: environment: build-publish steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Notify Slack @@ -149,7 +149,7 @@ jobs: actions: read steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/chain-selectors-check.yml b/.github/workflows/chain-selectors-check.yml index 1c59bff9f67..7b8c144e14f 100644 --- a/.github/workflows/chain-selectors-check.yml +++ b/.github/workflows/chain-selectors-check.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/changeset.yml b/.github/workflows/changeset.yml index cb11e21fb7a..a6bd6b4e0f4 100644 --- a/.github/workflows/changeset.yml +++ b/.github/workflows/changeset.yml @@ -13,7 +13,7 @@ jobs: - `#added` For any new functionality added. - `#breaking_change` For any functionality that requires manual action for the node to boot. - `#bugfix` For bug fixes. - - `#changed` For any change to the existing functionality. + - `#changed` For any change to the existing functionality. - `#db_update` For any feature that introduces updates to database schema. - `#deprecation_notice` For any upcoming deprecation functionality. - `#internal` For changesets that need to be excluded from the final changelog. @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 @@ -70,7 +70,7 @@ jobs: version: ^9.0.0 - name: Setup node - uses: actions/setup-node@v4.0.4 + uses: actions/setup-node@v4 if: ${{ steps.files-changed.outputs.core == 'true' || steps.files-changed.outputs.shared == 'true' }} with: node-version: 20 @@ -94,7 +94,7 @@ jobs: run: echo "top_level_dir=$(pwd)" >> $GITHUB_OUTPUT - name: Checkout .Github repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/.github @@ -170,7 +170,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 diff --git a/.github/workflows/changesets-preview-pr.yml b/.github/workflows/changesets-preview-pr.yml index c32b8c54c63..b413aa2aa0f 100644 --- a/.github/workflows/changesets-preview-pr.yml +++ b/.github/workflows/changesets-preview-pr.yml @@ -17,7 +17,7 @@ jobs: pull-requests: write steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -36,7 +36,7 @@ jobs: version: ^9.0.0 - name: Setup node - uses: actions/setup-node@v4.0.4 + uses: actions/setup-node@v4 if: steps.change.outputs.core-changeset == 'true' with: node-version: 20 diff --git a/.github/workflows/ci-core-partial.yml b/.github/workflows/ci-core-partial.yml index 38c252bad7e..8dd0706ca5f 100644 --- a/.github/workflows/ci-core-partial.yml +++ b/.github/workflows/ci-core-partial.yml @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -61,7 +61,7 @@ jobs: module-directory: "./deployment" steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -146,14 +146,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false # fetches all history for all tags and branches to provide more metadata for sonar reports fetch-depth: 0 - name: Download all workflow run artifacts - uses: actions/download-artifact@v4.1.8 + uses: actions/download-artifact@v4 with: path: coverage pattern: coverage-* @@ -205,7 +205,7 @@ jobs: if: ${{ github.event_name == 'schedule' }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -257,7 +257,7 @@ jobs: if: ${{ github.event_name == 'schedule' }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml index 574fa7de456..19e20e4941e 100644 --- a/.github/workflows/ci-core.yml +++ b/.github/workflows/ci-core.yml @@ -39,7 +39,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -132,7 +132,7 @@ jobs: modules: ${{ fromJson(needs.filter.outputs.affected-modules) }} steps: - name: Checkout - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Golang Lint (${{ matrix.modules }}) @@ -200,7 +200,7 @@ jobs: actions: read steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -311,7 +311,7 @@ jobs: - name: Store logs artifacts if: ${{ always() && needs.filter.outputs.should-run-ci-core == 'true' }} - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 with: name: ${{ matrix.type.cmd }}_logs path: | @@ -344,7 +344,7 @@ jobs: if: ${{ needs.filter.outputs.should-run-ci-core == 'true' }} steps: - name: Checkout - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 - name: Setup Go uses: ./.github/actions/setup-go @@ -359,7 +359,7 @@ jobs: - name: Store test report artifacts if: ${{ always() }} - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 with: name: go_core_scripts_tests_logs path: | @@ -374,13 +374,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 # fetches all history for all tags and branches to provide more metadata for sonar reports - name: Download all workflow artifacts - uses: actions/download-artifact@v4.1.8 + uses: actions/download-artifact@v4 - name: Check and Set SonarQube Report Paths shell: bash @@ -477,7 +477,7 @@ jobs: run: shell: bash steps: - - uses: actions/checkout@v4.2.1 + - uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 diff --git a/.github/workflows/ci-flakeguard.yml b/.github/workflows/ci-flakeguard.yml index 1bd60b20c94..02d38809bc0 100644 --- a/.github/workflows/ci-flakeguard.yml +++ b/.github/workflows/ci-flakeguard.yml @@ -19,7 +19,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 @@ -47,7 +47,7 @@ jobs: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} FLAKEGUARD_SPLUNK_ENDPOINT: ${{ secrets.FLAKEGUARD_SPLUNK_ENDPOINT }} FLAKEGUARD_SPLUNK_HEC: ${{ secrets.FLAKEGUARD_SPLUNK_HEC }} - + trigger-flaky-test-detection-for-deployment-project: name: Flakeguard Deployment Project uses: ./.github/workflows/flakeguard.yml diff --git a/.github/workflows/ci-protobuf.yml b/.github/workflows/ci-protobuf.yml index 1ea44a0ea78..2d3d66fc9d3 100644 --- a/.github/workflows/ci-protobuf.yml +++ b/.github/workflows/ci-protobuf.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/client-compatibility-tests.yml b/.github/workflows/client-compatibility-tests.yml index ebf2e55dcfd..f3cf1404142 100644 --- a/.github/workflows/client-compatibility-tests.yml +++ b/.github/workflows/client-compatibility-tests.yml @@ -48,7 +48,7 @@ jobs: dependency_changed: ${{ steps.changes.outputs.dependency_changed }} steps: - name: Checkout code - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 @@ -339,7 +339,7 @@ jobs: needs: [should-run, select-versions] steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ needs.select-versions.outputs.chainlink_version }} @@ -609,7 +609,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -868,7 +868,7 @@ jobs: - runlog steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ needs.select-versions.outputs.chainlink_version }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c0294645465..412b2c0f4b2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -55,7 +55,7 @@ jobs: should-run: ${{ needs.filter.outputs.should-run-js }} steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/crib-integration-test.yml b/.github/workflows/crib-integration-test.yml index 97f87c7d7fc..1d362080c0d 100644 --- a/.github/workflows/crib-integration-test.yml +++ b/.github/workflows/crib-integration-test.yml @@ -21,7 +21,7 @@ jobs: actions: read steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/delete-caches.yml b/.github/workflows/delete-caches.yml index aa714d38815..41d02fb2eb8 100644 --- a/.github/workflows/delete-caches.yml +++ b/.github/workflows/delete-caches.yml @@ -1,6 +1,6 @@ name: Cleanup Caches -# See: +# See: # https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/caching-dependencies-to-speed-up-workflows#force-deleting-cache-entries on: @@ -21,7 +21,7 @@ jobs: PR_NUMBER: ${{ github.event.pull_request.number }} steps: - name: Check out code - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -45,7 +45,7 @@ jobs: run: | set +e - PR_BRANCH=refs/pull/$PR_NUMBER/merge + PR_BRANCH=refs/pull/$PR_NUMBER/merge echo "Fetching list of cache keys for the PR branch ($PR_BRANCH)" PR_CACHE_KEYS=$(gh actions-cache list -R $REPO -B $PR_BRANCH | cut -f 1) @@ -57,9 +57,9 @@ jobs: if [[ -n "$TRUNK_SHA" ]]; then echo "Found corresponding merge commit $TRUNK_SHA" QUEUE_BRANCH="gh-readonly-queue/develop/pr-${PR_NUMBER}-${TRUNK_SHA}" - echo "Fetching list of cache keys for the merge queue branch ($QUEUE_BRANCH)" + echo "Fetching list of cache keys for the merge queue branch ($QUEUE_BRANCH)" QUEUE_CACHE_KEYS=$(gh actions-cache list -R $REPO -B $QUEUE_BRANCH | cut -f 1) - + echo "Deleting caches for merge queue branch ($QUEUE_BRANCH)..." for CACHE_KEY in $QUEUE_CACHE_KEYS; do gh actions-cache delete $CACHE_KEY -R $REPO -B $QUEUE_BRANCH --confirm diff --git a/.github/workflows/delete-deployments.yml b/.github/workflows/delete-deployments.yml index ff24db42229..0c4b60cf500 100644 --- a/.github/workflows/delete-deployments.yml +++ b/.github/workflows/delete-deployments.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/dependency-check.yml b/.github/workflows/dependency-check.yml index 0b09747f509..bdc8801db16 100644 --- a/.github/workflows/dependency-check.yml +++ b/.github/workflows/dependency-check.yml @@ -11,7 +11,7 @@ jobs: changes: ${{ steps.changes.outputs.src }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 id: changes with: @@ -25,7 +25,7 @@ jobs: needs: [changes] steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/flakeguard.yml b/.github/workflows/flakeguard.yml index 5c24e4973b3..b1d8f559f8b 100644 --- a/.github/workflows/flakeguard.yml +++ b/.github/workflows/flakeguard.yml @@ -12,7 +12,7 @@ on: required: true type: string description: 'The path to the project to run the flaky test detection.' - default: '.' + default: '.' baseRef: required: false type: string @@ -25,7 +25,7 @@ on: required: false type: boolean description: 'Run all tests in the project.' - default: false + default: false maxPassRatio: required: false type: string @@ -92,7 +92,7 @@ jobs: git_base_sha: ${{ steps.get_commit_sha.outputs.git_base_sha }} steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 @@ -105,11 +105,11 @@ jobs: git_head_sha=$(git rev-parse HEAD) git_head_short_sha=$(git rev-parse --short HEAD) echo "git_head_sha=$git_head_sha" >> $GITHUB_OUTPUT - echo "git_head_short_sha=$git_head_short_sha" >> $GITHUB_OUTPUT + echo "git_head_short_sha=$git_head_short_sha" >> $GITHUB_OUTPUT # Print HEAD SHAs to the console echo "HEAD SHA: $git_head_sha" - echo "HEAD Short SHA: $git_head_short_sha" + echo "HEAD Short SHA: $git_head_short_sha" # Conditionally resolve BASE SHA if [ -n "${{ env.GIT_BASE_REF }}" ]; then @@ -117,13 +117,13 @@ jobs: git_base_sha=$(git rev-parse origin/${{ env.GIT_BASE_REF }}) echo "git_base_sha=$git_base_sha" >> $GITHUB_OUTPUT - + # Print BASE SHA to the console echo "BASE SHA: $git_base_sha" else echo "BASE SHA not provided." echo "git_base_sha=" >> $GITHUB_OUTPUT - fi + fi - name: Setup Go uses: ./.github/actions/setup-go @@ -153,7 +153,7 @@ jobs: echo $PACKAGES echo "packages=$PACKAGES" >> $GITHUB_OUTPUT - - name: Find changed test files + - name: Find changed test files if: ${{ inputs.runAllTests == false && env.RUN_CUSTOM_TEST_PACKAGES == '' }} id: find-changed-test-files shell: bash @@ -168,7 +168,7 @@ jobs: TEST_FILES=$(flakeguard find --only-show-changed-test-files=true --base-ref=origin/${{ env.GIT_BASE_REF }} --project-path=${GH_INPUTS_PROJECT_PATH}) echo $TEST_FILES echo "test_files=$TEST_FILES" >> $GITHUB_OUTPUT - + - name: Split test packages into groups id: split-packages shell: bash @@ -182,11 +182,11 @@ jobs: if [[ "$GH_INPUTS_RUN_ALL_TESTS" == "true" ]]; then # Use ALL_TESTS_RUNNER for a specified number of groups, each with "./..." to run all tests ALL_TESTS_RUNNER_COUNT=${{ env.ALL_TESTS_RUNNER_COUNT }} - + # Create the JSON array dynamically based on ALL_TESTS_RUNNER_COUNT json_groups=$(jq -nc --argjson count "$ALL_TESTS_RUNNER_COUNT" \ '[range(0; $count) | { "testPackages": "./...", "runs_on": "'"${{ env.ALL_TESTS_RUNNER }}"'" }]') - + echo "$json_groups" echo "matrix<> $GITHUB_OUTPUT echo "$json_groups" >> $GITHUB_OUTPUT @@ -236,7 +236,7 @@ jobs: if [[ $i -lt $EXTRA ]]; then group_size=$(($group_size + 1)) fi - + # Extract the packages for the current group if [[ $group_size -gt 0 ]]; then group=("${PACKAGES[@]:current_index:group_size}") @@ -255,7 +255,7 @@ jobs: - name: Generate random workflow id id: gen_id shell: bash - run: echo "workflow_id=$(uuidgen)" >> "$GITHUB_OUTPUT" + run: echo "workflow_id=$(uuidgen)" >> "$GITHUB_OUTPUT" run-tests: name: Run Tests @@ -265,7 +265,7 @@ jobs: timeout-minutes: 180 strategy: fail-fast: false - matrix: + matrix: include: ${{ fromJSON(needs.get-tests.outputs.matrix) }} outputs: flakeguard_error: ${{ steps.run-tests.outputs.flakeguard_error }} @@ -273,7 +273,7 @@ jobs: DB_URL: postgresql://postgres:postgres@localhost:5432/chainlink_test?sslmode=disable steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ env.GIT_HEAD_REF }} @@ -316,7 +316,7 @@ jobs: - name: Setup DB run: go run ./core/store/cmd/preparetest env: - CL_DATABASE_URL: ${{ env.DB_URL }} + CL_DATABASE_URL: ${{ env.DB_URL }} - name: Install LOOP Plugins run: make install-plugins @@ -359,11 +359,11 @@ jobs: - name: Upload test result as artifact if: always() - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 with: name: test-result-${{ needs.get-tests.outputs.workflow_id }}-${{ steps.gen_id.outputs.id }} path: test-result.json - retention-days: 1 + retention-days: 1 report: needs: [get-tests, run-tests] @@ -374,7 +374,7 @@ jobs: test_results: ${{ steps.results.outputs.results }} steps: - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ env.GIT_HEAD_REF }} @@ -404,16 +404,16 @@ jobs: fi - name: Download all test result artifacts - uses: actions/download-artifact@v4.1.8 + uses: actions/download-artifact@v4 with: path: ci_test_results pattern: test-result-${{ needs.get-tests.outputs.workflow_id }}-* - + - name: Install flakeguard shell: bash run: go install github.com/smartcontractkit/chainlink-testing-framework/tools/flakeguard@49bbad97ccd743e7b704e4a17f92c475f2ee044d # flakguard@0.1.0 - + - name: Aggregate Flakeguard Results id: results shell: bash @@ -423,13 +423,13 @@ jobs: run: | # Create test results folder if it doesn't exist mkdir -p ci_test_results - + # Fix flakeguard binary path PATH=$PATH:$(go env GOPATH)/bin export PATH current_branch_name="${{ github.head_ref || github.ref_name }} " - + # Aggregate Flakeguard test results flakeguard aggregate-results \ --results-path ./ci_test_results \ @@ -455,7 +455,7 @@ jobs: # Print out the summary file echo -e "\nFlakeguard Summary:" - jq .summary_data ./flakeguard-report/all-test-results.json + jq .summary_data ./flakeguard-report/all-test-results.json # Read the summary from the generated report summary=$(jq -c '.summary_data' ./flakeguard-report/all-test-results.json) @@ -463,23 +463,23 @@ jobs: - name: Upload All Test Results as Artifact if: ${{ (success() || failure()) && fromJSON(steps.results.outputs.summary).total_tests > 0 }} - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 with: path: ./flakeguard-report/all-test-results.json name: all-test-results.json retention-days: 90 - + - name: Upload Failed Test Results as Artifact if: ${{ (success() || failure()) && fromJSON(steps.results.outputs.summary).failed_runs > 0 }} - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 with: path: ./flakeguard-report/failed-test-results.json name: failed-test-results.json - retention-days: 90 - + retention-days: 90 + - name: Upload Failed Test Results With Logs as Artifact if: ${{ (success() || failure()) && fromJSON(steps.results.outputs.summary).failed_runs > 0 }} - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 with: path: ./flakeguard-report/failed-test-results-with-logs.json name: failed-test-results-with-logs.json @@ -499,7 +499,7 @@ jobs: # Fix flakeguard binary path PATH=$PATH:$(go env GOPATH)/bin export PATH - + # Check if the event is a pull request if [ "$GH_EVENT_NAME" = "pull_request" ]; then flakeguard generate-report \ @@ -527,7 +527,7 @@ jobs: --current-commit-sha "$GH_EVENT_PULL_REQUEST_HEAD_SHA" \ --repo-url "https://github.com/${{ github.repository }}" \ --action-run-id "${{ github.run_id }}" \ - --max-pass-ratio "$GH_INPUTS_MAX_PASS_RATIO" + --max-pass-ratio "$GH_INPUTS_MAX_PASS_RATIO" fi EXIT_CODE=$? if [ $EXIT_CODE -eq 2 ]; then @@ -535,7 +535,7 @@ jobs: echo "ERROR: Flakeguard encountered an error while generating reports" >> $GITHUB_STEP_SUMMARY exit $EXIT_CODE fi - + - name: Add Github Summary if: (success() || failure()) run: | @@ -618,7 +618,7 @@ jobs: ] } ] - } + } - name: Send general Slack message uses: slackapi/slack-github-action@6c661ce58804a1a20f6dc5fbee7f0381b469e001 # v1.25.0 @@ -654,7 +654,7 @@ jobs: "type": "mrkdwn", "text": "${{ inputs.runAllTests == true && format('<{0}/{1}/actions/runs/{2}|View Flaky Detector Details>', github.server_url, github.repository, github.run_id) || format('<{0}/{1}/actions/runs/{2}|View Flaky Detector Details> | <{3}/compare/{4}...{5}#files_bucket|Compare Changes>{6}', github.server_url, github.repository, github.run_id, inputs.repoUrl, inputs.baseRef, needs.get-tests.outputs.git_head_sha, github.event_name == 'pull_request' && format(' | <{0}|View PR>', github.event.pull_request.html_url) || '') }}" } - } + } ] } ] diff --git a/.github/workflows/go-mod-cache.yml b/.github/workflows/go-mod-cache.yml index e90e6a9f285..6c2879979b8 100644 --- a/.github/workflows/go-mod-cache.yml +++ b/.github/workflows/go-mod-cache.yml @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -39,7 +39,7 @@ jobs: with: only-modules: "true" restore-module-cache-only: "false" - + - name: Install Dependencies shell: bash run: go mod download all diff --git a/.github/workflows/integration-in-memory-tests.yml b/.github/workflows/integration-in-memory-tests.yml index 05337f333cd..1702d654d54 100644 --- a/.github/workflows/integration-in-memory-tests.yml +++ b/.github/workflows/integration-in-memory-tests.yml @@ -31,7 +31,7 @@ jobs: if: github.actor != 'dependabot[bot]' steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -137,7 +137,7 @@ jobs: steps: - name: Checkout repo if: ${{ github.event_name == 'pull_request' }} - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink diff --git a/.github/workflows/integration-tests-publish.yml b/.github/workflows/integration-tests-publish.yml index 247d7458b48..6ccbfbf9147 100644 --- a/.github/workflows/integration-tests-publish.yml +++ b/.github/workflows/integration-tests-publish.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu22.04-8cores-32GB steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ github.event.pull_request.head.sha || github.sha }} @@ -68,7 +68,7 @@ jobs: runs-on: ubuntu22.04-8cores-32GB steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ github.sha }} diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index b76fb194abe..2fe79c1e31c 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -52,7 +52,7 @@ jobs: steps: - run: echo "${{github.event_name}}" - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -87,7 +87,7 @@ jobs: if: github.actor != 'dependabot[bot]' steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -148,7 +148,7 @@ jobs: needs: [changes, enforce-ctf-version] steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -452,7 +452,7 @@ jobs: steps: - name: Checkout repo if: ${{ github.event_name == 'pull_request' }} - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -473,13 +473,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink ref: ${{ inputs.cl_ref || github.event.pull_request.head.sha || github.event.merge_group.head_sha }} - name: Download All Artifacts - uses: actions/download-artifact@v4.1.8 + uses: actions/download-artifact@v4 with: path: cl_node_coverage_data pattern: cl_node_coverage_data_* @@ -498,7 +498,7 @@ jobs: sha: ${{ steps.getsha.outputs.sha }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink @@ -519,7 +519,7 @@ jobs: echo "short sha is: ${short_sha}" echo "short_sha=${short_sha}" >> "$GITHUB_OUTPUT" - name: Checkout solana - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink-solana @@ -547,7 +547,7 @@ jobs: projectserum_version: ${{ steps.psversion.outputs.projectserum_version }} steps: - name: Checkout the solana repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink-solana @@ -596,7 +596,7 @@ jobs: ] steps: - name: Checkout the solana repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink-solana @@ -631,14 +631,14 @@ jobs: steps: - name: Checkout the repo if: (needs.changes.outputs.core_changes == 'true' || github.event_name == 'workflow_dispatch') && needs.solana-test-image-exists.outputs.exists == 'false' - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink-solana ref: ${{ needs.get_solana_sha.outputs.sha }} - name: Download Artifacts if: (needs.changes.outputs.core_changes == 'true' || github.event_name == 'workflow_dispatch') && needs.solana-test-image-exists.outputs.exists == 'false' - uses: actions/download-artifact@v4.1.8 + uses: actions/download-artifact@v4 with: name: artifacts path: ${{ env.CONTRACT_ARTIFACTS_PATH }} @@ -680,7 +680,7 @@ jobs: CONTRACT_ARTIFACTS_PATH: contracts/target/deploy steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/chainlink-solana @@ -774,7 +774,7 @@ jobs: CHAINLINK_USER_TEAM: "BIX" - name: Upload Coverage Data - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 timeout-minutes: 2 continue-on-error: true with: diff --git a/.github/workflows/lint-gh-workflows.yml b/.github/workflows/lint-gh-workflows.yml index a3aaacb1abe..ae971f6052f 100644 --- a/.github/workflows/lint-gh-workflows.yml +++ b/.github/workflows/lint-gh-workflows.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out Code - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Run actionlint diff --git a/.github/workflows/operator-ui-ci.yml b/.github/workflows/operator-ui-ci.yml index 7ea1cd8327b..9135bf4e68a 100644 --- a/.github/workflows/operator-ui-ci.yml +++ b/.github/workflows/operator-ui-ci.yml @@ -32,7 +32,7 @@ jobs: url: ${{ secrets.AWS_INFRA_RELENG_TOKEN_ISSUER_LAMBDA_URL }} - name: Checkout repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/solidity-foundry-artifacts.yml b/.github/workflows/solidity-foundry-artifacts.yml index 5665c786057..301dac7b485 100644 --- a/.github/workflows/solidity-foundry-artifacts.yml +++ b/.github/workflows/solidity-foundry-artifacts.yml @@ -48,7 +48,7 @@ jobs: changeset_files: ${{ steps.changes-dorny.outputs.changeset_files }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ env.head_ref }} @@ -129,7 +129,7 @@ jobs: generate_code_coverage: ${{ steps.skip-code-coverage.outputs.generate_code_coverage }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/solidity-foundry.yml b/.github/workflows/solidity-foundry.yml index a3e9730e7ac..45bda7e4e44 100644 --- a/.github/workflows/solidity-foundry.yml +++ b/.github/workflows/solidity-foundry.yml @@ -48,7 +48,7 @@ jobs: echo "matrix=$matrix" >> $GITHUB_OUTPUT - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -65,7 +65,7 @@ jobs: all_changes: ${{ steps.changes.outputs.changes }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Detect changes @@ -153,7 +153,7 @@ jobs: ${{ contains(fromJson(needs.changes.outputs.all_changes), matrix.product.name) || contains(fromJson(needs.changes.outputs.all_changes), 'shared') || needs.changes.outputs.non_src_changes == 'true' }} - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false submodules: recursive @@ -218,7 +218,7 @@ jobs: shell: bash working-directory: contracts/src/v0.8 run: | - exact_versions=$(grep -rh "pragma solidity" ${{ matrix.product.name }} | sort | uniq | grep -v '\^' | awk '{print $3}' | tr -d ';') + exact_versions=$(grep -rh "pragma solidity" ${{ matrix.product.name }} | sort | uniq | grep -v '\^' | awk '{print $3}' | tr -d ';') for version in $exact_versions; do echo "Installing exact version: $version" if ! svm install "$version"; then @@ -326,12 +326,12 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout this repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Checkout .github repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/.github @@ -345,7 +345,7 @@ jobs: uses: ./.github/actions/install-solidity-foundry - name: Set up Python - uses: actions/setup-python@v5.2.0 + uses: actions/setup-python@v5 with: python-version: "3.8" @@ -382,7 +382,7 @@ jobs: # in that case we extract new issues introduced by the changes by using an LLM model - name: Upload Slither results for current branch if: needs.changes.outputs.sol_mod_only == 'true' - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 timeout-minutes: 2 continue-on-error: true with: @@ -393,7 +393,7 @@ jobs: # we need to upload scripts and configuration in case base_ref doesn't have the scripts, or they are in different version - name: Upload Slither scripts if: needs.changes.outputs.sol_mod_only == 'true' - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 timeout-minutes: 2 continue-on-error: true with: @@ -403,7 +403,7 @@ jobs: - name: Upload configs if: needs.changes.outputs.sol_mod_only == 'true' - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 timeout-minutes: 2 with: name: tmp-configs-${{ github.sha }} @@ -414,21 +414,21 @@ jobs: - name: Checkout earlier version of this repository if: needs.changes.outputs.sol_mod_only == 'true' - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ github.base_ref }} - name: Download Slither scripts if: needs.changes.outputs.sol_mod_only == 'true' - uses: actions/download-artifact@v4.1.8 + uses: actions/download-artifact@v4 with: name: tmp-slither-scripts-${{ github.sha }} path: ./dot_github/tools/scripts/solidity - name: Download configs if: needs.changes.outputs.sol_mod_only == 'true' - uses: actions/download-artifact@v4.1.8 + uses: actions/download-artifact@v4 with: name: tmp-configs-${{ github.sha }} path: contracts/configs @@ -465,7 +465,7 @@ jobs: - name: Upload Slither report if: needs.changes.outputs.sol_mod_only == 'true' - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 timeout-minutes: 10 continue-on-error: true with: @@ -476,7 +476,7 @@ jobs: - name: Download Slither results for current branch if: needs.changes.outputs.sol_mod_only == 'true' - uses: actions/download-artifact@v4.1.8 + uses: actions/download-artifact@v4 with: name: slither-reports-current-${{ github.sha }} path: contracts/slither-reports-current @@ -529,7 +529,7 @@ jobs: sol_files: ${{ needs.changes.outputs.not_test_sol_modified_files }} - name: Upload Slither reports - uses: actions/upload-artifact@v4.4.3 + uses: actions/upload-artifact@v4 timeout-minutes: 10 continue-on-error: true with: @@ -608,7 +608,7 @@ jobs: steps: - name: Checkout the repo if: ${{ (contains(fromJson(needs.changes.outputs.all_changes), matrix.product.name) || needs.changes.outputs.non_src_changes == 'true') && matrix.product.setup.run-forge-fmt }} - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false submodules: recursive diff --git a/.github/workflows/solidity-hardhat.yml b/.github/workflows/solidity-hardhat.yml index e2da95eae6e..c3dc1519cf9 100644 --- a/.github/workflows/solidity-hardhat.yml +++ b/.github/workflows/solidity-hardhat.yml @@ -19,7 +19,7 @@ jobs: changes: ${{ steps.changes.outputs.src }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 @@ -41,7 +41,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Setup NodeJS diff --git a/.github/workflows/solidity-traceability.yml b/.github/workflows/solidity-traceability.yml index a894175f6f3..afc29cb2985 100644 --- a/.github/workflows/solidity-traceability.yml +++ b/.github/workflows/solidity-traceability.yml @@ -22,7 +22,7 @@ jobs: changesets_files: ${{ steps.files-changed.outputs.changesets_files }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -59,7 +59,7 @@ jobs: # Include the pull request ref in the checkout action to prevent merge commit # https://github.com/actions/checkout?tab=readme-ov-file#checkout-pull-request-head-commit-instead-of-merge-commit - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false ref: ${{ github.event.pull_request.head.sha }} @@ -95,7 +95,7 @@ jobs: uses: ./.github/actions/setup-nodejs - name: Checkout .Github repository - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: smartcontractkit/.github @@ -193,11 +193,11 @@ jobs: body: | ## Solidity Review Jira issue Hey! We have taken the liberty to link this PR to a Jira issue for Solidity Review. - + This is a new feature, that's currently in the pilot phase, so please make sure that the linkage is correct. In a contrary case, please update it manually in JIRA and replace Solidity Review issue key in the changeset file with the correct one. Please reach out to the Test Tooling team and notify them about any issues you encounter. - + Any changes to the Solidity Review Jira issue should be reflected in the changeset file. If you need to update the issue key, please do so manually in the following changeset file: `${{ needs.files-changed.outputs.changesets_files }}` - + This PR has been linked to Solidity Review Jira issue: [${{ env.SOLIDITY_REVIEW_JIRA_ISSUE_KEY }}](${{ vars.JIRA_HOST }}browse/${{ env.SOLIDITY_REVIEW_JIRA_ISSUE_KEY }}) edit-mode: replace diff --git a/.github/workflows/solidity-wrappers.yml b/.github/workflows/solidity-wrappers.yml index 804a6822a29..bdbffecb053 100644 --- a/.github/workflows/solidity-wrappers.yml +++ b/.github/workflows/solidity-wrappers.yml @@ -23,7 +23,7 @@ jobs: changes: ${{ steps.ch.outputs.changes }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Detect changes @@ -42,7 +42,7 @@ jobs: runs-on: ubuntu22.04-8cores-32GB steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/solidity.yml b/.github/workflows/solidity.yml index 099fab122f6..def06b0be29 100644 --- a/.github/workflows/solidity.yml +++ b/.github/workflows/solidity.yml @@ -16,7 +16,7 @@ jobs: changes: ${{ steps.ch.outputs.changes }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Detect readonly solidity file changes @@ -30,7 +30,7 @@ jobs: changes: ${{ steps.ch.outputs.changes }} steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Detect changes @@ -51,7 +51,7 @@ jobs: release-version-ccip: ${{ steps.release-tag-check-ccip.outputs.release-version }} pre-release-version-ccip: ${{ steps.release-tag-check-ccip.outputs.pre-release-version }} steps: - - uses: actions/checkout@v4.2.1 + - uses: actions/checkout@v4 with: persist-credentials: false - name: Check release tag (core) @@ -97,7 +97,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Setup NodeJS @@ -113,13 +113,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false path: chainlink - name: Checkout diff-so-fancy - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false repository: so-fancy/diff-so-fancy @@ -172,7 +172,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Setup NodeJS @@ -194,7 +194,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false - name: Setup NodeJS @@ -210,7 +210,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false @@ -259,7 +259,7 @@ jobs: contents: write steps: - name: Checkout the repo - uses: actions/checkout@v4.2.1 + uses: actions/checkout@v4 with: persist-credentials: false diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index e10da5efe81..e75c857d7e0 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -18,7 +18,7 @@ jobs: pull-requests: write steps: - - uses: actions/stale@v9.0.0 + - uses: actions/stale@v9 with: repo-token: ${{ secrets.GITHUB_TOKEN }} exempt-all-pr-assignees: true diff --git a/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml b/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml index 061db3ae7f3..939e67df17f 100644 --- a/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml +++ b/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml @@ -10,7 +10,7 @@ jobs: name: Sync runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.2.1 + - uses: actions/checkout@v4 with: persist-credentials: false ref: develop From 3a0b6384e5d5200eb411b6eda7e0415c527bc3a1 Mon Sep 17 00:00:00 2001 From: Lei Date: Fri, 14 Feb 2025 10:36:43 -0800 Subject: [PATCH 79/83] [CAPPL-525] return error when receiver reverts or is invalid (#16343) * return error when receiver reverts or is invalid * address comment and lint --- .changeset/blue-ducks-compete.md | 5 + core/capabilities/targets/write_target.go | 23 +-- .../capabilities/targets/write_target_test.go | 143 +++++++++++++++++- 3 files changed, 157 insertions(+), 14 deletions(-) create mode 100644 .changeset/blue-ducks-compete.md diff --git a/.changeset/blue-ducks-compete.md b/.changeset/blue-ducks-compete.md new file mode 100644 index 00000000000..b873d7ededa --- /dev/null +++ b/.changeset/blue-ducks-compete.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +#bugfix diff --git a/core/capabilities/targets/write_target.go b/core/capabilities/targets/write_target.go index a312518910b..2d9074ffaf3 100644 --- a/core/capabilities/targets/write_target.go +++ b/core/capabilities/targets/write_target.go @@ -25,7 +25,8 @@ import ( ) var ( - _ capabilities.TargetCapability = &WriteTarget{} + _ capabilities.TargetCapability = &WriteTarget{} + ErrTxFailed = errors.New("submitted transaction failed") ) const transactionStatusCheckInterval = 2 * time.Second @@ -264,7 +265,7 @@ func (cap *WriteTarget) Execute(ctx context.Context, rawRequest capabilities.Cap return capabilities.CapabilityResponse{}, nil case transmissionInfo.State == TransmissionStateInvalidReceiver: cap.lggr.Infow("returning without a transmission attempt - transmission already attempted, receiver was marked as invalid", "executionID", request.Metadata.WorkflowExecutionID) - return capabilities.CapabilityResponse{}, nil + return capabilities.CapabilityResponse{}, ErrTxFailed case transmissionInfo.State == TransmissionStateFailed: receiverGasMinimum := cap.receiverGasMinimum if request.Config.GasLimit != nil { @@ -272,7 +273,7 @@ func (cap *WriteTarget) Execute(ctx context.Context, rawRequest capabilities.Cap } if transmissionInfo.GasLimit.Uint64() > receiverGasMinimum { cap.lggr.Infow("returning without a transmission attempt - transmission already attempted and failed, sufficient gas was provided", "executionID", request.Metadata.WorkflowExecutionID, "receiverGasMinimum", receiverGasMinimum, "transmissionGasLimit", transmissionInfo.GasLimit) - return capabilities.CapabilityResponse{}, nil + return capabilities.CapabilityResponse{}, ErrTxFailed } else { cap.lggr.Infow("non-empty report - retrying a failed transmission - attempting to push to txmgr", "request", request, "reportLen", len(request.Inputs.SignedReport.Report), "reportContextLen", len(request.Inputs.SignedReport.Context), "nSignatures", len(request.Inputs.SignedReport.Signatures), "executionID", request.Metadata.WorkflowExecutionID, "receiverGasMinimum", receiverGasMinimum, "transmissionGasLimit", transmissionInfo.GasLimit) } @@ -350,13 +351,13 @@ func (cap *WriteTarget) Execute(ctx context.Context, rawRequest capabilities.Cap // This is counterintuitive, but the tx manager is currently returning unconfirmed whenever the tx is confirmed // current implementation here: https://github.com/smartcontractkit/chainlink-framework/blob/main/chains/txmgr/txmgr.go#L697 - // so we need to check if we where able to write to the consumer contract to determine if the transaction was successful + // so we need to check if we were able to write to the consumer contract to determine if the transaction was successful if transmissionInfo.State == TransmissionStateSucceeded { cap.lggr.Debugw("Transaction confirmed", "request", request, "transaction", txID) return capabilities.CapabilityResponse{}, nil - } else { + } else if transmissionInfo.State == TransmissionStateFailed || transmissionInfo.State == TransmissionStateInvalidReceiver { cap.lggr.Errorw("Transaction written to the forwarder, but failed to be written to the consumer contract", "request", request, "transaction", txID, "transmissionState", transmissionInfo.State) - msg := "failed to submit transaction with ID: " + txID.String() + msg := "transaction written to the forwarder, but failed to be written to the consumer contract, transaction ID: " + txID.String() err = cap.emitter.With( platform.KeyWorkflowID, request.Metadata.WorkflowID, platform.KeyWorkflowName, request.Metadata.DecodedWorkflowName, @@ -366,7 +367,11 @@ func (cap *WriteTarget) Execute(ctx context.Context, rawRequest capabilities.Cap if err != nil { cap.lggr.Errorf("failed to send custom message with msg: %s, err: %v", msg, err) } - return capabilities.CapabilityResponse{}, errors.New("submitted transaction failed") + return capabilities.CapabilityResponse{}, ErrTxFailed + } else { + // TransmissionStateNotAttempted is not expected here, but we'll log it just in case + cap.lggr.Debugw("Transaction confirmed but transmission not attempted, this should never happen", "request", request, "transaction", txID) + return capabilities.CapabilityResponse{}, errors.New("transmission not attempted") } case commontypes.Finalized: cap.lggr.Debugw("Transaction finalized", "request", request, "transaction", txID) @@ -374,7 +379,7 @@ func (cap *WriteTarget) Execute(ctx context.Context, rawRequest capabilities.Cap case commontypes.Failed, commontypes.Fatal: cap.lggr.Error("Transaction failed", "request", request, "transaction", txID) - msg := "failed to submit transaction with ID: " + txID.String() + msg := "transaction failed to be written to the forwarder, transaction ID: " + txID.String() err = cap.emitter.With( platform.KeyWorkflowID, request.Metadata.WorkflowID, platform.KeyWorkflowName, request.Metadata.DecodedWorkflowName, @@ -384,7 +389,7 @@ func (cap *WriteTarget) Execute(ctx context.Context, rawRequest capabilities.Cap if err != nil { cap.lggr.Errorf("failed to send custom message with msg: %s, err: %v", msg, err) } - return capabilities.CapabilityResponse{}, errors.New("submitted transaction failed") + return capabilities.CapabilityResponse{}, ErrTxFailed default: cap.lggr.Debugw("Unexpected transaction status", "request", request, "transaction", txID, "status", txStatus) } diff --git a/core/capabilities/targets/write_target_test.go b/core/capabilities/targets/write_target_test.go index 6fde8387ed9..2cf05bbbca2 100644 --- a/core/capabilities/targets/write_target_test.go +++ b/core/capabilities/targets/write_target_test.go @@ -8,7 +8,6 @@ import ( "testing" "github.com/ethereum/go-ethereum/common" - "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -33,6 +32,7 @@ type testHarness struct { writeTarget *targets.WriteTarget forwarderAddr string binding types.BoundContract + gasLimit uint64 } func setup(t *testing.T) testHarness { @@ -44,7 +44,8 @@ func setup(t *testing.T) testHarness { forwarderA := testutils.NewAddress() forwarderAddr := forwarderA.Hex() - writeTarget := targets.NewWriteTarget(lggr, "test-write-target@1.0.0", cr, cw, forwarderAddr, 400_000) + var txGasLimit uint64 = 400_000 + writeTarget := targets.NewWriteTarget(lggr, "test-write-target@1.0.0", cr, cw, forwarderAddr, txGasLimit) require.NotNil(t, writeTarget) config, err := values.NewMap(map[string]any{ @@ -106,6 +107,7 @@ func setup(t *testing.T) testHarness { writeTarget: writeTarget, forwarderAddr: forwarderAddr, binding: binding, + gasLimit: txGasLimit - targets.ForwarderContractLogicGasCost, } } func TestWriteTarget(t *testing.T) { @@ -320,7 +322,7 @@ func TestWriteTarget_UnconfirmedTransaction(t *testing.T) { GasLimit: big.NewInt(0), InvalidReceiver: false, State: targets.TransmissionStateSucceeded, - Success: false, + Success: true, TransmissionId: [32]byte{}, Transmitter: common.HexToAddress("0x0"), } @@ -341,7 +343,7 @@ func TestWriteTarget_UnconfirmedTransaction(t *testing.T) { require.NotNil(t, response) }) - t.Run("transaction written to the forwarder, but failed to be written to the consumer contract", func(t *testing.T) { + t.Run("getTransmissionInfo twice, transaction written to the forwarder, but failed to be written to the consumer contract because of revert in receiver", func(t *testing.T) { th := setup(t) th.cw.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, th.forwarderAddr, mock.Anything, mock.Anything).Return(nil).Once() callCount := 0 @@ -378,6 +380,137 @@ func TestWriteTarget_UnconfirmedTransaction(t *testing.T) { ctx := testutils.Context(t) _, err2 := th.writeTarget.Execute(ctx, req) require.Error(t, err2) - require.Contains(t, err2.Error(), "submitted transaction failed") + require.ErrorIs(t, err2, targets.ErrTxFailed) + }) + + t.Run("getTransmissionInfo twice, transaction written to the forwarder, but failed to be written to the consumer contract because of invalid receiver", func(t *testing.T) { + th := setup(t) + th.cw.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, th.forwarderAddr, mock.Anything, mock.Anything).Return(nil).Once() + callCount := 0 + th.cr.On("GetLatestValue", mock.Anything, th.binding.ReadIdentifier("getTransmissionInfo"), mock.Anything, mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { + transmissionInfo := args.Get(4).(*targets.TransmissionInfo) + if callCount == 0 { + *transmissionInfo = targets.TransmissionInfo{ + GasLimit: big.NewInt(0), + InvalidReceiver: false, + State: targets.TransmissionStateNotAttempted, + Success: false, + TransmissionId: [32]byte{}, + Transmitter: common.HexToAddress("0x0"), + } + } else { + *transmissionInfo = targets.TransmissionInfo{ + GasLimit: big.NewInt(0), + InvalidReceiver: true, + State: targets.TransmissionStateInvalidReceiver, + Success: false, + TransmissionId: [32]byte{}, + Transmitter: common.HexToAddress("0x0"), + } + } + callCount++ + }) + req := capabilities.CapabilityRequest{ + Metadata: th.validMetadata, + Config: th.config, + Inputs: th.validInputs, + } + + th.cw.On("GetTransactionStatus", mock.Anything, mock.Anything).Return(types.Unconfirmed, nil).Once() + ctx := testutils.Context(t) + _, err2 := th.writeTarget.Execute(ctx, req) + require.Error(t, err2) + require.ErrorIs(t, err2, targets.ErrTxFailed) + }) + + t.Run("getTransmissionInfo once, transaction written to the forwarder, but failed to be written to the consumer contract because of invalid receiver", func(t *testing.T) { + th := setup(t) + th.cr.On("GetLatestValue", mock.Anything, th.binding.ReadIdentifier("getTransmissionInfo"), mock.Anything, mock.Anything, mock.Anything).Once().Return(nil).Run(func(args mock.Arguments) { + transmissionInfo := args.Get(4).(*targets.TransmissionInfo) + *transmissionInfo = targets.TransmissionInfo{ + GasLimit: big.NewInt(0), + InvalidReceiver: true, + State: targets.TransmissionStateInvalidReceiver, + Success: false, + TransmissionId: [32]byte{}, + Transmitter: common.HexToAddress("0x0"), + } + }) + req := capabilities.CapabilityRequest{ + Metadata: th.validMetadata, + Config: th.config, + Inputs: th.validInputs, + } + + ctx := testutils.Context(t) + _, err2 := th.writeTarget.Execute(ctx, req) + require.Error(t, err2) + require.ErrorIs(t, err2, targets.ErrTxFailed) + }) + + t.Run("getTransmissionInfo once, transaction written to the forwarder, but failed to be written to the consumer contract because of revert in receiver", func(t *testing.T) { + th := setup(t) + th.cr.On("GetLatestValue", mock.Anything, th.binding.ReadIdentifier("getTransmissionInfo"), mock.Anything, mock.Anything, mock.Anything).Once().Return(nil).Run(func(args mock.Arguments) { + transmissionInfo := args.Get(4).(*targets.TransmissionInfo) + *transmissionInfo = targets.TransmissionInfo{ + GasLimit: big.NewInt(0).SetUint64(th.gasLimit + 1), // has sufficient gas + InvalidReceiver: false, + State: targets.TransmissionStateFailed, + Success: false, + TransmissionId: [32]byte{}, + Transmitter: common.HexToAddress("0x0"), + } + }) + req := capabilities.CapabilityRequest{ + Metadata: th.validMetadata, + Config: th.config, + Inputs: th.validInputs, + } + + ctx := testutils.Context(t) + _, err2 := th.writeTarget.Execute(ctx, req) + require.Error(t, err2) + require.ErrorIs(t, err2, targets.ErrTxFailed) + }) + + t.Run("getTransmissionInfo twice, first time receiver reverted because of insufficient gas, second time succeeded", func(t *testing.T) { + th := setup(t) + th.cw.On("SubmitTransaction", mock.Anything, "forwarder", "report", mock.Anything, mock.Anything, th.forwarderAddr, mock.Anything, mock.Anything).Return(nil).Once() + callCount := 0 + th.cr.On("GetLatestValue", mock.Anything, th.binding.ReadIdentifier("getTransmissionInfo"), mock.Anything, mock.Anything, mock.Anything).Return(nil).Run(func(args mock.Arguments) { + transmissionInfo := args.Get(4).(*targets.TransmissionInfo) + if callCount == 0 { + *transmissionInfo = targets.TransmissionInfo{ + GasLimit: big.NewInt(0).SetUint64(th.gasLimit - 1), // has insufficient gas + InvalidReceiver: false, + State: targets.TransmissionStateFailed, + Success: false, + TransmissionId: [32]byte{}, + Transmitter: common.HexToAddress("0x0"), + } + } else { + *transmissionInfo = targets.TransmissionInfo{ + GasLimit: big.NewInt(0).SetUint64(th.gasLimit + 1), // has sufficient gas + InvalidReceiver: false, + State: targets.TransmissionStateSucceeded, + Success: true, + TransmissionId: [32]byte{}, + Transmitter: common.HexToAddress("0x0"), + } + } + callCount++ + }) + req := capabilities.CapabilityRequest{ + Metadata: th.validMetadata, + Config: th.config, + Inputs: th.validInputs, + } + + th.cw.On("GetTransactionStatus", mock.Anything, mock.Anything).Return(types.Unconfirmed, nil).Once() + + ctx := testutils.Context(t) + response, err2 := th.writeTarget.Execute(ctx, req) + require.NoError(t, err2) + require.NotNil(t, response) }) } From 26a94d54fef4aea56bcbf155c97467378408faf6 Mon Sep 17 00:00:00 2001 From: Margaret Ma Date: Fri, 14 Feb 2025 16:53:05 -0500 Subject: [PATCH 80/83] [CAPPL-442] add workflow registry view (#16336) * add workflow registry view * print instead of return from registry errors --- .tool-versions | 2 +- deployment/.mockery.yaml | 9 +- .../v1_0/mocks/workflow_registry_interface.go | 3535 +++++++++++++++++ deployment/common/view/v1_0/workflowreg.go | 198 + .../common/view/v1_0/workflowreg_test.go | 205 + .../keystone/changeset/internal/state.go | 14 + deployment/keystone/view/view.go | 2 + 7 files changed, 3963 insertions(+), 2 deletions(-) create mode 100644 deployment/common/view/v1_0/mocks/workflow_registry_interface.go create mode 100644 deployment/common/view/v1_0/workflowreg.go create mode 100644 deployment/common/view/v1_0/workflowreg_test.go diff --git a/.tool-versions b/.tool-versions index 7c999437710..b3617414021 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,5 +1,5 @@ golang 1.23.3 -mockery 2.46.3 +mockery 2.50.0 nodejs 20.13.1 pnpm 9.4.0 postgres 15.1 diff --git a/deployment/.mockery.yaml b/deployment/.mockery.yaml index 79e4d52104a..d9235cd3be6 100644 --- a/deployment/.mockery.yaml +++ b/deployment/.mockery.yaml @@ -10,4 +10,11 @@ packages: mockname: "Mock{{ .InterfaceName }}" filename: offchain_client_mock.go inpackage: true - dir: "{{ .InterfaceDir }}/mocks" \ No newline at end of file + dir: "{{ .InterfaceDir }}/mocks" + github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper: + config: + dir: common/view/v1_0/mocks/ + filename: workflow_registry_interface.go + outpkg: mocks + interfaces: + WorkflowRegistryInterface: diff --git a/deployment/common/view/v1_0/mocks/workflow_registry_interface.go b/deployment/common/view/v1_0/mocks/workflow_registry_interface.go new file mode 100644 index 00000000000..46fb6dcad5f --- /dev/null +++ b/deployment/common/view/v1_0/mocks/workflow_registry_interface.go @@ -0,0 +1,3535 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package mocks + +import ( + big "math/big" + + bind "github.com/ethereum/go-ethereum/accounts/abi/bind" + common "github.com/ethereum/go-ethereum/common" + + event "github.com/ethereum/go-ethereum/event" + + generated "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" + + mock "github.com/stretchr/testify/mock" + + types "github.com/ethereum/go-ethereum/core/types" + + workflow_registry_wrapper "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" +) + +// WorkflowRegistryInterface is an autogenerated mock type for the WorkflowRegistryInterface type +type WorkflowRegistryInterface struct { + mock.Mock +} + +type WorkflowRegistryInterface_Expecter struct { + mock *mock.Mock +} + +func (_m *WorkflowRegistryInterface) EXPECT() *WorkflowRegistryInterface_Expecter { + return &WorkflowRegistryInterface_Expecter{mock: &_m.Mock} +} + +// AcceptOwnership provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for AcceptOwnership") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_AcceptOwnership_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'AcceptOwnership' +type WorkflowRegistryInterface_AcceptOwnership_Call struct { + *mock.Call +} + +// AcceptOwnership is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *WorkflowRegistryInterface_Expecter) AcceptOwnership(opts interface{}) *WorkflowRegistryInterface_AcceptOwnership_Call { + return &WorkflowRegistryInterface_AcceptOwnership_Call{Call: _e.mock.On("AcceptOwnership", opts)} +} + +func (_c *WorkflowRegistryInterface_AcceptOwnership_Call) Run(run func(opts *bind.TransactOpts)) *WorkflowRegistryInterface_AcceptOwnership_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_AcceptOwnership_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_AcceptOwnership_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_AcceptOwnership_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *WorkflowRegistryInterface_AcceptOwnership_Call { + _c.Call.Return(run) + return _c +} + +// ActivateWorkflow provides a mock function with given fields: opts, workflowKey +func (_m *WorkflowRegistryInterface) ActivateWorkflow(opts *bind.TransactOpts, workflowKey [32]byte) (*types.Transaction, error) { + ret := _m.Called(opts, workflowKey) + + if len(ret) == 0 { + panic("no return value specified for ActivateWorkflow") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte) (*types.Transaction, error)); ok { + return rf(opts, workflowKey) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte) *types.Transaction); ok { + r0 = rf(opts, workflowKey) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, [32]byte) error); ok { + r1 = rf(opts, workflowKey) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ActivateWorkflow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ActivateWorkflow' +type WorkflowRegistryInterface_ActivateWorkflow_Call struct { + *mock.Call +} + +// ActivateWorkflow is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - workflowKey [32]byte +func (_e *WorkflowRegistryInterface_Expecter) ActivateWorkflow(opts interface{}, workflowKey interface{}) *WorkflowRegistryInterface_ActivateWorkflow_Call { + return &WorkflowRegistryInterface_ActivateWorkflow_Call{Call: _e.mock.On("ActivateWorkflow", opts, workflowKey)} +} + +func (_c *WorkflowRegistryInterface_ActivateWorkflow_Call) Run(run func(opts *bind.TransactOpts, workflowKey [32]byte)) *WorkflowRegistryInterface_ActivateWorkflow_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([32]byte)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ActivateWorkflow_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_ActivateWorkflow_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ActivateWorkflow_Call) RunAndReturn(run func(*bind.TransactOpts, [32]byte) (*types.Transaction, error)) *WorkflowRegistryInterface_ActivateWorkflow_Call { + _c.Call.Return(run) + return _c +} + +// Address provides a mock function with no fields +func (_m *WorkflowRegistryInterface) Address() common.Address { + ret := _m.Called() + + if len(ret) == 0 { + panic("no return value specified for Address") + } + + var r0 common.Address + if rf, ok := ret.Get(0).(func() common.Address); ok { + r0 = rf() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Address) + } + } + + return r0 +} + +// WorkflowRegistryInterface_Address_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Address' +type WorkflowRegistryInterface_Address_Call struct { + *mock.Call +} + +// Address is a helper method to define mock.On call +func (_e *WorkflowRegistryInterface_Expecter) Address() *WorkflowRegistryInterface_Address_Call { + return &WorkflowRegistryInterface_Address_Call{Call: _e.mock.On("Address")} +} + +func (_c *WorkflowRegistryInterface_Address_Call) Run(run func()) *WorkflowRegistryInterface_Address_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *WorkflowRegistryInterface_Address_Call) Return(_a0 common.Address) *WorkflowRegistryInterface_Address_Call { + _c.Call.Return(_a0) + return _c +} + +func (_c *WorkflowRegistryInterface_Address_Call) RunAndReturn(run func() common.Address) *WorkflowRegistryInterface_Address_Call { + _c.Call.Return(run) + return _c +} + +// ComputeHashKey provides a mock function with given fields: opts, owner, field +func (_m *WorkflowRegistryInterface) ComputeHashKey(opts *bind.CallOpts, owner common.Address, field string) ([32]byte, error) { + ret := _m.Called(opts, owner, field) + + if len(ret) == 0 { + panic("no return value specified for ComputeHashKey") + } + + var r0 [32]byte + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, string) ([32]byte, error)); ok { + return rf(opts, owner, field) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, string) [32]byte); ok { + r0 = rf(opts, owner, field) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([32]byte) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address, string) error); ok { + r1 = rf(opts, owner, field) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ComputeHashKey_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ComputeHashKey' +type WorkflowRegistryInterface_ComputeHashKey_Call struct { + *mock.Call +} + +// ComputeHashKey is a helper method to define mock.On call +// - opts *bind.CallOpts +// - owner common.Address +// - field string +func (_e *WorkflowRegistryInterface_Expecter) ComputeHashKey(opts interface{}, owner interface{}, field interface{}) *WorkflowRegistryInterface_ComputeHashKey_Call { + return &WorkflowRegistryInterface_ComputeHashKey_Call{Call: _e.mock.On("ComputeHashKey", opts, owner, field)} +} + +func (_c *WorkflowRegistryInterface_ComputeHashKey_Call) Run(run func(opts *bind.CallOpts, owner common.Address, field string)) *WorkflowRegistryInterface_ComputeHashKey_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address), args[2].(string)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ComputeHashKey_Call) Return(_a0 [32]byte, _a1 error) *WorkflowRegistryInterface_ComputeHashKey_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ComputeHashKey_Call) RunAndReturn(run func(*bind.CallOpts, common.Address, string) ([32]byte, error)) *WorkflowRegistryInterface_ComputeHashKey_Call { + _c.Call.Return(run) + return _c +} + +// DeleteWorkflow provides a mock function with given fields: opts, workflowKey +func (_m *WorkflowRegistryInterface) DeleteWorkflow(opts *bind.TransactOpts, workflowKey [32]byte) (*types.Transaction, error) { + ret := _m.Called(opts, workflowKey) + + if len(ret) == 0 { + panic("no return value specified for DeleteWorkflow") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte) (*types.Transaction, error)); ok { + return rf(opts, workflowKey) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte) *types.Transaction); ok { + r0 = rf(opts, workflowKey) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, [32]byte) error); ok { + r1 = rf(opts, workflowKey) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_DeleteWorkflow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DeleteWorkflow' +type WorkflowRegistryInterface_DeleteWorkflow_Call struct { + *mock.Call +} + +// DeleteWorkflow is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - workflowKey [32]byte +func (_e *WorkflowRegistryInterface_Expecter) DeleteWorkflow(opts interface{}, workflowKey interface{}) *WorkflowRegistryInterface_DeleteWorkflow_Call { + return &WorkflowRegistryInterface_DeleteWorkflow_Call{Call: _e.mock.On("DeleteWorkflow", opts, workflowKey)} +} + +func (_c *WorkflowRegistryInterface_DeleteWorkflow_Call) Run(run func(opts *bind.TransactOpts, workflowKey [32]byte)) *WorkflowRegistryInterface_DeleteWorkflow_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([32]byte)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_DeleteWorkflow_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_DeleteWorkflow_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_DeleteWorkflow_Call) RunAndReturn(run func(*bind.TransactOpts, [32]byte) (*types.Transaction, error)) *WorkflowRegistryInterface_DeleteWorkflow_Call { + _c.Call.Return(run) + return _c +} + +// FilterAllowedDONsUpdatedV1 provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) FilterAllowedDONsUpdatedV1(opts *bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1Iterator, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for FilterAllowedDONsUpdatedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1Iterator, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1Iterator); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterAllowedDONsUpdatedV1' +type WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call struct { + *mock.Call +} + +// FilterAllowedDONsUpdatedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +func (_e *WorkflowRegistryInterface_Expecter) FilterAllowedDONsUpdatedV1(opts interface{}) *WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call { + return &WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call{Call: _e.mock.On("FilterAllowedDONsUpdatedV1", opts)} +} + +func (_c *WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call) Run(run func(opts *bind.FilterOpts)) *WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call) RunAndReturn(run func(*bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1Iterator, error)) *WorkflowRegistryInterface_FilterAllowedDONsUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterAuthorizedAddressesUpdatedV1 provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) FilterAuthorizedAddressesUpdatedV1(opts *bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1Iterator, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for FilterAuthorizedAddressesUpdatedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1Iterator, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1Iterator); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterAuthorizedAddressesUpdatedV1' +type WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call struct { + *mock.Call +} + +// FilterAuthorizedAddressesUpdatedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +func (_e *WorkflowRegistryInterface_Expecter) FilterAuthorizedAddressesUpdatedV1(opts interface{}) *WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call { + return &WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call{Call: _e.mock.On("FilterAuthorizedAddressesUpdatedV1", opts)} +} + +func (_c *WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call) Run(run func(opts *bind.FilterOpts)) *WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call) RunAndReturn(run func(*bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1Iterator, error)) *WorkflowRegistryInterface_FilterAuthorizedAddressesUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterOwnershipTransferRequested provides a mock function with given fields: opts, from, to +func (_m *WorkflowRegistryInterface) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequestedIterator, error) { + ret := _m.Called(opts, from, to) + + if len(ret) == 0 { + panic("no return value specified for FilterOwnershipTransferRequested") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequestedIterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequestedIterator, error)); ok { + return rf(opts, from, to) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequestedIterator); ok { + r0 = rf(opts, from, to) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequestedIterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address, []common.Address) error); ok { + r1 = rf(opts, from, to) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterOwnershipTransferRequested' +type WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call struct { + *mock.Call +} + +// FilterOwnershipTransferRequested is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - from []common.Address +// - to []common.Address +func (_e *WorkflowRegistryInterface_Expecter) FilterOwnershipTransferRequested(opts interface{}, from interface{}, to interface{}) *WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call { + return &WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call{Call: _e.mock.On("FilterOwnershipTransferRequested", opts, from, to)} +} + +func (_c *WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call) Run(run func(opts *bind.FilterOpts, from []common.Address, to []common.Address)) *WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([]common.Address), args[2].([]common.Address)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequestedIterator, _a1 error) *WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address, []common.Address) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequestedIterator, error)) *WorkflowRegistryInterface_FilterOwnershipTransferRequested_Call { + _c.Call.Return(run) + return _c +} + +// FilterOwnershipTransferred provides a mock function with given fields: opts, from, to +func (_m *WorkflowRegistryInterface) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferredIterator, error) { + ret := _m.Called(opts, from, to) + + if len(ret) == 0 { + panic("no return value specified for FilterOwnershipTransferred") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferredIterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferredIterator, error)); ok { + return rf(opts, from, to) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address, []common.Address) *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferredIterator); ok { + r0 = rf(opts, from, to) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferredIterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address, []common.Address) error); ok { + r1 = rf(opts, from, to) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterOwnershipTransferred_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterOwnershipTransferred' +type WorkflowRegistryInterface_FilterOwnershipTransferred_Call struct { + *mock.Call +} + +// FilterOwnershipTransferred is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - from []common.Address +// - to []common.Address +func (_e *WorkflowRegistryInterface_Expecter) FilterOwnershipTransferred(opts interface{}, from interface{}, to interface{}) *WorkflowRegistryInterface_FilterOwnershipTransferred_Call { + return &WorkflowRegistryInterface_FilterOwnershipTransferred_Call{Call: _e.mock.On("FilterOwnershipTransferred", opts, from, to)} +} + +func (_c *WorkflowRegistryInterface_FilterOwnershipTransferred_Call) Run(run func(opts *bind.FilterOpts, from []common.Address, to []common.Address)) *WorkflowRegistryInterface_FilterOwnershipTransferred_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([]common.Address), args[2].([]common.Address)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterOwnershipTransferred_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferredIterator, _a1 error) *WorkflowRegistryInterface_FilterOwnershipTransferred_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterOwnershipTransferred_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address, []common.Address) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferredIterator, error)) *WorkflowRegistryInterface_FilterOwnershipTransferred_Call { + _c.Call.Return(run) + return _c +} + +// FilterRegistryLockedV1 provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) FilterRegistryLockedV1(opts *bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1Iterator, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for FilterRegistryLockedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1Iterator, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1Iterator); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterRegistryLockedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterRegistryLockedV1' +type WorkflowRegistryInterface_FilterRegistryLockedV1_Call struct { + *mock.Call +} + +// FilterRegistryLockedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +func (_e *WorkflowRegistryInterface_Expecter) FilterRegistryLockedV1(opts interface{}) *WorkflowRegistryInterface_FilterRegistryLockedV1_Call { + return &WorkflowRegistryInterface_FilterRegistryLockedV1_Call{Call: _e.mock.On("FilterRegistryLockedV1", opts)} +} + +func (_c *WorkflowRegistryInterface_FilterRegistryLockedV1_Call) Run(run func(opts *bind.FilterOpts)) *WorkflowRegistryInterface_FilterRegistryLockedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterRegistryLockedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterRegistryLockedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterRegistryLockedV1_Call) RunAndReturn(run func(*bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1Iterator, error)) *WorkflowRegistryInterface_FilterRegistryLockedV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterRegistryUnlockedV1 provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) FilterRegistryUnlockedV1(opts *bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1Iterator, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for FilterRegistryUnlockedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1Iterator, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1Iterator); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterRegistryUnlockedV1' +type WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call struct { + *mock.Call +} + +// FilterRegistryUnlockedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +func (_e *WorkflowRegistryInterface_Expecter) FilterRegistryUnlockedV1(opts interface{}) *WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call { + return &WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call{Call: _e.mock.On("FilterRegistryUnlockedV1", opts)} +} + +func (_c *WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call) Run(run func(opts *bind.FilterOpts)) *WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call) RunAndReturn(run func(*bind.FilterOpts) (*workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1Iterator, error)) *WorkflowRegistryInterface_FilterRegistryUnlockedV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterWorkflowActivatedV1 provides a mock function with given fields: opts, workflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) FilterWorkflowActivatedV1(opts *bind.FilterOpts, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1Iterator, error) { + ret := _m.Called(opts, workflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for FilterWorkflowActivatedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1Iterator, error)); ok { + return rf(opts, workflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1Iterator); ok { + r0 = rf(opts, workflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, workflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterWorkflowActivatedV1' +type WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call struct { + *mock.Call +} + +// FilterWorkflowActivatedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - workflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) FilterWorkflowActivatedV1(opts interface{}, workflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call { + return &WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call{Call: _e.mock.On("FilterWorkflowActivatedV1", opts, workflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call) Run(run func(opts *bind.FilterOpts, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([][32]byte), args[2].([]common.Address), args[3].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call) RunAndReturn(run func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1Iterator, error)) *WorkflowRegistryInterface_FilterWorkflowActivatedV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterWorkflowDeletedV1 provides a mock function with given fields: opts, workflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) FilterWorkflowDeletedV1(opts *bind.FilterOpts, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1Iterator, error) { + ret := _m.Called(opts, workflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for FilterWorkflowDeletedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1Iterator, error)); ok { + return rf(opts, workflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1Iterator); ok { + r0 = rf(opts, workflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, workflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterWorkflowDeletedV1' +type WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call struct { + *mock.Call +} + +// FilterWorkflowDeletedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - workflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) FilterWorkflowDeletedV1(opts interface{}, workflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call { + return &WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call{Call: _e.mock.On("FilterWorkflowDeletedV1", opts, workflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call) Run(run func(opts *bind.FilterOpts, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([][32]byte), args[2].([]common.Address), args[3].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call) RunAndReturn(run func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1Iterator, error)) *WorkflowRegistryInterface_FilterWorkflowDeletedV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterWorkflowForceUpdateSecretsRequestedV1 provides a mock function with given fields: opts, owner +func (_m *WorkflowRegistryInterface) FilterWorkflowForceUpdateSecretsRequestedV1(opts *bind.FilterOpts, owner []common.Address) (*workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1Iterator, error) { + ret := _m.Called(opts, owner) + + if len(ret) == 0 { + panic("no return value specified for FilterWorkflowForceUpdateSecretsRequestedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) (*workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1Iterator, error)); ok { + return rf(opts, owner) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1Iterator); ok { + r0 = rf(opts, owner) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address) error); ok { + r1 = rf(opts, owner) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterWorkflowForceUpdateSecretsRequestedV1' +type WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call struct { + *mock.Call +} + +// FilterWorkflowForceUpdateSecretsRequestedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - owner []common.Address +func (_e *WorkflowRegistryInterface_Expecter) FilterWorkflowForceUpdateSecretsRequestedV1(opts interface{}, owner interface{}) *WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call { + return &WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call{Call: _e.mock.On("FilterWorkflowForceUpdateSecretsRequestedV1", opts, owner)} +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call) Run(run func(opts *bind.FilterOpts, owner []common.Address)) *WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([]common.Address)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address) (*workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1Iterator, error)) *WorkflowRegistryInterface_FilterWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterWorkflowPausedV1 provides a mock function with given fields: opts, workflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) FilterWorkflowPausedV1(opts *bind.FilterOpts, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1Iterator, error) { + ret := _m.Called(opts, workflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for FilterWorkflowPausedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1Iterator, error)); ok { + return rf(opts, workflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1Iterator); ok { + r0 = rf(opts, workflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, workflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterWorkflowPausedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterWorkflowPausedV1' +type WorkflowRegistryInterface_FilterWorkflowPausedV1_Call struct { + *mock.Call +} + +// FilterWorkflowPausedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - workflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) FilterWorkflowPausedV1(opts interface{}, workflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_FilterWorkflowPausedV1_Call { + return &WorkflowRegistryInterface_FilterWorkflowPausedV1_Call{Call: _e.mock.On("FilterWorkflowPausedV1", opts, workflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowPausedV1_Call) Run(run func(opts *bind.FilterOpts, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_FilterWorkflowPausedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([][32]byte), args[2].([]common.Address), args[3].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowPausedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterWorkflowPausedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowPausedV1_Call) RunAndReturn(run func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1Iterator, error)) *WorkflowRegistryInterface_FilterWorkflowPausedV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterWorkflowRegisteredV1 provides a mock function with given fields: opts, workflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) FilterWorkflowRegisteredV1(opts *bind.FilterOpts, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1Iterator, error) { + ret := _m.Called(opts, workflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for FilterWorkflowRegisteredV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1Iterator, error)); ok { + return rf(opts, workflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1Iterator); ok { + r0 = rf(opts, workflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, workflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterWorkflowRegisteredV1' +type WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call struct { + *mock.Call +} + +// FilterWorkflowRegisteredV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - workflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) FilterWorkflowRegisteredV1(opts interface{}, workflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call { + return &WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call{Call: _e.mock.On("FilterWorkflowRegisteredV1", opts, workflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call) Run(run func(opts *bind.FilterOpts, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([][32]byte), args[2].([]common.Address), args[3].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call) RunAndReturn(run func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1Iterator, error)) *WorkflowRegistryInterface_FilterWorkflowRegisteredV1_Call { + _c.Call.Return(run) + return _c +} + +// FilterWorkflowUpdatedV1 provides a mock function with given fields: opts, oldWorkflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) FilterWorkflowUpdatedV1(opts *bind.FilterOpts, oldWorkflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1Iterator, error) { + ret := _m.Called(opts, oldWorkflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for FilterWorkflowUpdatedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1Iterator + var r1 error + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1Iterator, error)); ok { + return rf(opts, oldWorkflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1Iterator); ok { + r0 = rf(opts, oldWorkflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1Iterator) + } + } + + if rf, ok := ret.Get(1).(func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, oldWorkflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterWorkflowUpdatedV1' +type WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call struct { + *mock.Call +} + +// FilterWorkflowUpdatedV1 is a helper method to define mock.On call +// - opts *bind.FilterOpts +// - oldWorkflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) FilterWorkflowUpdatedV1(opts interface{}, oldWorkflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call { + return &WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call{Call: _e.mock.On("FilterWorkflowUpdatedV1", opts, oldWorkflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call) Run(run func(opts *bind.FilterOpts, oldWorkflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.FilterOpts), args[1].([][32]byte), args[2].([]common.Address), args[3].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1Iterator, _a1 error) *WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call) RunAndReturn(run func(*bind.FilterOpts, [][32]byte, []common.Address, []uint32) (*workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1Iterator, error)) *WorkflowRegistryInterface_FilterWorkflowUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// GetAllAllowedDONs provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) GetAllAllowedDONs(opts *bind.CallOpts) ([]uint32, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetAllAllowedDONs") + } + + var r0 []uint32 + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([]uint32, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) []uint32); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]uint32) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_GetAllAllowedDONs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAllAllowedDONs' +type WorkflowRegistryInterface_GetAllAllowedDONs_Call struct { + *mock.Call +} + +// GetAllAllowedDONs is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *WorkflowRegistryInterface_Expecter) GetAllAllowedDONs(opts interface{}) *WorkflowRegistryInterface_GetAllAllowedDONs_Call { + return &WorkflowRegistryInterface_GetAllAllowedDONs_Call{Call: _e.mock.On("GetAllAllowedDONs", opts)} +} + +func (_c *WorkflowRegistryInterface_GetAllAllowedDONs_Call) Run(run func(opts *bind.CallOpts)) *WorkflowRegistryInterface_GetAllAllowedDONs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_GetAllAllowedDONs_Call) Return(_a0 []uint32, _a1 error) *WorkflowRegistryInterface_GetAllAllowedDONs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_GetAllAllowedDONs_Call) RunAndReturn(run func(*bind.CallOpts) ([]uint32, error)) *WorkflowRegistryInterface_GetAllAllowedDONs_Call { + _c.Call.Return(run) + return _c +} + +// GetAllAuthorizedAddresses provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) GetAllAuthorizedAddresses(opts *bind.CallOpts) ([]common.Address, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for GetAllAuthorizedAddresses") + } + + var r0 []common.Address + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) ([]common.Address, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) []common.Address); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]common.Address) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetAllAuthorizedAddresses' +type WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call struct { + *mock.Call +} + +// GetAllAuthorizedAddresses is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *WorkflowRegistryInterface_Expecter) GetAllAuthorizedAddresses(opts interface{}) *WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call { + return &WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call{Call: _e.mock.On("GetAllAuthorizedAddresses", opts)} +} + +func (_c *WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call) Run(run func(opts *bind.CallOpts)) *WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call) Return(_a0 []common.Address, _a1 error) *WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call) RunAndReturn(run func(*bind.CallOpts) ([]common.Address, error)) *WorkflowRegistryInterface_GetAllAuthorizedAddresses_Call { + _c.Call.Return(run) + return _c +} + +// GetWorkflowMetadata provides a mock function with given fields: opts, workflowOwner, workflowName +func (_m *WorkflowRegistryInterface) GetWorkflowMetadata(opts *bind.CallOpts, workflowOwner common.Address, workflowName string) (workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error) { + ret := _m.Called(opts, workflowOwner, workflowName) + + if len(ret) == 0 { + panic("no return value specified for GetWorkflowMetadata") + } + + var r0 workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, string) (workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error)); ok { + return rf(opts, workflowOwner, workflowName) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, string) workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata); ok { + r0 = rf(opts, workflowOwner, workflowName) + } else { + r0 = ret.Get(0).(workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata) + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address, string) error); ok { + r1 = rf(opts, workflowOwner, workflowName) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_GetWorkflowMetadata_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWorkflowMetadata' +type WorkflowRegistryInterface_GetWorkflowMetadata_Call struct { + *mock.Call +} + +// GetWorkflowMetadata is a helper method to define mock.On call +// - opts *bind.CallOpts +// - workflowOwner common.Address +// - workflowName string +func (_e *WorkflowRegistryInterface_Expecter) GetWorkflowMetadata(opts interface{}, workflowOwner interface{}, workflowName interface{}) *WorkflowRegistryInterface_GetWorkflowMetadata_Call { + return &WorkflowRegistryInterface_GetWorkflowMetadata_Call{Call: _e.mock.On("GetWorkflowMetadata", opts, workflowOwner, workflowName)} +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadata_Call) Run(run func(opts *bind.CallOpts, workflowOwner common.Address, workflowName string)) *WorkflowRegistryInterface_GetWorkflowMetadata_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address), args[2].(string)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadata_Call) Return(_a0 workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, _a1 error) *WorkflowRegistryInterface_GetWorkflowMetadata_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadata_Call) RunAndReturn(run func(*bind.CallOpts, common.Address, string) (workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error)) *WorkflowRegistryInterface_GetWorkflowMetadata_Call { + _c.Call.Return(run) + return _c +} + +// GetWorkflowMetadataListByDON provides a mock function with given fields: opts, donID, start, limit +func (_m *WorkflowRegistryInterface) GetWorkflowMetadataListByDON(opts *bind.CallOpts, donID uint32, start *big.Int, limit *big.Int) ([]workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error) { + ret := _m.Called(opts, donID, start, limit) + + if len(ret) == 0 { + panic("no return value specified for GetWorkflowMetadataListByDON") + } + + var r0 []workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint32, *big.Int, *big.Int) ([]workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error)); ok { + return rf(opts, donID, start, limit) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, uint32, *big.Int, *big.Int) []workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata); ok { + r0 = rf(opts, donID, start, limit) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, uint32, *big.Int, *big.Int) error); ok { + r1 = rf(opts, donID, start, limit) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWorkflowMetadataListByDON' +type WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call struct { + *mock.Call +} + +// GetWorkflowMetadataListByDON is a helper method to define mock.On call +// - opts *bind.CallOpts +// - donID uint32 +// - start *big.Int +// - limit *big.Int +func (_e *WorkflowRegistryInterface_Expecter) GetWorkflowMetadataListByDON(opts interface{}, donID interface{}, start interface{}, limit interface{}) *WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call { + return &WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call{Call: _e.mock.On("GetWorkflowMetadataListByDON", opts, donID, start, limit)} +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call) Run(run func(opts *bind.CallOpts, donID uint32, start *big.Int, limit *big.Int)) *WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(uint32), args[2].(*big.Int), args[3].(*big.Int)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call) Return(_a0 []workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, _a1 error) *WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call) RunAndReturn(run func(*bind.CallOpts, uint32, *big.Int, *big.Int) ([]workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error)) *WorkflowRegistryInterface_GetWorkflowMetadataListByDON_Call { + _c.Call.Return(run) + return _c +} + +// GetWorkflowMetadataListByOwner provides a mock function with given fields: opts, workflowOwner, start, limit +func (_m *WorkflowRegistryInterface) GetWorkflowMetadataListByOwner(opts *bind.CallOpts, workflowOwner common.Address, start *big.Int, limit *big.Int) ([]workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error) { + ret := _m.Called(opts, workflowOwner, start, limit) + + if len(ret) == 0 { + panic("no return value specified for GetWorkflowMetadataListByOwner") + } + + var r0 []workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, *big.Int, *big.Int) ([]workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error)); ok { + return rf(opts, workflowOwner, start, limit) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts, common.Address, *big.Int, *big.Int) []workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata); ok { + r0 = rf(opts, workflowOwner, start, limit) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts, common.Address, *big.Int, *big.Int) error); ok { + r1 = rf(opts, workflowOwner, start, limit) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetWorkflowMetadataListByOwner' +type WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call struct { + *mock.Call +} + +// GetWorkflowMetadataListByOwner is a helper method to define mock.On call +// - opts *bind.CallOpts +// - workflowOwner common.Address +// - start *big.Int +// - limit *big.Int +func (_e *WorkflowRegistryInterface_Expecter) GetWorkflowMetadataListByOwner(opts interface{}, workflowOwner interface{}, start interface{}, limit interface{}) *WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call { + return &WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call{Call: _e.mock.On("GetWorkflowMetadataListByOwner", opts, workflowOwner, start, limit)} +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call) Run(run func(opts *bind.CallOpts, workflowOwner common.Address, start *big.Int, limit *big.Int)) *WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts), args[1].(common.Address), args[2].(*big.Int), args[3].(*big.Int)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call) Return(_a0 []workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, _a1 error) *WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call) RunAndReturn(run func(*bind.CallOpts, common.Address, *big.Int, *big.Int) ([]workflow_registry_wrapper.WorkflowRegistryWorkflowMetadata, error)) *WorkflowRegistryInterface_GetWorkflowMetadataListByOwner_Call { + _c.Call.Return(run) + return _c +} + +// IsRegistryLocked provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) IsRegistryLocked(opts *bind.CallOpts) (bool, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for IsRegistryLocked") + } + + var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (bool, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) bool); ok { + r0 = rf(opts) + } else { + r0 = ret.Get(0).(bool) + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_IsRegistryLocked_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'IsRegistryLocked' +type WorkflowRegistryInterface_IsRegistryLocked_Call struct { + *mock.Call +} + +// IsRegistryLocked is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *WorkflowRegistryInterface_Expecter) IsRegistryLocked(opts interface{}) *WorkflowRegistryInterface_IsRegistryLocked_Call { + return &WorkflowRegistryInterface_IsRegistryLocked_Call{Call: _e.mock.On("IsRegistryLocked", opts)} +} + +func (_c *WorkflowRegistryInterface_IsRegistryLocked_Call) Run(run func(opts *bind.CallOpts)) *WorkflowRegistryInterface_IsRegistryLocked_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_IsRegistryLocked_Call) Return(_a0 bool, _a1 error) *WorkflowRegistryInterface_IsRegistryLocked_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_IsRegistryLocked_Call) RunAndReturn(run func(*bind.CallOpts) (bool, error)) *WorkflowRegistryInterface_IsRegistryLocked_Call { + _c.Call.Return(run) + return _c +} + +// LockRegistry provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) LockRegistry(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for LockRegistry") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_LockRegistry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'LockRegistry' +type WorkflowRegistryInterface_LockRegistry_Call struct { + *mock.Call +} + +// LockRegistry is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *WorkflowRegistryInterface_Expecter) LockRegistry(opts interface{}) *WorkflowRegistryInterface_LockRegistry_Call { + return &WorkflowRegistryInterface_LockRegistry_Call{Call: _e.mock.On("LockRegistry", opts)} +} + +func (_c *WorkflowRegistryInterface_LockRegistry_Call) Run(run func(opts *bind.TransactOpts)) *WorkflowRegistryInterface_LockRegistry_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_LockRegistry_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_LockRegistry_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_LockRegistry_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *WorkflowRegistryInterface_LockRegistry_Call { + _c.Call.Return(run) + return _c +} + +// Owner provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) Owner(opts *bind.CallOpts) (common.Address, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for Owner") + } + + var r0 common.Address + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (common.Address, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) common.Address); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(common.Address) + } + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_Owner_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Owner' +type WorkflowRegistryInterface_Owner_Call struct { + *mock.Call +} + +// Owner is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *WorkflowRegistryInterface_Expecter) Owner(opts interface{}) *WorkflowRegistryInterface_Owner_Call { + return &WorkflowRegistryInterface_Owner_Call{Call: _e.mock.On("Owner", opts)} +} + +func (_c *WorkflowRegistryInterface_Owner_Call) Run(run func(opts *bind.CallOpts)) *WorkflowRegistryInterface_Owner_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_Owner_Call) Return(_a0 common.Address, _a1 error) *WorkflowRegistryInterface_Owner_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_Owner_Call) RunAndReturn(run func(*bind.CallOpts) (common.Address, error)) *WorkflowRegistryInterface_Owner_Call { + _c.Call.Return(run) + return _c +} + +// ParseAllowedDONsUpdatedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseAllowedDONsUpdatedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseAllowedDONsUpdatedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseAllowedDONsUpdatedV1' +type WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call struct { + *mock.Call +} + +// ParseAllowedDONsUpdatedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseAllowedDONsUpdatedV1(log interface{}) *WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call { + return &WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call{Call: _e.mock.On("ParseAllowedDONsUpdatedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1, _a1 error) *WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1, error)) *WorkflowRegistryInterface_ParseAllowedDONsUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseAuthorizedAddressesUpdatedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseAuthorizedAddressesUpdatedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseAuthorizedAddressesUpdatedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseAuthorizedAddressesUpdatedV1' +type WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call struct { + *mock.Call +} + +// ParseAuthorizedAddressesUpdatedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseAuthorizedAddressesUpdatedV1(log interface{}) *WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call { + return &WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call{Call: _e.mock.On("ParseAuthorizedAddressesUpdatedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1, _a1 error) *WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1, error)) *WorkflowRegistryInterface_ParseAuthorizedAddressesUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseLog provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseLog(log types.Log) (generated.AbigenLog, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseLog") + } + + var r0 generated.AbigenLog + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (generated.AbigenLog, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) generated.AbigenLog); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(generated.AbigenLog) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseLog_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseLog' +type WorkflowRegistryInterface_ParseLog_Call struct { + *mock.Call +} + +// ParseLog is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseLog(log interface{}) *WorkflowRegistryInterface_ParseLog_Call { + return &WorkflowRegistryInterface_ParseLog_Call{Call: _e.mock.On("ParseLog", log)} +} + +func (_c *WorkflowRegistryInterface_ParseLog_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseLog_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseLog_Call) Return(_a0 generated.AbigenLog, _a1 error) *WorkflowRegistryInterface_ParseLog_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseLog_Call) RunAndReturn(run func(types.Log) (generated.AbigenLog, error)) *WorkflowRegistryInterface_ParseLog_Call { + _c.Call.Return(run) + return _c +} + +// ParseOwnershipTransferRequested provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseOwnershipTransferRequested(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseOwnershipTransferRequested") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseOwnershipTransferRequested' +type WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call struct { + *mock.Call +} + +// ParseOwnershipTransferRequested is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseOwnershipTransferRequested(log interface{}) *WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call { + return &WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call{Call: _e.mock.On("ParseOwnershipTransferRequested", log)} +} + +func (_c *WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, _a1 error) *WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, error)) *WorkflowRegistryInterface_ParseOwnershipTransferRequested_Call { + _c.Call.Return(run) + return _c +} + +// ParseOwnershipTransferred provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseOwnershipTransferred(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseOwnershipTransferred") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseOwnershipTransferred_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseOwnershipTransferred' +type WorkflowRegistryInterface_ParseOwnershipTransferred_Call struct { + *mock.Call +} + +// ParseOwnershipTransferred is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseOwnershipTransferred(log interface{}) *WorkflowRegistryInterface_ParseOwnershipTransferred_Call { + return &WorkflowRegistryInterface_ParseOwnershipTransferred_Call{Call: _e.mock.On("ParseOwnershipTransferred", log)} +} + +func (_c *WorkflowRegistryInterface_ParseOwnershipTransferred_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseOwnershipTransferred_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseOwnershipTransferred_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, _a1 error) *WorkflowRegistryInterface_ParseOwnershipTransferred_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseOwnershipTransferred_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, error)) *WorkflowRegistryInterface_ParseOwnershipTransferred_Call { + _c.Call.Return(run) + return _c +} + +// ParseRegistryLockedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseRegistryLockedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseRegistryLockedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseRegistryLockedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseRegistryLockedV1' +type WorkflowRegistryInterface_ParseRegistryLockedV1_Call struct { + *mock.Call +} + +// ParseRegistryLockedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseRegistryLockedV1(log interface{}) *WorkflowRegistryInterface_ParseRegistryLockedV1_Call { + return &WorkflowRegistryInterface_ParseRegistryLockedV1_Call{Call: _e.mock.On("ParseRegistryLockedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseRegistryLockedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseRegistryLockedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseRegistryLockedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1, _a1 error) *WorkflowRegistryInterface_ParseRegistryLockedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseRegistryLockedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1, error)) *WorkflowRegistryInterface_ParseRegistryLockedV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseRegistryUnlockedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseRegistryUnlockedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseRegistryUnlockedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseRegistryUnlockedV1' +type WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call struct { + *mock.Call +} + +// ParseRegistryUnlockedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseRegistryUnlockedV1(log interface{}) *WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call { + return &WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call{Call: _e.mock.On("ParseRegistryUnlockedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1, _a1 error) *WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1, error)) *WorkflowRegistryInterface_ParseRegistryUnlockedV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseWorkflowActivatedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseWorkflowActivatedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseWorkflowActivatedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseWorkflowActivatedV1' +type WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call struct { + *mock.Call +} + +// ParseWorkflowActivatedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseWorkflowActivatedV1(log interface{}) *WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call { + return &WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call{Call: _e.mock.On("ParseWorkflowActivatedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, _a1 error) *WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, error)) *WorkflowRegistryInterface_ParseWorkflowActivatedV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseWorkflowDeletedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseWorkflowDeletedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseWorkflowDeletedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseWorkflowDeletedV1' +type WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call struct { + *mock.Call +} + +// ParseWorkflowDeletedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseWorkflowDeletedV1(log interface{}) *WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call { + return &WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call{Call: _e.mock.On("ParseWorkflowDeletedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, _a1 error) *WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, error)) *WorkflowRegistryInterface_ParseWorkflowDeletedV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseWorkflowForceUpdateSecretsRequestedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseWorkflowForceUpdateSecretsRequestedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseWorkflowForceUpdateSecretsRequestedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseWorkflowForceUpdateSecretsRequestedV1' +type WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call struct { + *mock.Call +} + +// ParseWorkflowForceUpdateSecretsRequestedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseWorkflowForceUpdateSecretsRequestedV1(log interface{}) *WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call { + return &WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call{Call: _e.mock.On("ParseWorkflowForceUpdateSecretsRequestedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, _a1 error) *WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, error)) *WorkflowRegistryInterface_ParseWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseWorkflowPausedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseWorkflowPausedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseWorkflowPausedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseWorkflowPausedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseWorkflowPausedV1' +type WorkflowRegistryInterface_ParseWorkflowPausedV1_Call struct { + *mock.Call +} + +// ParseWorkflowPausedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseWorkflowPausedV1(log interface{}) *WorkflowRegistryInterface_ParseWorkflowPausedV1_Call { + return &WorkflowRegistryInterface_ParseWorkflowPausedV1_Call{Call: _e.mock.On("ParseWorkflowPausedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowPausedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseWorkflowPausedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowPausedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, _a1 error) *WorkflowRegistryInterface_ParseWorkflowPausedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowPausedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, error)) *WorkflowRegistryInterface_ParseWorkflowPausedV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseWorkflowRegisteredV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseWorkflowRegisteredV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseWorkflowRegisteredV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseWorkflowRegisteredV1' +type WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call struct { + *mock.Call +} + +// ParseWorkflowRegisteredV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseWorkflowRegisteredV1(log interface{}) *WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call { + return &WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call{Call: _e.mock.On("ParseWorkflowRegisteredV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, _a1 error) *WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, error)) *WorkflowRegistryInterface_ParseWorkflowRegisteredV1_Call { + _c.Call.Return(run) + return _c +} + +// ParseWorkflowUpdatedV1 provides a mock function with given fields: log +func (_m *WorkflowRegistryInterface) ParseWorkflowUpdatedV1(log types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, error) { + ret := _m.Called(log) + + if len(ret) == 0 { + panic("no return value specified for ParseWorkflowUpdatedV1") + } + + var r0 *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1 + var r1 error + if rf, ok := ret.Get(0).(func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, error)); ok { + return rf(log) + } + if rf, ok := ret.Get(0).(func(types.Log) *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1); ok { + r0 = rf(log) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1) + } + } + + if rf, ok := ret.Get(1).(func(types.Log) error); ok { + r1 = rf(log) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseWorkflowUpdatedV1' +type WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call struct { + *mock.Call +} + +// ParseWorkflowUpdatedV1 is a helper method to define mock.On call +// - log types.Log +func (_e *WorkflowRegistryInterface_Expecter) ParseWorkflowUpdatedV1(log interface{}) *WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call { + return &WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call{Call: _e.mock.On("ParseWorkflowUpdatedV1", log)} +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call) Run(run func(log types.Log)) *WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(types.Log)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call) Return(_a0 *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, _a1 error) *WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call) RunAndReturn(run func(types.Log) (*workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, error)) *WorkflowRegistryInterface_ParseWorkflowUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// PauseWorkflow provides a mock function with given fields: opts, workflowKey +func (_m *WorkflowRegistryInterface) PauseWorkflow(opts *bind.TransactOpts, workflowKey [32]byte) (*types.Transaction, error) { + ret := _m.Called(opts, workflowKey) + + if len(ret) == 0 { + panic("no return value specified for PauseWorkflow") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte) (*types.Transaction, error)); ok { + return rf(opts, workflowKey) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte) *types.Transaction); ok { + r0 = rf(opts, workflowKey) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, [32]byte) error); ok { + r1 = rf(opts, workflowKey) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_PauseWorkflow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'PauseWorkflow' +type WorkflowRegistryInterface_PauseWorkflow_Call struct { + *mock.Call +} + +// PauseWorkflow is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - workflowKey [32]byte +func (_e *WorkflowRegistryInterface_Expecter) PauseWorkflow(opts interface{}, workflowKey interface{}) *WorkflowRegistryInterface_PauseWorkflow_Call { + return &WorkflowRegistryInterface_PauseWorkflow_Call{Call: _e.mock.On("PauseWorkflow", opts, workflowKey)} +} + +func (_c *WorkflowRegistryInterface_PauseWorkflow_Call) Run(run func(opts *bind.TransactOpts, workflowKey [32]byte)) *WorkflowRegistryInterface_PauseWorkflow_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([32]byte)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_PauseWorkflow_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_PauseWorkflow_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_PauseWorkflow_Call) RunAndReturn(run func(*bind.TransactOpts, [32]byte) (*types.Transaction, error)) *WorkflowRegistryInterface_PauseWorkflow_Call { + _c.Call.Return(run) + return _c +} + +// RegisterWorkflow provides a mock function with given fields: opts, workflowName, workflowID, donID, status, binaryURL, configURL, secretsURL +func (_m *WorkflowRegistryInterface) RegisterWorkflow(opts *bind.TransactOpts, workflowName string, workflowID [32]byte, donID uint32, status uint8, binaryURL string, configURL string, secretsURL string) (*types.Transaction, error) { + ret := _m.Called(opts, workflowName, workflowID, donID, status, binaryURL, configURL, secretsURL) + + if len(ret) == 0 { + panic("no return value specified for RegisterWorkflow") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, string, [32]byte, uint32, uint8, string, string, string) (*types.Transaction, error)); ok { + return rf(opts, workflowName, workflowID, donID, status, binaryURL, configURL, secretsURL) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, string, [32]byte, uint32, uint8, string, string, string) *types.Transaction); ok { + r0 = rf(opts, workflowName, workflowID, donID, status, binaryURL, configURL, secretsURL) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, string, [32]byte, uint32, uint8, string, string, string) error); ok { + r1 = rf(opts, workflowName, workflowID, donID, status, binaryURL, configURL, secretsURL) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_RegisterWorkflow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RegisterWorkflow' +type WorkflowRegistryInterface_RegisterWorkflow_Call struct { + *mock.Call +} + +// RegisterWorkflow is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - workflowName string +// - workflowID [32]byte +// - donID uint32 +// - status uint8 +// - binaryURL string +// - configURL string +// - secretsURL string +func (_e *WorkflowRegistryInterface_Expecter) RegisterWorkflow(opts interface{}, workflowName interface{}, workflowID interface{}, donID interface{}, status interface{}, binaryURL interface{}, configURL interface{}, secretsURL interface{}) *WorkflowRegistryInterface_RegisterWorkflow_Call { + return &WorkflowRegistryInterface_RegisterWorkflow_Call{Call: _e.mock.On("RegisterWorkflow", opts, workflowName, workflowID, donID, status, binaryURL, configURL, secretsURL)} +} + +func (_c *WorkflowRegistryInterface_RegisterWorkflow_Call) Run(run func(opts *bind.TransactOpts, workflowName string, workflowID [32]byte, donID uint32, status uint8, binaryURL string, configURL string, secretsURL string)) *WorkflowRegistryInterface_RegisterWorkflow_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(string), args[2].([32]byte), args[3].(uint32), args[4].(uint8), args[5].(string), args[6].(string), args[7].(string)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_RegisterWorkflow_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_RegisterWorkflow_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_RegisterWorkflow_Call) RunAndReturn(run func(*bind.TransactOpts, string, [32]byte, uint32, uint8, string, string, string) (*types.Transaction, error)) *WorkflowRegistryInterface_RegisterWorkflow_Call { + _c.Call.Return(run) + return _c +} + +// RequestForceUpdateSecrets provides a mock function with given fields: opts, secretsURL +func (_m *WorkflowRegistryInterface) RequestForceUpdateSecrets(opts *bind.TransactOpts, secretsURL string) (*types.Transaction, error) { + ret := _m.Called(opts, secretsURL) + + if len(ret) == 0 { + panic("no return value specified for RequestForceUpdateSecrets") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, string) (*types.Transaction, error)); ok { + return rf(opts, secretsURL) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, string) *types.Transaction); ok { + r0 = rf(opts, secretsURL) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, string) error); ok { + r1 = rf(opts, secretsURL) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_RequestForceUpdateSecrets_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'RequestForceUpdateSecrets' +type WorkflowRegistryInterface_RequestForceUpdateSecrets_Call struct { + *mock.Call +} + +// RequestForceUpdateSecrets is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - secretsURL string +func (_e *WorkflowRegistryInterface_Expecter) RequestForceUpdateSecrets(opts interface{}, secretsURL interface{}) *WorkflowRegistryInterface_RequestForceUpdateSecrets_Call { + return &WorkflowRegistryInterface_RequestForceUpdateSecrets_Call{Call: _e.mock.On("RequestForceUpdateSecrets", opts, secretsURL)} +} + +func (_c *WorkflowRegistryInterface_RequestForceUpdateSecrets_Call) Run(run func(opts *bind.TransactOpts, secretsURL string)) *WorkflowRegistryInterface_RequestForceUpdateSecrets_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(string)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_RequestForceUpdateSecrets_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_RequestForceUpdateSecrets_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_RequestForceUpdateSecrets_Call) RunAndReturn(run func(*bind.TransactOpts, string) (*types.Transaction, error)) *WorkflowRegistryInterface_RequestForceUpdateSecrets_Call { + _c.Call.Return(run) + return _c +} + +// TransferOwnership provides a mock function with given fields: opts, to +func (_m *WorkflowRegistryInterface) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + ret := _m.Called(opts, to) + + if len(ret) == 0 { + panic("no return value specified for TransferOwnership") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, common.Address) (*types.Transaction, error)); ok { + return rf(opts, to) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, common.Address) *types.Transaction); ok { + r0 = rf(opts, to) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, common.Address) error); ok { + r1 = rf(opts, to) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_TransferOwnership_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TransferOwnership' +type WorkflowRegistryInterface_TransferOwnership_Call struct { + *mock.Call +} + +// TransferOwnership is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - to common.Address +func (_e *WorkflowRegistryInterface_Expecter) TransferOwnership(opts interface{}, to interface{}) *WorkflowRegistryInterface_TransferOwnership_Call { + return &WorkflowRegistryInterface_TransferOwnership_Call{Call: _e.mock.On("TransferOwnership", opts, to)} +} + +func (_c *WorkflowRegistryInterface_TransferOwnership_Call) Run(run func(opts *bind.TransactOpts, to common.Address)) *WorkflowRegistryInterface_TransferOwnership_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].(common.Address)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_TransferOwnership_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_TransferOwnership_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_TransferOwnership_Call) RunAndReturn(run func(*bind.TransactOpts, common.Address) (*types.Transaction, error)) *WorkflowRegistryInterface_TransferOwnership_Call { + _c.Call.Return(run) + return _c +} + +// TypeAndVersion provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) TypeAndVersion(opts *bind.CallOpts) (string, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for TypeAndVersion") + } + + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(*bind.CallOpts) (string, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.CallOpts) string); ok { + r0 = rf(opts) + } else { + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(*bind.CallOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_TypeAndVersion_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'TypeAndVersion' +type WorkflowRegistryInterface_TypeAndVersion_Call struct { + *mock.Call +} + +// TypeAndVersion is a helper method to define mock.On call +// - opts *bind.CallOpts +func (_e *WorkflowRegistryInterface_Expecter) TypeAndVersion(opts interface{}) *WorkflowRegistryInterface_TypeAndVersion_Call { + return &WorkflowRegistryInterface_TypeAndVersion_Call{Call: _e.mock.On("TypeAndVersion", opts)} +} + +func (_c *WorkflowRegistryInterface_TypeAndVersion_Call) Run(run func(opts *bind.CallOpts)) *WorkflowRegistryInterface_TypeAndVersion_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.CallOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_TypeAndVersion_Call) Return(_a0 string, _a1 error) *WorkflowRegistryInterface_TypeAndVersion_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_TypeAndVersion_Call) RunAndReturn(run func(*bind.CallOpts) (string, error)) *WorkflowRegistryInterface_TypeAndVersion_Call { + _c.Call.Return(run) + return _c +} + +// UnlockRegistry provides a mock function with given fields: opts +func (_m *WorkflowRegistryInterface) UnlockRegistry(opts *bind.TransactOpts) (*types.Transaction, error) { + ret := _m.Called(opts) + + if len(ret) == 0 { + panic("no return value specified for UnlockRegistry") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) (*types.Transaction, error)); ok { + return rf(opts) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts) *types.Transaction); ok { + r0 = rf(opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts) error); ok { + r1 = rf(opts) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_UnlockRegistry_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UnlockRegistry' +type WorkflowRegistryInterface_UnlockRegistry_Call struct { + *mock.Call +} + +// UnlockRegistry is a helper method to define mock.On call +// - opts *bind.TransactOpts +func (_e *WorkflowRegistryInterface_Expecter) UnlockRegistry(opts interface{}) *WorkflowRegistryInterface_UnlockRegistry_Call { + return &WorkflowRegistryInterface_UnlockRegistry_Call{Call: _e.mock.On("UnlockRegistry", opts)} +} + +func (_c *WorkflowRegistryInterface_UnlockRegistry_Call) Run(run func(opts *bind.TransactOpts)) *WorkflowRegistryInterface_UnlockRegistry_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_UnlockRegistry_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_UnlockRegistry_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_UnlockRegistry_Call) RunAndReturn(run func(*bind.TransactOpts) (*types.Transaction, error)) *WorkflowRegistryInterface_UnlockRegistry_Call { + _c.Call.Return(run) + return _c +} + +// UpdateAllowedDONs provides a mock function with given fields: opts, donIDs, allowed +func (_m *WorkflowRegistryInterface) UpdateAllowedDONs(opts *bind.TransactOpts, donIDs []uint32, allowed bool) (*types.Transaction, error) { + ret := _m.Called(opts, donIDs, allowed) + + if len(ret) == 0 { + panic("no return value specified for UpdateAllowedDONs") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []uint32, bool) (*types.Transaction, error)); ok { + return rf(opts, donIDs, allowed) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []uint32, bool) *types.Transaction); ok { + r0 = rf(opts, donIDs, allowed) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []uint32, bool) error); ok { + r1 = rf(opts, donIDs, allowed) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_UpdateAllowedDONs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateAllowedDONs' +type WorkflowRegistryInterface_UpdateAllowedDONs_Call struct { + *mock.Call +} + +// UpdateAllowedDONs is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - donIDs []uint32 +// - allowed bool +func (_e *WorkflowRegistryInterface_Expecter) UpdateAllowedDONs(opts interface{}, donIDs interface{}, allowed interface{}) *WorkflowRegistryInterface_UpdateAllowedDONs_Call { + return &WorkflowRegistryInterface_UpdateAllowedDONs_Call{Call: _e.mock.On("UpdateAllowedDONs", opts, donIDs, allowed)} +} + +func (_c *WorkflowRegistryInterface_UpdateAllowedDONs_Call) Run(run func(opts *bind.TransactOpts, donIDs []uint32, allowed bool)) *WorkflowRegistryInterface_UpdateAllowedDONs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([]uint32), args[2].(bool)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_UpdateAllowedDONs_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_UpdateAllowedDONs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_UpdateAllowedDONs_Call) RunAndReturn(run func(*bind.TransactOpts, []uint32, bool) (*types.Transaction, error)) *WorkflowRegistryInterface_UpdateAllowedDONs_Call { + _c.Call.Return(run) + return _c +} + +// UpdateAuthorizedAddresses provides a mock function with given fields: opts, addresses, allowed +func (_m *WorkflowRegistryInterface) UpdateAuthorizedAddresses(opts *bind.TransactOpts, addresses []common.Address, allowed bool) (*types.Transaction, error) { + ret := _m.Called(opts, addresses, allowed) + + if len(ret) == 0 { + panic("no return value specified for UpdateAuthorizedAddresses") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address, bool) (*types.Transaction, error)); ok { + return rf(opts, addresses, allowed) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, []common.Address, bool) *types.Transaction); ok { + r0 = rf(opts, addresses, allowed) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, []common.Address, bool) error); ok { + r1 = rf(opts, addresses, allowed) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateAuthorizedAddresses' +type WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call struct { + *mock.Call +} + +// UpdateAuthorizedAddresses is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - addresses []common.Address +// - allowed bool +func (_e *WorkflowRegistryInterface_Expecter) UpdateAuthorizedAddresses(opts interface{}, addresses interface{}, allowed interface{}) *WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call { + return &WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call{Call: _e.mock.On("UpdateAuthorizedAddresses", opts, addresses, allowed)} +} + +func (_c *WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call) Run(run func(opts *bind.TransactOpts, addresses []common.Address, allowed bool)) *WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([]common.Address), args[2].(bool)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call) RunAndReturn(run func(*bind.TransactOpts, []common.Address, bool) (*types.Transaction, error)) *WorkflowRegistryInterface_UpdateAuthorizedAddresses_Call { + _c.Call.Return(run) + return _c +} + +// UpdateWorkflow provides a mock function with given fields: opts, workflowKey, newWorkflowID, binaryURL, configURL, secretsURL +func (_m *WorkflowRegistryInterface) UpdateWorkflow(opts *bind.TransactOpts, workflowKey [32]byte, newWorkflowID [32]byte, binaryURL string, configURL string, secretsURL string) (*types.Transaction, error) { + ret := _m.Called(opts, workflowKey, newWorkflowID, binaryURL, configURL, secretsURL) + + if len(ret) == 0 { + panic("no return value specified for UpdateWorkflow") + } + + var r0 *types.Transaction + var r1 error + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte, [32]byte, string, string, string) (*types.Transaction, error)); ok { + return rf(opts, workflowKey, newWorkflowID, binaryURL, configURL, secretsURL) + } + if rf, ok := ret.Get(0).(func(*bind.TransactOpts, [32]byte, [32]byte, string, string, string) *types.Transaction); ok { + r0 = rf(opts, workflowKey, newWorkflowID, binaryURL, configURL, secretsURL) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*types.Transaction) + } + } + + if rf, ok := ret.Get(1).(func(*bind.TransactOpts, [32]byte, [32]byte, string, string, string) error); ok { + r1 = rf(opts, workflowKey, newWorkflowID, binaryURL, configURL, secretsURL) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_UpdateWorkflow_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'UpdateWorkflow' +type WorkflowRegistryInterface_UpdateWorkflow_Call struct { + *mock.Call +} + +// UpdateWorkflow is a helper method to define mock.On call +// - opts *bind.TransactOpts +// - workflowKey [32]byte +// - newWorkflowID [32]byte +// - binaryURL string +// - configURL string +// - secretsURL string +func (_e *WorkflowRegistryInterface_Expecter) UpdateWorkflow(opts interface{}, workflowKey interface{}, newWorkflowID interface{}, binaryURL interface{}, configURL interface{}, secretsURL interface{}) *WorkflowRegistryInterface_UpdateWorkflow_Call { + return &WorkflowRegistryInterface_UpdateWorkflow_Call{Call: _e.mock.On("UpdateWorkflow", opts, workflowKey, newWorkflowID, binaryURL, configURL, secretsURL)} +} + +func (_c *WorkflowRegistryInterface_UpdateWorkflow_Call) Run(run func(opts *bind.TransactOpts, workflowKey [32]byte, newWorkflowID [32]byte, binaryURL string, configURL string, secretsURL string)) *WorkflowRegistryInterface_UpdateWorkflow_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.TransactOpts), args[1].([32]byte), args[2].([32]byte), args[3].(string), args[4].(string), args[5].(string)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_UpdateWorkflow_Call) Return(_a0 *types.Transaction, _a1 error) *WorkflowRegistryInterface_UpdateWorkflow_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_UpdateWorkflow_Call) RunAndReturn(run func(*bind.TransactOpts, [32]byte, [32]byte, string, string, string) (*types.Transaction, error)) *WorkflowRegistryInterface_UpdateWorkflow_Call { + _c.Call.Return(run) + return _c +} + +// WatchAllowedDONsUpdatedV1 provides a mock function with given fields: opts, sink +func (_m *WorkflowRegistryInterface) WatchAllowedDONsUpdatedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1) (event.Subscription, error) { + ret := _m.Called(opts, sink) + + if len(ret) == 0 { + panic("no return value specified for WatchAllowedDONsUpdatedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1) (event.Subscription, error)); ok { + return rf(opts, sink) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1) event.Subscription); ok { + r0 = rf(opts, sink) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1) error); ok { + r1 = rf(opts, sink) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchAllowedDONsUpdatedV1' +type WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call struct { + *mock.Call +} + +// WatchAllowedDONsUpdatedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1 +func (_e *WorkflowRegistryInterface_Expecter) WatchAllowedDONsUpdatedV1(opts interface{}, sink interface{}) *WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call { + return &WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call{Call: _e.mock.On("WatchAllowedDONsUpdatedV1", opts, sink)} +} + +func (_c *WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1)) *WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryAllowedDONsUpdatedV1) (event.Subscription, error)) *WorkflowRegistryInterface_WatchAllowedDONsUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchAuthorizedAddressesUpdatedV1 provides a mock function with given fields: opts, sink +func (_m *WorkflowRegistryInterface) WatchAuthorizedAddressesUpdatedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1) (event.Subscription, error) { + ret := _m.Called(opts, sink) + + if len(ret) == 0 { + panic("no return value specified for WatchAuthorizedAddressesUpdatedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1) (event.Subscription, error)); ok { + return rf(opts, sink) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1) event.Subscription); ok { + r0 = rf(opts, sink) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1) error); ok { + r1 = rf(opts, sink) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchAuthorizedAddressesUpdatedV1' +type WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call struct { + *mock.Call +} + +// WatchAuthorizedAddressesUpdatedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1 +func (_e *WorkflowRegistryInterface_Expecter) WatchAuthorizedAddressesUpdatedV1(opts interface{}, sink interface{}) *WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call { + return &WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call{Call: _e.mock.On("WatchAuthorizedAddressesUpdatedV1", opts, sink)} +} + +func (_c *WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1)) *WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryAuthorizedAddressesUpdatedV1) (event.Subscription, error)) *WorkflowRegistryInterface_WatchAuthorizedAddressesUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchOwnershipTransferRequested provides a mock function with given fields: opts, sink, from, to +func (_m *WorkflowRegistryInterface) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { + ret := _m.Called(opts, sink, from, to) + + if len(ret) == 0 { + panic("no return value specified for WatchOwnershipTransferRequested") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, []common.Address, []common.Address) (event.Subscription, error)); ok { + return rf(opts, sink, from, to) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, []common.Address, []common.Address) event.Subscription); ok { + r0 = rf(opts, sink, from, to) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, []common.Address, []common.Address) error); ok { + r1 = rf(opts, sink, from, to) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchOwnershipTransferRequested' +type WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call struct { + *mock.Call +} + +// WatchOwnershipTransferRequested is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested +// - from []common.Address +// - to []common.Address +func (_e *WorkflowRegistryInterface_Expecter) WatchOwnershipTransferRequested(opts interface{}, sink interface{}, from interface{}, to interface{}) *WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call { + return &WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call{Call: _e.mock.On("WatchOwnershipTransferRequested", opts, sink, from, to)} +} + +func (_c *WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, from []common.Address, to []common.Address)) *WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested), args[2].([]common.Address), args[3].([]common.Address)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferRequested, []common.Address, []common.Address) (event.Subscription, error)) *WorkflowRegistryInterface_WatchOwnershipTransferRequested_Call { + _c.Call.Return(run) + return _c +} + +// WatchOwnershipTransferred provides a mock function with given fields: opts, sink, from, to +func (_m *WorkflowRegistryInterface) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { + ret := _m.Called(opts, sink, from, to) + + if len(ret) == 0 { + panic("no return value specified for WatchOwnershipTransferred") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, []common.Address, []common.Address) (event.Subscription, error)); ok { + return rf(opts, sink, from, to) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, []common.Address, []common.Address) event.Subscription); ok { + r0 = rf(opts, sink, from, to) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, []common.Address, []common.Address) error); ok { + r1 = rf(opts, sink, from, to) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchOwnershipTransferred_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchOwnershipTransferred' +type WorkflowRegistryInterface_WatchOwnershipTransferred_Call struct { + *mock.Call +} + +// WatchOwnershipTransferred is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred +// - from []common.Address +// - to []common.Address +func (_e *WorkflowRegistryInterface_Expecter) WatchOwnershipTransferred(opts interface{}, sink interface{}, from interface{}, to interface{}) *WorkflowRegistryInterface_WatchOwnershipTransferred_Call { + return &WorkflowRegistryInterface_WatchOwnershipTransferred_Call{Call: _e.mock.On("WatchOwnershipTransferred", opts, sink, from, to)} +} + +func (_c *WorkflowRegistryInterface_WatchOwnershipTransferred_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, from []common.Address, to []common.Address)) *WorkflowRegistryInterface_WatchOwnershipTransferred_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred), args[2].([]common.Address), args[3].([]common.Address)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchOwnershipTransferred_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchOwnershipTransferred_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchOwnershipTransferred_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryOwnershipTransferred, []common.Address, []common.Address) (event.Subscription, error)) *WorkflowRegistryInterface_WatchOwnershipTransferred_Call { + _c.Call.Return(run) + return _c +} + +// WatchRegistryLockedV1 provides a mock function with given fields: opts, sink +func (_m *WorkflowRegistryInterface) WatchRegistryLockedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1) (event.Subscription, error) { + ret := _m.Called(opts, sink) + + if len(ret) == 0 { + panic("no return value specified for WatchRegistryLockedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1) (event.Subscription, error)); ok { + return rf(opts, sink) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1) event.Subscription); ok { + r0 = rf(opts, sink) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1) error); ok { + r1 = rf(opts, sink) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchRegistryLockedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchRegistryLockedV1' +type WorkflowRegistryInterface_WatchRegistryLockedV1_Call struct { + *mock.Call +} + +// WatchRegistryLockedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1 +func (_e *WorkflowRegistryInterface_Expecter) WatchRegistryLockedV1(opts interface{}, sink interface{}) *WorkflowRegistryInterface_WatchRegistryLockedV1_Call { + return &WorkflowRegistryInterface_WatchRegistryLockedV1_Call{Call: _e.mock.On("WatchRegistryLockedV1", opts, sink)} +} + +func (_c *WorkflowRegistryInterface_WatchRegistryLockedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1)) *WorkflowRegistryInterface_WatchRegistryLockedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchRegistryLockedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchRegistryLockedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchRegistryLockedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryLockedV1) (event.Subscription, error)) *WorkflowRegistryInterface_WatchRegistryLockedV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchRegistryUnlockedV1 provides a mock function with given fields: opts, sink +func (_m *WorkflowRegistryInterface) WatchRegistryUnlockedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1) (event.Subscription, error) { + ret := _m.Called(opts, sink) + + if len(ret) == 0 { + panic("no return value specified for WatchRegistryUnlockedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1) (event.Subscription, error)); ok { + return rf(opts, sink) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1) event.Subscription); ok { + r0 = rf(opts, sink) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1) error); ok { + r1 = rf(opts, sink) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchRegistryUnlockedV1' +type WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call struct { + *mock.Call +} + +// WatchRegistryUnlockedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1 +func (_e *WorkflowRegistryInterface_Expecter) WatchRegistryUnlockedV1(opts interface{}, sink interface{}) *WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call { + return &WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call{Call: _e.mock.On("WatchRegistryUnlockedV1", opts, sink)} +} + +func (_c *WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1)) *WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryRegistryUnlockedV1) (event.Subscription, error)) *WorkflowRegistryInterface_WatchRegistryUnlockedV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchWorkflowActivatedV1 provides a mock function with given fields: opts, sink, workflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) WatchWorkflowActivatedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (event.Subscription, error) { + ret := _m.Called(opts, sink, workflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for WatchWorkflowActivatedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)); ok { + return rf(opts, sink, workflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, [][32]byte, []common.Address, []uint32) event.Subscription); ok { + r0 = rf(opts, sink, workflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, sink, workflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchWorkflowActivatedV1' +type WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call struct { + *mock.Call +} + +// WatchWorkflowActivatedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1 +// - workflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) WatchWorkflowActivatedV1(opts interface{}, sink interface{}, workflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call { + return &WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call{Call: _e.mock.On("WatchWorkflowActivatedV1", opts, sink, workflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1), args[2].([][32]byte), args[3].([]common.Address), args[4].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowActivatedV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)) *WorkflowRegistryInterface_WatchWorkflowActivatedV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchWorkflowDeletedV1 provides a mock function with given fields: opts, sink, workflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) WatchWorkflowDeletedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (event.Subscription, error) { + ret := _m.Called(opts, sink, workflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for WatchWorkflowDeletedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)); ok { + return rf(opts, sink, workflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, [][32]byte, []common.Address, []uint32) event.Subscription); ok { + r0 = rf(opts, sink, workflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, sink, workflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchWorkflowDeletedV1' +type WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call struct { + *mock.Call +} + +// WatchWorkflowDeletedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1 +// - workflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) WatchWorkflowDeletedV1(opts interface{}, sink interface{}, workflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call { + return &WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call{Call: _e.mock.On("WatchWorkflowDeletedV1", opts, sink, workflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1), args[2].([][32]byte), args[3].([]common.Address), args[4].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowDeletedV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)) *WorkflowRegistryInterface_WatchWorkflowDeletedV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchWorkflowForceUpdateSecretsRequestedV1 provides a mock function with given fields: opts, sink, owner +func (_m *WorkflowRegistryInterface) WatchWorkflowForceUpdateSecretsRequestedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, owner []common.Address) (event.Subscription, error) { + ret := _m.Called(opts, sink, owner) + + if len(ret) == 0 { + panic("no return value specified for WatchWorkflowForceUpdateSecretsRequestedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, []common.Address) (event.Subscription, error)); ok { + return rf(opts, sink, owner) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, []common.Address) event.Subscription); ok { + r0 = rf(opts, sink, owner) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, []common.Address) error); ok { + r1 = rf(opts, sink, owner) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchWorkflowForceUpdateSecretsRequestedV1' +type WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call struct { + *mock.Call +} + +// WatchWorkflowForceUpdateSecretsRequestedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1 +// - owner []common.Address +func (_e *WorkflowRegistryInterface_Expecter) WatchWorkflowForceUpdateSecretsRequestedV1(opts interface{}, sink interface{}, owner interface{}) *WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call { + return &WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call{Call: _e.mock.On("WatchWorkflowForceUpdateSecretsRequestedV1", opts, sink, owner)} +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, owner []common.Address)) *WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1), args[2].([]common.Address)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowForceUpdateSecretsRequestedV1, []common.Address) (event.Subscription, error)) *WorkflowRegistryInterface_WatchWorkflowForceUpdateSecretsRequestedV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchWorkflowPausedV1 provides a mock function with given fields: opts, sink, workflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) WatchWorkflowPausedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (event.Subscription, error) { + ret := _m.Called(opts, sink, workflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for WatchWorkflowPausedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)); ok { + return rf(opts, sink, workflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, [][32]byte, []common.Address, []uint32) event.Subscription); ok { + r0 = rf(opts, sink, workflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, sink, workflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchWorkflowPausedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchWorkflowPausedV1' +type WorkflowRegistryInterface_WatchWorkflowPausedV1_Call struct { + *mock.Call +} + +// WatchWorkflowPausedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1 +// - workflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) WatchWorkflowPausedV1(opts interface{}, sink interface{}, workflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_WatchWorkflowPausedV1_Call { + return &WorkflowRegistryInterface_WatchWorkflowPausedV1_Call{Call: _e.mock.On("WatchWorkflowPausedV1", opts, sink, workflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowPausedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_WatchWorkflowPausedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1), args[2].([][32]byte), args[3].([]common.Address), args[4].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowPausedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchWorkflowPausedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowPausedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowPausedV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)) *WorkflowRegistryInterface_WatchWorkflowPausedV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchWorkflowRegisteredV1 provides a mock function with given fields: opts, sink, workflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) WatchWorkflowRegisteredV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (event.Subscription, error) { + ret := _m.Called(opts, sink, workflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for WatchWorkflowRegisteredV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)); ok { + return rf(opts, sink, workflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, [][32]byte, []common.Address, []uint32) event.Subscription); ok { + r0 = rf(opts, sink, workflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, sink, workflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchWorkflowRegisteredV1' +type WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call struct { + *mock.Call +} + +// WatchWorkflowRegisteredV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1 +// - workflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) WatchWorkflowRegisteredV1(opts interface{}, sink interface{}, workflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call { + return &WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call{Call: _e.mock.On("WatchWorkflowRegisteredV1", opts, sink, workflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, workflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1), args[2].([][32]byte), args[3].([]common.Address), args[4].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowRegisteredV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)) *WorkflowRegistryInterface_WatchWorkflowRegisteredV1_Call { + _c.Call.Return(run) + return _c +} + +// WatchWorkflowUpdatedV1 provides a mock function with given fields: opts, sink, oldWorkflowID, workflowOwner, donID +func (_m *WorkflowRegistryInterface) WatchWorkflowUpdatedV1(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, oldWorkflowID [][32]byte, workflowOwner []common.Address, donID []uint32) (event.Subscription, error) { + ret := _m.Called(opts, sink, oldWorkflowID, workflowOwner, donID) + + if len(ret) == 0 { + panic("no return value specified for WatchWorkflowUpdatedV1") + } + + var r0 event.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)); ok { + return rf(opts, sink, oldWorkflowID, workflowOwner, donID) + } + if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, [][32]byte, []common.Address, []uint32) event.Subscription); ok { + r0 = rf(opts, sink, oldWorkflowID, workflowOwner, donID) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(event.Subscription) + } + } + + if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, [][32]byte, []common.Address, []uint32) error); ok { + r1 = rf(opts, sink, oldWorkflowID, workflowOwner, donID) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchWorkflowUpdatedV1' +type WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call struct { + *mock.Call +} + +// WatchWorkflowUpdatedV1 is a helper method to define mock.On call +// - opts *bind.WatchOpts +// - sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1 +// - oldWorkflowID [][32]byte +// - workflowOwner []common.Address +// - donID []uint32 +func (_e *WorkflowRegistryInterface_Expecter) WatchWorkflowUpdatedV1(opts interface{}, sink interface{}, oldWorkflowID interface{}, workflowOwner interface{}, donID interface{}) *WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call { + return &WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call{Call: _e.mock.On("WatchWorkflowUpdatedV1", opts, sink, oldWorkflowID, workflowOwner, donID)} +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, oldWorkflowID [][32]byte, workflowOwner []common.Address, donID []uint32)) *WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(*bind.WatchOpts), args[1].(chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1), args[2].([][32]byte), args[3].([]common.Address), args[4].([]uint32)) + }) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call) Return(_a0 event.Subscription, _a1 error) *WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *workflow_registry_wrapper.WorkflowRegistryWorkflowUpdatedV1, [][32]byte, []common.Address, []uint32) (event.Subscription, error)) *WorkflowRegistryInterface_WatchWorkflowUpdatedV1_Call { + _c.Call.Return(run) + return _c +} + +// NewWorkflowRegistryInterface creates a new instance of WorkflowRegistryInterface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewWorkflowRegistryInterface(t interface { + mock.TestingT + Cleanup(func()) +}) *WorkflowRegistryInterface { + mock := &WorkflowRegistryInterface{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/deployment/common/view/v1_0/workflowreg.go b/deployment/common/view/v1_0/workflowreg.go new file mode 100644 index 00000000000..8c4aa49cd0a --- /dev/null +++ b/deployment/common/view/v1_0/workflowreg.go @@ -0,0 +1,198 @@ +package v1_0 + +import ( + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + + "github.com/smartcontractkit/chainlink/deployment/common/view/types" + workflow_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" +) + +type WorkflowStatus uint8 + +const ( + WorkflowStatusActive WorkflowStatus = iota + WorkflowStatusPaused +) + +// WorkflowRegistryView is a high-fidelity view of the workflow registry contract. +type WorkflowRegistryView struct { + types.ContractMetaData + Workflows []WorkflowView `json:"workflows,omitempty"` + AuthorizedAddresses []common.Address `json:"authorized_addresses,omitempty"` + AllowedDONs []uint32 `json:"allowed_dons,omitempty"` + IsRegistryLocked bool `json:"is_registry_locked"` +} + +type WorkflowView struct { + WorkflowID string `json:"workflow_id"` // bytes32 stored as hex string (64 hex chars) + Owner common.Address `json:"owner"` + DonID uint32 `json:"don_id"` + Status WorkflowStatus `json:"status"` + WorkflowName string `json:"workflow_name"` + BinaryURL string `json:"binary_url"` + ConfigURL string `json:"config_url,omitempty"` + SecretsURL string `json:"secrets_url,omitempty"` +} + +func (ws WorkflowStatus) String() string { + switch ws { + case WorkflowStatusActive: + return "ACTIVE" + case WorkflowStatusPaused: + return "PAUSED" + default: + return fmt.Sprintf("UNKNOWN(%d)", ws) + } +} + +func (ws WorkflowStatus) MarshalJSON() ([]byte, error) { + return json.Marshal(ws.String()) +} + +func (ws *WorkflowStatus) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return err + } + + switch s { + case "ACTIVE": + *ws = WorkflowStatusActive + case "PAUSED": + *ws = WorkflowStatusPaused + default: + return fmt.Errorf("invalid WorkflowStatus value: %q", s) + } + return nil +} + +// WorkflowRegistryError is a custom error type for errors that occur while building the workflow registry view. +type WorkflowRegistryError struct { + Operation string + Err error +} + +func (e *WorkflowRegistryError) Error() string { + return fmt.Sprintf("%s: %v", e.Operation, e.Err) +} + +func (e *WorkflowRegistryError) Unwrap() error { + return e.Err +} + +func NewWorkflowView(wmd *workflow_registry.WorkflowRegistryWorkflowMetadata) (WorkflowView, error) { + if wmd == nil { + return WorkflowView{}, &WorkflowRegistryError{ + Operation: "converting workflow metadata", + Err: errors.New("workflow metadata is nil"), + } + } + return WorkflowView{ + WorkflowID: hex.EncodeToString(wmd.WorkflowID[:]), + Owner: wmd.Owner, + DonID: wmd.DonID, + Status: WorkflowStatus(wmd.Status), + WorkflowName: wmd.WorkflowName, + BinaryURL: wmd.BinaryURL, + ConfigURL: wmd.ConfigURL, + SecretsURL: wmd.SecretsURL, + }, nil +} + +// GenerateWorkflowRegistryView builds a WorkflowRegistryView from the provided workflow registry interface. +// Instead of aborting on the first error, it collects errors in a slice. +func GenerateWorkflowRegistryView(wr workflow_registry.WorkflowRegistryInterface) (WorkflowRegistryView, []error) { + var errs []error + + // 1) Build up basic contract metadata. + md, err := types.NewContractMetaData(wr, wr.Address()) + if err != nil { + errs = append(errs, &WorkflowRegistryError{ + Operation: "failed to build WorkflowRegistry ContractMetaData", + Err: err, + }) + } + + // 2) Query "getAllAllowedDONs”. + donIDs, err := wr.GetAllAllowedDONs(nil) + if err != nil { + errs = append(errs, &WorkflowRegistryError{ + Operation: "GetAllAllowedDONs call failed", + Err: err, + }) + } + + // 3) Query "getAllAuthorizedAddresses". + authAddrs, err := wr.GetAllAuthorizedAddresses(nil) + if err != nil { + errs = append(errs, &WorkflowRegistryError{ + Operation: "GetAllAuthorizedAddresses call failed", + Err: err, + }) + } + + // 4) Query "isRegistryLocked". + locked, err := wr.IsRegistryLocked(nil) + if err != nil { + errs = append(errs, &WorkflowRegistryError{ + Operation: "IsRegistryLocked call failed", + Err: err, + }) + } + + // 5) For each DON ID, gather their workflows. + var allWorkflowViews []WorkflowView + for _, donID := range donIDs { + // Start from index 0; fetch in pages up to the max. + // The registry's default max is 100 per page. + pageSize := big.NewInt(100) + start := big.NewInt(0) + + for { + wmds, err := wr.GetWorkflowMetadataListByDON(nil, donID, start, pageSize) + if err != nil { + errs = append(errs, &WorkflowRegistryError{ + Operation: fmt.Sprintf("GetWorkflowMetadataListByDON failed for donID %d", donID), + Err: err, + }) + break + } + if len(wmds) == 0 { + break + } + // Convert each WorkflowMetadata to a local WorkflowView. + for _, wmd := range wmds { + wv, err := NewWorkflowView(&wmd) + if err != nil { + errs = append(errs, &WorkflowRegistryError{ + Operation: "failed to convert workflow metadata", + Err: err, + }) + continue + } + allWorkflowViews = append(allWorkflowViews, wv) + } + // If the returned slice is smaller than pageSize, we've exhausted all results. + if len(wmds) < int(pageSize.Int64()) { + break + } + start = new(big.Int).Add(start, pageSize) + } + } + + // 6) Build up the final struct. + view := WorkflowRegistryView{ + ContractMetaData: md, + AllowedDONs: donIDs, + AuthorizedAddresses: authAddrs, + IsRegistryLocked: locked, + Workflows: allWorkflowViews, + } + return view, errs +} diff --git a/deployment/common/view/v1_0/workflowreg_test.go b/deployment/common/view/v1_0/workflowreg_test.go new file mode 100644 index 00000000000..bc3a8d30329 --- /dev/null +++ b/deployment/common/view/v1_0/workflowreg_test.go @@ -0,0 +1,205 @@ +package v1_0 + +import ( + "encoding/hex" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink/deployment/common/view/v1_0/mocks" + workflow_registry "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/workflow/generated/workflow_registry_wrapper" +) + +// TestNewWorkflowView tests the helper function that converts on-chain WorkflowMetadata -> WorkflowView. +func TestNewWorkflowView(t *testing.T) { + t.Run("nil input => error", func(t *testing.T) { + // Updated: nil input now returns an error. + wv, err := NewWorkflowView(nil) + require.Error(t, err) + assert.Contains(t, err.Error(), "workflow metadata is nil") + // And we expect the returned struct to be empty. + require.Equal(t, WorkflowView{}, wv) + }) + + t.Run("valid input => success", func(t *testing.T) { + meta := workflow_registry.WorkflowRegistryWorkflowMetadata{ + WorkflowID: [32]byte{0xab, 0xcd}, + Owner: common.HexToAddress("0x1234567890abcdef1234567890abcdef12345678"), + DonID: 42, + Status: 0, // WorkflowStatusActive + WorkflowName: "TestWorkflow", + BinaryURL: "http://binary", + ConfigURL: "http://config", + SecretsURL: "http://secrets", + } + + wv, err := NewWorkflowView(&meta) + require.NoError(t, err) + + wantID := hex.EncodeToString(meta.WorkflowID[:]) + assert.Equal(t, wantID, wv.WorkflowID) + assert.Equal(t, meta.Owner, wv.Owner) + assert.Equal(t, uint32(42), wv.DonID) + assert.Equal(t, WorkflowStatusActive, wv.Status) + assert.Equal(t, "TestWorkflow", wv.WorkflowName) + assert.Equal(t, "http://binary", wv.BinaryURL) + assert.Equal(t, "http://config", wv.ConfigURL) + assert.Equal(t, "http://secrets", wv.SecretsURL) + }) +} + +// TestGenerateWorkflowRegistryView uses a mock workflow registry to test the main view generation function. +func TestGenerateWorkflowRegistryView(t *testing.T) { + tests := []struct { + name string + mockSetup func(*mocks.WorkflowRegistryInterface) + wantErrCount int + wantAllowedDONs []uint32 + wantAuthAddrs []common.Address + wantLocked bool + wantNumWf int + }{ + { + name: "happy path - multiple DONs w/ single-page workflows", + mockSetup: func(m *mocks.WorkflowRegistryInterface) { + m.EXPECT().Address().Return(common.HexToAddress("0xFAKE1111FAKE1111FAKE1111FAKE1111FAKE1111")) + m.EXPECT().TypeAndVersion(mock.Anything).Return("WorkflowRegistry 1.0.0", nil).Maybe() + m.EXPECT().Owner(mock.Anything).Return(common.HexToAddress("0x12345..."), nil).Maybe() + + // Return 2 DON IDs. + m.EXPECT().GetAllAllowedDONs(mock.Anything).Return([]uint32{42, 84}, nil) + + // Return 2 authorized addresses. + m.EXPECT().GetAllAuthorizedAddresses(mock.Anything). + Return([]common.Address{ + common.HexToAddress("0x1111111111111111111111111111111111111111"), + common.HexToAddress("0x2222222222222222222222222222222222222222"), + }, nil) + + // Return locked = false. + m.EXPECT().IsRegistryLocked(mock.Anything).Return(false, nil) + + // For DON=42, single workflow -> active. + wf42 := []workflow_registry.WorkflowRegistryWorkflowMetadata{ + { + WorkflowID: [32]byte{0xde, 0xad, 0xbe, 0xef}, + DonID: 42, + Status: 0, // active + WorkflowName: "Workflow A", + BinaryURL: "binaryA", + ConfigURL: "configA", + SecretsURL: "secretsA", + }, + } + m.EXPECT().GetWorkflowMetadataListByDON(mock.Anything, uint32(42), big.NewInt(0), big.NewInt(100)). + Return(wf42, nil).Once() + // Next page returns empty. + m.EXPECT().GetWorkflowMetadataListByDON(mock.Anything, uint32(42), big.NewInt(100), big.NewInt(100)). + Return([]workflow_registry.WorkflowRegistryWorkflowMetadata{}, nil).Maybe() + + // For DON=84, single workflow -> paused. + wf84 := []workflow_registry.WorkflowRegistryWorkflowMetadata{ + { + WorkflowID: [32]byte{0xca, 0xfe, 0xba, 0xbe}, + DonID: 84, + Status: 1, // paused + WorkflowName: "Workflow B", + BinaryURL: "binaryB", + ConfigURL: "configB", + SecretsURL: "secretsB", + }, + } + m.EXPECT().GetWorkflowMetadataListByDON(mock.Anything, uint32(84), big.NewInt(0), big.NewInt(100)). + Return(wf84, nil).Once() + // Next page returns empty. + m.EXPECT().GetWorkflowMetadataListByDON(mock.Anything, uint32(84), big.NewInt(100), big.NewInt(100)). + Return([]workflow_registry.WorkflowRegistryWorkflowMetadata{}, nil).Maybe() + }, + wantErrCount: 0, + wantAllowedDONs: []uint32{42, 84}, + wantAuthAddrs: []common.Address{ + common.HexToAddress("0x1111111111111111111111111111111111111111"), + common.HexToAddress("0x2222222222222222222222222222222222222222"), + }, + wantLocked: false, + wantNumWf: 2, + }, + { + name: "GetAllAllowedDONs returns error => include error", + mockSetup: func(m *mocks.WorkflowRegistryInterface) { + m.EXPECT().Address().Return(common.HexToAddress("0xABCD")).Maybe() + m.EXPECT().TypeAndVersion(mock.Anything).Return("WorkflowRegistry 1.0.0", nil).Maybe() + m.EXPECT().Owner(mock.Anything).Return(common.HexToAddress("0x12345..."), nil).Maybe() + // Simulate three errors: + // 1. GetAllAllowedDONs error. Since there are no dons, there are no workflows to fetch. + m.EXPECT().GetAllAllowedDONs(mock.Anything). + Return([]uint32{}, assert.AnError) + // 2. GetAllAuthorizedAddresses error. + m.EXPECT().GetAllAuthorizedAddresses(mock.Anything). + Return(nil, assert.AnError) + // 3. IsRegistryLocked error. + m.EXPECT().IsRegistryLocked(mock.Anything). + Return(false, assert.AnError) + }, + wantErrCount: 3, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + mockWR := mocks.NewWorkflowRegistryInterface(t) + tc.mockSetup(mockWR) + + view, errs := GenerateWorkflowRegistryView(mockWR) + if tc.wantErrCount > 0 { + require.NotEmpty(t, errs) + return + } + require.Empty(t, errs) + + // Check fields. + assert.Equal(t, tc.wantAllowedDONs, view.AllowedDONs) + assert.Equal(t, tc.wantAuthAddrs, view.AuthorizedAddresses) + assert.Equal(t, tc.wantLocked, view.IsRegistryLocked) + assert.Len(t, view.Workflows, tc.wantNumWf) + }) + } +} + +func TestWorkflowStatus_MarshalUnmarshal(t *testing.T) { + tests := []struct { + name string + ws WorkflowStatus + want string + }{ + {"ACTIVE => JSON", WorkflowStatusActive, `"ACTIVE"`}, + {"PAUSED => JSON", WorkflowStatusPaused, `"PAUSED"`}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + // Marshal. + data, err := tc.ws.MarshalJSON() + require.NoError(t, err) + assert.Equal(t, tc.want, string(data)) + + // Unmarshal. + var back WorkflowStatus + err = back.UnmarshalJSON(data) + require.NoError(t, err) + assert.Equal(t, tc.ws, back) + }) + } + + t.Run("unknown => error", func(t *testing.T) { + raw := []byte(`"UNKNOWN(99)"`) + var ws WorkflowStatus + err := ws.UnmarshalJSON(raw) + require.Error(t, err) + assert.Contains(t, err.Error(), "invalid WorkflowStatus value") + }) +} diff --git a/deployment/keystone/changeset/internal/state.go b/deployment/keystone/changeset/internal/state.go index ad81d912d0d..61b4af862ab 100644 --- a/deployment/keystone/changeset/internal/state.go +++ b/deployment/keystone/changeset/internal/state.go @@ -64,6 +64,20 @@ func (cs ContractSet) View() (view.KeystoneChainView, error) { } out.CapabilityRegistry[cs.CapabilitiesRegistry.Address().String()] = capRegView } + + // Process the workflow registry and print if WorkflowRegistryError errors. + if cs.WorkflowRegistry != nil { + wrView, wrErrs := common_v1_0.GenerateWorkflowRegistryView(cs.WorkflowRegistry) + for _, err := range wrErrs { + var wre *common_v1_0.WorkflowRegistryError + if !errors.As(err, &wre) { + return view.KeystoneChainView{}, err + } + fmt.Println("WorkflowRegistry error:", err) + } + out.WorkflowRegistry[cs.WorkflowRegistry.Address().String()] = wrView + } + return out, nil } diff --git a/deployment/keystone/view/view.go b/deployment/keystone/view/view.go index 1320344b7ca..c74b4628d1e 100644 --- a/deployment/keystone/view/view.go +++ b/deployment/keystone/view/view.go @@ -9,12 +9,14 @@ import ( type KeystoneChainView struct { CapabilityRegistry map[string]common_v1_0.CapabilityRegistryView `json:"capabilityRegistry,omitempty"` + WorkflowRegistry map[string]common_v1_0.WorkflowRegistryView `json:"workflowRegistry,omitempty"` // TODO forwarders etc } func NewKeystoneChainView() KeystoneChainView { return KeystoneChainView{ CapabilityRegistry: make(map[string]common_v1_0.CapabilityRegistryView), + WorkflowRegistry: make(map[string]common_v1_0.WorkflowRegistryView), } } From 224ee68c7f1e2624ac36acbb3d838f20310a3cb3 Mon Sep 17 00:00:00 2001 From: amit-momin <108959691+amit-momin@users.noreply.github.com> Date: Fri, 14 Feb 2025 16:12:52 -0600 Subject: [PATCH 81/83] Added commit price only method config to Solana ChainWriter (#16401) * Added commit price only method config to Solana ChainWriter * Moved ATA config from commit method to execute * Upgraded chainlink-ccip dependency * Addressed feedback --- .../ccip/ccipsolana/commitcodec.go | 2 +- .../ccip/ccipsolana/commitcodec_test.go | 2 +- .../ccip/configs/solana/chain_writer.go | 601 ++++++++++-------- core/scripts/go.mod | 4 +- core/scripts/go.sum | 8 +- deployment/go.mod | 4 +- deployment/go.sum | 8 +- go.mod | 4 +- go.sum | 8 +- integration-tests/go.mod | 4 +- integration-tests/go.sum | 8 +- integration-tests/load/go.mod | 4 +- integration-tests/load/go.sum | 8 +- 13 files changed, 377 insertions(+), 288 deletions(-) diff --git a/core/capabilities/ccip/ccipsolana/commitcodec.go b/core/capabilities/ccip/ccipsolana/commitcodec.go index a380b0524fc..06f8b7d7845 100644 --- a/core/capabilities/ccip/ccipsolana/commitcodec.go +++ b/core/capabilities/ccip/ccipsolana/commitcodec.go @@ -33,7 +33,7 @@ func (c *CommitPluginCodecV1) Encode(ctx context.Context, report cciptypes.Commi } merkleRoot := combinedRoots[0] - mr := ccip_offramp.MerkleRoot{ + mr := &ccip_offramp.MerkleRoot{ SourceChainSelector: uint64(merkleRoot.ChainSel), OnRampAddress: merkleRoot.OnRampAddress, MinSeqNr: uint64(merkleRoot.SeqNumsRange.Start()), diff --git a/core/capabilities/ccip/ccipsolana/commitcodec_test.go b/core/capabilities/ccip/ccipsolana/commitcodec_test.go index 56255862a53..d0cb020c768 100644 --- a/core/capabilities/ccip/ccipsolana/commitcodec_test.go +++ b/core/capabilities/ccip/ccipsolana/commitcodec_test.go @@ -225,7 +225,7 @@ func Test_DecodingCommitReport(t *testing.T) { } onChainReport := ccip_offramp.CommitInput{ - MerkleRoot: ccip_offramp.MerkleRoot{ + MerkleRoot: &ccip_offramp.MerkleRoot{ SourceChainSelector: uint64(chainSel), OnRampAddress: onRampAddr.PublicKey().Bytes(), MinSeqNr: minSeqNr, diff --git a/core/capabilities/ccip/configs/solana/chain_writer.go b/core/capabilities/ccip/configs/solana/chain_writer.go index 80470a42f09..1226a7bad92 100644 --- a/core/capabilities/ccip/configs/solana/chain_writer.go +++ b/core/capabilities/ccip/configs/solana/chain_writer.go @@ -28,8 +28,12 @@ const ( merkleRoot = "Info.MerkleRoots.MerkleRoot" ) -func getCommitMethodConfig(fromAddress string, offrampProgramAddress string, destChainSelector uint64) chainwriter.MethodConfig { +func getCommitMethodConfig(fromAddress string, offrampProgramAddress string, destChainSelector uint64, priceOnly bool) chainwriter.MethodConfig { destChainSelectorBytes := binary.LittleEndian.AppendUint64([]byte{}, destChainSelector) + chainSpecificName := "commit" + if priceOnly { + chainSpecificName = "commitPriceOnly" + } return chainwriter.MethodConfig{ FromAddress: fromAddress, InputModifications: []codec.ModifierConfig{ @@ -40,114 +44,65 @@ func getCommitMethodConfig(fromAddress string, offrampProgramAddress string, des Fields: map[string]string{"RawReport": "Report"}, }, }, - ChainSpecificName: "commit", + ChainSpecificName: chainSpecificName, LookupTables: chainwriter.LookupTables{ DerivedLookupTables: []chainwriter.DerivedLookupTable{ getCommonAddressLookupTableConfig(offrampProgramAddress), }, }, - ATAs: []chainwriter.ATALookup{ - { - Location: destTokenAddress, - WalletAddress: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: receiverAddress}}, - TokenProgram: chainwriter.Lookup{AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ - LookupTableName: "PoolLookupTable", - IncludeIndexes: []int{6}, - }}, - MintAddress: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}, - }, - }, - Accounts: []chainwriter.Lookup{ - getOfframpAccountConfig(offrampProgramAddress), - getReferenceAddressesConfig(offrampProgramAddress), - {PDALookups: &chainwriter.PDALookups{ - Name: "SourceChainState", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("source_chain_state")}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}}, - }, - IsSigner: false, - IsWritable: true, - }}, - {PDALookups: &chainwriter.PDALookups{ - Name: "CommitReport", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("commit_report")}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRoot}}}, - }, - IsSigner: false, - IsWritable: true, - }}, - getAuthorityAccountConstant(fromAddress), - getSystemProgramConstant(), - getSysVarInstructionConstant(), - getFeeBillingSignerConfig(offrampProgramAddress), - getFeeQuoterConfig(offrampProgramAddress), - {PDALookups: &chainwriter.PDALookups{ - Name: "FeeQuoterAllowedPriceUpdater", - // Fetch fee quoter public key to use as program ID for PDA - PublicKey: getFeeQuoterConfig(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("allowed_price_updater")}, - {Dynamic: getFeeBillingSignerConfig(offrampProgramAddress)}, - }, - IsSigner: false, - IsWritable: false, - }}, - {PDALookups: &chainwriter.PDALookups{ - Name: "FeeQuoterConfig", - // Fetch fee quoter public key to use as program ID for PDA - PublicKey: getFeeQuoterConfig(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("config")}, - }, - IsSigner: false, - IsWritable: false, - }}, - { + Accounts: buildCommitAccountsList(fromAddress, offrampProgramAddress, destChainSelectorBytes, priceOnly), + DebugIDLocation: "", + } +} + +func buildCommitAccountsList(fromAddress, offrampProgramAddress string, destChainSelectorBytes []byte, priceOnly bool) []chainwriter.Lookup { + accounts := []chainwriter.Lookup{} + accounts = append(accounts, + getOfframpAccountConfig(offrampProgramAddress), + getReferenceAddressesConfig(offrampProgramAddress), + ) + if !priceOnly { + accounts = append(accounts, + chainwriter.Lookup{ PDALookups: &chainwriter.PDALookups{ - Name: "GlobalState", + Name: "SourceChainState", PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ - {Static: []byte("state")}, + {Static: []byte("source_chain_state")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}}, }, IsSigner: false, - IsWritable: false, + IsWritable: true, }, - Optional: true, }, - { + chainwriter.Lookup{ PDALookups: &chainwriter.PDALookups{ - Name: "BillingTokenConfig", - PublicKey: getFeeQuoterConfig(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("fee_billing_token_config")}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: "Info.TokenPrices.TokenID"}}}, - }, - IsSigner: false, - IsWritable: false, - }, - Optional: true, - }, - { - PDALookups: &chainwriter.PDALookups{ - Name: "ChainConfigGasPrice", - PublicKey: getFeeQuoterConfig(offrampProgramAddress), + Name: "CommitReport", + PublicKey: getAddressConstant(offrampProgramAddress), Seeds: []chainwriter.Seed{ - {Static: []byte("dest_chain")}, - {Static: destChainSelectorBytes}, + {Static: []byte("commit_report")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRootSourceChainSelector}}}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: merkleRoot}}}, }, IsSigner: false, - IsWritable: false, + IsWritable: true, }, - Optional: true, }, - }, - DebugIDLocation: "", + ) } + accounts = append(accounts, + getAuthorityAccountConstant(fromAddress), + getSystemProgramConstant(), + getSysVarInstructionConstant(), + getFeeBillingSignerConfig(offrampProgramAddress), + getFeeQuoterProgramAccount(offrampProgramAddress), + getFeeQuoterAllowedPriceUpdater(offrampProgramAddress), + getFeeQuoterConfigLookup(offrampProgramAddress), + getGlobalStateConfig(offrampProgramAddress), + getBillingTokenConfig(offrampProgramAddress), + getChainConfigGasPriceConfig(offrampProgramAddress, destChainSelectorBytes), + ) + return accounts } func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) chainwriter.MethodConfig { @@ -167,86 +122,113 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch DerivedLookupTables: []chainwriter.DerivedLookupTable{ { Name: "PoolLookupTable", - Accounts: chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ - Name: "TokenAdminRegistry", - PublicKey: getRouterConfig(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("token_admin_registry")}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}}, + Accounts: chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "TokenAdminRegistry", + PublicKey: getRouterProgramAccount(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("token_admin_registry")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}}, + }, + IsSigner: false, + IsWritable: false, + InternalField: chainwriter.InternalField{ + TypeName: "TokenAdminRegistry", + Location: "LookupTable", + // TokenAdminRegistry is in the router program so need to provide the router's IDL + IDL: ccipRouterIDL, + }, }, - IsSigner: false, - IsWritable: false, - InternalField: chainwriter.InternalField{ - TypeName: "TokenAdminRegistry", - Location: "LookupTable", - // TokenAdminRegistry is in the router program so need to provide the router's IDL - IDL: ccipRouterIDL, - }, - }}, + }, }, getCommonAddressLookupTableConfig(offrampProgramAddress), }, }, + ATAs: []chainwriter.ATALookup{ + { + Location: destTokenAddress, + WalletAddress: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: receiverAddress}}, + TokenProgram: chainwriter.Lookup{ + AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ + LookupTableName: "PoolLookupTable", + IncludeIndexes: []int{6}, + }, + }, + MintAddress: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}, + }, + }, Accounts: []chainwriter.Lookup{ getOfframpAccountConfig(offrampProgramAddress), getReferenceAddressesConfig(offrampProgramAddress), - {PDALookups: &chainwriter.PDALookups{ - Name: "SourceChainState", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("source_chain_state")}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, + { + PDALookups: &chainwriter.PDALookups{ + Name: "SourceChainState", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("source_chain_state")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - }}, - {PDALookups: &chainwriter.PDALookups{ - Name: "CommitReport", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("commit_report")}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{ - // The seed is the merkle root of the report, as passed into the input params. - Location: merkleRoot, - }}}, + }, + { + PDALookups: &chainwriter.PDALookups{ + Name: "CommitReport", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("commit_report")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, + {Dynamic: chainwriter.Lookup{ + AccountLookup: &chainwriter.AccountLookup{ + // The seed is the merkle root of the report, as passed into the input params. + Location: merkleRoot, + }}, + }, + }, + IsSigner: false, + IsWritable: true, }, - IsSigner: false, - IsWritable: true, - }}, + }, getAddressConstant(offrampProgramAddress), - {PDALookups: &chainwriter.PDALookups{ - Name: "AllowedOfframp", - PublicKey: getRouterConfig(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("allowed_offramp")}, - {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, - {Dynamic: getAddressConstant(offrampProgramAddress)}, + { + PDALookups: &chainwriter.PDALookups{ + Name: "AllowedOfframp", + PublicKey: getRouterProgramAccount(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("allowed_offramp")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: sourceChainSelectorPath}}}, + {Dynamic: getAddressConstant(offrampProgramAddress)}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - }}, - {PDALookups: &chainwriter.PDALookups{ - Name: "ExternalExecutionConfig", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("external_execution_config")}, + }, + { + PDALookups: &chainwriter.PDALookups{ + Name: "ExternalExecutionConfig", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("external_execution_config")}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - }}, + }, getAuthorityAccountConstant(fromAddress), getSystemProgramConstant(), getSysVarInstructionConstant(), - {PDALookups: &chainwriter.PDALookups{ - Name: "ExternalTokenPoolsSigner", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("external_token_pools_signer")}, + { + PDALookups: &chainwriter.PDALookups{ + Name: "ExternalTokenPoolsSigner", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("external_token_pools_signer")}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - }}, + }, { AccountLookup: &chainwriter.AccountLookup{ Name: "UserAccounts", @@ -259,16 +241,20 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch { PDALookups: &chainwriter.PDALookups{ Name: "ReceiverAssociatedTokenAccount", - PublicKey: chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ - Address: solana.SPLAssociatedTokenAccountProgramID.String(), - }}, + PublicKey: chainwriter.Lookup{ + AccountConstant: &chainwriter.AccountConstant{ + Address: solana.SPLAssociatedTokenAccountProgramID.String(), + }, + }, Seeds: []chainwriter.Seed{ {Static: []byte(fromAddress)}, {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: "Info.AbstractReports.Messages.Receiver"}}}, - {Dynamic: chainwriter.Lookup{AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ - LookupTableName: "PoolLookupTable", - IncludeIndexes: []int{6}, - }}}, + {Dynamic: chainwriter.Lookup{ + AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ + LookupTableName: "PoolLookupTable", + IncludeIndexes: []int{6}, + }}, + }, {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destTokenAddress}}}, }, IsSigner: false, @@ -279,7 +265,7 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch { PDALookups: &chainwriter.PDALookups{ Name: "PerChainTokenConfig", - PublicKey: getFeeQuoterConfig(offrampProgramAddress), + PublicKey: getFeeQuoterProgramAccount(offrampProgramAddress), Seeds: []chainwriter.Seed{ {Static: []byte("per_chain_per_token_config")}, {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destChainSelectorPath}}}, @@ -293,10 +279,12 @@ func getExecuteMethodConfig(fromAddress string, offrampProgramAddress string) ch { PDALookups: &chainwriter.PDALookups{ Name: "PoolChainConfig", - PublicKey: chainwriter.Lookup{AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ - LookupTableName: "PoolLookupTable", - IncludeIndexes: []int{2}, - }}, + PublicKey: chainwriter.Lookup{ + AccountsFromLookupTable: &chainwriter.AccountsFromLookupTable{ + LookupTableName: "PoolLookupTable", + IncludeIndexes: []int{2}, + }, + }, Seeds: []chainwriter.Seed{ {Static: []byte("ccip_tokenpool_chainconfig")}, {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: destChainSelectorPath}}}, @@ -345,7 +333,8 @@ func GetSolanaChainWriterConfig(offrampProgramAddress string, fromAddress string ccipconsts.ContractNameOffRamp: { Methods: map[string]chainwriter.MethodConfig{ ccipconsts.MethodExecute: getExecuteMethodConfig(fromAddress, offrampProgramAddress), - ccipconsts.MethodCommit: getCommitMethodConfig(fromAddress, offrampProgramAddress, destChainSelector), + ccipconsts.MethodCommit: getCommitMethodConfig(fromAddress, offrampProgramAddress, destChainSelector, false), + ccipconsts.MethodCommitPriceOnly: getCommitMethodConfig(fromAddress, offrampProgramAddress, destChainSelector, true), }, IDL: ccipOfframpIDL, }, @@ -360,85 +349,177 @@ func GetSolanaChainWriterConfig(offrampProgramAddress string, fromAddress string } func getOfframpAccountConfig(offrampProgramAddress string) chainwriter.Lookup { - return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ - Name: "OfframpAccountConfig", - PublicKey: chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ - Address: offrampProgramAddress, - }}, - Seeds: []chainwriter.Seed{ - {Static: []byte("config")}, + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "OfframpAccountConfig", + PublicKey: chainwriter.Lookup{ + AccountConstant: &chainwriter.AccountConstant{ + Address: offrampProgramAddress, + }, + }, + Seeds: []chainwriter.Seed{ + {Static: []byte("config")}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - }} + } } func getAddressConstant(address string) chainwriter.Lookup { - return chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ - Address: address, - IsSigner: false, - IsWritable: false, - }} + return chainwriter.Lookup{ + AccountConstant: &chainwriter.AccountConstant{ + Address: address, + IsSigner: false, + IsWritable: false, + }, + } } -func getFeeQuoterConfig(offrampProgramAddress string) chainwriter.Lookup { - return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ - Name: ccipconsts.ContractNameFeeQuoter, - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("reference_addresses")}, - }, - IsSigner: false, - IsWritable: false, - // Reads the address from the reference addresses account - InternalField: chainwriter.InternalField{ - TypeName: "ReferenceAddresses", - Location: "FeeQuoter", - IDL: ccipOfframpIDL, +func getFeeQuoterProgramAccount(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: ccipconsts.ContractNameFeeQuoter, + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("reference_addresses")}, + }, + IsSigner: false, + IsWritable: false, + // Reads the address from the reference addresses account + InternalField: chainwriter.InternalField{ + TypeName: "ReferenceAddresses", + Location: "FeeQuoter", + IDL: ccipOfframpIDL, + }, }, - }} + } } -func getRouterConfig(offrampProgramAddress string) chainwriter.Lookup { - return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ - Name: ccipconsts.ContractNameRouter, - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("reference_addresses")}, - }, - IsSigner: false, - IsWritable: false, - // Reads the address from the reference addresses account - InternalField: chainwriter.InternalField{ - TypeName: "ReferenceAddresses", - Location: "Router", - IDL: ccipOfframpIDL, +func getRouterProgramAccount(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: ccipconsts.ContractNameRouter, + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("reference_addresses")}, + }, + IsSigner: false, + IsWritable: false, + // Reads the address from the reference addresses account + InternalField: chainwriter.InternalField{ + TypeName: "ReferenceAddresses", + Location: "Router", + IDL: ccipOfframpIDL, + }, }, - }} + } } func getReferenceAddressesConfig(offrampProgramAddress string) chainwriter.Lookup { - return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ - Name: "ReferenceAddresses", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("reference_addresses")}, + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "ReferenceAddresses", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("reference_addresses")}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - }} + } } func getFeeBillingSignerConfig(offrampProgramAddress string) chainwriter.Lookup { - return chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ - Name: "FeeBillingSigner", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("fee_billing_signer")}, + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "FeeBillingSigner", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("fee_billing_signer")}, + }, + IsSigner: false, + IsWritable: false, }, - IsSigner: false, - IsWritable: false, - }} + } +} + +func getFeeQuoterAllowedPriceUpdater(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "FeeQuoterAllowedPriceUpdater", + // Fetch fee quoter public key to use as program ID for PDA + PublicKey: getFeeQuoterProgramAccount(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("allowed_price_updater")}, + {Dynamic: getFeeBillingSignerConfig(offrampProgramAddress)}, + }, + IsSigner: false, + IsWritable: false, + }, + } +} + +func getFeeQuoterConfigLookup(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "FeeQuoterConfig", + // Fetch fee quoter public key to use as program ID for PDA + PublicKey: getFeeQuoterProgramAccount(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("config")}, + }, + IsSigner: false, + IsWritable: false, + }, + } +} + +func getGlobalStateConfig(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "GlobalState", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("state")}, + }, + IsSigner: false, + IsWritable: false, + }, + Optional: true, + } +} + +func getBillingTokenConfig(offrampProgramAddress string) chainwriter.Lookup { + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "BillingTokenConfig", + PublicKey: getFeeQuoterProgramAccount(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("fee_billing_token_config")}, + {Dynamic: chainwriter.Lookup{AccountLookup: &chainwriter.AccountLookup{Location: "Info.TokenPrices.TokenID"}}}, + }, + IsSigner: false, + IsWritable: false, + }, + Optional: true, + } +} + +func getChainConfigGasPriceConfig(offrampProgramAddress string, destChainSelector []byte) chainwriter.Lookup { + return chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "ChainConfigGasPrice", + PublicKey: getFeeQuoterProgramAccount(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("dest_chain")}, + {Static: destChainSelector}, + }, + IsSigner: false, + IsWritable: false, + }, + Optional: true, + } } // getCommonAddressLookupTableConfig returns the lookup table config that fetches the lookup table address from a PDA on-chain @@ -446,44 +527,52 @@ func getFeeBillingSignerConfig(offrampProgramAddress string) chainwriter.Lookup func getCommonAddressLookupTableConfig(offrampProgramAddress string) chainwriter.DerivedLookupTable { return chainwriter.DerivedLookupTable{ Name: "CommonAddressLookupTable", - Accounts: chainwriter.Lookup{PDALookups: &chainwriter.PDALookups{ - Name: "OfframpLookupTable", - PublicKey: getAddressConstant(offrampProgramAddress), - Seeds: []chainwriter.Seed{ - {Static: []byte("reference_addresses")}, - }, - InternalField: chainwriter.InternalField{ - TypeName: "ReferenceAddresses", - Location: "OfframpLookupTable", - IDL: ccipOfframpIDL, + Accounts: chainwriter.Lookup{ + PDALookups: &chainwriter.PDALookups{ + Name: "OfframpLookupTable", + PublicKey: getAddressConstant(offrampProgramAddress), + Seeds: []chainwriter.Seed{ + {Static: []byte("reference_addresses")}, + }, + InternalField: chainwriter.InternalField{ + TypeName: "ReferenceAddresses", + Location: "OfframpLookupTable", + IDL: ccipOfframpIDL, + }, }, - }}, + }, } } func getAuthorityAccountConstant(fromAddress string) chainwriter.Lookup { - return chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ - Name: "Authority", - Address: fromAddress, - IsSigner: true, - IsWritable: true, - }} + return chainwriter.Lookup{ + AccountConstant: &chainwriter.AccountConstant{ + Name: "Authority", + Address: fromAddress, + IsSigner: true, + IsWritable: true, + }, + } } func getSystemProgramConstant() chainwriter.Lookup { - return chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ - Name: "SystemProgram", - Address: solana.SystemProgramID.String(), - IsSigner: false, - IsWritable: false, - }} + return chainwriter.Lookup{ + AccountConstant: &chainwriter.AccountConstant{ + Name: "SystemProgram", + Address: solana.SystemProgramID.String(), + IsSigner: false, + IsWritable: false, + }, + } } func getSysVarInstructionConstant() chainwriter.Lookup { - return chainwriter.Lookup{AccountConstant: &chainwriter.AccountConstant{ - Name: "SysvarInstructions", - Address: solana.SysVarInstructionsPubkey.String(), - IsSigner: false, - IsWritable: false, - }} + return chainwriter.Lookup{ + AccountConstant: &chainwriter.AccountConstant{ + Name: "SysvarInstructions", + Address: solana.SysVarInstructionsPubkey.String(), + IsSigner: false, + IsWritable: false, + }, + } } diff --git a/core/scripts/go.mod b/core/scripts/go.mod index cacb9739b11..d583d01fe27 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -305,8 +305,8 @@ require ( github.com/shirou/gopsutil/v3 v3.24.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chain-selectors v1.0.40 // indirect - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 2656937455a..ab4b5c8b5df 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1123,10 +1123,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1:yXV9GJ6GvtoUpDwh4IkZ50dtjju2aJHBqhEcdBPMr0Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= diff --git a/deployment/go.mod b/deployment/go.mod index cf9a3f80057..d55c89d99c9 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -30,8 +30,8 @@ require ( github.com/sethvargo/go-retry v0.2.4 github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 diff --git a/deployment/go.sum b/deployment/go.sum index 9ef8a13e006..2448ea17ae6 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1126,10 +1126,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1:yXV9GJ6GvtoUpDwh4IkZ50dtjju2aJHBqhEcdBPMr0Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= diff --git a/go.mod b/go.mod index e75471e473b..fa243b645b6 100644 --- a/go.mod +++ b/go.mod @@ -76,8 +76,8 @@ require ( github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-feeds v0.1.1 diff --git a/go.sum b/go.sum index f89d9947716..39d7b416bb8 100644 --- a/go.sum +++ b/go.sum @@ -1010,10 +1010,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3 h1:f4F/7OCuMybsPKKXXvLQz+Q1hGq07I1cfoWy5EA9iRg= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250206215114-fb6c3c35e8e3/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1:yXV9GJ6GvtoUpDwh4IkZ50dtjju2aJHBqhEcdBPMr0Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 111815592d0..8e5e0777148 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -49,7 +49,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 @@ -427,7 +427,7 @@ require ( github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 183a9d802f7..21a895b331d 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1378,10 +1378,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1:yXV9GJ6GvtoUpDwh4IkZ50dtjju2aJHBqhEcdBPMr0Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 99c0ea50d21..5236bf0851b 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -28,7 +28,7 @@ require ( github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 - github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee + github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 @@ -414,7 +414,7 @@ require ( github.com/sirupsen/logrus v1.9.3 // indirect github.com/smartcontractkit/ccip-owner-contracts v0.0.0-salt-fix // indirect github.com/smartcontractkit/chainlink-automation v0.8.1 // indirect - github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 // indirect + github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 // indirect github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 // indirect github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 58219f786e9..79d3ac5cda5 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1361,10 +1361,10 @@ github.com/smartcontractkit/chain-selectors v1.0.40 h1:iLvvoZeehVq6/7F+zzolQLF0D github.com/smartcontractkit/chain-selectors v1.0.40/go.mod h1:xsKM0aN3YGcQKTPRPDDtPx2l4mlTN1Djmg0VVXV40b8= github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgBc2xpDKBco/Q4h4ydl6+UUU= github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee h1:fs5zG44+/JmvlLkCORYeOVsIufDw4UFmRcSWhmp0Qiw= -github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214122756-01c6c2d85aee/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7 h1:5NagQi0BzMkxgTXO0LbGcmqr5XLhWjC6T7ZScCp86H8= -github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250211204327-6aca485891a7/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1:yXV9GJ6GvtoUpDwh4IkZ50dtjju2aJHBqhEcdBPMr0Q= +github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= +github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= From 13b7d5abf5ee307dae13095542dd179efb065c08 Mon Sep 17 00:00:00 2001 From: Joe Huang Date: Fri, 14 Feb 2025 17:55:43 -0600 Subject: [PATCH 82/83] refactor extradata codec to unblock ccip ocr message optimization using protobuf (#16402) * refactor extradata codec to unblock ccip ocr message optimization using protobuf * goimport * revert * minor * minor * refactor * fix import * fix import * add comments * fix test * support Solana->EVM * fix * update * fix make --- .changeset/four-hats-mate.md | 5 + .mockery.yaml | 3 + .../capabilities/ccip/ccipevm/executecodec.go | 19 ++- .../ccip/ccipevm/executecodec_test.go | 69 ++++++-- .../ccip/ccipevm/extradatadecoder.go | 11 +- .../ccip/ccipevm/extradatadecoder_test.go | 9 +- .../capabilities/ccip/ccipevm/helpers_test.go | 5 +- core/capabilities/ccip/ccipevm/msghasher.go | 61 ++++++- .../ccip/ccipevm/msghasher_test.go | 35 ++-- .../ccip/ccipsolana/executecodec.go | 34 ++-- .../ccip/ccipsolana/executecodec_test.go | 27 ++- .../ccip/ccipsolana/extradatadecoder.go | 11 +- .../ccip/ccipsolana/extradatadecoder_test.go | 7 +- .../capabilities/ccip/ccipsolana/msghasher.go | 26 ++- .../ccip/ccipsolana/msghasher_test.go | 18 +- .../ccip/common/extradatacodec.go | 59 +++++-- .../ccip/common/mocks/extra_data_codec.go | 154 ++++++++++++++++++ .../capabilities/ccip/oraclecreator/plugin.go | 72 ++++---- .../smoke/ccip/ccip_reader_test.go | 11 +- 19 files changed, 512 insertions(+), 124 deletions(-) create mode 100644 .changeset/four-hats-mate.md create mode 100644 core/capabilities/ccip/common/mocks/extra_data_codec.go diff --git a/.changeset/four-hats-mate.md b/.changeset/four-hats-mate.md new file mode 100644 index 00000000000..83110978ed5 --- /dev/null +++ b/.changeset/four-hats-mate.md @@ -0,0 +1,5 @@ +--- +"chainlink": minor +--- + +refactor extradata codec logic and unblock ccip msg optimization using protobuf #added diff --git a/.mockery.yaml b/.mockery.yaml index 8b7d9988ab9..7ad18b97802 100644 --- a/.mockery.yaml +++ b/.mockery.yaml @@ -27,6 +27,9 @@ packages: interfaces: CCIPOracle: OracleCreator: + github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common: + interfaces: + ExtraDataCodec: github.com/smartcontractkit/chainlink/v2/core/capabilities/remote/types: interfaces: Dispatcher: diff --git a/core/capabilities/ccip/ccipevm/executecodec.go b/core/capabilities/ccip/ccipevm/executecodec.go index 6a2431d6e81..d8fcb912a01 100644 --- a/core/capabilities/ccip/ccipevm/executecodec.go +++ b/core/capabilities/ccip/ccipevm/executecodec.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" + ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -19,9 +20,10 @@ import ( // - "OffRamp 1.6.0" type ExecutePluginCodecV1 struct { executeReportMethodInputs abi.Arguments + extraDataCodec ccipcommon.ExtraDataCodec } -func NewExecutePluginCodecV1() *ExecutePluginCodecV1 { +func NewExecutePluginCodecV1(extraDataCodec ccipcommon.ExtraDataCodec) *ExecutePluginCodecV1 { abiParsed, err := abi.JSON(strings.NewReader(offramp.OffRampABI)) if err != nil { panic(fmt.Errorf("parse multi offramp abi: %s", err)) @@ -33,6 +35,7 @@ func NewExecutePluginCodecV1() *ExecutePluginCodecV1 { return &ExecutePluginCodecV1{ executeReportMethodInputs: methodInputs[:1], + extraDataCodec: extraDataCodec, } } @@ -59,7 +62,12 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec return nil, fmt.Errorf("empty amount for token: %s", tokenAmount.DestTokenAddress) } - destGasAmount, err := abiDecodeUint32(tokenAmount.DestExecData) + destExecDataDecodedMap, err := e.extraDataCodec.DecodeTokenAmountDestExecData(tokenAmount.DestExecData, chainReport.SourceChainSelector) + if err != nil { + return nil, fmt.Errorf("failed to decode dest exec data: %w", err) + } + + destGasAmount, err := extractDestGasAmountFromMap(destExecDataDecodedMap) if err != nil { return nil, fmt.Errorf("decode dest gas amount: %w", err) } @@ -82,7 +90,12 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec }) } - gasLimit, err := decodeExtraArgsV1V2(message.ExtraArgs) + decodedExtraArgsMap, err := e.extraDataCodec.DecodeExtraArgs(message.ExtraArgs, chainReport.SourceChainSelector) + if err != nil { + return nil, err + } + + gasLimit, err := parseExtraDataMap(decodedExtraArgsMap) if err != nil { return nil, fmt.Errorf("decode extra args to get gas limit: %w", err) } diff --git a/core/capabilities/ccip/ccipevm/executecodec_test.go b/core/capabilities/ccip/ccipevm/executecodec_test.go index 2e171f04030..7f8f924c740 100644 --- a/core/capabilities/ccip/ccipevm/executecodec_test.go +++ b/core/capabilities/ccip/ccipevm/executecodec_test.go @@ -2,6 +2,7 @@ package ccipevm import ( "encoding/base64" + "math/big" "math/rand" "testing" @@ -10,7 +11,11 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" + ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common/mocks" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -25,7 +30,7 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ) -var randomExecuteReport = func(t *testing.T, d *testSetupData) cciptypes.ExecutePluginReport { +var randomExecuteReport = func(t *testing.T, d *testSetupData, chainSelector uint64, gasLimit *big.Int, destGasAmount uint32) cciptypes.ExecutePluginReport { const numChainReports = 10 const msgsPerReport = 10 const numTokensPerMsg = 3 @@ -39,7 +44,7 @@ var randomExecuteReport = func(t *testing.T, d *testSetupData) cciptypes.Execute tokenAmounts := make([]cciptypes.RampTokenAmount, numTokensPerMsg) for z := 0; z < numTokensPerMsg; z++ { - encodedDestExecData, err2 := abiEncodeUint32(rand.Uint32()) + encodedDestExecData, err2 := abiEncodeUint32(destGasAmount) require.NoError(t, err2) tokenAmounts[z] = cciptypes.RampTokenAmount{ @@ -52,7 +57,7 @@ var randomExecuteReport = func(t *testing.T, d *testSetupData) cciptypes.Execute } extraArgs, err := d.contract.EncodeEVMExtraArgsV1(nil, message_hasher.ClientEVMExtraArgsV1{ - GasLimit: utils.RandUint256(), + GasLimit: gasLimit, }) assert.NoError(t, err) @@ -82,7 +87,7 @@ var randomExecuteReport = func(t *testing.T, d *testSetupData) cciptypes.Execute } chainReports[i] = cciptypes.ExecutePluginReportSingleChain{ - SourceChainSelector: cciptypes.ChainSelector(rand.Uint64()), + SourceChainSelector: cciptypes.ChainSelector(chainSelector), Messages: reportMessages, OffchainTokenData: tokenData, Proofs: []cciptypes.Bytes32{utils.RandomBytes32(), utils.RandomBytes32()}, @@ -95,16 +100,41 @@ var randomExecuteReport = func(t *testing.T, d *testSetupData) cciptypes.Execute func TestExecutePluginCodecV1(t *testing.T) { d := testSetup(t) + ctx := testutils.Context(t) + mockExtraDataCodec := &mocks.ExtraDataCodec{} + destGasAmount := rand.Uint32() + gasLimit := utils.RandUint256() + mockExtraDataCodec.On("DecodeTokenAmountDestExecData", mock.Anything, mock.Anything).Return(map[string]any{ + "destgasamount": destGasAmount, + }, nil) + mockExtraDataCodec.On("DecodeExtraArgs", mock.Anything, mock.Anything).Return(map[string]any{ + "gasLimit": utils.RandUint256(), + "accountIsWritableBitmap": gasLimit, + }, nil) testCases := []struct { - name string - report func(report cciptypes.ExecutePluginReport) cciptypes.ExecutePluginReport - expErr bool + name string + report func(report cciptypes.ExecutePluginReport) cciptypes.ExecutePluginReport + expErr bool + chainSelector uint64 + destGasAmount uint32 + gasLimit *big.Int }{ { - name: "base report", - report: func(report cciptypes.ExecutePluginReport) cciptypes.ExecutePluginReport { return report }, - expErr: false, + name: "base report", + report: func(report cciptypes.ExecutePluginReport) cciptypes.ExecutePluginReport { return report }, + expErr: false, + chainSelector: 5009297550715157269, // ETH mainnet chain selector + gasLimit: gasLimit, + destGasAmount: destGasAmount, + }, + { + name: "base report", + report: func(report cciptypes.ExecutePluginReport) cciptypes.ExecutePluginReport { return report }, + expErr: false, + chainSelector: 124615329519749607, // Solana mainnet chain selector + gasLimit: gasLimit, + destGasAmount: destGasAmount, }, { name: "reports have empty msgs", @@ -113,7 +143,10 @@ func TestExecutePluginCodecV1(t *testing.T) { report.ChainReports[4].Messages = []cciptypes.Message{} return report }, - expErr: false, + expErr: false, + chainSelector: 5009297550715157269, // ETH mainnet chain selector + gasLimit: gasLimit, + destGasAmount: destGasAmount, }, { name: "reports have empty offchain token data", @@ -122,12 +155,13 @@ func TestExecutePluginCodecV1(t *testing.T) { report.ChainReports[4].OffchainTokenData[1] = [][]byte{} return report }, - expErr: false, + expErr: false, + chainSelector: 5009297550715157269, // ETH mainnet chain selector + gasLimit: gasLimit, + destGasAmount: destGasAmount, }, } - ctx := testutils.Context(t) - // Deploy the contract transactor := evmtestutils.MustNewSimTransactor(t) simulatedBackend := backends.NewSimulatedBackend(core.GenesisAlloc{ @@ -141,8 +175,8 @@ func TestExecutePluginCodecV1(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - codec := NewExecutePluginCodecV1() - report := tc.report(randomExecuteReport(t, d)) + codec := NewExecutePluginCodecV1(mockExtraDataCodec) + report := tc.report(randomExecuteReport(t, d, tc.chainSelector, tc.gasLimit, tc.destGasAmount)) bytes, err := codec.Encode(ctx, report) if tc.expErr { assert.Error(t, err) @@ -183,6 +217,7 @@ func TestExecutePluginCodecV1(t *testing.T) { } func Test_DecodeReport(t *testing.T) { + ExtraDataCodec := ccipcommon.NewExtraDataCodec(ccipcommon.NewExtraDataCodecParams(ExtraDataDecoder{}, ccipsolana.ExtraDataDecoder{})) offRampABI, err := offramp.OffRampMetaData.GetAbi() require.NoError(t, err) @@ -201,7 +236,7 @@ func Test_DecodeReport(t *testing.T) { rawReport := *abi.ConvertType(executeInputs[1], new([]byte)).(*[]byte) - codec := NewExecutePluginCodecV1() + codec := NewExecutePluginCodecV1(ExtraDataCodec) decoded, err := codec.Decode(tests.Context(t), rawReport) require.NoError(t, err) diff --git a/core/capabilities/ccip/ccipevm/extradatadecoder.go b/core/capabilities/ccip/ccipevm/extradatadecoder.go index 5f26ba9a54c..be657bfbb8d 100644 --- a/core/capabilities/ccip/ccipevm/extradatadecoder.go +++ b/core/capabilities/ccip/ccipevm/extradatadecoder.go @@ -6,8 +6,12 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" ) -func DecodeDestExecDataToMap(DestExecData cciptypes.Bytes) (map[string]interface{}, error) { - destGasAmount, err := abiDecodeUint32(DestExecData) +// ExtraDataDecoder is a concrete implementation of ExtraDataDecoder +type ExtraDataDecoder struct{} + +// DecodeDestExecDataToMap reformats bytes into a chain agnostic map[string]interface{} representation for dest exec data +func (d ExtraDataDecoder) DecodeDestExecDataToMap(destExecData cciptypes.Bytes) (map[string]interface{}, error) { + destGasAmount, err := abiDecodeUint32(destExecData) if err != nil { return nil, fmt.Errorf("decode dest gas amount: %w", err) } @@ -17,7 +21,8 @@ func DecodeDestExecDataToMap(DestExecData cciptypes.Bytes) (map[string]interface }, nil } -func DecodeExtraArgsToMap(extraArgs []byte) (map[string]any, error) { +// DecodeExtraArgsToMap reformats bytes into a chain agnostic map[string]any representation for extra args +func (d ExtraDataDecoder) DecodeExtraArgsToMap(extraArgs cciptypes.Bytes) (map[string]any, error) { if len(extraArgs) < 4 { return nil, fmt.Errorf("extra args too short: %d, should be at least 4 (i.e the extraArgs tag)", len(extraArgs)) } diff --git a/core/capabilities/ccip/ccipevm/extradatadecoder_test.go b/core/capabilities/ccip/ccipevm/extradatadecoder_test.go index f2a7b168618..b213a14331a 100644 --- a/core/capabilities/ccip/ccipevm/extradatadecoder_test.go +++ b/core/capabilities/ccip/ccipevm/extradatadecoder_test.go @@ -14,6 +14,7 @@ import ( func Test_decodeExtraData(t *testing.T) { d := testSetup(t) gasLimit := big.NewInt(rand.Int63()) + extraDataDecoder := &ExtraDataDecoder{} t.Run("decode extra args into map evm v1", func(t *testing.T) { encoded, err := d.contract.EncodeEVMExtraArgsV1(nil, message_hasher.ClientEVMExtraArgsV1{ @@ -21,7 +22,7 @@ func Test_decodeExtraData(t *testing.T) { }) require.NoError(t, err) - m, err := DecodeExtraArgsToMap(encoded) + m, err := extraDataDecoder.DecodeExtraArgsToMap(encoded) require.NoError(t, err) require.Len(t, m, 1) @@ -37,7 +38,7 @@ func Test_decodeExtraData(t *testing.T) { }) require.NoError(t, err) - m, err := DecodeExtraArgsToMap(encoded) + m, err := extraDataDecoder.DecodeExtraArgsToMap(encoded) require.NoError(t, err) require.Len(t, m, 2) @@ -65,7 +66,7 @@ func Test_decodeExtraData(t *testing.T) { encoded, err := d.contract.EncodeSVMExtraArgsV1(nil, decoded) require.NoError(t, err) - m, err := DecodeExtraArgsToMap(encoded) + m, err := extraDataDecoder.DecodeExtraArgsToMap(encoded) require.NoError(t, err) require.Len(t, m, 5) @@ -94,7 +95,7 @@ func Test_decodeExtraData(t *testing.T) { destGasAmount := uint32(10000) encoded, err := abiEncodeUint32(destGasAmount) require.NoError(t, err) - m, err := DecodeDestExecDataToMap(encoded) + m, err := extraDataDecoder.DecodeDestExecDataToMap(encoded) require.NoError(t, err) require.Len(t, m, 1) diff --git a/core/capabilities/ccip/ccipevm/helpers_test.go b/core/capabilities/ccip/ccipevm/helpers_test.go index 35615e9644a..f1381ea4cc5 100644 --- a/core/capabilities/ccip/ccipevm/helpers_test.go +++ b/core/capabilities/ccip/ccipevm/helpers_test.go @@ -13,6 +13,7 @@ import ( func Test_decodeExtraArgs(t *testing.T) { d := testSetup(t) gasLimit := big.NewInt(rand.Int63()) + extraDataDecoder := &ExtraDataDecoder{} t.Run("v1", func(t *testing.T) { encoded, err := d.contract.EncodeEVMExtraArgsV1(nil, message_hasher.ClientEVMExtraArgsV1{ @@ -45,7 +46,7 @@ func Test_decodeExtraArgs(t *testing.T) { }) require.NoError(t, err) - m, err := DecodeExtraArgsToMap(encoded) + m, err := extraDataDecoder.DecodeExtraArgsToMap(encoded) require.NoError(t, err) require.Len(t, m, 1) @@ -61,7 +62,7 @@ func Test_decodeExtraArgs(t *testing.T) { }) require.NoError(t, err) - m, err := DecodeExtraArgsToMap(encoded) + m, err := extraDataDecoder.DecodeExtraArgsToMap(encoded) require.NoError(t, err) require.Len(t, m, 2) diff --git a/core/capabilities/ccip/ccipevm/msghasher.go b/core/capabilities/ccip/ccipevm/msghasher.go index ac436afb028..e385edebe29 100644 --- a/core/capabilities/ccip/ccipevm/msghasher.go +++ b/core/capabilities/ccip/ccipevm/msghasher.go @@ -2,11 +2,15 @@ package ccipevm import ( "context" + "errors" "fmt" + "math/big" + "strings" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" + ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" "github.com/smartcontractkit/chainlink-ccip/pkg/logutil" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -40,12 +44,14 @@ var ( // Compatible with: // - "OnRamp 1.6.0" type MessageHasherV1 struct { - lggr logger.Logger + lggr logger.Logger + extraDataCodec ccipcommon.ExtraDataCodec } -func NewMessageHasherV1(lggr logger.Logger) *MessageHasherV1 { +func NewMessageHasherV1(lggr logger.Logger, extraDataCodec ccipcommon.ExtraDataCodec) *MessageHasherV1 { return &MessageHasherV1{ - lggr: lggr, + lggr: lggr, + extraDataCodec: extraDataCodec, } } @@ -154,9 +160,15 @@ func (h *MessageHasherV1) Hash(ctx context.Context, msg cciptypes.Message) (ccip // TODO: we assume that extra args is always abi-encoded for now, but we need // to decode according to source chain selector family. We should add a family // lookup API to the chain-selectors library. - gasLimit, err := decodeExtraArgsV1V2(msg.ExtraArgs) + + decodedExtraArgsMap, err := h.extraDataCodec.DecodeExtraArgs(msg.ExtraArgs, msg.Header.SourceChainSelector) + if err != nil { + return [32]byte{}, err + } + + gasLimit, err := parseExtraDataMap(decodedExtraArgsMap) if err != nil { - return [32]byte{}, fmt.Errorf("decode extra args: %w", err) + return [32]byte{}, fmt.Errorf("decode extra args to get gas limit: %w", err) } lggr.Debugw("decoded msg gas limit", "gasLimit", gasLimit) @@ -242,5 +254,44 @@ func abiDecodeAddress(data []byte) (common.Address, error) { return val, nil } +func parseExtraDataMap(input map[string]any) (*big.Int, error) { + var outputGas *big.Int + for fieldName, fieldValue := range input { + lowercase := strings.ToLower(fieldName) + switch lowercase { + case "gaslimit": + // Expect [][32]byte + if val, ok := fieldValue.(*big.Int); ok { + outputGas = val + return outputGas, nil + } else { + return nil, fmt.Errorf("unexpected type for gas limit: %T", fieldValue) + } + default: + // no error here, as we only need the keys to gasLimit, other keys can be skipped without like AllowOutOfOrderExecution etc. + } + } + return outputGas, errors.New("gas limit not found in extra data map") +} + +func extractDestGasAmountFromMap(input map[string]any) (uint32, error) { + // Iterate through the expected fields in the struct + for fieldName, fieldValue := range input { + lowercase := strings.ToLower(fieldName) + switch lowercase { + case "destgasamount": + // Expect uint32 + if val, ok := fieldValue.(uint32); ok { + return val, nil + } else { + return 0, errors.New("invalid type for destgasamount, expected uint32") + } + default: + } + } + + return 0, errors.New("invalid token message, dest gas amount not found in the DestExecDataDecoded map") +} + // Interface compliance check var _ cciptypes.MessageHasher = (*MessageHasherV1)(nil) diff --git a/core/capabilities/ccip/ccipevm/msghasher_test.go b/core/capabilities/ccip/ccipevm/msghasher_test.go index cb399a75573..3528c7635d6 100644 --- a/core/capabilities/ccip/ccipevm/msghasher_test.go +++ b/core/capabilities/ccip/ccipevm/msghasher_test.go @@ -17,6 +17,8 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" "github.com/ethereum/go-ethereum/core/types" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" + ccipcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" "github.com/stretchr/testify/require" "github.com/smartcontractkit/chainlink-common/pkg/logger" @@ -31,6 +33,8 @@ import ( cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" ) +var ExtraDataCodec = ccipcommon.NewExtraDataCodec(ccipcommon.NewExtraDataCodecParams(ExtraDataDecoder{}, ccipsolana.ExtraDataDecoder{})) + // NOTE: these test cases are only EVM <-> EVM. // Update these cases once we have non-EVM examples. func TestMessageHasher_EVM2EVM(t *testing.T) { @@ -38,19 +42,19 @@ func TestMessageHasher_EVM2EVM(t *testing.T) { d := testSetup(t) testCases := []evmExtraArgs{ - {version: "v1", gasLimit: big.NewInt(rand.Int63())}, - {version: "v2", gasLimit: big.NewInt(rand.Int63()), allowOOO: false}, - {version: "v2", gasLimit: big.NewInt(rand.Int63()), allowOOO: true}, + {version: "v1", gasLimit: big.NewInt(rand.Int63()), chainSelector: 5009297550715157269}, // ETH mainnet chain selector + {version: "v2", gasLimit: big.NewInt(rand.Int63()), allowOOO: false, chainSelector: 5009297550715157269}, // ETH mainnet chain selector + {version: "v2", gasLimit: big.NewInt(rand.Int63()), allowOOO: true, chainSelector: 5009297550715157269}, // ETH mainnet chain selector } for i, tc := range testCases { t.Run(fmt.Sprintf("tc_%d", i), func(tt *testing.T) { - testHasherEVM2EVM(ctx, tt, d, tc) + testHasherEVM2EVM(ctx, tt, d, tc, tc.chainSelector) }) } } -func testHasherEVM2EVM(ctx context.Context, t *testing.T, d *testSetupData, evmExtraArgs evmExtraArgs) { - ccipMsg := createEVM2EVMMessage(t, d.contract, evmExtraArgs) +func testHasherEVM2EVM(ctx context.Context, t *testing.T, d *testSetupData, evmExtraArgs evmExtraArgs, sourceChainSelector uint64) { + ccipMsg := createEVM2EVMMessage(t, d.contract, evmExtraArgs, sourceChainSelector) var tokenAmounts []message_hasher.InternalAny2EVMTokenTransfer for _, rta := range ccipMsg.TokenAmounts { @@ -83,7 +87,7 @@ func testHasherEVM2EVM(ctx context.Context, t *testing.T, d *testSetupData, evmE expectedHash, err := d.contract.Hash(&bind.CallOpts{Context: ctx}, evmMsg, ccipMsg.Header.OnRamp) require.NoError(t, err) - evmMsgHasher := NewMessageHasherV1(logger.Test(t)) + evmMsgHasher := NewMessageHasherV1(logger.Test(t), ExtraDataCodec) actualHash, err := evmMsgHasher.Hash(ctx, ccipMsg) require.NoError(t, err) @@ -91,19 +95,20 @@ func testHasherEVM2EVM(ctx context.Context, t *testing.T, d *testSetupData, evmE } type evmExtraArgs struct { - version string - gasLimit *big.Int - allowOOO bool + version string + gasLimit *big.Int + allowOOO bool + chainSelector uint64 } -func createEVM2EVMMessage(t *testing.T, messageHasher *message_hasher.MessageHasher, evmExtraArgs evmExtraArgs) cciptypes.Message { +func createEVM2EVMMessage(t *testing.T, messageHasher *message_hasher.MessageHasher, evmExtraArgs evmExtraArgs, sourceChainSelector uint64) cciptypes.Message { messageID := utils.RandomBytes32() sourceTokenData := make([]byte, rand.Intn(2048)) _, err := cryptorand.Read(sourceTokenData) require.NoError(t, err) - sourceChain := rand.Uint64() + sourceChain := sourceChainSelector seqNum := rand.Uint64() nonce := rand.Uint64() destChain := rand.Uint64() @@ -257,7 +262,7 @@ func TestMessagerHasher_againstRmnSharedVector(t *testing.T) { }, any2EVMMessage, common.LeftPadBytes(msg.Header.OnRamp, 32)) require.NoError(t, err) - h := NewMessageHasherV1(logger.Test(t)) + h := NewMessageHasherV1(logger.Test(t), ExtraDataCodec) msgH, err := h.Hash(tests.Context(t), msg) require.NoError(t, err) require.Equal(t, expectedMsgHash, msgH.String()) @@ -330,7 +335,7 @@ func TestMessagerHasher_againstRmnSharedVector(t *testing.T) { rmnMsgHash = "0xb6ea678f918293745bfb8db05d79dcf08986c7da3e302ac5f6782618a6f11967" ) - h := NewMessageHasherV1(logger.Test(t)) + h := NewMessageHasherV1(logger.Test(t), ExtraDataCodec) msgH, err := h.Hash(tests.Context(t), msg) require.NoError(t, err) @@ -355,7 +360,7 @@ func TestMessagerHasher_againstRmnSharedVector(t *testing.T) { err = json.Unmarshal(data, &msgs) require.NoError(t, err) - msgHasher := NewMessageHasherV1(logger.Test(t)) + msgHasher := NewMessageHasherV1(logger.Test(t), ExtraDataCodec) for _, msg := range msgs { any2EVMMessage := ccipMsgToAny2EVMMessage(t, msg) diff --git a/core/capabilities/ccip/ccipsolana/executecodec.go b/core/capabilities/ccip/ccipsolana/executecodec.go index dceb0d19a42..ad6efebf04f 100644 --- a/core/capabilities/ccip/ccipsolana/executecodec.go +++ b/core/capabilities/ccip/ccipsolana/executecodec.go @@ -10,6 +10,7 @@ import ( agbinary "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" @@ -19,10 +20,13 @@ import ( // Compatible with: // - "OffRamp 1.6.0-dev" type ExecutePluginCodecV1 struct { + extraDataCodec common.ExtraDataCodec } -func NewExecutePluginCodecV1() *ExecutePluginCodecV1 { - return &ExecutePluginCodecV1{} +func NewExecutePluginCodecV1(extraDataCodec common.ExtraDataCodec) *ExecutePluginCodecV1 { + return &ExecutePluginCodecV1{ + extraDataCodec: extraDataCodec, + } } func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.ExecutePluginReport) ([]byte, error) { @@ -50,7 +54,12 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec return nil, fmt.Errorf("invalid destTokenAddress address: %v", tokenAmount.DestTokenAddress) } - destGasAmount, err := extractDestGasAmountFromMap(tokenAmount.DestExecDataDecoded) + destExecDataDecodedMap, err := e.extraDataCodec.DecodeTokenAmountDestExecData(tokenAmount.DestExecData, chainReport.SourceChainSelector) + if err != nil { + return nil, fmt.Errorf("failed to decode dest exec data: %w", err) + } + + destGasAmount, err := extractDestGasAmountFromMap(destExecDataDecodedMap) if err != nil { return nil, err } @@ -64,8 +73,13 @@ func (e *ExecutePluginCodecV1) Encode(ctx context.Context, report cciptypes.Exec }) } + extraDataDecodecMap, err := e.extraDataCodec.DecodeExtraArgs(msg.ExtraArgs, chainReport.SourceChainSelector) + if err != nil { + return nil, fmt.Errorf("failed to decode extra args: %w", err) + } + var extraArgs ccip_offramp.Any2SVMRampExtraArgs - extraArgs, _, err := parseExtraArgsMapWithAccounts(msg.ExtraArgsDecoded) + extraArgs, _, err = parseExtraArgsMapWithAccounts(extraDataDecodecMap) if err != nil { return nil, fmt.Errorf("invalid extra args map: %w", err) } @@ -192,25 +206,23 @@ func (e *ExecutePluginCodecV1) Decode(ctx context.Context, encodedReport []byte) } func extractDestGasAmountFromMap(input map[string]any) (uint32, error) { - var out uint32 - - // Iterate through the expected fields in the struct + // Search for the gas fields for fieldName, fieldValue := range input { lowercase := strings.ToLower(fieldName) switch lowercase { case "destgasamount": // Expect uint32 if v, ok := fieldValue.(uint32); ok { - out = v + return v, nil } else { - return out, errors.New("invalid type for destgasamount, expected uint32") + return 0, errors.New("invalid type for destgasamount, expected uint32") } default: - return out, errors.New("invalid token message, dest gas amount not found in the DestExecDataDecoded map") + } } - return out, nil + return 0, errors.New("invalid token message, dest gas amount not found in the DestExecDataDecoded map") } // Ensure ExecutePluginCodec implements the ExecutePluginCodec interface diff --git a/core/capabilities/ccip/ccipsolana/executecodec_test.go b/core/capabilities/ccip/ccipsolana/executecodec_test.go index 833d83126be..927b28f6c04 100644 --- a/core/capabilities/ccip/ccipsolana/executecodec_test.go +++ b/core/capabilities/ccip/ccipsolana/executecodec_test.go @@ -9,6 +9,11 @@ import ( agbinary "github.com/gagliardetto/binary" solanago "github.com/gagliardetto/solana-go" + "github.com/stretchr/testify/mock" + + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common/mocks" + + "github.com/smartcontractkit/chainlink-ccip/mocks/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" @@ -146,10 +151,18 @@ func TestExecutePluginCodecV1(t *testing.T) { } ctx := testutils.Context(t) + mockExtraDataCodec := &mocks.ExtraDataCodec{} + mockExtraDataCodec.On("DecodeTokenAmountDestExecData", mock.Anything, mock.Anything).Return(map[string]any{ + "destGasAmount": uint32(10), + }, nil) + mockExtraDataCodec.On("DecodeExtraArgs", mock.Anything, mock.Anything).Return(map[string]any{ + "ComputeUnits": uint32(1000), + "accountIsWritableBitmap": uint64(2), + }, nil) for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - cd := NewExecutePluginCodecV1() + cd := NewExecutePluginCodecV1(mockExtraDataCodec) report := tc.report(randomExecuteReport(t, tc.chainSelector)) bytes, err := cd.Encode(ctx, report) if tc.expErr { @@ -181,6 +194,14 @@ func TestExecutePluginCodecV1(t *testing.T) { } func Test_DecodingExecuteReport(t *testing.T) { + mockExtraDataCodec := ccipocr3.NewMockExtraDataCodec(t) + mockExtraDataCodec.On("DecodeTokenAmountDestExecData", mock.Anything, mock.Anything).Return(map[string]any{ + "destGasAmount": uint32(10), + }, nil) + mockExtraDataCodec.On("DecodeExtraArgs", mock.Anything, mock.Anything).Return(map[string]any{ + "ComputeUnits": uint32(1000), + "accountIsWritableBitmap": uint64(2), + }, nil) t.Run("decode on-chain execute report", func(t *testing.T) { chainSel := cciptypes.ChainSelector(rand.Uint64()) onRampAddr, err := solanago.NewRandomPrivateKey() @@ -222,7 +243,7 @@ func Test_DecodingExecuteReport(t *testing.T) { err = onChainReport.MarshalWithEncoder(encoder) require.NoError(t, err) - executeCodec := NewExecutePluginCodecV1() + executeCodec := NewExecutePluginCodecV1(mockExtraDataCodec) decode, err := executeCodec.Decode(testutils.Context(t), buf.Bytes()) require.NoError(t, err) @@ -238,7 +259,7 @@ func Test_DecodingExecuteReport(t *testing.T) { t.Run("decode Borsh encoded execute report", func(t *testing.T) { ocrReport := randomExecuteReport(t, 124615329519749607) - cd := NewExecutePluginCodecV1() + cd := NewExecutePluginCodecV1(mockExtraDataCodec) encodedReport, err := cd.Encode(testutils.Context(t), ocrReport) require.NoError(t, err) diff --git a/core/capabilities/ccip/ccipsolana/extradatadecoder.go b/core/capabilities/ccip/ccipsolana/extradatadecoder.go index b46692d0d98..616a65aa462 100644 --- a/core/capabilities/ccip/ccipsolana/extradatadecoder.go +++ b/core/capabilities/ccip/ccipsolana/extradatadecoder.go @@ -7,6 +7,7 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" agbinary "github.com/gagliardetto/binary" + cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/fee_quoter" ) @@ -26,8 +27,11 @@ var ( evmExtraArgsV2Tag = hexutil.MustDecode("0x181dcf10") ) -// DecodeExtraArgsToMap is a helper function for converting Borsh encoded extra args bytes into map[string]any, which will be saved in ocr report.message.ExtraArgsDecoded -func DecodeExtraArgsToMap(extraArgs []byte) (map[string]any, error) { +// ExtraDataDecoder is a helper struct for decoding extra data +type ExtraDataDecoder struct{} + +// DecodeExtraArgsToMap is a helper function for converting Borsh encoded extra args bytes into map[string]any +func (d ExtraDataDecoder) DecodeExtraArgsToMap(extraArgs cciptypes.Bytes) (map[string]any, error) { if len(extraArgs) < 4 { return nil, fmt.Errorf("extra args too short: %d, should be at least 4 (i.e the extraArgs tag)", len(extraArgs)) } @@ -67,7 +71,8 @@ func DecodeExtraArgsToMap(extraArgs []byte) (map[string]any, error) { return outputMap, nil } -func DecodeDestExecDataToMap(destExecData []byte) (map[string]any, error) { +// DecodeDestExecDataToMap is a helper function for converting dest exec data bytes into map[string]any +func (d ExtraDataDecoder) DecodeDestExecDataToMap(destExecData cciptypes.Bytes) (map[string]any, error) { return map[string]interface{}{ svmDestExecDataKey: bytesToUint32LE(destExecData), }, nil diff --git a/core/capabilities/ccip/ccipsolana/extradatadecoder_test.go b/core/capabilities/ccip/ccipsolana/extradatadecoder_test.go index a4de8331d24..56de78fd412 100644 --- a/core/capabilities/ccip/ccipsolana/extradatadecoder_test.go +++ b/core/capabilities/ccip/ccipsolana/extradatadecoder_test.go @@ -15,11 +15,12 @@ import ( ) func Test_decodeExtraArgs(t *testing.T) { + extraDataDecoder := &ExtraDataDecoder{} t.Run("decode dest exec data into map svm", func(t *testing.T) { destGasAmount := uint32(10000) encoded := make([]byte, 4) binary.LittleEndian.PutUint32(encoded, destGasAmount) - output, err := DecodeDestExecDataToMap(encoded) + output, err := extraDataDecoder.DecodeDestExecDataToMap(encoded) require.NoError(t, err) decoded, exist := output[svmDestExecDataKey] @@ -46,7 +47,7 @@ func Test_decodeExtraArgs(t *testing.T) { encoder := agbinary.NewBorshEncoder(&buf) err := extraArgs.MarshalWithEncoder(encoder) require.NoError(t, err) - output, err := DecodeExtraArgsToMap(append(svmExtraArgsV1Tag, buf.Bytes()...)) + output, err := extraDataDecoder.DecodeExtraArgsToMap(append(svmExtraArgsV1Tag, buf.Bytes()...)) require.NoError(t, err) require.Len(t, output, 5) @@ -74,7 +75,7 @@ func Test_decodeExtraArgs(t *testing.T) { err := extraArgs.MarshalWithEncoder(encoder) require.NoError(t, err) - output, err := DecodeExtraArgsToMap(append(evmExtraArgsV2Tag, buf.Bytes()...)) + output, err := extraDataDecoder.DecodeExtraArgsToMap(append(evmExtraArgsV2Tag, buf.Bytes()...)) require.NoError(t, err) require.Len(t, output, 2) diff --git a/core/capabilities/ccip/ccipsolana/msghasher.go b/core/capabilities/ccip/ccipsolana/msghasher.go index 7c12de91026..54f5a0eb159 100644 --- a/core/capabilities/ccip/ccipsolana/msghasher.go +++ b/core/capabilities/ccip/ccipsolana/msghasher.go @@ -7,6 +7,7 @@ import ( "strings" "github.com/gagliardetto/solana-go" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common" "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/ccip" @@ -20,12 +21,14 @@ import ( // Compatible with: // - "OnRamp 1.6.0-dev" type MessageHasherV1 struct { - lggr logger.Logger + lggr logger.Logger + extraDataCodec common.ExtraDataCodec } -func NewMessageHasherV1(lggr logger.Logger) *MessageHasherV1 { +func NewMessageHasherV1(lggr logger.Logger, extraDataCodec cciptypes.ExtraDataCodec) *MessageHasherV1 { return &MessageHasherV1{ - lggr: lggr, + lggr: lggr, + extraDataCodec: extraDataCodec, } } @@ -45,7 +48,12 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty anyToSolanaMessage.Sender = msg.Sender anyToSolanaMessage.Data = msg.Data for _, ta := range msg.TokenAmounts { - destGasAmount, err := extractDestGasAmountFromMap(ta.DestExecDataDecoded) + destExecDataDecodedMap, err := h.extraDataCodec.DecodeTokenAmountDestExecData(ta.DestExecData, msg.Header.SourceChainSelector) + if err != nil { + return [32]byte{}, fmt.Errorf("failed to decode dest exec data: %w", err) + } + + destGasAmount, err := extractDestGasAmountFromMap(destExecDataDecodedMap) if err != nil { return [32]byte{}, err } @@ -59,9 +67,13 @@ func (h *MessageHasherV1) Hash(_ context.Context, msg cciptypes.Message) (ccipty }) } - var err error + extraDataDecodecMap, err := h.extraDataCodec.DecodeExtraArgs(msg.ExtraArgs, msg.Header.SourceChainSelector) + if err != nil { + return [32]byte{}, fmt.Errorf("failed to decode extra args: %w", err) + } + var msgAccounts []solana.PublicKey - anyToSolanaMessage.ExtraArgs, msgAccounts, err = parseExtraArgsMapWithAccounts(msg.ExtraArgsDecoded) + anyToSolanaMessage.ExtraArgs, msgAccounts, err = parseExtraArgsMapWithAccounts(extraDataDecodecMap) if err != nil { return [32]byte{}, fmt.Errorf("failed to decode ExtraArgs: %w", err) } @@ -107,7 +119,7 @@ func parseExtraArgsMapWithAccounts(input map[string]any) (ccip_offramp.Any2SVMRa return out, accounts, errors.New("invalid type for Accounts, expected [][32]byte") } default: - // no error here, aswe only need the keys to construct SVMExtraArgs, other keys can be skipped without + // no error here, as we only need the keys to construct SVMExtraArgs, other keys can be skipped without // return errors because there's no guarantee SVMExtraArgs will match with SVMExtraArgsV1 } } diff --git a/core/capabilities/ccip/ccipsolana/msghasher_test.go b/core/capabilities/ccip/ccipsolana/msghasher_test.go index c078b124b5b..8e838689cb5 100644 --- a/core/capabilities/ccip/ccipsolana/msghasher_test.go +++ b/core/capabilities/ccip/ccipsolana/msghasher_test.go @@ -9,8 +9,11 @@ import ( agbinary "github.com/gagliardetto/binary" "github.com/gagliardetto/solana-go" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common/mocks" + "github.com/smartcontractkit/chainlink-ccip/chains/solana/contracts/tests/config" "github.com/smartcontractkit/chainlink-ccip/chains/solana/gobindings/ccip_offramp" "github.com/smartcontractkit/chainlink-ccip/chains/solana/utils/ccip" @@ -25,7 +28,20 @@ import ( func TestMessageHasher_Any2Solana(t *testing.T) { any2AnyMsg, any2SolanaMsg, msgAccounts := createAny2SolanaMessages(t) - msgHasher := NewMessageHasherV1(logger.Test(t)) + mockExtraDataCodec := &mocks.ExtraDataCodec{} + mockExtraDataCodec.On("DecodeTokenAmountDestExecData", mock.Anything, mock.Anything).Return(map[string]any{ + "destGasAmount": uint32(10), + }, nil) + mockExtraDataCodec.On("DecodeExtraArgs", mock.Anything, mock.Anything).Return(map[string]any{ + "ComputeUnits": uint32(1000), + "AccountIsWritableBitmap": uint64(10), + "Accounts": [][32]byte{ + [32]byte(config.CcipLogicReceiver.Bytes()), + [32]byte(config.ReceiverTargetAccountPDA.Bytes()), + [32]byte(solana.SystemProgramID.Bytes()), + }, + }, nil) + msgHasher := NewMessageHasherV1(logger.Test(t), mockExtraDataCodec) actualHash, err := msgHasher.Hash(testutils.Context(t), any2AnyMsg) require.NoError(t, err) expectedHash, err := ccip.HashAnyToSVMMessage(any2SolanaMsg, any2AnyMsg.Header.OnRamp, msgAccounts) diff --git a/core/capabilities/ccip/common/extradatacodec.go b/core/capabilities/ccip/common/extradatacodec.go index 47146ddd5b6..a7e3376035c 100644 --- a/core/capabilities/ccip/common/extradatacodec.go +++ b/core/capabilities/ccip/common/extradatacodec.go @@ -4,19 +4,53 @@ import ( "fmt" chainsel "github.com/smartcontractkit/chain-selectors" - cciptypes "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" - "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" - "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" ) -type ExtraDataCodec struct{} +// ExtraDataCodec is an interface for decoding extra args and dest exec data into a chain-agnostic map[string]any representation +type ExtraDataCodec interface { + // DecodeExtraArgs reformat bytes into a chain agnostic map[string]any representation for extra args + DecodeExtraArgs(extraArgs cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) + // DecodeTokenAmountDestExecData reformat bytes to chain-agnostic map[string]any for tokenAmount DestExecData field + DecodeTokenAmountDestExecData(destExecData cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) +} + +// ExtraDataDecoder is an interface for decoding extra args and dest exec data into a map[string]any representation +type ExtraDataDecoder interface { + DecodeExtraArgsToMap(extraArgs cciptypes.Bytes) (map[string]any, error) + DecodeDestExecDataToMap(destExecData cciptypes.Bytes) (map[string]any, error) +} + +// RealExtraDataCodec is a concrete implementation of ExtraDataCodec +type RealExtraDataCodec struct { + EVMExtraDataDecoder ExtraDataDecoder + SolanaExtraDataDecoder ExtraDataDecoder +} + +// ExtraDataCodecParams is a struct that holds the parameters for creating a RealExtraDataCodec +type ExtraDataCodecParams struct { + evmExtraDataDecoder ExtraDataDecoder + solanaExtraDataDecoder ExtraDataDecoder +} + +// NewExtraDataCodecParams is a constructor for ExtraDataCodecParams +func NewExtraDataCodecParams(evmDecoder ExtraDataDecoder, solanaDecoder ExtraDataDecoder) ExtraDataCodecParams { + return ExtraDataCodecParams{ + evmExtraDataDecoder: evmDecoder, + solanaExtraDataDecoder: solanaDecoder, + } +} -func NewExtraDataCodec() ExtraDataCodec { - return ExtraDataCodec{} +// NewExtraDataCodec is a constructor for RealExtraDataCodec +func NewExtraDataCodec(params ExtraDataCodecParams) RealExtraDataCodec { + return RealExtraDataCodec{ + EVMExtraDataDecoder: params.evmExtraDataDecoder, + SolanaExtraDataDecoder: params.solanaExtraDataDecoder, + } } -func (c ExtraDataCodec) DecodeExtraArgs(extraArgs cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) { +// DecodeExtraArgs reformats bytes into a chain agnostic map[string]any representation for extra args +func (c RealExtraDataCodec) DecodeExtraArgs(extraArgs cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) { if len(extraArgs) == 0 { // return empty map if extraArgs is empty return nil, nil @@ -29,17 +63,18 @@ func (c ExtraDataCodec) DecodeExtraArgs(extraArgs cciptypes.Bytes, sourceChainSe switch family { case chainsel.FamilyEVM: - return ccipevm.DecodeExtraArgsToMap(extraArgs) + return c.EVMExtraDataDecoder.DecodeExtraArgsToMap(extraArgs) case chainsel.FamilySolana: - return ccipsolana.DecodeExtraArgsToMap(extraArgs) + return c.SolanaExtraDataDecoder.DecodeExtraArgsToMap(extraArgs) default: return nil, fmt.Errorf("unsupported family for extra args type %s", family) } } -func (c ExtraDataCodec) DecodeTokenAmountDestExecData(destExecData cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) { +// DecodeTokenAmountDestExecData reformats bytes to chain-agnostic map[string]any for tokenAmount DestExecData field +func (c RealExtraDataCodec) DecodeTokenAmountDestExecData(destExecData cciptypes.Bytes, sourceChainSelector cciptypes.ChainSelector) (map[string]any, error) { if len(destExecData) == 0 { // return empty map if destExecData is empty return nil, nil @@ -52,10 +87,10 @@ func (c ExtraDataCodec) DecodeTokenAmountDestExecData(destExecData cciptypes.Byt switch family { case chainsel.FamilyEVM: - return ccipevm.DecodeDestExecDataToMap(destExecData) + return c.EVMExtraDataDecoder.DecodeDestExecDataToMap(destExecData) case chainsel.FamilySolana: - return ccipsolana.DecodeDestExecDataToMap(destExecData) + return c.SolanaExtraDataDecoder.DecodeDestExecDataToMap(destExecData) default: return nil, fmt.Errorf("unsupported family for extra args type %s", family) diff --git a/core/capabilities/ccip/common/mocks/extra_data_codec.go b/core/capabilities/ccip/common/mocks/extra_data_codec.go new file mode 100644 index 00000000000..d52d2bd8497 --- /dev/null +++ b/core/capabilities/ccip/common/mocks/extra_data_codec.go @@ -0,0 +1,154 @@ +// Code generated by mockery v2.50.0. DO NOT EDIT. + +package mocks + +import ( + ccipocr3 "github.com/smartcontractkit/chainlink-ccip/pkg/types/ccipocr3" + + mock "github.com/stretchr/testify/mock" +) + +// ExtraDataCodec is an autogenerated mock type for the ExtraDataCodec type +type ExtraDataCodec struct { + mock.Mock +} + +type ExtraDataCodec_Expecter struct { + mock *mock.Mock +} + +func (_m *ExtraDataCodec) EXPECT() *ExtraDataCodec_Expecter { + return &ExtraDataCodec_Expecter{mock: &_m.Mock} +} + +// DecodeExtraArgs provides a mock function with given fields: extraArgs, sourceChainSelector +func (_m *ExtraDataCodec) DecodeExtraArgs(extraArgs ccipocr3.Bytes, sourceChainSelector ccipocr3.ChainSelector) (map[string]interface{}, error) { + ret := _m.Called(extraArgs, sourceChainSelector) + + if len(ret) == 0 { + panic("no return value specified for DecodeExtraArgs") + } + + var r0 map[string]interface{} + var r1 error + if rf, ok := ret.Get(0).(func(ccipocr3.Bytes, ccipocr3.ChainSelector) (map[string]interface{}, error)); ok { + return rf(extraArgs, sourceChainSelector) + } + if rf, ok := ret.Get(0).(func(ccipocr3.Bytes, ccipocr3.ChainSelector) map[string]interface{}); ok { + r0 = rf(extraArgs, sourceChainSelector) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]interface{}) + } + } + + if rf, ok := ret.Get(1).(func(ccipocr3.Bytes, ccipocr3.ChainSelector) error); ok { + r1 = rf(extraArgs, sourceChainSelector) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ExtraDataCodec_DecodeExtraArgs_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DecodeExtraArgs' +type ExtraDataCodec_DecodeExtraArgs_Call struct { + *mock.Call +} + +// DecodeExtraArgs is a helper method to define mock.On call +// - extraArgs ccipocr3.Bytes +// - sourceChainSelector ccipocr3.ChainSelector +func (_e *ExtraDataCodec_Expecter) DecodeExtraArgs(extraArgs interface{}, sourceChainSelector interface{}) *ExtraDataCodec_DecodeExtraArgs_Call { + return &ExtraDataCodec_DecodeExtraArgs_Call{Call: _e.mock.On("DecodeExtraArgs", extraArgs, sourceChainSelector)} +} + +func (_c *ExtraDataCodec_DecodeExtraArgs_Call) Run(run func(extraArgs ccipocr3.Bytes, sourceChainSelector ccipocr3.ChainSelector)) *ExtraDataCodec_DecodeExtraArgs_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(ccipocr3.Bytes), args[1].(ccipocr3.ChainSelector)) + }) + return _c +} + +func (_c *ExtraDataCodec_DecodeExtraArgs_Call) Return(_a0 map[string]interface{}, _a1 error) *ExtraDataCodec_DecodeExtraArgs_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ExtraDataCodec_DecodeExtraArgs_Call) RunAndReturn(run func(ccipocr3.Bytes, ccipocr3.ChainSelector) (map[string]interface{}, error)) *ExtraDataCodec_DecodeExtraArgs_Call { + _c.Call.Return(run) + return _c +} + +// DecodeTokenAmountDestExecData provides a mock function with given fields: destExecData, sourceChainSelector +func (_m *ExtraDataCodec) DecodeTokenAmountDestExecData(destExecData ccipocr3.Bytes, sourceChainSelector ccipocr3.ChainSelector) (map[string]interface{}, error) { + ret := _m.Called(destExecData, sourceChainSelector) + + if len(ret) == 0 { + panic("no return value specified for DecodeTokenAmountDestExecData") + } + + var r0 map[string]interface{} + var r1 error + if rf, ok := ret.Get(0).(func(ccipocr3.Bytes, ccipocr3.ChainSelector) (map[string]interface{}, error)); ok { + return rf(destExecData, sourceChainSelector) + } + if rf, ok := ret.Get(0).(func(ccipocr3.Bytes, ccipocr3.ChainSelector) map[string]interface{}); ok { + r0 = rf(destExecData, sourceChainSelector) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(map[string]interface{}) + } + } + + if rf, ok := ret.Get(1).(func(ccipocr3.Bytes, ccipocr3.ChainSelector) error); ok { + r1 = rf(destExecData, sourceChainSelector) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// ExtraDataCodec_DecodeTokenAmountDestExecData_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'DecodeTokenAmountDestExecData' +type ExtraDataCodec_DecodeTokenAmountDestExecData_Call struct { + *mock.Call +} + +// DecodeTokenAmountDestExecData is a helper method to define mock.On call +// - destExecData ccipocr3.Bytes +// - sourceChainSelector ccipocr3.ChainSelector +func (_e *ExtraDataCodec_Expecter) DecodeTokenAmountDestExecData(destExecData interface{}, sourceChainSelector interface{}) *ExtraDataCodec_DecodeTokenAmountDestExecData_Call { + return &ExtraDataCodec_DecodeTokenAmountDestExecData_Call{Call: _e.mock.On("DecodeTokenAmountDestExecData", destExecData, sourceChainSelector)} +} + +func (_c *ExtraDataCodec_DecodeTokenAmountDestExecData_Call) Run(run func(destExecData ccipocr3.Bytes, sourceChainSelector ccipocr3.ChainSelector)) *ExtraDataCodec_DecodeTokenAmountDestExecData_Call { + _c.Call.Run(func(args mock.Arguments) { + run(args[0].(ccipocr3.Bytes), args[1].(ccipocr3.ChainSelector)) + }) + return _c +} + +func (_c *ExtraDataCodec_DecodeTokenAmountDestExecData_Call) Return(_a0 map[string]interface{}, _a1 error) *ExtraDataCodec_DecodeTokenAmountDestExecData_Call { + _c.Call.Return(_a0, _a1) + return _c +} + +func (_c *ExtraDataCodec_DecodeTokenAmountDestExecData_Call) RunAndReturn(run func(ccipocr3.Bytes, ccipocr3.ChainSelector) (map[string]interface{}, error)) *ExtraDataCodec_DecodeTokenAmountDestExecData_Call { + _c.Call.Return(run) + return _c +} + +// NewExtraDataCodec creates a new instance of ExtraDataCodec. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewExtraDataCodec(t interface { + mock.TestingT + Cleanup(func()) +}) *ExtraDataCodec { + mock := &ExtraDataCodec{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go index e9cab490893..803b5fed2e5 100644 --- a/core/capabilities/ccip/oraclecreator/plugin.go +++ b/core/capabilities/ccip/oraclecreator/plugin.go @@ -53,12 +53,53 @@ import ( ) var _ cctypes.OracleCreator = &pluginOracleCreator{} +var extraDataCodec = ccipcommon.NewExtraDataCodec( + ccipcommon.NewExtraDataCodecParams( + ccipevm.ExtraDataDecoder{}, + ccipsolana.ExtraDataDecoder{}, + ), +) + +var plugins = map[string]plugin{ + chainsel.FamilyEVM: { + CommitPluginCodec: ccipevm.NewCommitPluginCodecV1(), + ExecutePluginCodec: ccipevm.NewExecutePluginCodecV1(extraDataCodec), + ExtraArgsCodec: extraDataCodec, + MessageHasher: func(lggr logger.Logger) cciptypes.MessageHasher { + return ccipevm.NewMessageHasherV1(lggr, extraDataCodec) + }, + TokenDataEncoder: ccipevm.NewEVMTokenDataEncoder(), + GasEstimateProvider: ccipevm.NewGasEstimateProvider(), + RMNCrypto: func(lggr logger.Logger) cciptypes.RMNCrypto { return ccipevm.NewEVMRMNCrypto(lggr) }, + }, + chainsel.FamilySolana: { + CommitPluginCodec: ccipsolana.NewCommitPluginCodecV1(), + ExecutePluginCodec: ccipsolana.NewExecutePluginCodecV1(extraDataCodec), + ExtraArgsCodec: extraDataCodec, + MessageHasher: func(lggr logger.Logger) cciptypes.MessageHasher { + return ccipsolana.NewMessageHasherV1(lggr, extraDataCodec) + }, + TokenDataEncoder: ccipsolana.NewSolanaTokenDataEncoder(), + GasEstimateProvider: ccipsolana.NewGasEstimateProvider(), + RMNCrypto: func(lggr logger.Logger) cciptypes.RMNCrypto { return nil }, + }, +} const ( defaultCommitGasLimit = 500_000 defaultExecGasLimit = 6_500_000 ) +type plugin struct { + CommitPluginCodec cciptypes.CommitPluginCodec + ExecutePluginCodec cciptypes.ExecutePluginCodec + ExtraArgsCodec ccipcommon.ExtraDataCodec + MessageHasher func(lggr logger.Logger) cciptypes.MessageHasher + TokenDataEncoder cciptypes.TokenDataEncoder + GasEstimateProvider cciptypes.EstimateProvider + RMNCrypto func(lggr logger.Logger) cciptypes.RMNCrypto +} + // pluginOracleCreator creates oracles that reference plugins running // in the same process as the chainlink node, i.e not LOOPPs. type pluginOracleCreator struct { @@ -238,37 +279,6 @@ func encodeOffRampAddr(addr []byte, chainFamily string, checkSum bool) string { return offRampAddr } -type plugin struct { - CommitPluginCodec cciptypes.CommitPluginCodec - ExecutePluginCodec cciptypes.ExecutePluginCodec - ExtraArgsCodec cciptypes.ExtraDataCodec - MessageHasher func(lggr logger.Logger) cciptypes.MessageHasher - TokenDataEncoder cciptypes.TokenDataEncoder - GasEstimateProvider cciptypes.EstimateProvider - RMNCrypto func(lggr logger.Logger) cciptypes.RMNCrypto -} - -var plugins = map[string]plugin{ - chainsel.FamilyEVM: { - CommitPluginCodec: ccipevm.NewCommitPluginCodecV1(), - ExecutePluginCodec: ccipevm.NewExecutePluginCodecV1(), - ExtraArgsCodec: ccipcommon.NewExtraDataCodec(), - MessageHasher: func(lggr logger.Logger) cciptypes.MessageHasher { return ccipevm.NewMessageHasherV1(lggr) }, - TokenDataEncoder: ccipevm.NewEVMTokenDataEncoder(), - GasEstimateProvider: ccipevm.NewGasEstimateProvider(), - RMNCrypto: func(lggr logger.Logger) cciptypes.RMNCrypto { return ccipevm.NewEVMRMNCrypto(lggr) }, - }, - chainsel.FamilySolana: { - CommitPluginCodec: ccipsolana.NewCommitPluginCodecV1(), - ExecutePluginCodec: ccipsolana.NewExecutePluginCodecV1(), - ExtraArgsCodec: ccipcommon.NewExtraDataCodec(), - MessageHasher: func(lggr logger.Logger) cciptypes.MessageHasher { return ccipsolana.NewMessageHasherV1(lggr) }, - TokenDataEncoder: ccipsolana.NewSolanaTokenDataEncoder(), - GasEstimateProvider: ccipsolana.NewGasEstimateProvider(), - RMNCrypto: func(lggr logger.Logger) cciptypes.RMNCrypto { return nil }, - }, -} - func (i *pluginOracleCreator) createFactoryAndTransmitter( donID uint32, config cctypes.OCR3ConfigWithMeta, diff --git a/integration-tests/smoke/ccip/ccip_reader_test.go b/integration-tests/smoke/ccip/ccip_reader_test.go index 3ca3ef73316..d68242c1c96 100644 --- a/integration-tests/smoke/ccip/ccip_reader_test.go +++ b/integration-tests/smoke/ccip/ccip_reader_test.go @@ -19,6 +19,9 @@ import ( "github.com/stretchr/testify/require" "go.uber.org/zap/zapcore" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm" + "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipsolana" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/deployment/environment/memory" @@ -294,7 +297,7 @@ func TestCCIPReader_GetRMNRemoteConfig(t *testing.T) { nil, chainD, rmnRemoteAddr.Bytes(), - ccipcommon.NewExtraDataCodec(), + ccipcommon.NewExtraDataCodec(ccipcommon.NewExtraDataCodecParams(ccipevm.ExtraDataDecoder{}, ccipsolana.ExtraDataDecoder{})), ) exp, err := rmnRemote.GetVersionedConfig(&bind.CallOpts{ @@ -418,7 +421,7 @@ func TestCCIPReader_GetOffRampConfigDigest(t *testing.T) { nil, chainD, addr.Bytes(), - ccipcommon.NewExtraDataCodec(), + ccipcommon.NewExtraDataCodec(ccipcommon.NewExtraDataCodecParams(ccipevm.ExtraDataDecoder{}, ccipsolana.ExtraDataDecoder{})), ) ccipReaderCommitDigest, err := reader.GetOffRampConfigDigest(ctx, consts.PluginTypeCommit) @@ -1545,7 +1548,7 @@ func testSetupRealContracts( contractReaders[chain] = cr } contractWriters := make(map[cciptypes.ChainSelector]types.ContractWriter) - edc := ccipcommon.NewExtraDataCodec() + edc := ccipcommon.NewExtraDataCodec(ccipcommon.NewExtraDataCodecParams(ccipevm.ExtraDataDecoder{}, ccipsolana.ExtraDataDecoder{})) reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, cciptypes.ChainSelector(destChain), nil, edc) return reader @@ -1661,7 +1664,7 @@ func testSetup( contractReaders[chain] = cr } contractWriters := make(map[cciptypes.ChainSelector]types.ContractWriter) - edc := ccipcommon.NewExtraDataCodec() + edc := ccipcommon.NewExtraDataCodec(ccipcommon.NewExtraDataCodecParams(ccipevm.ExtraDataDecoder{}, ccipsolana.ExtraDataDecoder{})) reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(ctx, lggr, contractReaders, contractWriters, params.DestChain, nil, edc) t.Cleanup(func() { From 6272fc5a7ec0b2556bb07fcdf24cb846e356913d Mon Sep 17 00:00:00 2001 From: ilija42 <57732589+ilija42@users.noreply.github.com> Date: Sat, 15 Feb 2025 02:22:18 +0100 Subject: [PATCH 83/83] [NONEVM-1319] - Solana Contract Reader Dest and Source cfg (#16308) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Implement Solana Contract Reader config and bump chainlink-solana * Update CR config * Resolve more TODOs from Contract Reader config * Bump solana * Progress on CR config * Add comments to CR config * Bump chainlink-ccip/chains/solana in core too * Use feeQuoterIDL * Fix CR config issues * Simplify CR config and add a TODO * Remove CR config resolved TODOs and add serialisation test * Add MethodNameOffRampLatestConfigDetails to CR config * Fix cfg * Upgraded chainlink-common dependency * Bump common and resolve OffRampLatestConfigDetails issues * Fixed linting --------- Co-authored-by: Blaž Hrastnik Co-authored-by: amit-momin --- .../ccip/configs/solana/chain_writer.go | 4 +- .../ccip/configs/solana/contract_reader.go | 458 +++++++++++++++++- .../configs/solana/contract_reader_test.go | 30 ++ .../capabilities/ccip/oraclecreator/plugin.go | 12 +- core/scripts/go.mod | 2 +- core/scripts/go.sum | 4 +- deployment/go.mod | 2 +- deployment/go.sum | 4 +- go.mod | 2 +- go.sum | 4 +- integration-tests/go.mod | 2 +- integration-tests/go.sum | 4 +- integration-tests/load/go.mod | 2 +- integration-tests/load/go.sum | 4 +- 14 files changed, 512 insertions(+), 22 deletions(-) create mode 100644 core/capabilities/ccip/configs/solana/contract_reader_test.go diff --git a/core/capabilities/ccip/configs/solana/chain_writer.go b/core/capabilities/ccip/configs/solana/chain_writer.go index 1226a7bad92..e8deee0ede7 100644 --- a/core/capabilities/ccip/configs/solana/chain_writer.go +++ b/core/capabilities/ccip/configs/solana/chain_writer.go @@ -332,8 +332,8 @@ func GetSolanaChainWriterConfig(offrampProgramAddress string, fromAddress string Programs: map[string]chainwriter.ProgramConfig{ ccipconsts.ContractNameOffRamp: { Methods: map[string]chainwriter.MethodConfig{ - ccipconsts.MethodExecute: getExecuteMethodConfig(fromAddress, offrampProgramAddress), - ccipconsts.MethodCommit: getCommitMethodConfig(fromAddress, offrampProgramAddress, destChainSelector, false), + ccipconsts.MethodExecute: getExecuteMethodConfig(fromAddress, offrampProgramAddress), + ccipconsts.MethodCommit: getCommitMethodConfig(fromAddress, offrampProgramAddress, destChainSelector, false), ccipconsts.MethodCommitPriceOnly: getCommitMethodConfig(fromAddress, offrampProgramAddress, destChainSelector, true), }, IDL: ccipOfframpIDL, diff --git a/core/capabilities/ccip/configs/solana/contract_reader.go b/core/capabilities/ccip/configs/solana/contract_reader.go index 39d9efbfbf7..3896b2ae9fa 100644 --- a/core/capabilities/ccip/configs/solana/contract_reader.go +++ b/core/capabilities/ccip/configs/solana/contract_reader.go @@ -1,11 +1,465 @@ package solana import ( + "encoding/json" + "fmt" + + idl "github.com/smartcontractkit/chainlink-ccip/chains/solana" + "github.com/smartcontractkit/chainlink-ccip/pkg/consts" + "github.com/smartcontractkit/chainlink-common/pkg/codec" + solanacodec "github.com/smartcontractkit/chainlink-solana/pkg/solana/codec" "github.com/smartcontractkit/chainlink-solana/pkg/solana/config" ) -var DestReaderConfig = config.ContractReader{} // TODO update the Dest chain reader configuration -var SourceReaderConfig = config.ContractReader{} // TODO update the Source chain reader configuration +var ccipOffRampIDL = idl.FetchCCIPOfframpIDL() +var ccipFeeQuoterIDL = idl.FetchFeeQuoterIDL() + +// TODO add events when Querying is finished +func DestContractReaderConfig() (config.ContractReader, error) { + var offRampIDL solanacodec.IDL + if err := json.Unmarshal([]byte(ccipOffRampIDL), &offRampIDL); err != nil { + return config.ContractReader{}, fmt.Errorf("unexpected error: invalid CCIP OffRamp IDL, error: %w", err) + } + + var feeQuoterIDL solanacodec.IDL + if err := json.Unmarshal([]byte(ccipFeeQuoterIDL), &feeQuoterIDL); err != nil { + return config.ContractReader{}, fmt.Errorf("unexpected error: invalid CCIP Fee Quoter IDL, error: %w", err) + } + + feeQuoterIDL.Accounts = append(feeQuoterIDL.Accounts, solanacodec.IdlTypeDef{ + Name: "USDPerToken", + Type: solanacodec.IdlTypeDefTy{ + Kind: solanacodec.IdlTypeDefTyKindStruct, + Fields: &solanacodec.IdlTypeDefStruct{ + { + Name: "tokenPrices", + Type: solanacodec.IdlType{ + AsIdlTypeVec: &solanacodec.IdlTypeVec{Vec: solanacodec.IdlType{AsIdlTypeDefined: &solanacodec.IdlTypeDefined{Defined: "TimestampedPackedU224"}}}, + }, + }, + }, + }, + }) + + var routerIDL solanacodec.IDL + if err := json.Unmarshal([]byte(ccipRouterIDL), &routerIDL); err != nil { + return config.ContractReader{}, fmt.Errorf("unexpected error: invalid CCIP Router IDL, error: %w", err) + } + + locationFirst := codec.ElementExtractorLocationFirst + return config.ContractReader{ + AddressShareGroups: [][]string{{consts.ContractNameRouter, consts.ContractNameNonceManager}}, + Namespaces: map[string]config.ChainContractReader{ + consts.ContractNameOffRamp: { + IDL: offRampIDL, + Reads: map[string]config.ReadDefinition{ + consts.MethodNameOffRampLatestConfigDetails: { + ChainSpecificName: "Config", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{Prefix: []byte("config")}, + OutputModifications: codec.ModifiersConfig{ + // TODO why does Solana have two of these in an array, but EVM has one + &codec.WrapperModifierConfig{ + Fields: map[string]string{"Ocr3": "OcrConfig"}, + }, + &codec.PropertyExtractorConfig{FieldName: "Ocr3"}, + &codec.ElementExtractorFromOnchainModifierConfig{Extractions: map[string]*codec.ElementExtractorLocation{"OcrConfig": &locationFirst}}, + &codec.ByteToBooleanModifierConfig{Fields: []string{"OcrConfig.ConfigInfo.IsSignatureVerificationEnabled"}}, + }, + }, + consts.MethodNameGetLatestPriceSequenceNumber: { + ChainSpecificName: "GlobalState", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{Prefix: []byte("state")}, + OutputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{ + Fields: map[string]string{"LatestPriceSequenceNumber": "LatestSeqNr"}, + }}, + }, + consts.MethodNameOffRampGetStaticConfig: { + ChainSpecificName: "Config", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("config"), + }, + OutputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{ + Fields: map[string]string{ + "SvmChainSelector": "ChainSelector", + }, + }, + }, + }, + consts.MethodNameOffRampGetDynamicConfig: { + ChainSpecificName: "Config", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("config"), + }, + OutputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{ + Fields: map[string]string{"EnableManualExecutionAfter": "PermissionLessExecutionThresholdSeconds"}, + }, + }, + MultiReader: &config.MultiReader{ + Reads: []config.ReadDefinition{ + { + ChainSpecificName: "ReferenceAddresses", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("reference_addresses"), + }, + }, + }, + }, + }, + consts.MethodNameGetSourceChainConfig: { + ChainSpecificName: "SourceChain", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("source_chain_state"), + Seeds: []solanacodec.PDASeed{{Name: "NewChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}}, + }, + InputModifications: codec.ModifiersConfig{&codec.RenameModifierConfig{Fields: map[string]string{"NewChainSelector": "SourceChainSelector"}}}, + OutputModifications: codec.ModifiersConfig{ + &codec.PropertyExtractorConfig{FieldName: "Config"}, + // TODO, onchain comment cays that both can be populated, but EVM contracts only have 1, so we take first here + // // OnRamp addresses supported from the source chain, each of them has a 64 byte address. So this can hold 2 addresses. + // // If only one address is configured, then the space for the second address must be zeroed. + // // Each address must be right padded with zeros if it is less than 64 bytes. + &codec.ElementExtractorModifierConfig{Extractions: map[string]*codec.ElementExtractorLocation{"OnRamp": &locationFirst}}, + }, + MultiReader: &config.MultiReader{ + ReuseParams: true, + Reads: []config.ReadDefinition{ + { + ChainSpecificName: "ReferenceAddresses", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("reference_addresses"), + }, + }, + }, + }, + }, + }, + }, + consts.ContractNameFeeQuoter: { + IDL: feeQuoterIDL, + Reads: map[string]config.ReadDefinition{ + consts.MethodNameFeeQuoterGetStaticConfig: { + ChainSpecificName: "Config", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("config"), + }, + OutputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{ + Fields: map[string]string{ + "MaxFeeJuelsPerMsg": "MaxFeeJuelsPerMsg", + "LinkTokenMint": "LinkToken", + }, + }, + }, + }, + // This one is hacky, but works - [NONEVM-1320] + consts.MethodNameFeeQuoterGetTokenPrices: { + ChainSpecificName: "USDPerToken", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("fee_billing_token_config"), + Seeds: []solanacodec.PDASeed{ + { + Name: "Tokens", + Type: solanacodec.IdlType{ + AsIdlTypeVec: &solanacodec.IdlTypeVec{ + Vec: solanacodec.IdlType{AsString: solanacodec.IdlTypePublicKey}, + }, + }, + }, + }, + }, + OutputModifications: codec.ModifiersConfig{ + &codec.PropertyExtractorConfig{FieldName: "TokenPrices"}, + }, + }, + consts.MethodNameFeeQuoterGetTokenPrice: { + ChainSpecificName: "BillingTokenConfigWrapper", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("fee_billing_token_config"), + Seeds: []solanacodec.PDASeed{{ + Name: "Tokens", + Type: solanacodec.IdlType{ + AsIdlTypeVec: &solanacodec.IdlTypeVec{ + Vec: solanacodec.IdlType{AsString: solanacodec.IdlTypePublicKey}, + }, + }, + }}}, + }, + consts.MethodNameGetFeePriceUpdate: { + ChainSpecificName: "DestChain", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("dest_chain"), + Seeds: []solanacodec.PDASeed{{Name: "DestinationChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}}, + }, + InputModifications: codec.ModifiersConfig{&codec.RenameModifierConfig{Fields: map[string]string{"DestinationChainSelector": "DestChainSelector"}}}, + OutputModifications: codec.ModifiersConfig{&codec.PropertyExtractorConfig{FieldName: "State.UsdPerUnitGas"}}, + }, + consts.MethodNameGetDestChainConfig: { + ChainSpecificName: "DestChain", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("dest_chain"), + Seeds: []solanacodec.PDASeed{{Name: "DestinationChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}}, + }, + InputModifications: codec.ModifiersConfig{&codec.RenameModifierConfig{Fields: map[string]string{"DestinationChainSelector": "DestChainSelector"}}}, + OutputModifications: codec.ModifiersConfig{ + &codec.PropertyExtractorConfig{FieldName: "Config"}, + &codec.RenameModifierConfig{ + Fields: map[string]string{ + "DefaultTokenFeeUsdcents": "DefaultTokenFeeUSDCents", + "NetworkFeeUsdcents": "NetworkFeeUSDCents", + }, + }, + }, + }, + }, + }, + consts.ContractNameRouter: { + IDL: routerIDL, + Reads: map[string]config.ReadDefinition{ + consts.MethodNameRouterGetWrappedNative: { + ChainSpecificName: "Config", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("config"), + }, + OutputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{ + Fields: map[string]string{ + "LinkTokenMint": "LinkToken", + }, + }, + }, + }, + }, + }, + consts.ContractNameNonceManager: { + IDL: routerIDL, + Reads: map[string]config.ReadDefinition{ + consts.MethodNameGetInboundNonce: { + ChainSpecificName: "Nonce", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("nonce"), + Seeds: []solanacodec.PDASeed{ + {Name: "DestinationChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}, + {Name: "Authority", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypePublicKey}}, + }, + }, + InputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{Fields: map[string]string{ + "DestinationChainSelector": "SourceChainSelector", + "Authority": "Sender", + }}}, + }, + }, + }, + }, + }, nil +} + +// TODO add events when Querying is finished +func SourceContractReaderConfig() (config.ContractReader, error) { + var routerIDL solanacodec.IDL + if err := json.Unmarshal([]byte(ccipRouterIDL), &routerIDL); err != nil { + return config.ContractReader{}, fmt.Errorf("unexpected error: invalid CCIP Router IDL, error: %w", err) + } + + var feeQuoterIDL solanacodec.IDL + if err := json.Unmarshal([]byte(ccipFeeQuoterIDL), &feeQuoterIDL); err != nil { + return config.ContractReader{}, fmt.Errorf("unexpected error: invalid CCIP Fee Quoter IDL, error: %w", err) + } + + feeQuoterIDL.Accounts = append(feeQuoterIDL.Accounts, solanacodec.IdlTypeDef{ + Name: "USDPerToken", + Type: solanacodec.IdlTypeDefTy{ + Kind: solanacodec.IdlTypeDefTyKindStruct, + Fields: &solanacodec.IdlTypeDefStruct{ + { + Name: "tokenPrices", + Type: solanacodec.IdlType{ + AsIdlTypeVec: &solanacodec.IdlTypeVec{Vec: solanacodec.IdlType{AsIdlTypeDefined: &solanacodec.IdlTypeDefined{Defined: "TimestampedPackedU224"}}}, + }, + }, + }, + }, + }) + + return config.ContractReader{ + AddressShareGroups: [][]string{{consts.ContractNameRouter, consts.ContractNameOnRamp}}, + Namespaces: map[string]config.ChainContractReader{ + consts.ContractNameOnRamp: { + IDL: routerIDL, + Reads: map[string]config.ReadDefinition{ + consts.MethodNameGetExpectedNextSequenceNumber: { + ChainSpecificName: "DestChain", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("dest_chain_state"), + Seeds: []solanacodec.PDASeed{{Name: "NewChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}}, + }, + InputModifications: codec.ModifiersConfig{&codec.RenameModifierConfig{Fields: map[string]string{"NewChainSelector": "DestChainSelector"}}}, + OutputModifications: codec.ModifiersConfig{ + &codec.PropertyExtractorConfig{FieldName: "State"}, + &codec.RenameModifierConfig{ + Fields: map[string]string{"SequenceNumber": "ExpectedNextSequenceNumber"}, + }}, + }, + consts.MethodNameOnRampGetDestChainConfig: { + ChainSpecificName: "DestChain", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("dest_chain_state"), + Seeds: []solanacodec.PDASeed{{Name: "NewChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}}, + }, + // response Router field will be populated with the bound address of the onramp + ResponseAddressHardCoder: &codec.HardCodeModifierConfig{ + // type doesn't matter it will be overridden with address internally + OffChainValues: map[string]any{"Router": ""}, + }, + InputModifications: codec.ModifiersConfig{&codec.RenameModifierConfig{Fields: map[string]string{"NewChainSelector": "DestChainSelector"}}}, + OutputModifications: codec.ModifiersConfig{ + &codec.PropertyExtractorConfig{FieldName: "State"}, + &codec.RenameModifierConfig{ + Fields: map[string]string{"SequenceNumber": "ExpectedNextSequenceNumber"}, + }, + }, + MultiReader: &config.MultiReader{ + ReuseParams: true, + Reads: []config.ReadDefinition{ + { + ChainSpecificName: "DestChain", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("dest_chain_state"), + Seeds: []solanacodec.PDASeed{{Name: "NewChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}}, + }, + InputModifications: codec.ModifiersConfig{&codec.RenameModifierConfig{Fields: map[string]string{"NewChainSelector": "DestChainSelector"}}}, + OutputModifications: codec.ModifiersConfig{&codec.PropertyExtractorConfig{FieldName: "Config"}}, + }, + }, + }, + }, + consts.MethodNameOnRampGetDynamicConfig: { + ChainSpecificName: "Config", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{Prefix: []byte("config")}, + OutputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{ + Fields: map[string]string{"Owner": "AllowListAdmin"}, + }}, + }, + }, + }, + consts.ContractNameFeeQuoter: { + IDL: feeQuoterIDL, + Reads: map[string]config.ReadDefinition{ + consts.MethodNameFeeQuoterGetStaticConfig: { + ChainSpecificName: "Config", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("config"), + }, + OutputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{ + Fields: map[string]string{ + "MaxFeeJuelsPerMsg": "MaxFeeJuelsPerMsg", + "LinkTokenMint": "LinkToken", + }, + }, + }, + }, + // this one is hacky, but should work NONEVM-1320 + consts.MethodNameFeeQuoterGetTokenPrices: { + ChainSpecificName: "USDPerToken", + ReadType: config.Account, + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("fee_billing_token_config"), + Seeds: []solanacodec.PDASeed{ + { + Name: "Tokens", + Type: solanacodec.IdlType{ + AsIdlTypeVec: &solanacodec.IdlTypeVec{ + Vec: solanacodec.IdlType{AsString: solanacodec.IdlTypePublicKey}, + }, + }, + }, + }, + }, + OutputModifications: codec.ModifiersConfig{ + &codec.PropertyExtractorConfig{FieldName: "TokenPrices"}, + }, + }, + consts.MethodNameFeeQuoterGetTokenPrice: { + ChainSpecificName: "BillingTokenConfigWrapper", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("fee_billing_token_config"), + Seeds: []solanacodec.PDASeed{{ + Name: "Tokens", + Type: solanacodec.IdlType{ + AsIdlTypeVec: &solanacodec.IdlTypeVec{ + Vec: solanacodec.IdlType{AsString: solanacodec.IdlTypePublicKey}, + }, + }, + }}}, + }, + consts.MethodNameGetFeePriceUpdate: { + ChainSpecificName: "DestChain", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("dest_chain"), + Seeds: []solanacodec.PDASeed{{Name: "DestinationChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}}, + }, + InputModifications: codec.ModifiersConfig{&codec.RenameModifierConfig{Fields: map[string]string{"DestinationChainSelector": "DestChainSelector"}}}, + OutputModifications: codec.ModifiersConfig{&codec.PropertyExtractorConfig{FieldName: "State.UsdPerUnitGas"}}, + }, + consts.MethodNameGetDestChainConfig: { + ChainSpecificName: "DestChain", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("dest_chain"), + Seeds: []solanacodec.PDASeed{{Name: "DestinationChainSelector", Type: solanacodec.IdlType{AsString: solanacodec.IdlTypeU64}}}, + }, + InputModifications: codec.ModifiersConfig{&codec.RenameModifierConfig{Fields: map[string]string{"DestinationChainSelector": "DestChainSelector"}}}, + OutputModifications: codec.ModifiersConfig{ + &codec.PropertyExtractorConfig{FieldName: "Config"}, + &codec.RenameModifierConfig{ + Fields: map[string]string{ + "DefaultTokenFeeUsdcents": "DefaultTokenFeeUSDCents", + "NetworkFeeUsdcents": "NetworkFeeUSDCents", + }, + }, + }, + }, + }, + }, + consts.ContractNameRouter: { + IDL: routerIDL, + Reads: map[string]config.ReadDefinition{ + consts.MethodNameRouterGetWrappedNative: { + ChainSpecificName: "Config", + PDADefinition: solanacodec.PDATypeDef{ + Prefix: []byte("config"), + }, + OutputModifications: codec.ModifiersConfig{ + &codec.RenameModifierConfig{ + Fields: map[string]string{ + "LinkTokenMint": "LinkToken", + }, + }, + }, + }, + }, + }, + }, + }, nil +} func MergeReaderConfigs(configs ...config.ContractReader) config.ContractReader { allNamespaces := make(map[string]config.ChainContractReader) diff --git a/core/capabilities/ccip/configs/solana/contract_reader_test.go b/core/capabilities/ccip/configs/solana/contract_reader_test.go new file mode 100644 index 00000000000..1f01ffc1cbd --- /dev/null +++ b/core/capabilities/ccip/configs/solana/contract_reader_test.go @@ -0,0 +1,30 @@ +package solana + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/smartcontractkit/chainlink-solana/pkg/solana/config" +) + +func TestContractReaderConfigRaw(t *testing.T) { + cfg, err := DestContractReaderConfig() + require.NoError(t, err) + + raw, err := json.Marshal(cfg) + require.NoError(t, err) + + var result config.ContractReader + require.NoError(t, json.Unmarshal(raw, &result)) + require.EqualValues(t, cfg, result) + + cfg, err = SourceContractReaderConfig() + require.NoError(t, err) + + raw, err = json.Marshal(cfg) + require.NoError(t, err) + require.NoError(t, json.Unmarshal(raw, &result)) + require.EqualValues(t, cfg, result) +} diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go index 803b5fed2e5..c0bdbb4a3d5 100644 --- a/core/capabilities/ccip/oraclecreator/plugin.go +++ b/core/capabilities/ccip/oraclecreator/plugin.go @@ -540,12 +540,18 @@ func getChainReaderConfig( return marshaledConfig, nil case relay.NetworkSolana: - // TODO update chain reader config in contract_reader.go + var err error var cfg config.ContractReader if chainID == destChainID { - cfg = solanaconfig.DestReaderConfig + cfg, err = solanaconfig.DestContractReaderConfig() + if err != nil { + return nil, fmt.Errorf("failed to get Solana dest contract reader config: %w", err) + } } else { - cfg = solanaconfig.SourceReaderConfig + cfg, err = solanaconfig.SourceContractReaderConfig() + if err != nil { + return nil, fmt.Errorf("failed to get Solana source contract reader config: %w", err) + } } marshaledConfig, err := json.Marshal(cfg) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index d583d01fe27..84f32160752 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -34,7 +34,7 @@ require ( github.com/prometheus/client_golang v1.20.5 github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v0.8.1 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.22 diff --git a/core/scripts/go.sum b/core/scripts/go.sum index ab4b5c8b5df..fef4fea42b3 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1127,8 +1127,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/deployment/go.mod b/deployment/go.mod index d55c89d99c9..c8d9d0cad64 100644 --- a/deployment/go.mod +++ b/deployment/go.mod @@ -32,7 +32,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250211162441-3d6cea220efb github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 diff --git a/deployment/go.sum b/deployment/go.sum index 2448ea17ae6..30913a31717 100644 --- a/deployment/go.sum +++ b/deployment/go.sum @@ -1130,8 +1130,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/go.mod b/go.mod index fa243b645b6..3b5d99f65a8 100644 --- a/go.mod +++ b/go.mod @@ -78,7 +78,7 @@ require ( github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 github.com/smartcontractkit/chainlink-feeds v0.1.1 github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250207205350-420ccacab78a diff --git a/go.sum b/go.sum index 39d7b416bb8..22569b77896 100644 --- a/go.sum +++ b/go.sum @@ -1014,8 +1014,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 8e5e0777148..41e282b4f25 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -50,7 +50,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 github.com/smartcontractkit/chainlink-testing-framework/framework v0.5.0 diff --git a/integration-tests/go.sum b/integration-tests/go.sum index 21a895b331d..8349372b644 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1382,8 +1382,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index 5236bf0851b..d6cce558278 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -29,7 +29,7 @@ require ( github.com/slack-go/slack v0.15.0 github.com/smartcontractkit/chain-selectors v1.0.40 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 - github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb + github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea github.com/smartcontractkit/chainlink-integrations/evm v0.0.0-20250213145514-41d874782c02 github.com/smartcontractkit/chainlink-testing-framework/lib v1.51.0 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.10 diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 79d3ac5cda5..a4e840fd295 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1365,8 +1365,8 @@ github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01 h1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Hht/OJq/PxC+gnBCIPyzHt4Otsw6mYwUVsmtOqIvlxo= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01 h1:R3OD6Phi0ULIQ2uvHiKVWYdgpi/O1Mt46CUK1UApcXU= github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250214202341-4190f2db1c01/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb h1:1VC/hN1ojPiEWCsjxhvcw4p1Zveo90O38VQhktvo3Ag= -github.com/smartcontractkit/chainlink-common v0.4.2-0.20250205141137-8f50d72601bb/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea h1:/1f/pWf7vSV9acTR9UPn2exPAwQG/LHGa4l9OywhS00= +github.com/smartcontractkit/chainlink-common v0.4.2-0.20250214231858-f365e2bdecea/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8= github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c=